Adding functionality into the MetadataCollector to list directories and browse files
diff --git a/agent/src/main/java/org/apache/airavata/mft/agent/TransportMediator.java b/agent/src/main/java/org/apache/airavata/mft/agent/TransportMediator.java
index d8a2ebe..cd90503 100644
--- a/agent/src/main/java/org/apache/airavata/mft/agent/TransportMediator.java
+++ b/agent/src/main/java/org/apache/airavata/mft/agent/TransportMediator.java
@@ -28,7 +28,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Optional;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock;
@@ -53,7 +52,7 @@
MetadataCollector destMetadataCollector, BiConsumer<String, TransferState> onStatusCallback,
BiConsumer<String, Boolean> exitingCallback) throws Exception {
- ResourceMetadata srcMetadata = srcMetadataCollector.getGetResourceMetadata(command.getSourceId(), command.getSourceToken());
+ FileResourceMetadata srcMetadata = srcMetadataCollector.getFileResourceMetadata(command.getSourceId(), command.getSourceToken());
final long resourceSize = srcMetadata.getResourceSize();
logger.debug("Source file size {}. MD5 {}", resourceSize, srcMetadata.getMd5sum());
@@ -129,7 +128,7 @@
throw new Exception("Transfer completed but resource is not available in destination");
}
- ResourceMetadata destMetadata = destMetadataCollector.getGetResourceMetadata(command.getDestinationId(),
+ FileResourceMetadata destMetadata = destMetadataCollector.getFileResourceMetadata(command.getDestinationId(),
command.getDestinationToken());
boolean doIntegrityVerify = true;
diff --git a/core/src/main/java/org/apache/airavata/mft/core/ConnectorContext.java b/core/src/main/java/org/apache/airavata/mft/core/ConnectorContext.java
index a4cd805..c8ce64f 100644
--- a/core/src/main/java/org/apache/airavata/mft/core/ConnectorContext.java
+++ b/core/src/main/java/org/apache/airavata/mft/core/ConnectorContext.java
@@ -20,7 +20,7 @@
public class ConnectorContext {
private DoubleStreamingBuffer streamBuffer;
- private ResourceMetadata metadata;
+ private FileResourceMetadata metadata;
private String transferId;
public DoubleStreamingBuffer getStreamBuffer() {
@@ -31,11 +31,11 @@
this.streamBuffer = streamBuffer;
}
- public ResourceMetadata getMetadata() {
+ public FileResourceMetadata getMetadata() {
return metadata;
}
- public void setMetadata(ResourceMetadata metadata) {
+ public void setMetadata(FileResourceMetadata metadata) {
this.metadata = metadata;
}
diff --git a/core/src/main/java/org/apache/airavata/mft/core/DirectoryResourceMetadata.java b/core/src/main/java/org/apache/airavata/mft/core/DirectoryResourceMetadata.java
new file mode 100644
index 0000000..5eb9813
--- /dev/null
+++ b/core/src/main/java/org/apache/airavata/mft/core/DirectoryResourceMetadata.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.airavata.mft.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DirectoryResourceMetadata {
+
+ private String friendlyName;
+ private long createdTime;
+ private long updateTime;
+ private String resourcePath;
+ private String parentResourceId;
+ private String parentResourceType;
+ private List<DirectoryResourceMetadata> directories = new ArrayList<>();
+ private List<FileResourceMetadata> files = new ArrayList<>();
+ private boolean lazyInitialized = true;
+
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+
+ public DirectoryResourceMetadata setFriendlyName(String friendlyName) {
+ this.friendlyName = friendlyName;
+ return this;
+ }
+
+ public long getCreatedTime() {
+ return createdTime;
+ }
+
+ public DirectoryResourceMetadata setCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ return this;
+ }
+
+ public long getUpdateTime() {
+ return updateTime;
+ }
+
+ public DirectoryResourceMetadata setUpdateTime(long updateTime) {
+ this.updateTime = updateTime;
+ return this;
+ }
+
+ public String getResourcePath() {
+ return resourcePath;
+ }
+
+ public DirectoryResourceMetadata setResourcePath(String resourcePath) {
+ this.resourcePath = resourcePath;
+ return this;
+ }
+
+ public String getParentResourceId() {
+ return parentResourceId;
+ }
+
+ public DirectoryResourceMetadata setParentResourceId(String parentResourceId) {
+ this.parentResourceId = parentResourceId;
+ return this;
+ }
+
+ public String getParentResourceType() {
+ return parentResourceType;
+ }
+
+ public DirectoryResourceMetadata setParentResourceType(String parentResourceType) {
+ this.parentResourceType = parentResourceType;
+ return this;
+ }
+
+ public List<DirectoryResourceMetadata> getDirectories() {
+ return directories;
+ }
+
+ public DirectoryResourceMetadata setDirectories(List<DirectoryResourceMetadata> directories) {
+ this.directories = directories;
+ return this;
+ }
+
+ public List<FileResourceMetadata> getFiles() {
+ return files;
+ }
+
+ public DirectoryResourceMetadata setFiles(List<FileResourceMetadata> files) {
+ this.files = files;
+ return this;
+ }
+
+ public boolean isLazyInitialized() {
+ return lazyInitialized;
+ }
+
+ public DirectoryResourceMetadata setLazyInitialized(boolean lazyInitialized) {
+ this.lazyInitialized = lazyInitialized;
+ return this;
+ }
+
+
+ public static final class Builder {
+ private String friendlyName;
+ private long createdTime;
+ private long updateTime;
+ private String resourcePath;
+ private String parentResourceId;
+ private String parentResourceType;
+ private List<DirectoryResourceMetadata> directories = new ArrayList<>();
+ private List<FileResourceMetadata> files = new ArrayList<>();
+ private boolean lazyInitialized = true;
+
+ private Builder() {
+ }
+
+ public static Builder getBuilder() {
+ return new Builder();
+ }
+
+ public Builder withFriendlyName(String friendlyName) {
+ this.friendlyName = friendlyName;
+ return this;
+ }
+
+ public Builder withCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ return this;
+ }
+
+ public Builder withUpdateTime(long updateTime) {
+ this.updateTime = updateTime;
+ return this;
+ }
+
+ public Builder withResourcePath(String resourcePath) {
+ this.resourcePath = resourcePath;
+ return this;
+ }
+
+ public Builder withParentResourceId(String parentResourceId) {
+ this.parentResourceId = parentResourceId;
+ return this;
+ }
+
+ public Builder withParentResourceType(String parentResourceType) {
+ this.parentResourceType = parentResourceType;
+ return this;
+ }
+
+ public Builder withDirectories(List<DirectoryResourceMetadata> directories) {
+ this.directories = directories;
+ return this;
+ }
+
+ public Builder withDirectory(DirectoryResourceMetadata directory) {
+ this.directories.add(directory);
+ return this;
+ }
+
+ public Builder withFiles(List<FileResourceMetadata> files) {
+ this.files = files;
+ return this;
+ }
+
+ public Builder withFile(FileResourceMetadata file) {
+ this.files.add(file);
+ return this;
+ }
+
+ public Builder withLazyInitialized(boolean lazyInitialized) {
+ this.lazyInitialized = lazyInitialized;
+ return this;
+ }
+
+ public DirectoryResourceMetadata build() {
+ DirectoryResourceMetadata directoryResourceMetadata = new DirectoryResourceMetadata();
+ directoryResourceMetadata.setFriendlyName(friendlyName);
+ directoryResourceMetadata.setCreatedTime(createdTime);
+ directoryResourceMetadata.setUpdateTime(updateTime);
+ directoryResourceMetadata.setResourcePath(resourcePath);
+ directoryResourceMetadata.setParentResourceId(parentResourceId);
+ directoryResourceMetadata.setParentResourceType(parentResourceType);
+ directoryResourceMetadata.setDirectories(directories);
+ directoryResourceMetadata.setFiles(files);
+ directoryResourceMetadata.setLazyInitialized(lazyInitialized);
+ return directoryResourceMetadata;
+ }
+ }
+}
diff --git a/core/src/main/java/org/apache/airavata/mft/core/FileResourceMetadata.java b/core/src/main/java/org/apache/airavata/mft/core/FileResourceMetadata.java
new file mode 100644
index 0000000..0b2372e
--- /dev/null
+++ b/core/src/main/java/org/apache/airavata/mft/core/FileResourceMetadata.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.airavata.mft.core;
+
+public class FileResourceMetadata {
+
+ private String friendlyName;
+ private long resourceSize;
+ private long createdTime;
+ private long updateTime;
+ private String md5sum;
+ private String resourcePath;
+ private String parentResourceId;
+ private String parentResourceType;
+
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+
+ public FileResourceMetadata setFriendlyName(String friendlyName) {
+ this.friendlyName = friendlyName;
+ return this;
+ }
+
+ public long getResourceSize() {
+ return resourceSize;
+ }
+
+ public FileResourceMetadata setResourceSize(long resourceSize) {
+ this.resourceSize = resourceSize;
+ return this;
+ }
+
+ public long getCreatedTime() {
+ return createdTime;
+ }
+
+ public FileResourceMetadata setCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ return this;
+ }
+
+ public long getUpdateTime() {
+ return updateTime;
+ }
+
+ public FileResourceMetadata setUpdateTime(long updateTime) {
+ this.updateTime = updateTime;
+ return this;
+ }
+
+ public String getMd5sum() {
+ return md5sum;
+ }
+
+ public FileResourceMetadata setMd5sum(String md5sum) {
+ this.md5sum = md5sum;
+ return this;
+ }
+
+ public String getResourcePath() {
+ return resourcePath;
+ }
+
+ public FileResourceMetadata setResourcePath(String resourcePath) {
+ this.resourcePath = resourcePath;
+ return this;
+ }
+
+ public String getParentResourceId() {
+ return parentResourceId;
+ }
+
+ public FileResourceMetadata setParentResourceId(String parentResourceId) {
+ this.parentResourceId = parentResourceId;
+ return this;
+ }
+
+ public String getParentResourceType() {
+ return parentResourceType;
+ }
+
+ public FileResourceMetadata setParentResourceType(String parentResourceType) {
+ this.parentResourceType = parentResourceType;
+ return this;
+ }
+
+ public static final class Builder {
+ private String friendlyName;
+ private long resourceSize;
+ private long createdTime;
+ private long updateTime;
+ private String md5sum;
+ private String resourcePath;
+ private String parentResourceId;
+ private String parentResourceType;
+
+ private Builder() {
+ }
+
+ public static Builder getBuilder() {
+ return new Builder();
+ }
+
+ public Builder withFriendlyName(String friendlyName) {
+ this.friendlyName = friendlyName;
+ return this;
+ }
+
+ public Builder withResourceSize(long resourceSize) {
+ this.resourceSize = resourceSize;
+ return this;
+ }
+
+ public Builder withCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ return this;
+ }
+
+ public Builder withUpdateTime(long updateTime) {
+ this.updateTime = updateTime;
+ return this;
+ }
+
+ public Builder withMd5sum(String md5sum) {
+ this.md5sum = md5sum;
+ return this;
+ }
+
+ public Builder withResourcePath(String resourcePath) {
+ this.resourcePath = resourcePath;
+ return this;
+ }
+
+ public Builder withParentResourceId(String parentResourceId) {
+ this.parentResourceId = parentResourceId;
+ return this;
+ }
+
+ public Builder withParentResourceType(String parentResourceType) {
+ this.parentResourceType = parentResourceType;
+ return this;
+ }
+
+ public FileResourceMetadata build() {
+ FileResourceMetadata fileResourceMetadata = new FileResourceMetadata();
+ fileResourceMetadata.setFriendlyName(friendlyName);
+ fileResourceMetadata.setResourceSize(resourceSize);
+ fileResourceMetadata.setCreatedTime(createdTime);
+ fileResourceMetadata.setUpdateTime(updateTime);
+ fileResourceMetadata.setMd5sum(md5sum);
+ fileResourceMetadata.setResourcePath(resourcePath);
+ fileResourceMetadata.setParentResourceId(parentResourceId);
+ fileResourceMetadata.setParentResourceType(parentResourceType);
+ return fileResourceMetadata;
+ }
+ }
+}
diff --git a/core/src/main/java/org/apache/airavata/mft/core/ResourceMetadata.java b/core/src/main/java/org/apache/airavata/mft/core/ResourceMetadata.java
deleted file mode 100644
index 378153b..0000000
--- a/core/src/main/java/org/apache/airavata/mft/core/ResourceMetadata.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.airavata.mft.core;
-
-public class ResourceMetadata {
-
- private long resourceSize;
- private long createdTime;
- private long updateTime;
- private String md5sum;
-
- public long getResourceSize() {
- return resourceSize;
- }
-
- public void setResourceSize(long resourceSize) {
- this.resourceSize = resourceSize;
- }
-
- public long getCreatedTime() {
- return createdTime;
- }
-
- public void setCreatedTime(long createdTime) {
- this.createdTime = createdTime;
- }
-
- public long getUpdateTime() {
- return updateTime;
- }
-
- public void setUpdateTime(long updateTime) {
- this.updateTime = updateTime;
- }
-
- public String getMd5sum() {
- return md5sum;
- }
-
- public void setMd5sum(String md5sum) {
- this.md5sum = md5sum;
- }
-}
diff --git a/core/src/main/java/org/apache/airavata/mft/core/api/MetadataCollector.java b/core/src/main/java/org/apache/airavata/mft/core/api/MetadataCollector.java
index c8e4fc4..e784867 100644
--- a/core/src/main/java/org/apache/airavata/mft/core/api/MetadataCollector.java
+++ b/core/src/main/java/org/apache/airavata/mft/core/api/MetadataCollector.java
@@ -17,10 +17,74 @@
package org.apache.airavata.mft.core.api;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
public interface MetadataCollector {
+
+ /**
+ * Initializes the {@link MetadataCollector}
+ *
+ * @param resourceServiceHost hostname of the resource service
+ * @param resourceServicePort port of the resource service
+ * @param secretServiceHost hostname of the secret service
+ * @param secretServicePort port of the secret service
+ */
public void init(String resourceServiceHost, int resourceServicePort, String secretServiceHost, int secretServicePort);
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception;
+
+ /**
+ * Fetches a metadata of given File Resource
+ *
+ * @param resourceId id of the resource
+ * @param credentialToken credential token for the resource
+ * @return an object of {@link FileResourceMetadata}
+ * @throws Exception if the resource id is not a File Resource type or the resource can't be fetched from the resource service
+ */
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception;
+
+ /**
+ * Fetches a metadata of given File Resource inside a registered directory resource. Target file might be living in
+ * multiple level below the parent directory
+ *
+ * @param parentResourceId parent directory resource id
+ * @param resourcePath path of the target resource. This should be a child path of the parent resource
+ * @param credentialToken credential token for the resource
+ * @return an object of {@link FileResourceMetadata}
+ * @throws Exception if the parent resource is not a Directory resource or the target resource is not a File Resource type
+ * or the resource can't be fetched from the resource service
+ */
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception;
+
+ /**
+ * Fetches a metadata of given Directory Resource
+ *
+ * @param resourceId id of the resource
+ * @param credentialToken credential token for the resource
+ * @return an object of {@link DirectoryResourceMetadata}
+ * @throws Exception if the resource id is not a Directory Resource type or the resource can't be fetched from the resource service
+ */
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception;
+
+ /**
+ * Fetches a metadata of given Directory Resource inside a registered directory resource. Target directory might be living in
+ * multiple level below the parent directory
+ *
+ * @param parentResourceId parent directory resource id
+ * @param resourcePath path of the target resource. This should be a child path of the parent resource
+ * @param credentialToken credential token for the resource
+ * @return an object of {@link DirectoryResourceMetadata}
+ * @throws Exception if the parent resource is not a Directory resource or the target resource is not a Directory Resource type
+ * or the resource can't be fetched from the resource service
+ */
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception;
+
+ /**
+ * Check whether the resource is available in the actual storage
+ *
+ * @param resourceId id of the resource
+ * @param credentialToken credential token for the resource
+ * @return true of the resource is available false otherwise
+ * @throws Exception if the resource details can not be fetched from the resource service
+ */
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception;
}
diff --git a/services/resource-service/server/src/main/resources/resources.json b/services/resource-service/server/src/main/resources/resources.json
index 83e009f..a389282 100644
--- a/services/resource-service/server/src/main/resources/resources.json
+++ b/services/resource-service/server/src/main/resources/resources.json
@@ -1,6 +1,18 @@
[
{
"type": "SCP",
+ "resourceId": "remote-ssh-dir-resource",
+ "resourceMode": "DIRECTORY",
+ "resourcePath": "/tmp",
+ "scpStorage" : {
+ "storageId": "remote-ssh-storage",
+ "host": "149.165.156.124",
+ "port": 22,
+ "user": "root"
+ }
+ },
+ {
+ "type": "SCP",
"resourceId": "remote-ssh-resource",
"resourceMode": "FILE",
"resourcePath": "/tmp/1mb.txt",
diff --git a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
index 8a265c8..5a64d54 100644
--- a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
+++ b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
@@ -22,7 +22,8 @@
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
import com.azure.storage.blob.models.BlobProperties;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.azure.AzureSecret;
@@ -58,7 +59,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
checkInitialized();
if (!isAvailable(resourceId, credentialToken)) {
@@ -77,7 +78,7 @@
.getBlobClient(azureResource.getFile().getResourcePath());
BlobProperties properties = blobClient.getBlockBlobClient().getProperties();
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
metadata.setResourceSize(properties.getBlobSize());
metadata.setCreatedTime(properties.getCreationTime().toEpochSecond());
metadata.setUpdateTime(properties.getCreationTime().toEpochSecond());
@@ -94,6 +95,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
checkInitialized();
diff --git a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
index b55a0f2..8e21c9f 100644
--- a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
+++ b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
@@ -20,7 +20,8 @@
import com.box.sdk.BoxAPIConnection;
import com.box.sdk.BoxFile;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.box.BoxSecret;
@@ -56,7 +57,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
checkInitialized();
@@ -70,7 +71,7 @@
BoxFile boxFile = new BoxFile(api, boxResource.getFile().getResourcePath());
BoxFile.Info boxFileInfo = boxFile.getInfo();
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
metadata.setResourceSize(boxFileInfo.getSize());
// TODO
@@ -83,6 +84,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
checkInitialized();
diff --git a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
index 1310c53..906fb0b 100644
--- a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
+++ b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
@@ -20,7 +20,8 @@
import com.dropbox.core.DbxRequestConfig;
import com.dropbox.core.v2.DbxClientV2;
import com.dropbox.core.v2.files.FileMetadata;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret;
@@ -55,9 +56,8 @@
}
}
-
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
DropboxResource dropboxResource = resourceClient.dropbox().getDropboxResource(DropboxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
@@ -68,7 +68,7 @@
DbxRequestConfig config = DbxRequestConfig.newBuilder("mftdropbox/v1").build();
DbxClientV2 dbxClientV2 = new DbxClientV2(config, dropboxSecret.getAccessToken());
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
FileMetadata fileMetadata = (FileMetadata) dbxClientV2.files().getMetadata(dropboxResource.getFile().getResourcePath());
metadata.setResourceSize(fileMetadata.getSize());
metadata.setMd5sum(null);
@@ -78,6 +78,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
diff --git a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
index 9b71dc8..66675f3 100644
--- a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
+++ b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
@@ -17,7 +17,8 @@
package org.apache.airavata.mft.transport.ftp;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.ftp.FTPSecret;
@@ -62,7 +63,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
@@ -70,7 +71,7 @@
SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
FTPSecret ftpSecret = secretClient.ftp().getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
- ResourceMetadata resourceMetadata = new ResourceMetadata();
+ FileResourceMetadata resourceMetadata = new FileResourceMetadata();
FTPClient ftpClient = null;
try {
ftpClient = FTPTransportUtil.getFTPClient(ftpResource, ftpSecret);
@@ -98,6 +99,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) {
checkInitialized();
diff --git a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
index bda277b..aa97091 100644
--- a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
+++ b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
@@ -25,7 +25,8 @@
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.StorageScopes;
import com.google.api.services.storage.model.StorageObject;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.gcs.GCSSecret;
@@ -67,7 +68,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
GCSResource gcsResource = resourceClient.gcs().getGCSResource(GCSResourceGetRequest.newBuilder().setResourceId(resourceId).build());
@@ -86,7 +87,7 @@
Storage storage = new Storage.Builder(transport, jsonFactory, credential).build();
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
StorageObject gcsMetadata = storage.objects().get(gcsResource.getGcsStorage().getBucketName(),
gcsResource.getFile().getResourcePath()).execute();
metadata.setResourceSize(gcsMetadata.getSize().longValue());
@@ -98,6 +99,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
diff --git a/transport/local-transport/src/main/java/org/apache/airavata/mft/transport/local/LocalMetadataCollector.java b/transport/local-transport/src/main/java/org/apache/airavata/mft/transport/local/LocalMetadataCollector.java
index ba21a2c..f24c70f 100644
--- a/transport/local-transport/src/main/java/org/apache/airavata/mft/transport/local/LocalMetadataCollector.java
+++ b/transport/local-transport/src/main/java/org/apache/airavata/mft/transport/local/LocalMetadataCollector.java
@@ -17,7 +17,8 @@
package org.apache.airavata.mft.transport.local;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.resource.client.ResourceServiceClient;
@@ -56,7 +57,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
LocalResource localResource = resourceClient.local().getLocalResource(LocalResourceGetRequest.newBuilder().setResourceId(resourceId).build());
@@ -64,7 +65,7 @@
if (resourceFile.exists()) {
BasicFileAttributes basicFileAttributes = Files.readAttributes(Path.of(localResource.getFile().getResourcePath()), BasicFileAttributes.class);
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
metadata.setCreatedTime(basicFileAttributes.creationTime().toMillis());
metadata.setUpdateTime(basicFileAttributes.lastModifiedTime().toMillis());
metadata.setResourceSize(basicFileAttributes.size());
@@ -91,6 +92,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
LocalResource localResource = resourceClient.local().getLocalResource(LocalResourceGetRequest.newBuilder().setResourceId(resourceId).build());
diff --git a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
index 5326e11..572affd 100644
--- a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
+++ b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
@@ -22,7 +22,8 @@
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.s3.S3Secret;
@@ -58,7 +59,7 @@
}
@Override
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
checkInitialized();
ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
@@ -74,7 +75,7 @@
.withRegion(s3Resource.getS3Storage().getRegion())
.build();
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
ObjectMetadata s3Metadata = s3Client.getObjectMetadata(s3Resource.getS3Storage().getBucketName(), s3Resource.getFile().getResourcePath());
metadata.setResourceSize(s3Metadata.getContentLength());
metadata.setMd5sum(s3Metadata.getETag());
@@ -84,6 +85,20 @@
}
@Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented"); }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ throw new UnsupportedOperationException("Method not implemented");
+ }
+
+ @Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
checkInitialized();
diff --git a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
index 2c1ac22..d0086a5 100644
--- a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
+++ b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
@@ -20,6 +20,7 @@
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.sftp.FileAttributes;
+import net.schmizz.sshj.sftp.RemoteResourceInfo;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.userauth.keyprovider.KeyProvider;
import net.schmizz.sshj.userauth.method.AuthKeyboardInteractive;
@@ -27,13 +28,16 @@
import net.schmizz.sshj.userauth.method.AuthPublickey;
import net.schmizz.sshj.userauth.method.ChallengeResponseProvider;
import net.schmizz.sshj.userauth.password.Resource;
-import org.apache.airavata.mft.core.ResourceMetadata;
+import org.apache.airavata.mft.core.DirectoryResourceMetadata;
+import org.apache.airavata.mft.core.FileResourceMetadata;
import org.apache.airavata.mft.core.ResourceTypes;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.scp.SCPSecret;
import org.apache.airavata.mft.credential.stubs.scp.SCPSecretGetRequest;
import org.apache.airavata.mft.resource.client.ResourceServiceClient;
import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
+import org.apache.airavata.mft.resource.stubs.common.DirectoryResource;
+import org.apache.airavata.mft.resource.stubs.common.FileResource;
import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResource;
import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResourceGetRequest;
import org.apache.airavata.mft.secret.client.SecretServiceClient;
@@ -72,15 +76,7 @@
}
}
- public ResourceMetadata getGetResourceMetadata(String resourceId, String credentialToken) throws IOException {
-
- checkInitialized();
- ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
- SCPResource scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
-
- SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
- SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
-
+ private FileResourceMetadata getFileResourceMetadata(SCPResource scpResource, SCPSecret scpSecret, String parentResourceId) throws Exception {
try (SSHClient sshClient = getSSHClient(scpResource, scpSecret)) {
logger.info("Fetching metadata for resource {} in {}", scpResource.getFile().getResourcePath(), scpResource.getScpStorage().getHost());
@@ -89,10 +85,14 @@
FileAttributes lstat = sftpClient.lstat(scpResource.getFile().getResourcePath());
sftpClient.close();
- ResourceMetadata metadata = new ResourceMetadata();
+ FileResourceMetadata metadata = new FileResourceMetadata();
metadata.setResourceSize(lstat.getSize());
metadata.setCreatedTime(lstat.getAtime());
metadata.setUpdateTime(lstat.getMtime());
+ metadata.setParentResourceId(parentResourceId);
+ metadata.setParentResourceType("SCP");
+ metadata.setFriendlyName(new File(scpResource.getFile().getResourcePath()).getName());
+ metadata.setResourcePath(scpResource.getFile().getResourcePath());
try {
// TODO calculate md5 using the binary based on the OS platform. Eg: MacOS has md5. Linux has md5sum
@@ -111,14 +111,121 @@
logger.warn("MD5 fetch error out {}", errorWriter.toString());
}
} catch (Exception e) {
- logger.warn("Failed to fetch md5 for SCP resource {}", resourceId, e);
+ logger.warn("Failed to fetch md5 for SCP resource {}", scpResource.getResourceId(), e);
}
-
return metadata;
}
}
}
+ public FileResourceMetadata getFileResourceMetadata(String resourceId, String credentialToken) throws Exception {
+
+ checkInitialized();
+ ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
+ SCPResource scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
+
+ SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+ SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+
+ return getFileResourceMetadata(scpResource, scpSecret, resourceId);
+ }
+
+ @Override
+ public FileResourceMetadata getFileResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
+ SCPResource parentSCPResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(parentResourceId).build());
+
+ SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+ SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+
+ validateParent(parentSCPResource, resourcePath);
+
+ SCPResource scpResource = SCPResource.newBuilder()
+ .setFile(FileResource.newBuilder()
+ .setResourcePath(resourcePath).build())
+ .setScpStorage(parentSCPResource.getScpStorage()).build();
+
+ return getFileResourceMetadata(scpResource, scpSecret, parentResourceId);
+ }
+
+ private DirectoryResourceMetadata getDirectoryResourceMetadata(SCPResource scpResource, SCPSecret scpSecret, String parentResourceId) throws Exception {
+ try (SSHClient sshClient = getSSHClient(scpResource, scpSecret)) {
+
+ logger.info("Fetching metadata for resource {} in {}", scpResource.getFile().getResourcePath(), scpResource.getScpStorage().getHost());
+
+ try (SFTPClient sftpClient = sshClient.newSFTPClient()) {
+ List<RemoteResourceInfo> lsOut = sftpClient.ls(scpResource.getDirectory().getResourcePath());
+ FileAttributes lsStat = sftpClient.lstat(scpResource.getDirectory().getResourcePath());
+ sftpClient.close();
+
+ DirectoryResourceMetadata.Builder dirMetadataBuilder = DirectoryResourceMetadata.Builder.getBuilder()
+ .withLazyInitialized(false);
+
+ for (RemoteResourceInfo rri : lsOut) {
+ if (rri.isDirectory()) {
+ DirectoryResourceMetadata.Builder childDirBuilder = DirectoryResourceMetadata.Builder.getBuilder()
+ .withFriendlyName(rri.getName())
+ .withResourcePath(rri.getPath())
+ .withCreatedTime(rri.getAttributes().getAtime())
+ .withUpdateTime(rri.getAttributes().getMtime())
+ .withParentResourceId(parentResourceId)
+ .withParentResourceType("SCP");
+ dirMetadataBuilder = dirMetadataBuilder.withDirectory(childDirBuilder.build());
+ }
+
+ if (rri.isRegularFile()) {
+ FileResourceMetadata.Builder childFileBuilder = FileResourceMetadata.Builder.getBuilder()
+ .withFriendlyName(rri.getName())
+ .withResourcePath(rri.getPath())
+ .withCreatedTime(rri.getAttributes().getAtime())
+ .withUpdateTime(rri.getAttributes().getMtime())
+ .withParentResourceId(parentResourceId)
+ .withParentResourceType("SCP");
+
+ dirMetadataBuilder = dirMetadataBuilder.withFile(childFileBuilder.build());
+ }
+ }
+
+ dirMetadataBuilder = dirMetadataBuilder.withFriendlyName(new File(scpResource.getDirectory().getResourcePath()).getName())
+ .withResourcePath(parentResourceId)
+ .withCreatedTime(lsStat.getAtime())
+ .withUpdateTime(lsStat.getMtime())
+ .withParentResourceId(parentResourceId)
+ .withParentResourceType("SCP");
+ return dirMetadataBuilder.build();
+ }
+ }
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String resourceId, String credentialToken) throws Exception {
+
+ ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
+ SCPResource scpPResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
+
+ SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+ SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+
+ return getDirectoryResourceMetadata(scpPResource, scpSecret, resourceId);
+ }
+
+ @Override
+ public DirectoryResourceMetadata getDirectoryResourceMetadata(String parentResourceId, String resourcePath, String credentialToken) throws Exception {
+ ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
+ SCPResource parentSCPPResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(parentResourceId).build());
+
+ SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+ SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+
+ validateParent(parentSCPPResource, resourcePath);
+
+ SCPResource scpResource = SCPResource.newBuilder().setScpStorage(parentSCPPResource.getScpStorage())
+ .setDirectory(DirectoryResource.newBuilder()
+ .setResourcePath(resourcePath).build()).build();
+
+ return getDirectoryResourceMetadata(scpResource, scpSecret, parentResourceId);
+ }
+
@Override
public Boolean isAvailable(String resourceId, String credentialToken) throws Exception {
@@ -143,6 +250,22 @@
}
}
+ private void validateParent(SCPResource parentSCPResource, String resourcePath) throws Exception {
+ if (!ResourceTypes.DIRECTORY.equals(parentSCPResource.getResourceCase().name())) {
+ logger.error("Parent resource " + parentSCPResource.getResourceId() + " is not a DIRECTORY type");
+ throw new Exception("Parent resource " + parentSCPResource.getResourceId() + " is not a DIRECTORY type");
+ }
+
+ String parentDir = parentSCPResource.getDirectory().getResourcePath();
+ parentDir = parentDir.endsWith(File.separator) ? parentDir : parentDir + File.separator;
+ if (!resourcePath.startsWith(parentDir)) {
+ logger.error("Given resource path " + resourcePath + " is not a part of the parent resource path "
+ + parentSCPResource.getDirectory().getResourcePath());
+ throw new Exception("Given resource path " + resourcePath + " is not a part of the parent resource path "
+ + parentSCPResource.getDirectory().getResourcePath());
+ }
+ }
+
private SSHClient getSSHClient(SCPResource scpResource, SCPSecret scpSecret) throws IOException {
SSHClient sshClient = new SSHClient();