[Google Drive API v3] Javaでファイルのパーミッション情報を取得する

Google Drive API v3（Java）を使用して、
Driveに置かれているファイルのパーミッション情報を取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[パーミッションリストを取得](#1-パーミッションリストを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[パーミッションの情報を取得](#2-パーミッションの情報を取得)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|


## 1. パーミッションリストを取得

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY
```

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。
### 1.2. 実行
APIを実行します。
パーミッションリストは一度に最大100件まで取得できます。

setFieldsで取得したいフィールド（[PermissionList](#permissionlist)）を指定できます。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

レスポンスの[getNextPageToken](#permissionlist)がNULLではない場合、
全てのリストが取得できていません。
[クエリパラメータのsetPageToken](#122-クエリパラメータ)に取得できた値を設定し、
再度APIを実行します。
```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Permissions permissions = drive.permissions();
    
    Drive.Permissions.List list = permissions.list("ファイルID");
    list.setFields("*");
    
//レスポンスのgetNextPageTokenがNULLではない場合
//list.setPageToken("レスポンスのgetNextPageToken");

	PermissionList res = list.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/permissions
が実行されます。

#### 1.2.2. クエリパラメータ
Drive.Permissions.Listのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setPageSize|Integer|ページごとに返されるファイルの最大数|
|setPageToken|String|次のページで前のリスト要求を継続するためのトークン<br>**レスポンスのgetNextPageTokenで取得が可能**|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setUseDomainAdminAccess|Boolean|ドメイン管理者としてリクエストを発行するか|

### 1.3. レスポンスの内容

#### PermissionList

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|nextPageToken|getNextPageToken|String|次のページのページトークン<br>リストの最後の場合はNULL|
|kind|getKind|String|リソースの種類<br>固定文字列：\"drive#fileList\"|
|permissions|getPermissions|List\<[Permission](#permission)\>|パーミッションのリスト|

## 2. パーミッションの情報を取得

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。
### 2.2. 実行
パーミッションを取得したいファイルIDとパーミッションIDを指定します。

setFieldsで取得したいフィールド（[Permission](#permission)）を指定できます。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Permissions permissions = drive.permissions();
    
    Drive.Permissions.Get get = permissions.get("ファイルID", "パーミッションID");
    get.setFields("*");
    
    Permission res = get.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
GET：　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/permissions/{パーミッションID}
が実行されます。

#### 2.2.2. クエリパラメータ
Drive.Permissions.Getのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setUseDomainAdminAccess|Boolean|ドメイン管理者としてリクエストを発行するか|

### 2.3. レスポンスの内容

#### Permission

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|id|getId|String|パーミッションID|
|type|getType|String|[被付与者のタイプ](#アクセス権の付与タイプ)|
|displayName|getDisplayName|String|パーミッション名|
|kind|getKind|String|リソースの識別名<br>固定文字列：\"drive#permission\"|
|permissionDetails|getPermissionDetails|List\<[Permission.PermissionDetails](#permissionpermissiondetails)\>|アクセス許可の継承についての詳細<br>**共有ドライブのみ**|
|photoLink|getPhotoLink|String|ユーザーのプロフィール写真へのリンク|
|emailAddress|getEmailAddress|String|参照するユーザーまたはグループの電子メールアドレス|
|role|getRole|String|[付与される役割](#役割)|
|allowFileDiscovery|getAllowFileDiscovery|Boolean|検索によるファイルの検出を許可するパーミッションか<br>**typeがanyoneの場合のみ**|
|domain|getDomain|String|パーミッションが参照するドメイン|
|expirationTime|getExpirationTime|String|期限切れになる時刻|
|deleted|getDeleted|Boolean|関連付けられたアカウントが削除されているか<br>**typeがuser、groupの場合のみ**|
|view|getView|String|パーミッションのビュー(publishedのみ)|
|pendingOwner|getPendingOwner|Boolean|関連付けられたアカウントが保留中の所有者であるか|

#### Permission.PermissionDetails
|メソッド|戻り値|説明|
|---|---|---|
|getPermissionType|String|パーミッションのタイプ<br>file、member|
|getInheritedFrom|String|継承元となるアイテムのID|
|getRole|String|[主な役割](#役割)|
|getInherited|Boolean|パーミッションが継承されるかどうか|

#### アクセス権の付与タイプ
|タイプ|内容|
|---|---|
|user|単一のユーザーにアクセス許可を付与|
|group|グループにアクセス許可を付与|
|domain|ドメインにアクセス許可を付与|
|anyone|会社ドメインへのアクセス権を持つ人物にアクセス許可を付与|

#### 役割
|許可された操作|owner|organizer|fileOrganizer|writer|commenter|reader|
|---|---|---|---|---|---|---|
|ファイルまたはフォルダーのメタデータ (名前、説明など) を読み取ります。|o|o|o|o|o|o|
|ファイルの内容を読む|o|o|o|o|o|o|
|フォルダー内のアイテムのリストを読む|o|o|o|o|o|o|
|ファイルにコメントを追加する|o|o|o|o|o|x|
|ファイルまたはフォルダーのメタデータを変更する|o|o|o|o|x|x|
|ファイルの内容を変更する|o|o|o|o|x|x|
|過去のリビジョンにアクセスする|o|o|o|o|x|x|
|フォルダーにアイテムを追加する|o|o|o|o|x|x|
|「マイドライブ」フォルダからアイテムを削除する|o|x|x|o|x|x|
|「マイドライブ」フォルダーのアイテムを共有する|o|x|x|o|x|x|
|共有ドライブアイテムを共有する|x|o|o|o|x|x|
|共有ドライブにファイルを追加する|x|o|o|o|x|x|
|共有ドライブのメタデータを変更する|x|o|x|x|x|x|
|共有ドライブのメンバーを追加する|x|o|x|x|x|x|
|詳細なファイル権限にアクセスできます|o|o|o|o|x|x|
|共有ドライブ内のアイテムを再編成する|x|o|o|x|x|x|
|アイテムを共有ドライブの外に移動する|x|o|x|x|x|x|
|アイテムをゴミ箱に移動する|o|o|o|x|x|x|
|ゴミ箱からアイテムを回収する|o|o|o|x|x|x|
|ゴミ箱を空にする|o|o|x|x|x|x|
|ファイルまたはフォルダーを削除する|o|o|x|x|x|x|
|共有ドライブ内のアイテムを削除する|x|o|x|x|x|x|
|空の共有ドライブを削除する|x|o|x|x|x|x|
|マイドライブフォルダー内のファイルにコンテンツ制限を追加する|o|x|x|o|x|x|
|共有ドライブ内のファイルにコンテンツ制限を追加する|x|o|o|o|x|x|

<br>
<br>
おしまい。。