import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.StorageScopes;
import com.google.api.services.storage.model.Bucket;
import com.google.api.services.storage.model.ObjectAccessControl;
import com.google.api.services.storage.model.StorageObject;
import com.google.common.collect.ImmutableList;
/**
* @author Ricardo Lecheta
*/
public class CloudStorageUtil {
private Storage client;
private static final JsonFactory JSON_FACTORY = JacksonFactory
.getDefaultInstance();
private final String applicationName;
private static HttpTransport httpTransport;
public CloudStorageUtil(String applicationName) {
super();
this.applicationName = applicationName;
}
// Conecta no Google APIs
public void connect(String accountId, File p12File) throws Exception {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
Credential credential = authorize(accountId, p12File);
client = new Storage.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(applicationName).build();
}
// Autoriza o acesso com "Server-Side Authorization"
private Credential authorize(String accountId, File p12File)
throws Exception {
Set<String> scopes = new HashSet<String>();
scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL);
scopes.add(StorageScopes.DEVSTORAGE_READ_ONLY);
scopes.add(StorageScopes.DEVSTORAGE_READ_WRITE);
// Autoriza a aplicação
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
HttpTransport httpTransport = GoogleNetHttpTransport
.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport).setJsonFactory(JSON_FACTORY)
.setServiceAccountId(accountId)
.setServiceAccountPrivateKeyFromP12File(p12File)
.setServiceAccountScopes(scopes).build();
return credential;
}
// Retorna um bucket
public Bucket getBucket(String bucketName) throws IOException {
Storage.Buckets.Get getBucket = client.buckets().get(bucketName);
getBucket.setProjection("full");
Bucket bucket = getBucket.execute();
return bucket;
}
// Lista os arquivos do bucket
public List<StorageObject> getBucketFiles(Bucket bucket) throws IOException {
Storage.Objects.List listObjects = client.objects().list(
bucket.getName());
com.google.api.services.storage.model.Objects objects;
ArrayList<StorageObject> all = new ArrayList<StorageObject>();
do {
objects = listObjects.execute();
List<StorageObject> items = objects.getItems();
if (null == items) {
// Sem arqivos
return all;
}
// Adiciona os arquivos
all.addAll(items);
listObjects.setPageToken(objects.getNextPageToken());
} while (null != objects.getNextPageToken());
return all;
}
// Faz upload do arquivo (INSERT) no storage.
public StorageObject upload(String bucketName, File file,
String contentType, String projectId) throws IOException {
if (client == null) {
throw new IOException("Cloud Storage API não está conectada");
}
if (file == null || !file.exists() || !file.isFile()) {
throw new FileNotFoundException("Arquivo não encontrado.");
}
// Nome do arquivo
String fileName = file.getName();
// Lê o arquivo
InputStream inputStream = new FileInputStream(file);
long byteCount = file.length();
InputStreamContent mediaContent = new InputStreamContent(contentType,
inputStream);
mediaContent.setLength(byteCount);
// Configura o acesso ACL = Access Control List
ImmutableList<ObjectAccessControl> acl = ImmutableList.of(
new ObjectAccessControl().setEntity(
String.format("project-owners-%s", projectId)).setRole(
"OWNER"),
new ObjectAccessControl().setEntity(
String.format("project-editors-%s", projectId))
.setRole("OWNER"),
new ObjectAccessControl().setEntity(
String.format("project-viewers-%s", projectId))
.setRole("READER"), new ObjectAccessControl()
.setEntity("allUsers").setRole("READER") // URL pública
);
// Configura o objeto
StorageObject obj = new StorageObject();
obj.setName(fileName); // nome
obj.setContentType(contentType); // tipo do conteúdo
obj.setAcl(acl); // permissões (foi configurado para URL pública
// Insere o objeto no Cloud Storage (file upload)
Storage.Objects.Insert insertObject = client.objects().insert(
bucketName, obj, mediaContent);
if (mediaContent.getLength() > 0
&& mediaContent.getLength() <= 2 * 1000 * 1000 /* 2MB */) {
// Utiliza o Direct Upload para arquivos pequenos
insertObject.getMediaHttpUploader().setDirectUploadEnabled(true);
}
// Executa a API
insertObject.execute();
return obj;
}
}