GoogleDriveAPI.java Source code

Java tutorial

Introduction

Here is the source code for GoogleDriveAPI.java

Source

/*
 * Copyright (c) 2012 Google Inc.
 * 
 * Licensed 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.
 */

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.media.MediaHttpDownloader;
import com.google.api.client.googleapis.media.MediaHttpUploader;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.DataStoreFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.About;
import com.google.api.services.drive.model.File;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Collections;

/**
 * A sample application that runs multiple requests against the Drive API. The requests this sample
 * makes are:
 * <ul>
 * <li>Does a resumable media upload</li>
 * <li>Updates the uploaded file by renaming it</li>
 * <li>Does a resumable media download</li>
 * <li>Does a direct media upload</li>
 * <li>Does a direct media download</li>
 * </ul>
 *
 * @author rmistry@google.com (Ravi Mistry)
 */
public class GoogleDriveAPI {

    /**
     * Be sure to specify the name of your application. If the application name is {@code null} or
     * blank, the application will log a warning. Suggested format is "MyCompany-ProductName/1.0".
     */
    private static final String APPLICATION_NAME = "Secret_Cloud";

    // private static final String UPLOAD_FILE_PATH = "Enter File Path";
    // private static final String DIR_FOR_DOWNLOADS = "Enter Download Directory";
    // private static final java.io.File UPLOAD_FILE = new java.io.File(UPLOAD_FILE_PATH);

    // /** Directory to store user credentials. */
    // private static final java.io.File DATA_STORE_DIR = new java.io.File(
    // System.getProperty("user.home"), ".store/drive_sample");

    /**
     * Global instance of the {@link DataStoreFactory}. The best practice is to make it a single
     * globally shared instance across your application.
     */
    private static FileDataStoreFactory dataStoreFactory;

    /** Global instance of the HTTP transport. */
    private static HttpTransport httpTransport;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    /** Global Drive API client. */
    private static Drive drive;

    /** Current Email Credential */
    private static String currentEmail = null;

    /** Authorizes the installed application to access user's protected data. */
    private static Credential authorize() throws Exception {
        // load client secrets
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
                new InputStreamReader(GoogleDriveAPI.class.getResourceAsStream("/client_secrets.json")));
        if (clientSecrets.getDetails().getClientId().startsWith("Enter")
                || clientSecrets.getDetails().getClientSecret().startsWith("Enter ")) {
            System.out.println("Enter Client ID and Secret from https://code.google.com/apis/console/?api=drive "
                    + "into drive-cmdline-sample/src/main/resources/client_secrets.json");
            System.exit(1);
        }
        // set up authorization code flow
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY,
                clientSecrets, Collections.singleton(DriveScopes.DRIVE_FILE)).setDataStoreFactory(dataStoreFactory)
                        .build();
        // authorize
        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    }

    private static void setup(String email) {
        if (currentEmail != email) {
            currentEmail = email;
            try {
                /** Directory to store user credentials. */
                java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".store/" + email);
                httpTransport = GoogleNetHttpTransport.newTrustedTransport();
                dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
                // authorization
                Credential credential = authorize();
                // set up the global Drive instance
                drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential)
                        .setApplicationName(APPLICATION_NAME).build();
            } catch (IOException e) {
                System.err.println(e.getMessage());
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // Preconditions.checkArgument(
        // !UPLOAD_FILE_PATH.startsWith("Enter ") && !DIR_FOR_DOWNLOADS.startsWith("Enter "),
        // "Please enter the upload file path and download directory in %s", GoogleDriveAPI.class);
        //
        // try {
        // httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        // dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
        // // authorization
        // Credential credential = authorize();
        // // // set up the global Drive instance
        // drive =
        // new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(
        // APPLICATION_NAME).build();
        //
        // // run commands
        //
        // View.header1("Starting Resumable Media Upload");
        // File uploadedFile = uploadFile(false);
        //
        // View.header1("Updating Uploaded File Name");
        // File updatedFile = updateFileWithTestSuffix(uploadedFile.getId());
        //
        // View.header1("Starting Resumable Media Download");
        // downloadFile(false, updatedFile);
        //
        // View.header1("Starting Simple Media Upload");
        // uploadedFile = uploadFile(true);
        //
        // View.header1("Starting Simple Media Download");
        // downloadFile(true, uploadedFile);
        //
        // View.header1("Success!");
        // return;
        // } catch (IOException e) {
        // System.err.println(e.getMessage());
        // } catch (Throwable t) {
        // t.printStackTrace();
        // }
        // System.exit(1);
        // setup();
        // upload("D:\\?\\ISSUE.txt");
    }

    /** Uploads a file using either resumable or direct media upload. */
    public static String upload(String email, String filepath) throws IOException {
        setup(email);
        FileContent mediaContent = new FileContent("application/octet-stream", new java.io.File(filepath));
        Drive.Files.Insert insert = drive.files().insert(new File().setTitle(filepath), mediaContent);
        MediaHttpUploader uploader = insert.getMediaHttpUploader();
        // uploader.setDirectUploadEnabled(useDirectUpload);
        uploader.setProgressListener(new FileUploadProgressListener());
        return insert.execute().getId();
    }

    /** Downloads a file using either resumable or direct media download. */
    public static void download(String email, String fileID, String downFile) throws IOException {
        setup(email);
        // file path parsing
        String folderName, fileName;
        int idx = Math.max(downFile.lastIndexOf('/'), downFile.lastIndexOf('\\'));
        folderName = downFile.substring(0, idx);
        fileName = downFile.substring(idx + 1);
        // create parent directory (if necessary)
        java.io.File parentDir = new java.io.File(folderName);
        if (!parentDir.exists() && !parentDir.mkdirs()) {
            throw new IOException("Unable to create parent directory");
        }

        // OutputStream out = new FileOutputStream(new java.io.File(parentDir,
        // uploadedFile.getTitle()));
        OutputStream out = new FileOutputStream(new java.io.File(parentDir, fileName));

        File fileToDownload = drive.files().get(fileID).execute();
        MediaHttpDownloader downloader = new MediaHttpDownloader(httpTransport,
                drive.getRequestFactory().getInitializer());
        // downloader.setDirectDownloadEnabled(useDirectDownload);
        downloader.setProgressListener(new FileDownloadProgressListener());
        downloader.download(new GenericUrl(fileToDownload.getDownloadUrl()), out);
    }

    /** Delete a file on Google Drive. */
    /**
     * Permanently delete a file, skipping the trash.
     *
     * @param fileID ID of the file to delete.
     */
    public static void delete(String email, String fileID) throws IOException {
        setup(email);
        drive.files().delete(fileID).execute();
    }

    /**
     * Return available space of specific Google Drive.
     * 
     * @throws IOException
     **/
    public static long getSpace(String email) throws IOException {
        setup(email);
        About about = drive.about().get().execute();
        // System.out.println("Current user name: " + about.getName());
        // System.out.println("Root folder ID: " + about.getRootFolderId());
        // System.out.println("Total quota (bytes): " + about.getQuotaBytesTotal());
        // System.out.println("Used quota (bytes): " + about.getQuotaBytesUsed());
        return about.getQuotaBytesTotal() - about.getQuotaBytesUsed();
    }

}