protected File getFile(Drive drive, String extRepositoryObjectKey) throws IOException {

    GoogleDriveCache googleDriveCache = GoogleDriveCache.getInstance();

    File file = googleDriveCache.get(extRepositoryObjectKey);

    if (file == null) {
      Drive.Files driveFiles = drive.files();

      Drive.Files.Get driveFilesGet = driveFiles.get(extRepositoryObjectKey);

      file = driveFilesGet.execute();

      googleDriveCache.put(file);
    }

    return file;
  }
  @Override
  public void deleteExtRepositoryObject(
      ExtRepositoryObjectType<? extends ExtRepositoryObject> extRepositoryObjectType,
      String extRepositoryObjectKey)
      throws PortalException {

    try {
      Drive drive = getDrive();

      Drive.Files driveFiles = drive.files();

      Drive.Files.Delete driveFilesDelete = driveFiles.delete(extRepositoryObjectKey);

      driveFilesDelete.execute();

      GoogleDriveCache googleDriveCache = GoogleDriveCache.getInstance();

      googleDriveCache.remove(extRepositoryObjectKey);
    } catch (IOException ioe) {
      _log.error(ioe, ioe);

      throw new SystemException(ioe);
    }
  }
  @Override
  public <T extends ExtRepositoryObject> List<T> getExtRepositoryObjects(
      ExtRepositoryObjectType<T> extRepositoryObjectType, String extRepositoryFolderKey)
      throws PortalException {

    try {
      Drive drive = getDrive();

      Drive.Files driveFiles = drive.files();

      Drive.Files.List driveFilesList = driveFiles.list();

      StringBundler sb = new StringBundler();

      if (extRepositoryFolderKey != null) {
        sb.append("'");
        sb.append(extRepositoryFolderKey);
        sb.append("' in parents and ");
      }

      if (!extRepositoryObjectType.equals(ExtRepositoryObjectType.OBJECT)) {

        sb.append("mimeType");

        if (extRepositoryObjectType.equals(ExtRepositoryObjectType.FILE)) {

          sb.append(" != '");
        } else {
          sb.append(" = '");
        }

        sb.append(_FOLDER_MIME_TYPE);
        sb.append("' and ");
      }

      sb.append("trashed = false");

      driveFilesList.setQ(sb.toString());

      FileList fileList = driveFilesList.execute();

      List<File> files = fileList.getItems();

      List<T> extRepositoryObjects = new ArrayList<>();

      GoogleDriveCache googleDriveCache = GoogleDriveCache.getInstance();

      for (File file : files) {
        if (_FOLDER_MIME_TYPE.equals(file.getMimeType())) {
          extRepositoryObjects.add((T) new GoogleDriveFolder(file, getRootFolderKey()));
        } else {
          extRepositoryObjects.add((T) new GoogleDriveFileEntry(file));
        }

        googleDriveCache.put(file);
      }

      return extRepositoryObjects;
    } catch (IOException ioe) {
      _log.error(ioe, ioe);

      throw new SystemException(ioe);
    }
  }