package de.cinovo.cloudconductor.server.repo.provider;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import de.cinovo.cloudconductor.server.repo.RepoEntry;
/**
* Copyright 2014 Hoegernet<br>
*
* @author Thorsten Hoeger
*/
public class AWSS3Provider implements IRepoProvider {
@Autowired
private AmazonS3 s3Client;
@Value("${repo.bucket}")
private String bucketName;
@Override
public boolean isListable() {
return true;
}
@Override
public List<RepoEntry> getEntries(String folder) {
List<RepoEntry> res = new ArrayList<>();
Set<String> folderNames = new HashSet<>();
ObjectListing objects = this.s3Client.listObjects(this.bucketName, folder);
List<S3ObjectSummary> summaries = objects.getObjectSummaries();
for (S3ObjectSummary objectSummary : summaries) {
String file = objectSummary.getKey().substring(folder.length());
if (file.contains("/")) {
file = file.substring(0, file.indexOf("/"));
if (!folderNames.contains(file)) {
folderNames.add(file);
RepoEntry dir = new RepoEntry();
dir.setName(file);
dir.setDirectory(true);
res.add(dir);
}
} else {
RepoEntry fil = new RepoEntry();
fil.setName(file);
fil.setDirectory(false);
fil.setModified(objectSummary.getLastModified());
fil.setSize(objectSummary.getSize());
fil.setChecksum(objectSummary.getETag());
res.add(fil);
}
}
if (objects.isTruncated()) {
// TODO handle this
}
return res;
}
@Override
public RepoEntry getEntry(String key) {
final ObjectMetadata obj = this.s3Client.getObjectMetadata(this.bucketName, key);
RepoEntry fil = new RepoEntry();
fil.setName(key);
fil.setDirectory(false);
fil.setModified(obj.getLastModified());
fil.setSize(obj.getContentLength());
fil.setContentType(obj.getContentType());
fil.setChecksum(obj.getETag());
return fil;
}
@Override
public InputStream getEntryStream(String key) {
S3Object s3Object = this.s3Client.getObject(this.bucketName, key);
return s3Object.getObjectContent();
}
}