blob: 526111cfdbb18d60f8082667e6a57f54fe557f01 [file] [log] [blame]
/*
* 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.transport.box;
import com.box.sdk.*;
import org.apache.airavata.mft.agent.stub.*;
import org.apache.airavata.mft.core.api.MetadataCollector;
import org.apache.airavata.mft.credential.stubs.box.BoxSecret;
import org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BoxMetadataCollector implements MetadataCollector {
private static final Logger logger = LoggerFactory.getLogger(BoxMetadataCollector.class);
boolean initialized = false;
private BoxStorage boxStorage;
private BoxSecret boxSecret;
@Override
public void init(StorageWrapper storage, SecretWrapper secret) {
this.boxStorage = storage.getBox();
this.boxSecret = secret.getBox();
this.initialized = true;
}
private void checkInitialized() {
if (!initialized) {
throw new IllegalStateException("S3 Metadata Collector is not initialized");
}
}
@Override
public ResourceMetadata getResourceMetadata(String resourcePath, boolean recursiveSearch) throws Exception {
checkInitialized();
BoxAPIConnection api = new BoxAPIConnection(boxSecret.getAccessToken());
BoxFile boxFile = null;
BoxFile.Info boxFileInfo = null;
BoxFolder boxFolder = null;
BoxFolder.Info boxFolderInfo;
boolean isFile = true;
ResourceMetadata.Builder resourceBuilder = ResourceMetadata.newBuilder();
try { // There is no API to derive the type of entry. So, manually checking the file type is used
boxFile = new BoxFile(api, resourcePath);
boxFileInfo = boxFile.getInfo();
} catch (BoxAPIException e) {
try {
boxFolder = new BoxFolder(api, resourcePath);
boxFolderInfo = boxFolder.getInfo();
isFile = false;
} catch (BoxAPIException ex) {
logger.error("Failed to fetch information of box item {}", resourcePath, ex);
resourceBuilder.setError(MetadataFetchError.NOT_FOUND);
return resourceBuilder.build();
}
}
if (isFile) {
FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
fileBuilder.setResourcePath(resourcePath);
fileBuilder.setFriendlyName(boxFileInfo.getName());
fileBuilder.setResourceSize(boxFileInfo.getSize());
fileBuilder.setCreatedTime(boxFileInfo.getCreatedAt().getTime());
fileBuilder.setUpdateTime(boxFileInfo.getModifiedAt().getTime());
resourceBuilder.setFile(fileBuilder);
} else {
DirectoryMetadata.Builder dirBuilder = DirectoryMetadata.newBuilder();
Iterable<BoxItem.Info> itemsInFolder = boxFolder.getChildren("metadata.global.properties");
for (BoxItem.Info itemInfo : itemsInFolder) {
if (itemInfo instanceof BoxFile.Info) {
BoxFile.Info fileInfo = (BoxFile.Info) itemInfo;
FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
fileBuilder.setResourcePath(fileInfo.getID());
fileBuilder.setFriendlyName(fileInfo.getName());
fileBuilder.setResourceSize(fileInfo.getSize());
fileBuilder.setCreatedTime(fileInfo.getCreatedAt().getTime());
fileBuilder.setUpdateTime(fileInfo.getModifiedAt().getTime());
dirBuilder.addFiles(fileBuilder);
} else if (itemInfo instanceof BoxFolder.Info) {
BoxFolder.Info folderInfo = (BoxFolder.Info) itemInfo;
DirectoryMetadata.Builder subDirBuilder = DirectoryMetadata.newBuilder();
subDirBuilder.setFriendlyName(folderInfo.getName());
subDirBuilder.setResourcePath(folderInfo.getID());
subDirBuilder.setCreatedTime(folderInfo.getCreatedAt().getTime());
subDirBuilder.setUpdateTime(folderInfo.getModifiedAt().getTime());
dirBuilder.addDirectories(subDirBuilder);
}
}
resourceBuilder.setDirectory(dirBuilder);
}
return resourceBuilder.build();
}
@Override
public Boolean isAvailable(String resourcePath) throws Exception {
checkInitialized();
BoxAPIConnection api = new BoxAPIConnection(boxSecret.getAccessToken());
try {
BoxFile boxFile = new BoxFile(api, resourcePath);
boxFile.getInfo();
} catch (BoxAPIException e) {
try {
BoxFolder boxFolder = new BoxFolder(api, resourcePath);
boxFolder.getInfo();
} catch (BoxAPIException ex) {
logger.warn("Failed to fetch information of box item {}", resourcePath, ex);
return false;
}
}
return true;
}
}