From c0509f08d22155ec8e33d9f30623c6a0d7189ffc Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Fri, 4 Oct 2019 14:08:26 -0400 Subject: [PATCH 001/254] Update google-api-services-docs dependency The current example dependency version does not include the APIs used in the [inserting and deleting tables](https://developers.google.com/docs/api/how-tos/tables#inserting_and_deleting_tables) section. --- docs/quickstart/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 7389b86b..cded13f2 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' -} \ No newline at end of file + compile 'com.google.api-client:google-api-client:1.30.1' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' + compile 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' +} From 410d7ec2ed2b20db9b52e06430f118f085026b6f Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Thu, 21 Nov 2019 16:53:12 +0200 Subject: [PATCH 002/254] Bump lib version google-api-client:1.23.0 has transitive dependency with guava-jdk5 (2014) which is not compatible with newer versions and is the cause of assembly errors. --- sheets/quickstart/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index ade2b272..cdf07781 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev516-1.23.0' + compile 'com.google.api-client:google-api-client:1.30.4' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4' + compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } From 39fbf48f5459e0ce1ea708841763a2a203897665 Mon Sep 17 00:00:00 2001 From: Oleksandr Soldatov Date: Thu, 12 Mar 2020 02:56:17 +0200 Subject: [PATCH 003/254] Update DocsQuickstart.java (#97) fix minor typo --- docs/quickstart/src/main/java/DocsQuickstart.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index 4943612d..cfc3900b 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -68,8 +68,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { From 6563898d309a3b4722b2e5e0806bab27c97540f9 Mon Sep 17 00:00:00 2001 From: seongwon Date: Tue, 2 Jun 2020 10:06:11 +0900 Subject: [PATCH 004/254] Fix #94 --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index cdf07781..731bc7c9 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { compile 'com.google.api-client:google-api-client:1.30.4' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } From e83e2f22b40d4a974c118436360c1d8a551be937 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 14 Oct 2020 13:02:49 -0600 Subject: [PATCH 005/254] Update readme for rebrand --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 672237e0..c2d18faf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# G Suite Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) -A collection of samples that demonstrate how to call G Suite APIs in Java. +A collection of samples that demonstrate how to call Google Workspace APIs in Java. ## APIs From a688d84ccb1ae5c1440a8fc3372bda8005caae25 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 27 Jan 2021 13:57:47 -0700 Subject: [PATCH 006/254] Rename gsuitedevs -> googleworkspace --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2d18faf..df42de15 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=master)](https://travis-ci.org/googleworkspace/java-samples) A collection of samples that demonstrate how to call Google Workspace APIs in Java. From 76805f8c5d448ca0519c6b64b4cbeb6333884708 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Wed, 5 May 2021 17:59:33 +0000 Subject: [PATCH 007/254] Add renovate.json --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..f45d8f11 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From ac56a087240db04312f1b2c73a4b4913680ab33d Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Mon, 6 Dec 2021 07:24:40 +0000 Subject: [PATCH 008/254] gmail quickstart to Java 11 --- gmail/quickstart/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index e073c032..db3dbb6a 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'GmailQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' } From 258c0540fad69f83ee74ab2ad023f21a4222619f Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Tue, 7 Dec 2021 15:21:26 +0000 Subject: [PATCH 009/254] Changed quickstarts to run in Java 11 Changed inlined functions returns. Added class level and instance variable comments. --- adminSDK/alertcenter/quickstart/build.gradle | 10 +++++----- adminSDK/directory/quickstart/build.gradle | 10 +++++----- adminSDK/reports/quickstart/build.gradle | 10 +++++----- adminSDK/reseller/quickstart/build.gradle | 10 +++++----- appsScript/quickstart/build.gradle | 10 +++++----- calendar/quickstart/build.gradle | 10 +++++----- classroom/quickstart/build.gradle | 10 +++++----- docs/outputJSON/build.gradle | 12 ++++++------ docs/quickstart/build.gradle | 10 +++++----- drive/activity-v2/quickstart/build.gradle | 10 +++++----- drive/activity/quickstart/build.gradle | 10 +++++----- .../src/main/java/DriveActivityQuickstart.java | 10 ++++++---- drive/quickstart/build.gradle | 10 +++++----- .../src/main/java/DriveQuickstart.java | 12 +++++++++--- .../src/main/java/GmailQuickstart.java | 12 +++++++++--- people/quickstart/build.gradle | 10 +++++----- sheets/quickstart/build.gradle | 10 +++++----- sheets/snippets/build.gradle | 8 ++++---- slides/quickstart/build.gradle | 10 +++++----- slides/snippets/build.gradle | 10 +++++----- tasks/quickstart/build.gradle | 10 +++++----- vault/quickstart/build.gradle | 10 +++++----- vault/vault-hold-migration-api/build.gradle | 18 +++++++++--------- 23 files changed, 128 insertions(+), 114 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index d044218e..b30fc6eb 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'AdminSDKAlertCenterQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.auth:google-auth-library-oauth2-http:0.11.0' - compile 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:0.11.0' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index d6a9fc0e..058eb0a4 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKDirectoryQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index eb8e50bb..e4946ce5 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKReportsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 5c64d3d8..c07d181f 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKResellerQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index dfa909d7..00206b7f 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AppsScriptQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 2e580223..ad1e25df 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'CalendarQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' } diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 517a3543..da87f9e8 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 401c8edd..74b22343 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'OutputJSON' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,8 +11,8 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' - compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.3.1' } diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index cded13f2..b65a16c2 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DocsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.1' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' - compile 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' + implementation 'com.google.api-client:google-api-client:1.30.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 1c756882..a53c5b5a 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.27.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - compile 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' + implementation 'com.google.api-client:google-api-client:1.27.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index d031b8ac..6368959a 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' } diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index ea0f22bf..c28cdd13 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -20,7 +20,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; @@ -35,7 +35,7 @@ import java.util.Arrays; import java.util.List; - +/* class to demonstarte use of Drive Activity list API */ public class DriveActivityQuickstart { /** Application name. */ private static final String APPLICATION_NAME = @@ -49,7 +49,7 @@ public class DriveActivityQuickstart { /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = - JacksonFactory.getDefaultInstance(); + GsonFactory.getDefaultInstance(); /** Global instance of the HTTP transport. */ private static HttpTransport HTTP_TRANSPORT; @@ -97,6 +97,7 @@ public static Credential authorize() throws IOException { flow, new LocalServerReceiver()).authorize("user"); System.out.println( "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + //returns an authorized Credential object. return credential; } @@ -107,10 +108,11 @@ public static Credential authorize() throws IOException { */ public static Appsactivity getAppsactivityService() throws IOException { Credential credential = authorize(); - return new Appsactivity.Builder( + Appsactivity service = new Appsactivity.Builder( HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME) .build(); + return service; } public static void main(String[] args) throws IOException { diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 1a6964bc..5df459b7 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' } diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 33b6ae9e..b9df6ab6 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; @@ -36,9 +36,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Drive files list API */ public class DriveQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 4aee4cfc..f6d1e569 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; @@ -36,9 +36,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Gmail list lalels API */ public class GmailQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 69a500f6..c91051c0 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'PeopleQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 731bc7c9..1e8aae5f 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SheetsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.4' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' - compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' + implementation 'com.google.api-client:google-api-client:1.30.4' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' + implementation 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 5e599ff9..2f64b589 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,10 +6,10 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.api-client:google-api-client:1.22.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' + implementation 'junit:junit:4.12' } test { diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 8d86e30b..279e0126 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SlidesQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' } diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 300684f4..71f55203 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -6,11 +6,11 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.api-client:google-api-client:1.22.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' + implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'junit:junit:4.12' compile fileTree(dir: 'lib', include: ['*.jar']) } diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 1e4b111a..d1a6fd75 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'TasksQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 1e7b2e97..274e6d48 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'Quickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 25933cd7..ef33dd66 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'com.google.vault.chatmigration.QuickStart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,11 +12,11 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' - compile group: 'org.apache.commons', name: 'commons-csv', version: '1.1' - compile "com.github.rholder:guava-retrying:2.0.0" - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' - compile group: 'commons-cli', name: 'commons-cli', version: '1.4' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.1' + implementation "com.github.rholder:guava-retrying:2.0.0" + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.4' } \ No newline at end of file From b35d59535c96e4f77d751a8b6409b2107a686773 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 8 Dec 2021 15:14:40 +0000 Subject: [PATCH 010/254] Changed inlined functions returns. Added class level and instance variable comments. --- .../quickstart/src/main/java/CalendarQuickstart.java | 12 +++++++++--- docs/quickstart/src/main/java/DocsQuickstart.java | 12 +++++++++--- .../src/main/java/DriveActivityQuickstart.java | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index f173a632..8cdde63f 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.DateTime; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.calendar.Calendar; @@ -37,9 +37,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Calendar events list API */ public class CalendarQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -70,7 +74,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index cfc3900b..f8321a67 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.docs.v1.Docs; import com.google.api.services.docs.v1.DocsScopes; @@ -35,9 +35,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Docs get documents API */ public class DocsQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 30f9d1cb..685f8648 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -108,10 +108,11 @@ public static Credential authorize() throws IOException { public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() throws IOException { Credential credential = authorize(); - return new com.google.api.services.driveactivity.v2.DriveActivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) + com.google.api.services.driveactivity.v2.DriveActivity service = new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME) .build(); + return service; } public static void main(String[] args) throws IOException { From 8f877ae1a1ea2e273a1d8a26e23fb2e7b3b31ee3 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Thu, 9 Dec 2021 14:42:58 +0000 Subject: [PATCH 011/254] Updated dependent libraries versions --- adminSDK/alertcenter/quickstart/build.gradle | 6 +++--- adminSDK/directory/quickstart/build.gradle | 6 +++--- adminSDK/reports/quickstart/build.gradle | 6 +++--- adminSDK/reseller/quickstart/build.gradle | 6 +++--- appsScript/quickstart/build.gradle | 6 +++--- calendar/quickstart/build.gradle | 6 +++--- classroom/quickstart/build.gradle | 6 +++--- docs/outputJSON/build.gradle | 8 ++++---- docs/quickstart/build.gradle | 6 +++--- drive/activity-v2/quickstart/build.gradle | 6 +++--- drive/activity/quickstart/build.gradle | 6 +++--- drive/quickstart/build.gradle | 6 +++--- gmail/quickstart/build.gradle | 6 +++--- people/quickstart/build.gradle | 6 +++--- sheets/quickstart/build.gradle | 6 +++--- sheets/snippets/build.gradle | 11 +++++------ slides/quickstart/build.gradle | 6 +++--- slides/snippets/build.gradle | 15 +++++++-------- tasks/quickstart/build.gradle | 6 +++--- vault/quickstart/build.gradle | 6 +++--- vault/vault-hold-migration-api/build.gradle | 14 +++++++------- 21 files changed, 74 insertions(+), 76 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index b30fc6eb..cdc190e5 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:0.11.0' - implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 058eb0a4..e15faceb 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index e4946ce5..5ba0c3a3 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index c07d181f..d8f6bc70 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 00206b7f..6cca05b5 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index ad1e25df..4df9dda7 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index da87f9e8..003f253d 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 74b22343..7a1ed8e7 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,8 +11,8 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' - implementation group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' } diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index b65a16c2..ce6efbf9 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.30.1' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index a53c5b5a..0ae0460b 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.27.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 6368959a..147b79d4 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 5df459b7..5a86fe3c 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index db3dbb6a..4142d13f 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index c91051c0..ef620f9a 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 1e8aae5f..fa80f645 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.30.4' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' - implementation 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 2f64b589..56829c60 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - implementation 'com.google.api-client:google-api-client:1.22.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' - implementation 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + testImplementation 'junit:junit:4.13.2' } test { diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 279e0126..cc5e201b 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 71f55203..1279246b 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -1,18 +1,17 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - implementation 'com.google.api-client:google-api-client:1.22.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' - implementation 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + testImplementation 'junit:junit:4.13.2' - compile fileTree(dir: 'lib', include: ['*.jar']) + implementation fileTree(dir: 'lib', include: ['*.jar']) } test { diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index d1a6fd75..9694c0ce 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 274e6d48..f529a705 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index ef33dd66..d0466b63 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,11 +12,11 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' - implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.1' - implementation "com.github.rholder:guava-retrying:2.0.0" - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' - implementation group: 'commons-cli', name: 'commons-cli', version: '1.4' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' + implementation 'com.github.rholder:guava-retrying:2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 72c0ffa9d77fbb0501aea7adad68fb3d938285e0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 16 Dec 2021 17:04:34 -0700 Subject: [PATCH 012/254] Enable lint workflows + delint --- .github/ISSUE_TEMPLATE.md | 18 +- .github/linters/sun_checks.xml | 361 +++++++++++++++++++++++++++++++++ .github/workflows/lint.yaml | 42 ++++ README.md | 4 +- sheets/snippets/test.sh | 3 - slides/snippets/test.sh | 3 - 6 files changed, 416 insertions(+), 15 deletions(-) create mode 100644 .github/linters/sun_checks.xml create mode 100644 .github/workflows/lint.yaml delete mode 100755 sheets/snippets/test.sh delete mode 100755 slides/snippets/test.sh diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9841d4e9..38a3c6e9 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,16 @@ -(Please fill out these details before submitting an issue) +# Summary + +(description of issue) + +## Sample Name -### Sample Name (i.e. Gmail Quickstart) -### Expected Behavior +## Expected Behavior + +## Actual Behavior -### Actual Behavior +## Specifications -### Specifications - - Java version (`java -version`) - - OS (Mac/Linux/Windows) +- Java version (`java -version`) +- OS (Mac/Linux/Windows) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml new file mode 100644 index 00000000..5585111e --- /dev/null +++ b/.github/linters/sun_checks.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 00000000..eb5e90a1 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,42 @@ +# Copyright 2021 Google LLC +# +# 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. +name: Lint +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + lint: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2.4.0 + with: + fetch-depth: 0 + - uses: github/super-linter/slim@v4.8.4 + env: + ERROR_ON_MISSING_EXEC_BIT: true + VALIDATE_JSCPD: false + VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-node@v2 + with: + node-version: '14' + - run: npm install + - run: npm run lint \ No newline at end of file diff --git a/README.md b/README.md index df42de15..189f8f47 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A collection of samples that demonstrate how to call Google Workspace APIs in Ja - [Quickstart](https://developers.google.com/calendar/quickstart/java) - [Sync Tokens and Etags](calendar/sync) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) ### Classroom @@ -32,7 +32,7 @@ A collection of samples that demonstrate how to call Google Workspace APIs in Ja ### Drive V3 - [Quickstart](https://developers.google.com/drive/v3/web/quickstart/java) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) ### Gmail diff --git a/sheets/snippets/test.sh b/sheets/snippets/test.sh deleted file mode 100755 index 49d2c9e8..00000000 --- a/sheets/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test --rerun-tasks # --rerun-tasks forces UP-TO-DATE tests to re-run diff --git a/slides/snippets/test.sh b/slides/snippets/test.sh deleted file mode 100755 index fbe3fff3..00000000 --- a/slides/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test \ No newline at end of file From b8aad560e523a6a257acb014a84909ad9d5bf537 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 16 Dec 2021 17:08:21 -0700 Subject: [PATCH 013/254] Remove stray steps from original --- .github/workflows/lint.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index eb5e90a1..aecee5dd 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -35,8 +35,3 @@ jobs: VALIDATE_JSCPD: false VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/setup-node@v2 - with: - node-version: '14' - - run: npm install - - run: npm run lint \ No newline at end of file From 3e4944eb771116f87ab36ddcd6b9314fd8d52922 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Mon, 20 Dec 2021 20:18:46 +0000 Subject: [PATCH 014/254] Update github/super-linter action to v4.8.5 --- .github/workflows/lint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index aecee5dd..659b0c58 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v2.4.0 with: fetch-depth: 0 - - uses: github/super-linter/slim@v4.8.4 + - uses: github/super-linter/slim@v4.8.5 env: ERROR_ON_MISSING_EXEC_BIT: true VALIDATE_JSCPD: false From 5bc9700c1d1bbaa807238f79e0a2c1b1e2a1dbb8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Thu, 6 Jan 2022 01:30:59 +0000 Subject: [PATCH 015/254] Update dependency com.google.http-client:google-http-client-jackson2 to v1.41.0 --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 29f97014..4a0019f6 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -81,7 +81,7 @@ - 1.40.1 + 1.41.0 1.32.1 UTF-8 From 70fbe39ca34c590e1d2c6680c0500e6cd850c846 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Thu, 6 Jan 2022 03:28:40 +0000 Subject: [PATCH 016/254] Update dependency com.google.api-client:google-api-client to v1.33.0 --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- adminSDK/directory/quickstart/build.gradle | 2 +- adminSDK/reports/quickstart/build.gradle | 2 +- adminSDK/reseller/quickstart/build.gradle | 2 +- appsScript/quickstart/build.gradle | 2 +- calendar/quickstart/build.gradle | 2 +- calendar/sync/pom.xml | 2 +- classroom/quickstart/build.gradle | 2 +- docs/outputJSON/build.gradle | 2 +- docs/quickstart/build.gradle | 2 +- drive/activity-v2/quickstart/build.gradle | 2 +- drive/activity/quickstart/build.gradle | 2 +- drive/quickstart/build.gradle | 2 +- gmail/quickstart/build.gradle | 2 +- people/quickstart/build.gradle | 2 +- sheets/quickstart/build.gradle | 2 +- slides/quickstart/build.gradle | 2 +- tasks/quickstart/build.gradle | 2 +- vault/quickstart/build.gradle | 2 +- vault/vault-hold-migration-api/build.gradle | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index cdc190e5..5cd6a28e 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index e15faceb..4ea5ca58 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 5ba0c3a3..80e4d79b 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index d8f6bc70..11603c02 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 6cca05b5..4990f03e 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 4df9dda7..1c1455c3 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 29f97014..50ae2e8e 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -61,7 +61,7 @@ com.google.api-client google-api-client - 1.32.2 + 1.33.0 com.google.http-client diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 003f253d..c3dd8ad2 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 7a1ed8e7..9a65d38a 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index ce6efbf9..48c9c11a 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 0ae0460b..7d0a08b6 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 147b79d4..32e034a8 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 5a86fe3c..b83619da 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 4142d13f..0dae0ebf 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index ef620f9a..6b72f13a 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index fa80f645..d5b89b8c 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index cc5e201b..36d3ef1d 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 9694c0ce..d1d434d1 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index f529a705..c7428927 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index d0466b63..83db2baf 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' From aef537cd9ba4a95a2697856682d5f7d842be0604 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 14:56:19 -0800 Subject: [PATCH 017/254] Added pull request template Added pull request template --- .github/pull_request_template.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..1acd3625 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ +# Description + +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. + +Fixes # (issue) + +# Is it been tested? +- [ ] Development testing done + +# Checklist: + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have performed a peer-reviewed with team member(s) +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] Any dependent changes have been merged and published in downstream modules From ce3c7c444f253fe5c21ee5d48b1679b3406f9746 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 15:46:32 -0800 Subject: [PATCH 018/254] Updated header Updated header --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1acd3625..ab678c3a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,10 +4,10 @@ Please include a summary of the change and which issue is fixed. Please also inc Fixes # (issue) -# Is it been tested? +## Is it been tested? - [ ] Development testing done -# Checklist: +## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code From c6b4d78dabfb1780c0366afc7960de968984c8c0 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 15:57:19 -0800 Subject: [PATCH 019/254] removed colon removed colon --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ab678c3a..c0834862 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,7 +7,7 @@ Fixes # (issue) ## Is it been tested? - [ ] Development testing done -## Checklist: +## Checklist - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code From 2fed7d145f9961991ad151e25c3609e03a00b238 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 18 Jan 2022 10:46:34 -0800 Subject: [PATCH 020/254] git-on-borg files of gmail-api-snippets (#151) Co-authored-by: sanjuktaghosh7 --- gmail/snippets/.gitignore | 61 +++ gmail/snippets/build.gradle | 18 + gmail/snippets/settings.gradle | 19 + gmail/snippets/src/main/java/SendEmail.java | 183 ++++++++ .../src/main/java/SettingsSnippets.java | 106 +++++ .../snippets/src/main/java/SmimeSnippets.java | 275 ++++++++++++ gmail/snippets/src/test/java/BaseTest.java | 81 ++++ .../snippets/src/test/java/SendEmailTest.java | 70 +++ .../src/test/java/SettingsSnippetsTest.java | 77 ++++ .../src/test/java/SmimeSnippetsTest.java | 410 ++++++++++++++++++ 10 files changed, 1300 insertions(+) create mode 100644 gmail/snippets/.gitignore create mode 100644 gmail/snippets/build.gradle create mode 100644 gmail/snippets/settings.gradle create mode 100644 gmail/snippets/src/main/java/SendEmail.java create mode 100644 gmail/snippets/src/main/java/SettingsSnippets.java create mode 100644 gmail/snippets/src/main/java/SmimeSnippets.java create mode 100644 gmail/snippets/src/test/java/BaseTest.java create mode 100644 gmail/snippets/src/test/java/SendEmailTest.java create mode 100644 gmail/snippets/src/test/java/SettingsSnippetsTest.java create mode 100644 gmail/snippets/src/test/java/SmimeSnippetsTest.java diff --git a/gmail/snippets/.gitignore b/gmail/snippets/.gitignore new file mode 100644 index 00000000..060526ad --- /dev/null +++ b/gmail/snippets/.gitignore @@ -0,0 +1,61 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ + +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries +# .idea/shelf + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle new file mode 100644 index 00000000..bd5284f5 --- /dev/null +++ b/gmail/snippets/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenLocal() + jcenter() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.22.0' + compile 'com.google.apis:google-api-services-gmail:v1-rev62-1.22.0' + compile 'com.google.code.gson:gson:2.4' + compile 'javax.mail:mail:1.4' + compile 'org.apache.commons:commons-csv:1.1' + testCompile 'junit:junit:4.12' + testCompile 'org.hamcrest:hamcrest-all:1.3' + testCompile 'org.mockito:mockito-core:2.7.19' +} diff --git a/gmail/snippets/settings.gradle b/gmail/snippets/settings.gradle new file mode 100644 index 00000000..f93899b1 --- /dev/null +++ b/gmail/snippets/settings.gradle @@ -0,0 +1,19 @@ +/* + * This settings file was auto generated by the Gradle buildInit task + * by 'sbazyl' at '10/22/15 11:30 AM' with Gradle 2.7 + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/2.7/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'java' diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java new file mode 100644 index 00000000..e8f39050 --- /dev/null +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -0,0 +1,183 @@ +import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +// ... + +public class SendEmail { + + // ... + + // [START create_draft] + /** + * Create draft email. + * + * @param service an authorized Gmail API instance + * @param userId user's email address. The special value "me" + * can be used to indicate the authenticated user + * @param emailContent the MimeMessage used as email within the draft + * @return the created draft + * @throws MessagingException + * @throws IOException + */ + public static Draft createDraft(Gmail service, + String userId, + MimeMessage emailContent) + throws MessagingException, IOException { + Message message = createMessageWithEmail(emailContent); + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create(userId, draft).execute(); + + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } + // [END create_draft] + + + // [START send_email] + /** + * Send an email from the user's mailbox to its recipient. + * + * @param service Authorized Gmail API instance. + * @param userId User's email address. The special value "me" + * can be used to indicate the authenticated user. + * @param emailContent Email to be sent. + * @return The sent message + * @throws MessagingException + * @throws IOException + */ + public static Message sendMessage(Gmail service, + String userId, + MimeMessage emailContent) + throws MessagingException, IOException { + Message message = createMessageWithEmail(emailContent); + message = service.users().messages().send(userId, message).execute(); + + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } + // [END send_email] + + + // [START create_message] + /** + * Create a message from an email. + * + * @param emailContent Email to be set to raw of message + * @return a message containing a base64url encoded email + * @throws IOException + * @throws MessagingException + */ + public static Message createMessageWithEmail(MimeMessage emailContent) + throws MessagingException, IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + emailContent.writeTo(buffer); + byte[] bytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(bytes); + Message message = new Message(); + message.setRaw(encodedEmail); + return message; + } + // [END create_message] + + // [START create_email] + /** + * Create a MimeMessage using the parameters provided. + * + * @param to email address of the receiver + * @param from email address of the sender, the mailbox account + * @param subject subject of the email + * @param bodyText body text of the email + * @return the MimeMessage to be used to send email + * @throws MessagingException + */ + public static MimeMessage createEmail(String to, + String from, + String subject, + String bodyText) + throws MessagingException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(from)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(to)); + email.setSubject(subject); + email.setText(bodyText); + return email; + } + // [END create_email] + + + // [START create_email_attachment] + /** + * Create a MimeMessage using the parameters provided. + * + * @param to Email address of the receiver. + * @param from Email address of the sender, the mailbox account. + * @param subject Subject of the email. + * @param bodyText Body text of the email. + * @param file Path to the file to be attached. + * @return MimeMessage to be used to send email. + * @throws MessagingException + */ + public static MimeMessage createEmailWithAttachment(String to, + String from, + String subject, + String bodyText, + File file) + throws MessagingException, IOException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(from)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(to)); + email.setSubject(subject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + return email; + } + // [END create_email_attachment] + + // ... + +} diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java new file mode 100644 index 00000000..fab67fa6 --- /dev/null +++ b/gmail/snippets/src/main/java/SettingsSnippets.java @@ -0,0 +1,106 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + + +public class SettingsSnippets { + + private Gmail service; + + public SettingsSnippets(Gmail service) { + this.service = service; + } + + public String updateSignature() throws IOException { + Gmail gmailService = this.service; + // [START updateSignature] + SendAs primaryAlias = null; + ListSendAsResponse aliases = gmailService.users().settings().sendAs().list("me").execute(); + for (SendAs alias: aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; + } + } + SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs result = gmailService.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + System.out.println("Updated signature for " + result.getDisplayName()); + // [END updateSignature] + return result.getSignature(); + } + + public String createFilter(String realLabelId) throws IOException { + Gmail gmailService = this.service; + // [START createFilter] + String labelId = "Label_14"; // ID of the user label to add + // [START_EXCLUDE silent] + labelId = realLabelId; + // [END_EXCLUDE] + Filter filter = new Filter() + .setCriteria(new FilterCriteria() + .setFrom("cat-enthusiasts@example.com")) + .setAction(new FilterAction() + .setAddLabelIds(Arrays.asList(labelId)) + .setRemoveLabelIds(Arrays.asList("INBOX"))); + Filter result = gmailService.users().settings().filters().create("me", filter).execute(); + System.out.println("Created filter " + result.getId()); + // [END createFilter] + return result.getId(); + } + + public AutoForwarding enableForwarding(String realForwardingAddress) throws IOException { + Gmail gmailService = this.service; + // [START enableForwarding] + ForwardingAddress address = new ForwardingAddress() + .setForwardingEmail("user2@example.com"); + // [START_EXCLUDE silent] + address.setForwardingEmail(realForwardingAddress); + // [END_EXCLUDE] + ForwardingAddress createAddressResult = gmailService.users().settings().forwardingAddresses() + .create("me", address).execute(); + if (createAddressResult.getVerificationStatus().equals("accepted")) { + AutoForwarding autoForwarding = new AutoForwarding() + .setEnabled(true) + .setEmailAddress(address.getForwardingEmail()) + .setDisposition("trash"); + autoForwarding = gmailService.users().settings().updateAutoForwarding("me", autoForwarding).execute(); + // [START_EXCLUDE silent] + return autoForwarding; + } + // [END enableForwarding] + return null; + } + + public VacationSettings enableAutoReply() throws IOException { + Gmail gmailService = this.service; + // [START enableAutoReply] + VacationSettings vacationSettings = new VacationSettings() + .setEnableAutoReply(true) + .setResponseBodyHtml("I'm on vacation and will reply when I'm back in the office. Thanks!") + .setRestrictToDomain(true) + .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.UTC) * 1000); + VacationSettings response = gmailService.users().settings().updateVacation("me", vacationSettings).execute(); + // [END enableAutoReply] + return response; + } + +} diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java new file mode 100644 index 00000000..12f895ca --- /dev/null +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -0,0 +1,275 @@ +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Base64; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +class SmimeSnippets { + + SmimeSnippets() {} + + // [START create_smime_info] + /** + * Create an SmimeInfo resource for a certificate from file. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file is not + * password-protected. + * @return An SmimeInfo object with the specified certificate. + */ + public static SmimeInfo createSmimeInfo(String filename, String password) { + SmimeInfo smimeInfo = null; + InputStream in = null; + + try { + File file = new File(filename); + in = new FileInputStream(file); + byte fileContent[] = new byte[(int) file.length()]; + in.read(fileContent); + + smimeInfo = new SmimeInfo(); + smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); + if (password != null && password.length() > 0) { + smimeInfo.setEncryptedKeyPassword(password); + } + } catch (Exception e) { + System.out.printf("An error occured while reading the certificate file: %s\n", e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException ioe) { + System.out.printf("An error occured while closing the input stream: %s\n", ioe); + } + } + + return smimeInfo; + } + // [END create_smime_info] + + // [START insert_smime_info] + /** + * Upload an S/MIME certificate for the user. + * + * @param service Authorized GMail API service instance. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate. + */ + public static SmimeInfo insertSmimeInfo( + Gmail service, String userId, String sendAsEmail, SmimeInfo smimeInfo) { + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + try { + SmimeInfo results = + service + .users() + .settings() + .sendAs() + .smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); + } + + return null; + } + // [END insert_smime_info] + + // [START insert_cert_from_csv] + /** + * A builder that returns a GMail API service instance that is authorized to act on behalf of the + * specified user. + */ + @FunctionalInterface + public interface GmailServiceBuilder { + Gmail buildGmailServiceFromUserId(String userId) throws IOException; + } + + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param serviceBuilder A function that returns an authorized GMail API service instance for a + * given user. + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); + if (smimeInfo != null) { + insertSmimeInfo( + serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); + } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } + // [END insert_cert_from_csv] + + // [START update_smime_certs] + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param service Authorized GMail API service instance. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certifcate. + */ + public static String updateSmimeCerts( + Gmail service, + String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) { + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + ListSmimeInfoResponse listResults = null; + try { + listResults = + service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } + + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; + + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; + } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } + } else { + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); + SmimeInfo insertResults = insertSmimeInfo(service, userId, sendAsEmail, smimeInfo); + if (insertResults != null) { + defaultId = insertResults.getId(); + } + } + + if (defaultId != null) { + try { + service + .users() + .settings() + .sendAs() + .smimeInfo() + .setDefault(userId, sendAsEmail, defaultId) + .execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; + } + + return null; + } + + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param serviceBuilder A function that returns an authorized GMail API service instance for a + * given user. + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv( + GmailServiceBuilder serviceBuilder, String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse( + csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + updateSmimeCerts( + serviceBuilder.buildGmailServiceFromUserId(userId), + userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } + // [END update_smime_certs] +} diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..9fa3740f --- /dev/null +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -0,0 +1,81 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + + public static final String TEST_USER = "gdtest1@appsrocks.com"; + public static final String RECIPIENT = "gdtest2@appsrocks.com"; + public static final String FORWARDING_ADDRESS = "gdtest2@appsrocks.com"; + + static { + enableLogging(); + } + + protected Gmail service; + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + GoogleCredential defaultCredentials = GoogleCredential.getApplicationDefault(); + return new GoogleCredential.Builder() + .setServiceAccountId(defaultCredentials.getServiceAccountId()) + .setServiceAccountPrivateKey(defaultCredentials.getServiceAccountPrivateKey()) + .setServiceAccountPrivateKeyId(defaultCredentials.getServiceAccountPrivateKeyId()) + .setServiceAccountUser(TEST_USER) + .setJsonFactory(defaultCredentials.getJsonFactory()) + .setTransport(defaultCredentials.getTransport()) + .setServiceAccountScopes(Arrays.asList(GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_SEND, GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_SETTINGS_SHARING)) + .build(); + } + + public Gmail buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Gmail.Builder( + new NetHttpTransport(), + JacksonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + } + +} diff --git a/gmail/snippets/src/test/java/SendEmailTest.java b/gmail/snippets/src/test/java/SendEmailTest.java new file mode 100644 index 00000000..6d17129b --- /dev/null +++ b/gmail/snippets/src/test/java/SendEmailTest.java @@ -0,0 +1,70 @@ +import com.google.api.services.gmail.model.*; +import org.junit.Test; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class SendEmailTest extends BaseTest { + + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } + + @Test + public void createEmailWithAttachment() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, + TEST_USER, + "test", + "Hello!", + new java.io.File("files/photo.jpg")); + assertEquals("test", mimeMessage.getSubject()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } + + @Test + public void createMessageWithEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + + com.google.api.services.gmail.model.Message message = SendEmail.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } + + @Test + public void createDraft() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + Draft draft = SendEmail.createDraft(this.service, "me", mimeMessage); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()); + } + + @Test + public void sendEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, + TEST_USER, + "test", + "Hello!", + new java.io.File("files/photo.jpg")); + com.google.api.services.gmail.model.Message message = SendEmail.sendMessage(this.service, "me", mimeMessage); + assertNotNull(message); + } +} diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java new file mode 100644 index 00000000..8622e8d4 --- /dev/null +++ b/gmail/snippets/src/test/java/SettingsSnippetsTest.java @@ -0,0 +1,77 @@ + +import com.google.api.services.gmail.model.AutoForwarding; +import com.google.api.services.gmail.model.Label; +import com.google.api.services.gmail.model.ListLabelsResponse; +import com.google.api.services.gmail.model.VacationSettings; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class SettingsSnippetsTest extends BaseTest { + + private SettingsSnippets snippets; + private Label testLabel = null; + + @Before + public void createSnippets() { + this.snippets = new SettingsSnippets(this.service); + } + + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } + } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } + + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; + } + } + + @Test + public void updateSignature() throws IOException, GeneralSecurityException { + String signature = this.snippets.updateSignature(); + assertEquals("I heart cats.", signature); + } + + @Test + public void createFilter() throws IOException, GeneralSecurityException { + String id = this.snippets.createFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } + + @Test + public void enableAutoForwarding() throws IOException, GeneralSecurityException { + AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } + + @Test + public void enableAutoReply() throws IOException, GeneralSecurityException { + VacationSettings settings = this.snippets.enableAutoReply(); + assertNotNull(settings); + } +} diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java new file mode 100644 index 00000000..6aefb3e3 --- /dev/null +++ b/gmail/snippets/src/test/java/SmimeSnippetsTest.java @@ -0,0 +1,410 @@ +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +public class SmimeSnippetsTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + private static final String TEST_USER = "user1@example.com"; + + @Mock private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @After + public void tearDown() throws IOException { + verifyNoMoreInteractions(mockService); + verifyNoMoreInteractions(mockUsers); + verifyNoMoreInteractions(mockSettings); + verifyNoMoreInteractions(mockSendAs); + verifyNoMoreInteractions(mockSmimeInfo); + verifyNoMoreInteractions(mockInsert); + verifyNoMoreInteractions(mockList); + verifyNoMoreInteractions(mockSetDefault); + + verifyZeroInteractions(mockDelete); + verifyZeroInteractions(mockGet); + } + + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", "certpass"); + + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/notfound.p12", null /* password */); + + assertNull(smimeInfo); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.updateSmimeFromCsv((u) -> mockService, "files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(9); + verify(mockSmimeInfo).list(eq("user1@example.com"), eq("user1@example.com")); + verify(mockSmimeInfo).list(eq("user2@example.com"), eq("user2@example.com")); + verify(mockSmimeInfo).list(eq("user3@example.com"), eq("user3@example.com")); + verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user3@example.com"), eq("user3@example.com"), any()); + verify(mockSmimeInfo) + .setDefault(eq("user1@example.com"), eq("user1@example.com"), eq("new_certificate_id")); + verify(mockSmimeInfo) + .setDefault(eq("user2@example.com"), eq("user2@example.com"), eq("new_certificate_id")); + verify(mockSmimeInfo) + .setDefault(eq("user3@example.com"), eq("user3@example.com"), eq("new_certificate_id")); + verify(mockList, times(3)).execute(); + verify(mockInsert, times(3)).execute(); + verify(mockSetDefault, times(3)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} From f7ca6935bffafacf536d42ded5ea113da82e0be0 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 19 Jan 2022 16:50:52 +0000 Subject: [PATCH 021/254] git-on-borg files of drive-api-snippets (#156) * git-on-borg files of drive-api-snippets * git-on-borg files of drive-api-snippets Co-authored-by: Rajesh Mudaliyar Co-authored-by: sanjuktaghosh7 --- drive/snippets/drive_v2/build.gradle | 16 + drive/snippets/drive_v2/settings.gradle | 2 + .../src/main/java/AppDataSnippets.java | 63 ++++ .../src/main/java/ChangeSnippets.java | 49 +++ .../drive_v2/src/main/java/DriveSnippets.java | 81 +++++ .../drive_v2/src/main/java/FileSnippets.java | 297 ++++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 84 +++++ drive/snippets/drive_v3/.gitignore | 5 + drive/snippets/drive_v3/build.gradle | 12 + drive/snippets/drive_v3/settings.gradle | 11 + .../src/main/java/AppDataSnippets.java | 61 ++++ .../src/main/java/ChangeSnippets.java | 48 +++ .../drive_v3/src/main/java/DriveSnippets.java | 84 +++++ .../drive_v3/src/main/java/FileSnippets.java | 290 +++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 84 +++++ 15 files changed, 1187 insertions(+) create mode 100644 drive/snippets/drive_v2/build.gradle create mode 100644 drive/snippets/drive_v2/settings.gradle create mode 100644 drive/snippets/drive_v2/src/main/java/AppDataSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/ChangeSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/DriveSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/FileSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java create mode 100644 drive/snippets/drive_v3/.gitignore create mode 100644 drive/snippets/drive_v3/build.gradle create mode 100644 drive/snippets/drive_v3/settings.gradle create mode 100644 drive/snippets/drive_v3/src/main/java/AppDataSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/ChangeSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/DriveSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/FileSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle new file mode 100644 index 00000000..d49d8d61 --- /dev/null +++ b/drive/snippets/drive_v2/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.code.gson:gson:2.4' + testImplementation 'junit:junit:4.12' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/drive/snippets/drive_v2/settings.gradle b/drive/snippets/drive_v2/settings.gradle new file mode 100644 index 00000000..f91561c8 --- /dev/null +++ b/drive/snippets/drive_v2/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'drive_v2' + diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java new file mode 100644 index 00000000..a05d5cc3 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -0,0 +1,63 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; + +import java.io.IOException; +import java.util.Collections; + + +public class AppDataSnippets { + + private Drive service; + + public AppDataSnippets(Drive service) { + this.service = service; + } + + public String uploadAppData() throws IOException { + Drive driveService = this.service; + // [START uploadAppData] + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadAppData] + return file.getId(); + } + + public FileList listAppData() throws IOException { + Drive driveService = this.service; + // [START listAppData] + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + // [END listAppData] + return files; + } + + public String fetchAppDataFolder() throws IOException { + Drive driveService = this.service; + // [START fetchAppDataFolder] + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END fetchAppDataFolder] + return file.getId(); + } + +} diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java new file mode 100644 index 00000000..23710324 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -0,0 +1,49 @@ +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Change; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; + +import java.io.IOException; + +public class ChangeSnippets { + + private Drive service; + + public ChangeSnippets(Drive service) { + this.service = service; + } + + public String fetchStartPageToken() throws IOException { + Drive driveService = this.service; + // [START fetchStartPageToken] + StartPageToken response = driveService.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + // [END fetchStartPageToken] + return response.getStartPageToken(); + } + + public String fetchChanges(String savedStartPageToken) throws IOException { + Drive driveService = this.service; + // [START fetchChanges] + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = driveService.changes().list() + .setPageToken(pageToken) + .execute(); + for (Change change : changes.getItems()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + // [END fetchChanges] + return savedStartPageToken; + } +} diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java new file mode 100644 index 00000000..49942b6d --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -0,0 +1,81 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DriveSnippets { + private com.google.api.services.drive.Drive service; + + public DriveSnippets(com.google.api.services.drive.Drive service) { + this.service = service; + } + + public String createDrive() throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + // [START createDrive] + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + Drive drive = driveService.drives().insert(requestId, driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + // [END createDrive] + return drive.getId(); + } + + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + // [START recoverDrives] + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverDrives] + return drives; + } +} diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java new file mode 100644 index 00000000..f79a8159 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FileSnippets.java @@ -0,0 +1,297 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.ParentReference; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class FileSnippets { + + private Drive service; + + public FileSnippets(Drive service) { + this.service = service; + } + + public String uploadBasic() throws IOException { + Drive driveService = this.service; + // [START uploadBasic] + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadBasic] + return file.getId(); + } + + public String uploadRevision(String realFileId) throws IOException { + Drive driveService = this.service; + // [START uploadRevision] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadRevision] + return file.getId(); + } + + + public File uploadToFolder(String realFolderId) throws IOException { + Drive driveService = this.service; + // [START uploadToFolder] + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + File fileMetadata = new File(); + // [START_EXCLUDE silent] + folderId = realFolderId; + // [END_EXCLUDE] + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(folderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadToFolder] + return file; + } + + public String uploadWithConversion() throws IOException { + Drive driveService = this.service; + + // [START uploadWithConversion] + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadWithConversion] + return file.getId(); + } + + public ByteArrayOutputStream exportPdf(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START exportPdf] + String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().export(fileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + // [END exportPdf] + return (ByteArrayOutputStream) outputStream; + } + + public ByteArrayOutputStream downloadFile(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START downloadFile] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().get(fileId) + .executeMediaAndDownloadTo(outputStream); + // [END downloadFile] + return (ByteArrayOutputStream) outputStream; + } + + public String createShortcut() throws IOException { + Drive driveService = this.service; + // [START createShortcut] + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = driveService.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END createShortcut] + return file.getId(); + } + + public long touchFile(String realFileId, long realTimestamp) + throws IOException { + Drive driveService = this.service; + + // [START touchFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + // [START_EXCLUDE silent] + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + // [END_EXCLUDE] + File file = driveService.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + // [END touchFile] + return file.getModifiedDate().getValue(); + } + + public String createFolder() throws IOException { + Drive driveService = this.service; + // [START createFolder] + File fileMetadata = new File(); + fileMetadata.setTitle("Invoices"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + + File file = driveService.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END createFolder] + return file.getId(); + } + + public List moveFileToFolder(String realFileId, String realFolderId) + throws IOException { + Drive driveService = this.service; + // [START moveFileToFolder] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + // [START_EXCLUDE silent] + fileId = realFileId; + folderId = realFolderId; + // [END_EXCLUDE] + // Retrieve the existing parents to remove + File file = driveService.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (ParentReference parent : file.getParents()) { + previousParents.append(parent.getId()); + previousParents.append(','); + } + // Move the file to the new folder + file = driveService.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + // [END moveFileToFolder] + List parents = new ArrayList(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + } + + public List searchFiles() throws IOException { + Drive driveService = this.service; + List files = new ArrayList(); + // [START searchFiles] + String pageToken = null; + do { + FileList result = driveService.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + // [START_EXCLUDE silent] + files.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END searchFiles] + return files; + } + + public List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + Drive driveService = this.service; + final List ids = new ArrayList(); + // [START shareFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + // [START_EXCLUDE silent] + ids.add(permission.getId()); + // [END_EXCLUDE] + } + }; + BatchRequest batch = driveService.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + userPermission.setValue(realUser); + // [END_EXCLUDE] + driveService.permissions().insert(fileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader") + .setValue("example.com"); + // [START_EXCLUDE silent] + domainPermission.setValue(realDomain); + // [END_EXCLUDE] + driveService.permissions().insert(fileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + // [END shareFile] + return ids; + } + +} diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java new file mode 100644 index 00000000..7cbdb71a --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TeamDriveSnippets { + private Drive service; + + public TeamDriveSnippets(Drive service) { + this.service = service; + } + + public String createTeamDrive() throws IOException { + Drive driveService = this.service; + // [START createTeamDrive] + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = driveService.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + // [END createTeamDrive] + return teamDrive.getId(); + } + + public List recoverTeamDrives(String realUser) + throws IOException { + Drive driveService = this.service; + List teamDrives = new ArrayList(); + // [START recoverTeamDrives] + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + TeamDriveList result = driveService.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + teamDrives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverTeamDrives] + return teamDrives; + } +} diff --git a/drive/snippets/drive_v3/.gitignore b/drive/snippets/drive_v3/.gitignore new file mode 100644 index 00000000..1b6985c0 --- /dev/null +++ b/drive/snippets/drive_v3/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle new file mode 100644 index 00000000..6ef0198a --- /dev/null +++ b/drive/snippets/drive_v3/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenLocal() + jcenter() +} +dependencies { + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.code.gson:gson:2.4' + testImplementation 'junit:junit:4.12' +} \ No newline at end of file diff --git a/drive/snippets/drive_v3/settings.gradle b/drive/snippets/drive_v3/settings.gradle new file mode 100644 index 00000000..d8be1d67 --- /dev/null +++ b/drive/snippets/drive_v3/settings.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.3/userguide/multi_project_builds.html + */ + +rootProject.name = 'drive_v3' +include('plugin') diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java new file mode 100644 index 00000000..05300c26 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -0,0 +1,61 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; + +import java.io.IOException; +import java.util.Collections; + + +public class AppDataSnippets { + + private Drive service; + + public AppDataSnippets(Drive service) { + this.service = service; + } + + public String uploadAppData() throws IOException { + Drive driveService = this.service; + // [START uploadAppData] + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadAppData] + return file.getId(); + } + + public FileList listAppData() throws IOException { + Drive driveService = this.service; + // [START listAppData] + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + // [END listAppData] + return files; + } + + public String fetchAppDataFolder() throws IOException { + Drive driveService = this.service; + // [START fetchAppDataFolder] + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END fetchAppDataFolder] + return file.getId(); + } + +} diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java new file mode 100644 index 00000000..147668fa --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -0,0 +1,48 @@ +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Change; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; + +import java.io.IOException; + +public class ChangeSnippets { + + private Drive service; + + public ChangeSnippets(Drive service) { + this.service = service; + } + + public String fetchStartPageToken() throws IOException { + Drive driveService = this.service; + // [START fetchStartPageToken] + StartPageToken response = driveService.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + // [END fetchStartPageToken] + return response.getStartPageToken(); + } + + public String fetchChanges(String savedStartPageToken) throws IOException { + Drive driveService = this.service; + // [START fetchChanges] + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = driveService.changes().list(pageToken) + .execute(); + for (Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + // [END fetchChanges] + return savedStartPageToken; + } +} diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java new file mode 100644 index 00000000..0262a6f4 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DriveSnippets { + private com.google.api.services.drive.Drive service; + + public DriveSnippets(com.google.api.services.drive.Drive service) { + this.service = service; + } + + public String createDrive() throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + // [START createDrive] + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + Drive drive = driveService.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + // [END createDrive] + return drive.getId(); + } + + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + // [START recoverDrives] + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getDrives()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverDrives] + return drives; + } +} diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java new file mode 100644 index 00000000..784a2bbe --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FileSnippets.java @@ -0,0 +1,290 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.Permission; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class FileSnippets { + + private Drive service; + + public FileSnippets(Drive service) { + this.service = service; + } + + public String uploadBasic() throws IOException { + Drive driveService = this.service; + // [START uploadBasic] + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadBasic] + return file.getId(); + } + + public String uploadRevision(String realFileId) throws IOException { + Drive driveService = this.service; + // [START uploadRevision] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadRevision] + return file.getId(); + } + + + public File uploadToFolder(String realFolderId) throws IOException { + Drive driveService = this.service; + // [START uploadToFolder] + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + File fileMetadata = new File(); + // [START_EXCLUDE silent] + folderId = realFolderId; + // [END_EXCLUDE] + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(folderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadToFolder] + return file; + } + + public String uploadWithConversion() throws IOException { + Drive driveService = this.service; + + // [START uploadWithConversion] + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadWithConversion] + return file.getId(); + } + + public ByteArrayOutputStream exportPdf(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START exportPdf] + String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().export(fileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + // [END exportPdf] + return (ByteArrayOutputStream) outputStream; + } + + public ByteArrayOutputStream downloadFile(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START downloadFile] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().get(fileId) + .executeMediaAndDownloadTo(outputStream); + // [END downloadFile] + return (ByteArrayOutputStream) outputStream; + } + + public String createShortcut() throws IOException { + Drive driveService = this.service; + // [START createShortcut] + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = driveService.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END createShortcut] + return file.getId(); + } + + public long touchFile(String realFileId, long realTimestamp) + throws IOException { + Drive driveService = this.service; + + // [START touchFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + // [START_EXCLUDE silent] + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + // [END_EXCLUDE] + File file = driveService.files().update(fileId, fileMetadata) + .setFields("id, modifiedTime") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + // [END touchFile] + return file.getModifiedTime().getValue(); + } + + public String createFolder() throws IOException { + Drive driveService = this.service; + // [START createFolder] + File fileMetadata = new File(); + fileMetadata.setName("Invoices"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + + File file = driveService.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END createFolder] + return file.getId(); + } + + public List moveFileToFolder(String realFileId, String realFolderId) + throws IOException { + Drive driveService = this.service; + // [START moveFileToFolder] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + // [START_EXCLUDE silent] + fileId = realFileId; + folderId = realFolderId; + // [END_EXCLUDE] + // Retrieve the existing parents to remove + File file = driveService.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + // Move the file to the new folder + file = driveService.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + // [END moveFileToFolder] + return file.getParents(); + } + + public List searchFiles() throws IOException { + Drive driveService = this.service; + List files = new ArrayList(); + // [START searchFiles] + String pageToken = null; + do { + FileList result = driveService.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, files(id, name)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + // [START_EXCLUDE silent] + files.addAll(result.getFiles()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END searchFiles] + return files; + } + + public List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + Drive driveService = this.service; + final List ids = new ArrayList(); + // [START shareFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + // [START_EXCLUDE silent] + ids.add(permission.getId()); + // [END_EXCLUDE] + } + }; + BatchRequest batch = driveService.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + userPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + driveService.permissions().create(fileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader") + .setDomain("example.com"); + // [START_EXCLUDE silent] + domainPermission.setDomain(realDomain); + // [END_EXCLUDE] + driveService.permissions().create(fileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + // [END shareFile] + return ids; + } + +} diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java new file mode 100644 index 00000000..10ca713f --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TeamDriveSnippets { + private Drive service; + + public TeamDriveSnippets(Drive service) { + this.service = service; + } + + public String createTeamDrive() throws IOException { + Drive driveService = this.service; + // [START createTeamDrive] + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = driveService.teamdrives().create(requestId, + teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + // [END createTeamDrive] + return teamDrive.getId(); + } + + public List recoverTeamDrives(String realUser) + throws IOException { + Drive driveService = this.service; + List teamDrives = new ArrayList(); + // [START recoverTeamDrives] + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + + do { + TeamDriveList result = driveService.teamdrives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, teamDrives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getTeamDrives()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .create(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + teamDrives.addAll(result.getTeamDrives()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverTeamDrives] + return teamDrives; + } +} From 6691736cea13ac485e334d0c4a9876da076876e6 Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:33:50 +0530 Subject: [PATCH 022/254] Enable Auto Reply gmail snippet (#162) * Enable Auto Reply gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableAutoReply.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 gmail/snippets/src/main/java/EnableAutoReply.java diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java new file mode 100644 index 00000000..ef6e052c --- /dev/null +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -0,0 +1,73 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_enable_auto_reply] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.VacationSettings; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Enable Auto Reply API*/ +public class EnableAutoReply { + /** + * Enables the auto reply + * + * @throws IOException + */ + public static void autoReply() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try { + // Enable auto reply by restricting domain with start time and end time + VacationSettings vacationSettings = new VacationSettings() + .setEnableAutoReply(true) + .setResponseBodyHtml("I am on vacation and will reply when I am back in the office. Thanks!") + .setRestrictToDomain(true) + .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); + + VacationSettings response = service.users().settings().updateVacation("me", vacationSettings).execute(); + // Prints the auto-reply response body + System.out.println("Enabled auto reply with message : "+response.getResponseBodyHtml()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to enable auto reply: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_enable_auto_reply] \ No newline at end of file From eae5d8394d42f0992156d1389a725f945cbbe8ec Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:34:09 +0530 Subject: [PATCH 023/254] Create Filter gmail snippet (#161) * Create Filter gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateFilter.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateFilter.java diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java new file mode 100644 index 00000000..06840c76 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -0,0 +1,72 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_create_filter] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Filter; +import com.google.api.services.gmail.model.FilterAction; +import com.google.api.services.gmail.model.FilterCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Create Filter API */ +public class CreateFilter { + /** + * Create a new filter. + * + * @throws IOException + */ + public static void createNewFilter() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Filter the mail from sender and archive them(skip the inbox) + try { + Filter filter = new Filter() + .setCriteria(new FilterCriteria() + .setFrom("gduser1@workspacesamples.dev")) + .setAction(new FilterAction() + .setRemoveLabelIds(Arrays.asList("INBOX"))); + + Filter result = service.users().settings().filters().create("me", filter).execute(); + // Prints the new created filter ID + System.out.println("Created filter " + result.getId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create filter: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_filter] \ No newline at end of file From eb89577c66f359e867c6deb39466919f5d89debf Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:34:25 +0530 Subject: [PATCH 024/254] Update Signature gmail snippet (#160) * Update Signature gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- gmail/snippets/build.gradle | 21 +++-- .../src/main/java/UpdateSignature.java | 77 +++++++++++++++++++ 2 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 gmail/snippets/src/main/java/UpdateSignature.java diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index bd5284f5..f0dd197b 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -1,18 +1,17 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - mavenLocal() - jcenter() + mavenCentral() } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-gmail:v1-rev62-1.22.0' - compile 'com.google.code.gson:gson:2.4' - compile 'javax.mail:mail:1.4' - compile 'org.apache.commons:commons-csv:1.1' - testCompile 'junit:junit:4.12' - testCompile 'org.hamcrest:hamcrest-all:1.3' - testCompile 'org.mockito:mockito-core:2.7.19' + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' + implementation 'com.google.code.gson:gson:2.4' + implementation 'javax.mail:mail:1.4' + implementation 'org.apache.commons:commons-csv:1.1' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.hamcrest:hamcrest-all:1.3' + testImplementation 'org.mockito:mockito-core:4.2.0' } diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java new file mode 100644 index 00000000..b6ca985e --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -0,0 +1,77 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_update_signature] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.SendAs; +import com.google.api.services.gmail.model.ListSendAsResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Update Signature API */ +public class UpdateSignature { + /** + * Update the gmail signature. + * + * @throws IOException + */ + public static void updateGmailSignature() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try { + SendAs primaryAlias = null; + ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); + for (SendAs alias : aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; + } + } + // Updating a new signature + SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs result = service.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + //Prints the updated signature + System.out.println("Updated signature - " + result.getSignature()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to update signature: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_update_signature] \ No newline at end of file From 359d6d0179607e5fd821ba8a564d4e0dd0d245fa Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:04:52 -0800 Subject: [PATCH 025/254] Added update signature gmail snippet. (#159) Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From e5358a1f1fa3bab61a762e3defa00984e2639704 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:05:06 -0800 Subject: [PATCH 026/254] Added file for CreateFolder use-case. It also uses Google ADC. (#158) * Update CreateFolder.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- drive/snippets/drive_v2/build.gradle | 1 + .../drive_v2/src/main/java/CreateFolder.java | 67 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateFolder.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index d49d8d61..609d4c93 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,6 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java new file mode 100644 index 00000000..8bb1b908 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_create_folder] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_create_folder] From 4b94aeb26d1e43f0c70f34bf51c1acc927359cc2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:05:21 -0800 Subject: [PATCH 027/254] Added file Uploadbasic for upload file use-case. It includes Google ADC (#157) * Added file Uploadbasic for upload file use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- drive/snippets/drive_v2/files/photo.jpg | Bin 0 -> 1128108 bytes .../drive_v2/src/main/java/UploadBasic.java | 71 ++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 drive/snippets/drive_v2/files/photo.jpg create mode 100644 drive/snippets/drive_v2/src/main/java/UploadBasic.java diff --git a/drive/snippets/drive_v2/files/photo.jpg b/drive/snippets/drive_v2/files/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98b05d35ee5af0e111177c397029593f553ddeaa GIT binary patch literal 1128108 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

HQ)rO7BEjui9nQ>LErPORLjn%TCJ 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

onJQK?d^r;4N8M@Rqx&?@C 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 >fN8wuB zai~lj_Fe@b>zCs-6Nf96;}r5$LYMo#^v5XNI`Dc`d1ER4FJh16Xs(H!jO&op|Qx02fAqQ^J(wwCfZ6`G547~pU38q9MC9*#4YOGpgBUXNK zjlC+_OyfN$3AKJok1v%JlenV6Rd-_)CKg4NQI^LOR?=`PoL^7LD5*IK?&H_iYqpV{D&xt-B*mQLbKK%16sg zP$OIpm1Z_(X7s2Y9PMFEYC8ml{!>%2^AU5^YPk)Jjxj`07CvLQ-KeuhaZM7rQZ|uP zrD9K%23E8Xt1rwd4T@Xk`D-e2_q7?r_=~{aAMsw5CX=kfBu-cy26SWS&C@;q0KH!t zd`110ZX=FeU%-)t*|lEHp8yZ<#!tU${RHx&DTDI2tyH`~KtEqb^N%C#B(?Ub8a zABozZ!|xdAcL(j7HQW)!AdRJXU(4S80FxUDKU(cPA@DcGo-CeAf3X`)*dWe!Zx7uE za68xQlr~nZ{%C}6AMhply}s>GO%4l5WR@7h8J~OLcR%Ou*S|g}tINyO)7rD(s6GJr zo5CI+4>g=u6P8qVwsx8Klg92B3y!T{DEPV5_=e+7c;t$EDIPgd)Tu@X1u%A>;ji1( zf;j<9{J5{qkJ@+PtJRWgJTsz^v@`L}<&Nf++XV^5p?ul_2&(&a^ri0nYB zyQ(=AmCB@e^9S9n5Q=hRIsWxjTZQvLaq_Q9R~tfjaLZ||MKFzvD{TqS%&lKfd3Ms; zMs_;j20#AIeDk24y3)xP8R_!p=C6IRyp}mPl+2j!J6FzTbr&}0p@Vi-G{dZlvW3Eb zw7Y7w#z_kKG8NC?`cStH!wu2ul=H`7{*fbb(;s@cAkn#{4Y-L>o%WBrkMC05T;Tvq zLA1Wi5w8Kd)?{<6(eK@!`%PMfXPhu8k^Cq7#;P?`cLBkX&e(So{3~A1@R#AZ*Kglb z)gUix7~r;4ESVfP{0B9O;BSPw{;byewxr2#5i01NNe$7r4uZbW@Xn7Gi)PlAzcTLJ zPBGikysX0?8*)Q)n-PnQRinA)8qR>)9ND#xb-%Cv%HEZQ9pgAHvxC#oYv>!B6uBF7 z_p6B3{0RiM;OXqpNxLuTN22;yg&LOJ!iFdLk2*FrlMm~of+*nHg89Y;yk ztiC}Jk`RA|cLhJ~RcLSR)zw|TWvjosdlYIX8=ObQg<+u=l2wf(`IvV({_B5A`Mw>q zIAQV@P(KRxkBoN~_tww`b`BV*P26FJ%zgTO>hT+S7x!r^V+->AE8D>9cZ4AKf3_91(<1qZL z=fq}sc|uK{gk|A>Dqp&v-S1QVsxYG!2J;5r zk=JkeTHta=jOtr)u6)+QHpQqC-f6OiJ??sK8?#-0jp579$L;H}hxc1Qm3MZ!ZH=GL z9Dg$Os#3Pck6#|I?w>x-@R_wqN@|JZ`NTR%2m4-)-n;J#d?oO9?ZnUK<@juVsP+krmu!MOhXGFwc&)QN+#ZbIz%Yn^r_oTU)RIC~OWthZS)xfo@fE@mprlhf}10J~Z$ zoT5N(Q9<9!EmYL!f@@`IFwUQqW?W7T`9CNhtz+tOT)&pkwh_Ndb`-Wby-QDPi5gf= z)o+z+iPp5+WVR*Ke!;Z=0DF((uSI>z2$zt5@zY#Rzp3f===RRSXU@a^!S}83$=}^7 zCxvU;MWMHv=G^X)`+9NwHRXjHDQgK3JW5H}P%%0Cu_G z_(MEFehgO-vqHW8Z{hy(*S$ov&KmbuU1r$ZvJiwe)*Kuyd6YU8?dv+uo=zFKUP7q; zAH-MJT2Fu?j>#Cru{R4N72G<152bR~eijy&(nl1iG0)_fJ4E{-8EKpE4yWr@U`u%JQ^^~*{{VZSuEuW;!q<-&hsy{yuHTzK?|asB z_-5i6BSmeS{$0IKHMA?M*nJ8sAi20Osmy3MWB6K`J;F^PwJU{RO6}nAPNk>X%_NZS zk)3uT{{R|)5pVXtyI2$HiqpI}F>fC)%gar?+sD)2(xQ3cg-fd(FDLz)g9ERDcz$%$^C1bneJnS z-aM?z-zlkMyex?=$y9g3@_&lAgDoR4L?dR5w&q&ruZzISjy_iDU3|7iDN^Vi*l(NA z=9{Qn+1zb?m=TZGyJ%EbB}bIvV=@(KV?QoBR8unxaVn3-tzBCrVVxPie#`t#O9(M- ziIZ+e&Hl}HUi%7aBG^9kZ#VAMJCu$Yi$S=c``py_u}Kp(zJBk`y066oIvD3%G3bBv zDw#-7Dq3GoNVOm8`tJ4r0D856f_4iqF{tQ!n#*_-%!U~mk(1^h!Wb{DYZX*1&TAlo zI$b_3nRLUW`ksQIn$;3n3cDDekN6c!VJuO=R!@~r{>?br4)+uEa;+9<4%+pg`W zA~D5bYLW&j7v@E5wQe*jK`K-M{51{Lt+}yzAYqip6yYfI6m#%40;0Cn>^fGZkNU#cw=JP$l_Vz{1~Ao9nKrpJG2N(Gl=+}H-hY;~Z6Z-8?!IL|-u@hV zeQ35q=^>QhgZcjewN|jHvNRuipL|v_lY5;JL>JIP>yy=MINM3~blNu^+^uWN40+3w zC~WQ{sQS}YS~Xya@~6LQlUN~b7jD*c-Uc!2_}2BZL}8vuBr{2#RIl96K(&ddsJWjD zlvEu(g?8xH%&w@L9Ch3GTDj^>-iZ5n)hEc@GAd|okVxdN1ANL_q_l=R*gnun48Jbg zbg@bySo8b7<-f+cX3n^s4T~y37G>V)^5sWUQ)+U^*urgnn^$*6ZrQ5(Y|<d(?( zw=*Kk{A;U+^m2y_Vc5NTb4!o1f`Nz4lFE3nDOd=%8Dfq5bdhyL{V!+8&0y z&r;L`my;IcrhKB`)Yn6QHNr=^{{VD~q^R}(0BX4ij2v7S62?D;hV9$G-mR&{mCDJ~ zJ;X4&!?pKqc2@rY&}*;J;JQntjUn8q--xW;KW?EUWc;36e5k)F*QQ!&_HBD_HN?Ut z9awZzT-ciSiPwjrc6zUbRuqMnL@z22llWD3{{VQ`OZJC$0Zzft?fzAhVg82y0J@JN zMZn!!Q^V!P(yEdF0HD{;N^P_0XhW48p11aaseuR2=&SrSQg$+xAniTR@U3XDMYwle z#z{K=0J~JK0Senj`bpgs;!S5TdE;ZBlc%Y#QP6Hgl6jXuC?kRI*n8KS=-y;e8;>MA z$lRXw>wX@V7}NK#hLO5Ga@LAS>%*e$)K{_KN0eqgagmDXbeI`!x8SyMxSr;xjv(VC z?p%KjX+YRO6M!qqsUxy6>N*X|#1Zr+l^YINjB-J#4#`+!BOQLV7(j|+9A}!(VeVbG zIg@}k)Kksnk{f_}Qb!Yn-0zK_ojAhYVw3X$$Zqt(z-&qKHc*ePNfIdeoK*9E@L`V? z0Vo%a)Csb9oev5=?J>ih*lg8SCMfbcnwKiULY<7Ye4zFvNnMl=FKt8T{KZchse-bN zqnfWOe7o0|6#|aMIlf|4{Iv!)t_LJ^sSIVC685GLp|MjUNcpUSOkI6j$K6bDN15dml)g5Y7_G=>}6{6!XpbaA8dR2)L%4tbIyHh zX!a#NN=Xu{?m>^`QWl78RT+@>_M>v=_n$8AloHW?^#=3P=|t6piZYFk>`x2)G({vt zZs`8C9msZ+M#pGwb4-Yogp6~ZTC|PqD-cZ%RI!sFe=mBho?=P^3@OGdLQxU|dwL&Q zue6BJV+3MmnTi9gnT&ffJ_Hb~-Q zCj@YFRRq!^QMpbQ+z$sa))t_R6oN>Ga(Y)#){J8+2>|pp5r)`DyW7=ZtJY{;(d0(2DC)6p}AKH)jqpgVM0B{5u$i zSz&YL9^d_Xsie($ZENJi%f@h2`ZZgf_A^V}_l;ld)KXg9j2!2TW9TcKlT5sYq%a-P z4t+TP02=9F)Gbk8e8+lqSKtHnKDBb-qrwoLANVUSep2j?7tIj`CQO{;C#`M33Ar$B z&h+1o*#5N1bOtl2avC1E9kJY2jF%@*g+@1@=~WpS*reK8#;tb@pEC9}#@^Zax{BPW z+vff98>wFZ07~?f5>F0Ce!haZ9bZh;Qtl}hP-897a6kQ2rMT)w=Ti-(wCJB@Z=MzZ z0C$>`?Tr%oFCRJD*#30qiDa@!U~-#A{o{|Dx8YOS#LH=mljhC01;={Dp-cOvH+2w@ zfVn+E=suMsw`lMpKN4}1=}9C~CfFB&_lfkUlc-F%jx?GG&N*&Rxms|yQtZl)9FjO| zaw9SQ{{TWgYDbBMz)1GvW^%r@rrK#1#lvqi9J&7hW74OF+2fUA5$r&}d4G%htL(L_ zoJ?a2>|&Un^4H0kPX7S*s~ExdX+Q&O5A)4-)7r?&{{Uu_=KG^}@R~-pj?zUkNtOea zZYtqXigdI&?GDS&xcf=u$Mf_3?@y(6wo?x&$C2glZQGl@W9har++01~xXR7dM|Q2L zTJp-_Z0=$6OX0vD-1Xg2I=a|OJqX$snoltsW2aUA_Ug{^vhIa8hWTq*j4WE>468p- ze~0PqP{(jVkp1uT{8g1UM51z33Q^%$C}kiMRA4k%s>D zdtI)@z4LFB$e1`4%lMik)ueTkgh8K|u&$~TvpFi#ymUNzB>OQ}4V;6te|EEPBj5AP zH!xkbV(k9^0PLChB7SzZ(!<`TYdJ6+AC-s7KfSiSx)WTdhlqjC9LFD*7$ZL@$6VC* zr_WJuck&Q;_WuCuQb~5!1sTUryuE0=4=vPF+czb_AouyJt3#8OiLcv8*F(sSKFq_M zH#x3m^+mQKkZs!;Q(8i=L^gPo3IJfL? z^<$E?%iJn%X6^pXce6$xfmr%&otT&Ed z833PPf2DF_bh8c_ZD1jtJY0+6C8U+e8&o1k9ZTFbX)e6o4=t_qXrQtWysh_rYv;uFmeoRSTob`|qCi@ZBJT}dvR zYqM*7;QXP!mG!TL_3M3N+J7|(k{%gI`7zt(u3yET8MnQ&l3OI)6c^don&+j7wv3kg z9~_&DnI&sGkKDLFmL+SUfHVDTh`X3T zg4Vhp;@e^+)gytwdNSx)*T>k+2>vq?~Ggw`Pw_}(2e-C=}!{J>MUbI_V zTcaJ%J#q7#_2crc4`1*^`e8v3d?CR-$^QTf=jV){ybW7Kb+)(Gce;W{sHju71Kj!= z^eaY7Sj1X+4-yVTbNbiL&t-paB3#^jvOi25@m(dBt*lzxiJ~gef%i{BYnr4I*@v?} zobdJ4m8{5KLjaqQPXp+GrFPNkT5*x4nf9KDN6p22!KHZiTbPzDMh`D(#&P$5I`nM^ z#r_<*w0zy7yk`e?LC3JKHl+u9vTbAN3kQM!0C>{z?Z@L?FO_QBM*ZkV8TPLa(DmC* zUfUW}qxT#Q_y_S7-f5T2VJUDw-94)rQ%P9Mm)<*@c`O{5?bvSWe;Se1P?G0i90TcI ze;0@}t3X7gj2<$lueY^sMXy=Pu^HqTe!EUbJu8-5nAE3Zp+F^+7ddZQnIJ=)_oyve z0HC9Mhmd}?FO+^)4Ut);p_wd#RbY|f7rFMR8azHX)Pauddem|t1xmIUbqCV3lCTl7 zxRGSf$|`Nqqi&Op-3aYTBdn>gu0TBdQpF1G%Z{Bh+Nu$;H$uk51H2K*{&eHDe|esi zNB24W2ek|forpQAl0`-8GD2EKVbFD`0R@R(wK`*yWgfqMIWZY_A|vg7O`mm%TJHhQ~o# z(}^uNu~&GWO^cP-dVAE2e7vwc_o)?CatA*3Qc;F79)qZ@U=}1+4BW0s>U}AVh9m)j zQYtK)88W!*@AatWLA%Q&ftt#ru?;?jc2Z7qC?c~4R zVcxQdcOht%pK2YTQ(ZPM-sYA#(Q-lEyPWmO^`*gl^T6hY^fR913%E=-kOndDx`x8J zTwofMLAwl2RCdRI@TjEQpS{SZ8CbQb##Key4l_!-&IvpYhLnOvSYVIkOC)abZ3heO z-l=P_zR?jQX~D=f0FE_Gf&D)LQ%7!65Ug@@OD9yo`BZcDttr0a@1OI{Fr;$s9P)F? z#y*s#*eo%n$o}ZXRd3!8nKParzb2 zz-${-j=jZNvIM`FL}=WJ0m>ep)fB23h+(-KprwuC&FAih1Ool$*BLSMjR3aN~*XRqAd#D2Pzz3estsna>Fzz zKY4i_>S5F7p(4q%@!T~>yi!k)Q7gU}jkESE2Mtr=mEat3PH1&%RJI4D@+l`()Sxr%9AVadh@O-mBx zPT`O_rv)n9RPo_KN-u_f?NN?6yO-EmGJk8 zcoZu1&q{z!!-2^PO-UX@U63Y;YqWXKRd#a*Xh!r98w-?mY!aep9(u zr8f1k462Ha^7JZssnD{YTvCM+cEwDpF@^0zlUgw5)QsiMSahc%l1cs%OO6Nvlw@!R zTFvfKu+(fxkSbi{p1A8oV5uB+r6UCKO%5Y~0XI`VVmPM-IL~UDAXH_C6en^TAXUd1 zsS0ERjw!^bIU=2q2NfYFVIxw`G0;_(3()qaTOFr3;-n*cA8N{95Fs}hDQF@ct?g5*j;Y?ERmjdbr=qgB9la`M(9s}P+`GF|i)=Upikk!| z2byV*BXQ!RsN-@tzE%X(%=!5jrB_8Paw^t zC{-sa*#p*`lN?2HhAckqOtB5B#-dM~_-ar-eoqw~!km5UmtYwG09W%b@l}h+l1l~$ z?&I;OY>Gr#c9Z;7CG?`T7I`#bF&;gU&lTG0_S zXEA3#nX6Gi=;_8=wt7|Rq?X$0JecyNWty!<$kOFIQJKe@n_Vi+&Fm~ZnBV3!vP>|u zB5!)ej@4D-lYP&RHOzxdE2M^7lWX6yd|0jrM507(zs^s3QB7IwL2 z`Q-0K`x51*g@_|>Eac(6YL1+eNh>R7${Z4XeQQ$YP_eVdcBkDf{{Y2SSlb*d;J5PP zi}y6Xg=?r}w_@?IG3Vv=`ql7fRT6@ycWSC)pLjAhR8yzUwV6fdQsQ z48?yX=WR(0f+l~LZt8SatT)MT)4%ZIn8GAfL|xk(aUb5QPWlr$OHc`I6~fHpbFW79 zs&}%w9NUfZ$@fC_``>&116lsIZel~K2*(^V5&73H_Lc2t*wy(>W!I<5{@sKF!5#4_$^hsuA1nz^SNi2T=( zZpi8BRm_OzA)Y0;K5TMe#x~-z;*5)h&0U#-29yup?%n>)Q;y;(vxM5m?|iilAbK7f8{%D{by{={c4Wc-08~C*wFHqdxob&tBvjclT8pPZXHPm&vAt@% z*0W0Ay?y(BZ@c%arC4ok?H<+F?sWe0)*5-FE2qd0{yjvVzUcX)O>e$sDvW&m-mBrscDlo%`4d84IGx=Dr0l)^{iEUSf45K zvH7Y+NqpI2ZQD=Xs!pOA2_tab#Z+R)uE(tWDwat6Q2?4mOJc|OpWNN;U!ZpG-)0N^ z75U5X`I27|Y0!y0jq}EgSNONOj(iaZ`+w z^3=O`e5wG&R|JRo``40i3;}^VdQ&jlvVVrA$Cfiuk{IK)M4ijzV~}Td(TXFDQ{`%l zGBz>Vq+;M>wGdCKHU~RDhMJLQ=BX5yd@$)iVqa=@{`FJ6g<>}>U!^QznfABKikzm^ z+*g`vjlVGaqLP-j3lK;{9f$tS12*Xp{ zDZ+)@ibdm-^HjwSF}n!Ve8NxRqDND-0h+LpDvihHYG8->w*Bg%SgKGK0cuU&Nl;dv ztF+{G6u1xb5z>g3sj)%Y+05CtpLqOQvy{a5g;}z6Hun+c)H4h+;)Wicn z?Nhb_{?#y)Md&Xfvy6(3j!ponHn{2cX@mET$4az=nGQ0>0;#F8k&c~e2UNy0ij@fa znBug$BE*QR)jQG^R$hBG2^#KYMfqBqHm>ch_i0>^NZ77aWl#P)P@8>+XyT@bI=9~W zX`7$T-bWQtlj>hEvZ)KjK&S%^=aW_?V#jJ#FhKc8=9n~2jl&vEj0RWcrYnORe6+DM zV*;5;K7t6PFX|}(MP|w3oX&jSPZW|67v-sTWR88?SIYao^!1N#-{UnvJD#1Y%9$E3 zm~^5s6re~~?`^1o0MtW<$*0F5;E&;}%Rtm4IgfZEUM^Q4&vDuB991Q&Rz+w6}K#iHkPX2ly%& zPtL^mrc8X1O^RTn1Lh`yhRa}9l;k+Z!_UvV`_!2c1s!Tv zUN|2uS7HNg{u-4lic0Jf5sllinvuvHx6QVpELGJ8xR&9d- zQoN!yV&8V65}mme+Y)4q@=KNEt<%FLl_-vnb&j;J6O|hEU%&xMR0`*pMRFN4nlmbP|Yh!JdyXQ&KDa# z4Do;Lw6e^%J|2_(8-MRD)qZ3=D*1UNobpahc&~_l19_4>JQEKs{d<2$L%9khk8zc{aF1;jYIS|@epU$k~V6}3+Wc#B237B}`Y+BrK@ zd}m{xyOH`HJt~!#hIO4=RF6orguUC3kZs}r0NrZ+jnzB};k|uTb&ELeBoDn^^Pi`( zo`#vE{4?-}hwk3@MzD(ArzM;+mJ6OXpd{c9)$RWPt&Oc?s43X_N8u0b>uYhMS?WG2 zjKO!f$kF}Mj*fP1EC+6)y+cv>4P_*f3md0^Gbs-1zmDU#;a^Wh1+}!PKaq^B>{{XvCUVhJ7`+(OsmdfPk2+mbN z{uA;-zlTExnBx83Vjyp>eVWA)mv;*k!#*^dUB6|oGe zxL%xX`G4K5$neR+Y!wl3in!x#FP@@5-Z$Q?Zel$)Lc8~IP()s78kp`|ZmvX;jZo?Pb#@uj^TXGpmj9wriRq3 zIG-)}yWuQ)wWFQ;rcd>I{!okQxO%mCrO&}X5kqkkTf@FHmB`(JuxF?KgZ=9J=Hk;U z<&J)}MkqP*WKN$gbWq3ErmT-=2gKN#3d!l_d;=fDuMx`_dwWS9DL!6!V$15iaa}Ek z!R>nKR?_-6frw{9gClDF;LBfc9Y1OL(+uCOUpBC+sua%J=vk#s$8@;Y5cE+;$WVL( zc|>PdxiP@1zv@EoC-}3wE5&+OhyE04X{Wq4#o~=VR88BMmG55kVFur3-Wxx9ptH1V zc2NbNyydH9Ke9sRb@U)Zec_jj2Tu)iV%zU zMOy*niAPPf8=Z`jGkmninOXJ*`Egc^z2Y`Zck5B4f-q37X~^gqV{iNFvu`IGkCfZC z){r-l$#2TsY|qFlyoF}{^Pl%?H_THZJ9ssPsOqy@N~sUbH+;snOqPzKJ9TzhCOZ@T zs>s!~izs6jr~U$Ko7Q|vvBeQG?RFpf4SB`j)HQ2`duH5Sm4D!0-v0n+6yS?$=;%C0 z;<)V4Kp%C%2Mb;)soU!M+qt)IDP}*t-S>ioH@pi3aUh>pu1FZO(;>9GkjvR#tBv+9~B-(}i^D%9XFuD0csTJ#* z-jgiQ%jZY)e;2Cl{wnhMVqi=*YQ>lRn)I;sUqgOf4rbp#mPr>*wMH3lnC<@e_lvS-C}FI@rhAN?JM%A{{R}zxOw#%WS34Eg)*Z&Hx=0NH{3Zb zv5h93Yk3mEX&4s|^5^}QtCrprf(anCRaswm&h7JL{{X)%a* zH)>A%)P2C8`W9GFe-x2o5z#T#nUx?CwS zj&^r#zr{%Qv07WaZbP~I%D>(J0OF}#^b}>y?w&Vyp;=2WoejEf+k>=q_ce_th9Z?b zrQOe^dlr$TTxxd>91-k5cPTt>t=sBc%% zE18s=hC9x99@VE5=U}>Z*uC-Ax(6RKpS;tqqD5evmv(*CY7aU{qBtLW_(MI5m6Zdkxs>RyK>$w~-{{Uu{S>lACUA*&1+f{%Ak>C2(ZKF*J zc|#BqZux%eR&-4qK)j2TW)-OOEEBTlD~>?-tgC{OBKcc(7SGGj(^39X5nk@_BY_{v zgP~sk0NtyxT)v|eZgCk*XB>*6Yz5qJB#f!E=Klb`YVL|v$cXCrs8n z5)UKn?-GIhU;UMAKqHfDLfpsqnz^Tbr%gSLG**esX~O-{?^;F~6+X`Y05WamJ7%$R z03~^Rak{!4Ed$#uayAb+u4;(tqO~7w5|FV#{#yS4JX6e2q@-`!{{VaD{{UvPrE?ID zD|cp4+->Xs0PNM)x{2mgc-Xpf&5ob#8s*gLj165f(OsmwMk9CdZQ!+BXoJeWVqphw zQoZSr-<4q-;D#MXO4q*A!P8#yL*=mK4wW&hW1=+s9$n*zE^mmI+D?N7SB=Be*O^Bx z#3jt?Fwgk^0Q)uQTA!Z6Ng4LJ&nM>p04BKbmeNYAFxoOt&DE>2oA*qovDtWYY?cOQ z&hz(n{{RoAdnbh;h2U42cjFvC&7Hj){sUfT;ZGw|{lrk`?ctLHKM{EM&u5k*1W?{O`dE@ z3t)xkv9DIrZKJod5yJU)86m5O65hv67})7ykvPW<=~uTd?Bgse8r+mS*)n>D>?-JT zS%ZD!?Ot12oiAd-N#;2xDUL8|)M}(DJt~A_Jjgb;O1MJC22_S#l`cBmXs{($RRnFR z$CtHp-m6KH>ffb0BNln%HG0^HveS*qx#Frx5&OBM{o!0N!TuTLFUZ|$ zBy?l@yz#{=ERw!R+QOp_h|R`I^{R_vMTD1N%jS^WZwvq<9nXKILU;mG(YsU(a7Y~I zwF!b_!Ojn*BQk@#7(J;%oNZpzFxkQRsR_uYRLO=Tr6e%`8zZ0TQ(?jt#~z}gBz?sP zBdtE8>L~*_BZ1zYTg&0N1JDVq|@dTWn^g2?&JjHwN(rpWH$q)Sbr}&JM=XJ#v;P(=daeTG8Bl& zF57Ys^r(WPZt|OzV4^|u?5*DEmE|iQ5g&OMh!|7lFk#gT!K3p z#x|H0U=%Oi$6v;%HJ_XxEsoMhY0z zm;V57{6#I5toE}kPcs-m{{UG0pQU;xt!Xfi7GU7F*16N+{aSfRx!Q##&DkFbz9S(>Ue=dUNUg) zyYA4Ww;@2g4WcEVk^^~ecM73%WfT09IDMZsE1^ZXbYzjXEf=XD*&a(}R+IRfA1~ut z`$gQpWOLTd4Z-q+t$;q_^r^JCTH58*hWWl!8Qt>#0J}@4rQL+WNg+ZcZw|c{iO9^O5qq z8|4}4QEF)f9#m4FE^^-@gV=TaD@aD-oJ+QL5=Xce$bY_l>c`pd6PAw z6zJBoF=mW>-j%6qD%(fokG=P|cB$A+A_dctSM4%B-OKWidW%rBfg%p+mILdW*qM^x zDh>_-WBeki-P%bqh>?SDA2)TS&2dd!<)XZW?vd=>;#2YjE5Y?)U1hz^#ne7X;IGP# ze)koEnnbo`)q=FC{6BTJ_r+^l%Mw9}$wb}OvvOR(S&C(O%rnLnSNNCa{0(MaTSl`z z%5d-eIsPA|Uz*rMb0moTunqq4tm~p@S81DTZW#XnfYXnW%*8jwFQ!_QXeuh_#J&KrVIIurjHu&CXH(a!F3ovb%^`S zed`q^NaFIH_XQZP{{UX{ZYFqJnJ515UzWVbQ?rv#ksdY5G5g1{KkV1Jh4+!=Vqwdy zO!;i#c-lyd0uD)U{RXq~Yk6wXl3|;8P~H7&O&V5hsq&0}z-g~<3W%nV2_9dSeZGrb z+bvHZvt#B+OfQ4wbaLN%op~UM1W~IK>dQ{HhJQ2c&mWW(Hv|3swW5&6JW8{VnLDq| zx8A947P_&|UOc~K8)Dt%4gl&$_zLokPAP9>%dg1Yep>gbuHcT@VH}qJBm8Uq+VX8i z*&@1hiN0L){_nMR;i~sM{7oGWDJ=F(njA6f;n!9NW+RU=tZ6W^a{{VKNx@TG5 zHciUi3I71uYKPloHo;jxd5%ST4^z#W&t+S^b0_pKWn@uy!$YiAji9SP*) zVgCSPv2`j%2y z{>|58r0$8=HTSI}GmQ_`CX7(UZYzdt$MF ztc}oY_Z8sOm86O|tq$&8KGjkn3OC>P9eJ-$v1oOuBY1YINyGaZ^Q%oZNERxzAd_)ciQ2$hD#tXgR`s+GbX86vZlT!u9_Ed+S{FC(7&x zlIWJ#dVK3}ilJKyPVC~oh0<*FeQLrP5mD!l@8xrk_G`i~EekyGAa=J-h5rDJD_cUm z*E~K`UD57*)QI9p)MqQZlyv?^xbYF@6J3v4)czP~SJA!H0g~kW{{Ze|upNiBcqY5> z_rw;nTwEk4`#l^elcA8FenH%Oiu&)tek9X;Rss1Sxa!vXzJ0y;HQZ`?PMd!cCd4tO zG3{JxwBsW+S;t0xY+PIU7UWK*ICHmXQa1Vznz7PUx0uYkqeVEt{-VD3)%**lYBHs@ z<+fsC2qiLy9lsjmJXP>|)fF!7Z3GzyA}qQes6M{cam2;D2Qqp#e5+xse`ehMzfGLL z_~rU%>t2iD&xm@g$s$}ipUe5fx%`E0#qe5rM4w@9dhUE+f3c72T$T63-CszJZlSpH zB;?5+GKBU3| z>FZXZkfg0C8@b~>1!h~o?!jK;@<&H5@FlHDW z8jH%`*Md5ls4l=nkra?WUsK+nz{3yXr%RB#RAf^{x9&lH8@&<&G+@ED_4lYG47nZZ z(v&+^+ɬmLhdY2jg-yJ$B=9@^DMrTuqwD!qL?PI2 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�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 >i_ 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�!BC6p@!X#{dYzncrB;;{X4TZ7yO(|`e!RLxm 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

N=uA1h2{* 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�*(xZILBQ}X=S{{RZk7rCYROVXl% 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%0A{beVWLFa^A5E1 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�qEu*f*+o-3S}R*lJyDGGwvBmJS+*Ec&C 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

EvrFXFVyI_Gmg9(}EQHR39Dv7AJ>gF5 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

3jdfqGy=%EtD99KWRD07qF9qRK%9(nyK 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

6e08ZRFHs$O4c}2wl^6ifNoM70F_OSHO0nEm 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 STyVJU>szh09Tj(LAOG2cxRf&h literal 0 HcmV?d00001 diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java new file mode 100644 index 00000000..22732967 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -0,0 +1,71 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_upload_basic] + +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadBasic() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_upload_basic] From c6e7cdb1bfc7d60ab0d2f97ee05d7b8080529036 Mon Sep 17 00:00:00 2001 From: Cameron Gregor Date: Tue, 1 Feb 2022 03:55:16 +1100 Subject: [PATCH 028/254] fix typos in GmailQuickstart class comment (#166) Just noticed these typos whist doing the quickstart --- gmail/quickstart/src/main/java/GmailQuickstart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index f6d1e569..650ba0b7 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Gmail list lalels API */ +/* class to demonstrate use of Gmail list labels API */ public class GmailQuickstart { /** Application name. */ private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; From ba566cabae6c666e326654fbbf6e6fc3a18e8255 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Mon, 31 Jan 2022 09:05:19 -0800 Subject: [PATCH 029/254] Create Draft gmail snippet (#164) * Create Draft gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/src/main/java/CreateDraft.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateDraft.java diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java new file mode 100644 index 00000000..411271cd --- /dev/null +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -0,0 +1,103 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_create_draft] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; + +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Draft API */ +public class CreateDraft { + /** + * Create a draft email. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the created draft + * @throws MessagingException + * @throws IOException + */ + public static Draft createDraftMessage(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create the draft message + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create("me", draft).execute(); + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create draft: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_draft] \ No newline at end of file From c3706625fe079eb3b69b424d3a020798f1206688 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Mon, 31 Jan 2022 09:17:00 -0800 Subject: [PATCH 030/254] Added file MoveFileToFolder for moving file in folder use-case (#163) * Added file MoveFileToFolder for moving file in folder use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../src/main/java/MoveFileToFolder.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..c46e45ab --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -0,0 +1,85 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param realFileId Id of file to be moved. + * @param realFolderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + * */ + private static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + String parentIds = file.getParents().map(ParentReference::getId); + String previousParents = String.join(",", parentIds); + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents) + .setFields("id, parents") + .execute(); + + List parents = new ArrayList(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] From 5e9e7b8c3f6eba00d78ab5ddf7a3d7bfd38dd6d8 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Feb 2022 15:34:57 -0800 Subject: [PATCH 031/254] Drive touch file (#167) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file TouchFile for creating file's touch file use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/TouchFile.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/TouchFile.java diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java new file mode 100644 index 00000000..4a9e56e0 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -0,0 +1,78 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + * */ + private static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + return file.getModifiedDate().getValue(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] From d225911103ce5a6acf657ff4783cecb730d2ef56 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:38:16 -0800 Subject: [PATCH 032/254] Send message gmail snippet (#169) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Send message gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/src/main/java/SendMessage.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 gmail/snippets/src/main/java/SendMessage.java diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java new file mode 100644 index 00000000..204fc5d2 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_send_message] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +/* Class to demonstrate the use of Gmail Send Message API */ +public class SendMessage { + /** + * Send an email from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the sent message + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmail(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to send message: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_send_message] \ No newline at end of file From 3b5f480d6e04b1aee898ae05709fe14ee5ce4e1c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:38:48 -0800 Subject: [PATCH 033/254] Gmail create draft attach (#171) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Create Draft with attachment gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../main/java/CreateDraftWithAttachment.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateDraftWithAttachment.java diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java new file mode 100644 index 00000000..bf2d8247 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -0,0 +1,122 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_create_draft_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Draft with attachment API */ +public class CreateDraftWithAttachment { + /** + * Create a draft email. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the created draft + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Draft createDraftMessageWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create the draft message + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create("me", draft).execute(); + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create draft: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_draft_with_attachment] \ No newline at end of file From f9c684dc381ce402eaf4892d25edb854559b3d16 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:39:16 -0800 Subject: [PATCH 034/254] Create SmimeInfo gmail snippet (#173) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Create SmimeInfo gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateSmimeInfo.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateSmimeInfo.java diff --git a/gmail/snippets/src/main/java/CreateSmimeInfo.java b/gmail/snippets/src/main/java/CreateSmimeInfo.java new file mode 100644 index 00000000..5f3b7781 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateSmimeInfo.java @@ -0,0 +1,63 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_create_smime_info] +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Base64; + +/* Class to demonstrate the use of Gmail Create SmimeInfo API */ +public class CreateSmimeInfo { + /** + * Create an SmimeInfo resource for a certificate from file. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file is not + * password-protected. + * @return An SmimeInfo object with the specified certificate. + */ + public static SmimeInfo createSmimeInfo(String filename, String password) { + SmimeInfo smimeInfo = null; + InputStream in = null; + + try { + File file = new File(filename); + in = new FileInputStream(file); + byte[] fileContent = new byte[(int) file.length()]; + in.read(fileContent); + + smimeInfo = new SmimeInfo(); + smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); + if (password != null && password.length() > 0) { + smimeInfo.setEncryptedKeyPassword(password); + } + } catch (Exception e) { + System.out.printf("An error occured while reading the certificate file: %s\n", e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException ioe) { + System.out.printf("An error occured while closing the input stream: %s\n", ioe); + } + } + return smimeInfo; + } +} +// [END gmail_create_smime_info] \ No newline at end of file From d2b1d40f64e86ec28f08a4cdc02ff92bfa808ad3 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:39:50 -0800 Subject: [PATCH 035/254] Drive : Retrieve page token and list of changes (#174) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files FetchStartPageToken, FetchChanges for Changes snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/FetchChanges.java | 79 +++++++++++++++++++ .../src/main/java/FetchStartPageToken.java | 67 ++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/FetchChanges.java create mode 100644 drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java new file mode 100644 index 00000000..69a7fbb3 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + private static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..060cccd7 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * @return Start page token as String. + * @throws IOException if file is not found + */ + private static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] From 25a0b22082da10c35624d30a6d9f3072b86e9262 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:40:21 -0800 Subject: [PATCH 036/254] Drive : AppData snippets (#172) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadAppData,ListAppData,FetchAppDataFolder for create file,list files and list out appdata folder use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/files/config.json | 3 + .../src/main/java/FetchAppDataFolder.java | 74 +++++++++++++++++ .../drive_v2/src/main/java/ListAppData.java | 80 ++++++++++++++++++ .../drive_v2/src/main/java/UploadAppData.java | 82 +++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 drive/snippets/drive_v2/files/config.json create mode 100644 drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java create mode 100644 drive/snippets/drive_v2/src/main/java/ListAppData.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadAppData.java diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json new file mode 100644 index 00000000..3d2519ed --- /dev/null +++ b/drive/snippets/drive_v2/files/config.json @@ -0,0 +1,3 @@ +{ + "foo" : "bar" +} \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..9820e21c --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * @return Application data folder's ID. + */ + public String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java new file mode 100644 index 00000000..704eb9b2 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of list 10 files in the application data folder. */ +public class ListAppData { + + /** + * list down files in the application data folder. + * @return list of 10 files. + */ + public FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + return files; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java new file mode 100644 index 00000000..56d469d7 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -0,0 +1,82 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of create file in the application data folder. */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * @return Created file's Id. + */ + private static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file From 9c1f379696c033eb9ae7f59516a93094fa5a0174 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:40:49 -0800 Subject: [PATCH 037/254] Send message with attachment gmail snippet (#170) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Send message with attachment gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/files/photo.jpg | Bin 0 -> 1128108 bytes .../main/java/SendMessageWithAttachment.java | 120 ++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 gmail/snippets/files/photo.jpg create mode 100644 gmail/snippets/src/main/java/SendMessageWithAttachment.java diff --git a/gmail/snippets/files/photo.jpg b/gmail/snippets/files/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98b05d35ee5af0e111177c397029593f553ddeaa GIT binary patch literal 1128108 zcmeGEcUV)+76%IN9Xiq_3KEJ0DM64>6PnaOqV!Nj1p-2l5<*8sic~}Bs0c`h&;%6) z5e2176A+Q&i_!!HrHNp>L0{i<&i9@B-16@|E9}hLYu2n;>o;p=&)z!^KgWJf13Wkk z76X7F02tFhz|XfV#)cupa{yps0w4eYUmqhY%1Bm7x zzCLbZs(X?>&wlmut5j4#s;DcV)sYHf3Mh4DMRg?<0Ek6p|M38#9F_YIuNg1?FK^KVF1!Vfc>`@5U(`IKlTIC82*u8 zOk@0qzmmrCcfWLu(%Amy1?W8cKW!;#{J-RMBp?}S7x(&NP^a@bX{o(ED{=yxo8BMlTo{+93Y4FAS6{ml#0 z<;?#kSN!EO-A|^`Vx?dH(6fQ*bFuO-UYyQVOdqa=g z5CB9*0Dv>;=g-A<061<&x3NciHm&FfKbswcBE$e<@GC>ah-P#lNY7Jty2f5c?&(43 zA3BZ@c{)#_N3b`>9`y5vbX5N6fb?ko=0Qe!UjLEr(6#^YAU*T<#+#nW4B~X@AN~CR z*B_onWfumQ*eVgVG80Mr7$02X)z=z{^E zDrgA0gGA5`bOJ5GC%_4y6?g#L00Mz7APDpZ)4)csAM632fOo)R@BnxUct@`-rT01o zyal(w58zwyCD;c(rq`E(F<=`20bc+abnAQ|2ZR;!9b58;AaTVN`9<=4j%>;dY5>i`$10PX;X!B_Nt1i(Y!63_^I06f5JbnZ1h zq9AYjb3jB_5w|S6`R@fKMa4 z2VmtrC=8c7hN7<$d-Q8E?=gGX`R{c6=g*IB0Kij8*Le*9)<1s!{3Zhc!V7ezUo+|7 z%3m{;e*UZc&$U;~#hGwkjNt6;Ms^lcmPe|1dyAbrrYNrn&}RYoYwkl#_xk<49@6Iu zb1!|y>|HG&wtI5MU+c!6e3s7bq466L=3jC;&-{%(=jbcs-aKPr1UP=TJ+ar8^N$V- z4ETN3f#CP#y#L50fP=sFf5`>@ksk$wf63_)u_*5~q0iLTN+^gZc9JY693!D;NW2SU?q89 zvimV48jU`tpmNp_{(IQ`^3Xp(m+a>JkB$Fy(wlV5A0J9`JGQ3-|I@^I zZ&xCBj`$yq_GG_0I_FGqBl?{4{SQz50}P1X|Dpf?mj%B&qN}<2`0si6t2>gqKE3Av zHv{^iCBBzbatdfUqyqlWc4yBglDdhnEAd?D|Ao>oOTJ{hudkPuIDHo;F7^+q>U&Lp z_e4*+|JDsXVSb~nZuuL)U!zTOCi}bX0i-2v>E`bnNG7=LCB}bfo}^zB|4uh6H^09* zFXG?Kzvs{2&3@a%&|&;HTYCc__Is?O!d!_tS? z-g&QE@&8g|>FY%Y`QNMbeSOXmUEO>LZYSM>+~}3`joZK1O0O!5=qKH&hQ${JN zDy#jQ={-EK2K0gZ<=wHpx%O|^(H;IJ`i1K+?l;!Q{@YOeE!$h*iEgfV-+$#C9ZmX) zIvpfMWo6VJxO=DcAe9tV>G|^e^fz22Vu+j9Z(shS5C1=|{1@-&%gtWxKkJsZ*#GE% z2>cI${~_={1pbG>{}A~99s>Wm^KtW`?>vL)_cg%J6#zwl;`jS@Kuk$q0YK?tO&IBq zoc8D!zjq5qzo#7$ro2uD?l3M!uwDP~MKAnk3&6|Dmcr4(0Ez<;UXXzo{MiPG(r?$8 zz+d#M8U5?eEjJtcKDt6Z{hktJV1O_(Ffr|Q176yD%E!pd#CI5}%e>#hnMK@>UokSZ zfEBJ+*9x_K@kv6-g&f7ke&C>h;GrXuQqnRAWffI56k1*1zz}0(jKx{ut!-@W>>UWM zZs*)Rh@SodfkD9`p<&TiVq)Xs6B5(XGcvQTUB8iCSX5k6T2@Z0xO4Yj{rv|GjSrtb zYisZ5?CS0r8XkE$`fBX;_}h0gvvczc?-!TW);Bh{K5u{7+1-na{@Cw#SoH7Tk^TR~ z#Y>M1!pO+L$g&p~2npT`oR^X5Fp`;1*Mh~_Z@;)=BrCsOYC&Bq8(hiq6V!$Lg8hJm z^4lY8d!hY`?EhY1QU9+Z`zNq}#Wexw1CU?D0D&+tF)%PNF*DJLnU#5uSlL;B5&Pf7 z@r$_ji2EPz;R&5woI~= zf=Fxer*4T1nV!o3T*7Yu;C{$^*|miCuUB7BhW94*Drm`c0RjyCFN5FczQ2I4$iMg` zlh@lztW^O1N_j2zIC2?#cVQPF6FN|W6*l0FeokhxOWF_LH#}UgV#`2U(aSo65Bz~2 zzCSHve!Gjtr@}(&VyG)giV!`1lsJPh4TY-N?&Dgq11Xm`wug~5R&%@D5GS{T7aewJ-AkW#(v z$@bYJq}arNn@kLC+q} zqB5Kdnak4<#uY-FtNnm*g>BOM1uh(Na=b+BG1K!ne=4G-iG(x*76eKxqSH@o`%^hj z=sLHDh;3;}Q&LoCN?3w9&}D@)*$!;Jq+}Sy-_&q?IuBdM=K*5_?l8;`MZ@$XQ_Pw2ol%lO1UtQztgx=x0i8KVjB z6AdFrQ=5s?d_Y-#d?u?{YWvA>7t)g$`BB+aEG*=`!i85VRt7c4vUCOJQ*AjnEEim8 z9VTiYF9cUcOrxC)cJMAGrcM6o%O_jitW{c!UQgqxbqQ>Qjl6qn z89y=)akgC(C?1>P(+NsyL@i@E&S^5f4=u39YCp-ZM3ytE1`|r$<&3ndWb>UE{1dBo zG{J2y&$XCZyKIj@!xq>}OI;H#EKkKX*yvP*r9QPjqV#yvsW8&T7@w$;RiaPv8F|WO z*DQEm+wSMvnX3|w=U->f%O%}TnJDC6=9c7tZ-{x?zHEBeF&GyXR0M=UZVa%h%(hS<^>~m>I}w)nRMY z2kKS?i9CBz1*5u7&b%Lg;hrH6H)wmgopj%-zKM2ex_&peI%j66=5&X>AhV-Y!|llh zpP97F^5zW)q{Fz}!0Q@=^azb)ui)}CdK8{d2Z{{F-ki^wb-E<2v_w4La>hW?UNI*n zukoWJMLj?xbKinop4my8&GjxQ{K~~Lbf3_T(g= zYTo3i^|uoW<5XK=9aO)pPjLNXeA324t|u#m=M8PN}z?~eyOxKc&D$2-*MQC)LOk$-Ar_D57%`P0!k?^UKDqkE}w zTA#F6f|YvGJ0AGuTTbs!oSFHG^38ES@1OVb(F0it*+Vr0zMg4?)B``hiP7Jx?h4r8yt_kuB(+{el%m?-XZ{ITua6`Yq&l>m+h7IL z%b=PH;!6A6X4$I*?Y@=yytzSxKh7IJdlbXrdgWotgM~qcvc-?`ixhu_`o<%eJ-ZvW9w{(8- zNyMp{7q_P~qK;hW7wrEl1%jM_L)Wu=d=7SdsEW;sj6t_LTS}w93bcV@8p1z;zl0zA zy0G3>QcYexi99i-mGhv)>~Nsxi39V};WLLQZ4mF3v;40fB`cod7q;y^ z*TFs2cl0#d<(82&gEaZ}SuWz*3Wkk(phlXit0S*%F%;{_U4pyIq2`&8&^^%09Yzjg zh#y=?;g-B{-=?Rwt1LxnopSD$AYpy0jLq|$wOtUS~z@#2q~=RcP|PmIT8;&mSM_rHq6G*rQotUTr|XgGRcDA-HX<=N|fr+*(ndn zyrI)S_nsKKs+8F9`mV-U=mL7#jPk)zO$CxE_ds)`Nq5$gc0bC4N;G2RqOUP#*QmK3 z$hlZ9L`eF%51Un4y9fE;JdWvB?Lx&ND$?wKDF~GBoOu#Fo@SGJ%o4etW0h(w(CLsq zH-XKKzU`0|AGKt_6S>5sZOsv(q6uOBu>!yAE)-HNl+|wUqdzAO=BjJEN+Tt)+$ z6b1j-UUz+y2FcL56gFZa%hc1yg^M04OH?S%E4+TtuT_iqRO#SQA@;tcB1U5Nlc#Xm z9DaxU_C}>|eFn@W_0GXm2aKxXXIJ)|t$uY&nWIluEQ_7|v&|_eQ<<-i+Hq>)XBDzg z^V!TD{l^n)B#eUP+K;7awnJYqo{R6b^F`Wb--C*B%p_V*f7q9unz57$xSP;sVZ3qoYAh16xIo?Alu+(atFZGh1Y}Ob`X~eZ^ z^;G1AFc$?e1?9iX>%}V(l&A8I)d*1JTtg|^#&O{R|2s9pWdPrHn9)6vR{P-jn9Y&> z2`tj}{D{u-r}M>jkLtT;vz>NWB9(7ejenS+9 zm`f$FV_1bE3YB?j0<%L;(|W4dT1t0PF%zQml9?)@Oq&gTHCOLy9>SmbxPjQDbMfw zr6Pfib(zF#DExIC{axk?i%-{>I@cDWX7f!^S+!C9wIdq%H8*F)$S8!nw+Z}HN>91o z++$C1XPyqFY{E*WX1nA53Ho3nYuT8QrknxHYNWZfZCZJ1+tN&lgDYx$X0Bqj7>TNh z*N(Lrot>BNT5PQ-RY-(y(*gf*q zb-ZXumMjHdsZx-sTNf?3!L9u003(%CavIH$cx z6^cK+(?Cn?!2IP9H<#!bVO*Zrv_GOffr>OE{RE`Z;w1@Z%-$RmBHDlcWLpA7N2X{x zqh;GMYaK;3Mr9=?^BNcP{Vas@g};|a;*LTgG4K-1K}BCJ0RnUN!?v!2rP3|jU+Z%3 z?JgO-aQv_lm3(q|M7je*ELEKpL`i1vtK`_Aj-#-Q zA*L&6k%Gu=yt;%#d6k!6^E<-AptXcQg3k#o=6xX5Y?4wSl)4hgqSb^?vUB62T3FTE;p=LC zLwU71Sp-Tz+4KX>p&YR*MI*srgYpo?@xbnPgmW!KBU?3wA&}RgRW@mzI<+!5{Dwb1 zXUM0EH$8Iv`dmcoBL1x)SC^SQ)MBn&$TVc-q*myxWqIqk`cNhsu1URDAjCZdm*&WG z-h7wcAd1+Y&yA|#HkU@T$act{udNf*i^!y9`~)t#Qw_C^b3+Ftvl))P(Nf2EH$erq zpo*_q9^kBXVswfHY+JNENNP-);I~D&)e~PLK84IcdAYb|=d1UHvi2*jU}rPD%9k`o zFo>g8ZUG?GxV2JGbEdbelU7=MGHyXEeb@4!OX#A*P*_@QSCf#(iuI_3?S{_m$Sl&Q zY%(a{oui?ka2)RV5nfl~(J88Cnt7<~+EXe*_Z5eBrbBGhZQbwVSMmqMtDMN#X)Cye zG)GyoL(lf%I&)Hmr(zTu{mru_K6cubeudKM^pi>q*k(i(kZW$qDN1LlyndB4QkM|% zoFtR3#88hxLa;ROEe+zf{+97xMsTEAyy{`KU^PMX)yUCXvt8}MFz@3y_l)*CVbQzh)^Z8=AFmVZBKl|Z9jT^hv9KS3^4%z1P@ahIvS_K~QVb7Al|JpIMIqC7Z4zV!6YaWAaA#CY$5*;h zbyrLozUInw357eZ;ba(DZnZ6XkrNZL0+D|Ixa7E>Ojr!OztzoGLr^I}nGQvgP z-M@PL(bSvj6~HGf9@8HJ3sPZAZD@_yfdzfjTC~=8*JMA*`1X59Sp%A(-ZI{yE6F8s zGSeb=%B&v#SgFDFGfj~7qj72uA2x z${1M`+wzoO3!0=Bjc4KopEt~fS*Ob|L|RA#v!hAxQEin9>7iK+(aHTemDr&RQPvQ}@w0*PWS7TB0*3Tp_`pqkB0io`;>b;8|!lt3x?50_9HedW8ZR;*?t{PJE`=Z)Pg4m=|>{ ztJ<g|V`<%ec})M(_~yF!S_f92oy?AoX!oMP}ETdVwo4J3G6BRSy`e6yG54J$T}9 z_E^$f#Z!eO|KuhM6EOjc!I9Mt9WIHtjTNiC`FAfqQL%d#*+4q(;0JSygO(L2*4gii zU`0(?R%9}6bvoeR+RAn;+4F>6xveKNb}y0i6#iVSTe8|~vhlsyg0*Y5@lW7ohh1>z z+1t(bI=we@rh^MsXov%12!?>}l|;)t8$pbpm9kx+6IrGmB^AXfbl12P@1^7x*Mm5I z_#huwXJX^in$}nKw)>(JLOz;hY6)boYRUqxT8-@z5tC4jkTae^Z!2(osFz4#ems)gfQGvIc%@At4nD1! z^K4iWm(-*7V}^}sv0P<<|0XR$z6cI)R;b8)n#NLcA{Zf*stQB8AO!SMx5F2^KC3vp z?2yz)>I`sD)PSeX174^d&&U<$EabN5Ltn0o0|Vn#aEO+N-d%(J3i?rsGSPCezE7)n zWW@L9WR~A|dr2ZnT5H+03Ru74cDVW+&e2>kSrUBol7%NUPwo3)KQa2u8ca0;yTIGH z6rAMht8Myt;0p8IxbQQpT=x|On^o!Qk#<5j?hTZ|{A z3^i6tq(O;3TetF_AbVqDgmX@{;9 z{61n98DHeY3@(4PE{xT7T)SJ3O&g9%`g*_eiN!i{Eka16Zqbq^wgS85z{mQ!0R<^? zMYOQ@m60y9o%MOGwpj_#!ZWB%_q*~_SFFVSBT&$?!&>ZDoRi(o+*`TY|KejGR-*_* z+UHVq;d;#nm}_Ff=sS&=<1+D7|Lw@10DB$wy^Up?>mW2^)ncex z;Le!v(%qek>HX`sb(eLO#z+zm`uZ;ssYOK`KLK2AgyMl#lwk20^Q1>Jk=Vj__hjR( z8_xix`LZ$-El_8IoTz9>IP@%^PftzA!lGUx%mot+F@`1jUJQ^dkmHu`_(FXiP2S? zztV~8@fMui8vpDzu9g=&$?P`)-S3UgOy1YegqCE3mY|l3>5;iQ)mckW!Y(`93R-(2 zU^P^9Hn+Bnp%H3RdmqN{7QbT6Cwx0Eu10HF|2e{}%(J}p0fD~0r7XUeha?RwM_fWQ zQuQ;tr0O)+mTh#`TQH1+Ul>I#EQC8tdX``i3Bk^=gfSFD?PB81?HjMV`;hM}ON1gc zqPyDBxUWzm2RvxM000{f0g@jw;RG5Ozdh+MO4WyQDS|9({Dz(c-w=aY_pi;gL@?tH zMa48x;H_V~LHkHF#U`c6=4i}KCq?yXYFsl$h&*=fOt2W9qm0Fy%_kyh z=17Q!S$Sz^BTL_NUMp^72G=v%cKNG_5D6(OTmDE#y;IMR8fhWFd*0AvHurx8B~>cY zx`B=8SJ{ydAjrY3!Wn}jH*OL*-sPDG!kHtg%E*+NPo;pJ2y1uWS=AP!sHv1 zn6C>y;Na>Uy^V<^mUqJypQnU75Gl~7w>nB$*h%Wc1|~^uUnA75ubGjLWs({uhRc+@ ztv?BJVUI`fZ^qBvVP@-7z)VC;b(-m7s|}@>4nLE@oSD+Vdx407S3@Ns6Z4E4<2Ubq zopia97xf-<0XH^5qtNNeak^Gm+%5R&Y&(=Z?$ry>u|lxrbW%w$ph*oC|dL$wCp$a@D;rU_-u z$fxlS;MaFx)S`_ongE1rc=X0x4e2|JGS(hE)lCc!+%Ywh$__}K!wizq+kH4i-Q&TK zn2Wce=2uN;4A>de@6xQO+$XeED z1gFvXy*Qe`%S50_0x9b0o5cnEHBv#giM#@eJ`0*(@oCCNM1&b?+OojAKMZ0vW4wym z3H|6WJjS}w65b=Im!ReCjl2#IKA@^Cqrk1A^R#e+Y4SYdmlChwq>+)azIk*$R z?3{uwnaDE}C~+*`E}dOvXuRD%5LgFs&!5e!SEo^8d`wu4eKahmv$~7N3>|O!%&f01 z>rSHjgn~GuQn}1}6%RI}>dDqMCZeLq_Zn88s=I`V2hShgF00`OvtjMdn$3w^>LWc@ zYQn;-px7=g_2IZ4`tyJ3Ne}T=WTa^lKvqgjWuAk3vr{y}RpgIWmefiUqL`6pI<^`~ zN6$y;s)!-TS1cWnuj|TncltCX*Pfu-kGlZOZ2Vpm>s;4MM%&F?O$N4~yf>)bZS`T`l_onTva$8uLtXDf$#O|Xk~ip{cIz6v`dFaY+oOO>M);)mBGzXg+%2o4_!_f0YnNFX3!>3OUi5*@) z?vRU*l3~1Hp0%L-WxW79BTUg)>@MY-mV{ zrLeI>taRf30jTT69Ilc1G-*c}P$c)>kJB=^)mAOq`{Fb+U2|l4NrdFBdkbS$88BC> z4B-gXxTQocBApQk8zS7gZh0rAMW$UVowj1t7r+34efKmeLw}HgtTKxJ1Ws$pE6OO# zwWtoF-sN1GUHf7c1yPXEg9>U@c%KvNZ%vcw>2&UfYv(>u_k{eV#Br|lbxfflhc&8G zvP=i>E>QkTBJxc&>0oM~D!ZB(V|vS?WoU@kpti*@bBT4AP-8or=Ls8e24OR(w0E-% z+)-Po1ZS@l$o%ZRv0(|uILj2y&vi6Mri9*x1g*ck*nPbOx7 z5y-?WRGSa$8E#zo@ZvZq#wZSgG`nTY#5 zBHnKILPvJHf&^8+b$vv(MLe?mT`9M&PF?0Re$4v+?Ns8#PB z;30=1#ggiQOk{HTnHwL@hZsTcc^^)fJma@j<8Nao{@z5Y$5xP`vAlYL!!|w9WUS%o ze0}|R;}Pbr*4Evx!}7B{sW4d9vYAAv%;(DwLt7oKAjNeNivwp%9L(}3ajy(rB8;b+ z!m_DI*yxomrP|oD=9dh0%YmPOazUQTBDM5JaVM;DPSIQV$?m4sQ-uT2w9Bdr3UQ31 zQG%u;_}Sn^YbTrftTSXq&-UI%jKY(TY>SiZW_6xS30VSes;{IL%!RZYS2_Koaf;Xm zr%q9ej}91pQh89+i=;=e8IgK#<}UIxvX<f+LsA`W=2+_HEuto%e0(l+gU zVb+#4{RGJ^%`ETat-}4|Nx1U`L9$muANQNO_H#FG(iZM!p{>hy2wKPy-er3SS4$&u ztO3V|*OO+rm1DQXlTU_}=`Y;jM{QT518eQ(S56}(N1luPD9v!~OyJ@Oyg|^=dE)Nz zsrj*wp9A@nOnlEIs)VzPm~k%lphrgXn@exMSl_&gx(#9LuoAMfK5@0Y(BkNmXB|YR z$8v&fB6gRirjFwzHu*N>?aZK2nn+1FW}Ia^=;c;p)(KlDW3h|%kwkZKLG6)!sc~J~ zTO##!-rl4$y2_Ef+S6NQflio9cW{)xz>Nb7c`t8CpTC;G9E^FCd^>Eh$SvhS>K&`H zpMXPS_Y7m#!8y-hn}av1{n^{gBzmZehuMvH?!S6*i&c{P`q1a#omt&OV2c3@s^vCh z&;eUTu{z!@@U{NKW%in()5Ogp-d4To&qC@yv@=_;SGLTx9S_)5#YU64pJSg0hgqF8 zgyPFQ72yJ%xGxo1^O}z>s!r7evHJtvxl;(3%;h(v<4u;hrK@wGsoY_W!*vid&1(5K z4J&5J5&`4DvQ=)WR@Ak74Ldz4QbD3PPquy6SbV>#$an1MpeOW0aoT3hxRYJ!e(*em z3M+^%AP}C57f+#PdM2}wA_K6lKak2*nAa_qC@b2%wU@dhh9k&WQ5z~OM&F6NfT#F*N>#&n{>i+5!n#wl!fP-!>{8{=i}pg zHS?EGDx~Q8#1P$JWMk6WHf-?Dws7 zDzAKP5EP(Q)I*p!Oh>ghJ8b23G}%Kmigz$9o*^cbQ|PLftLFVA|pR&C2H0S{$Q|u&U1K!A4`AlcOREWeC+T*D+Ytnct>^fM{!#c z=&yoCb-)>PMdWtZi_{!{Grg`31tt8D3$`n@!E--5O4Pv`llti!*S)fR(c^bBKj2wk z#!YoFNxP+Z^S=~7NwMq{eM@~=40q|OC5$&4s^kb}p?(5uOSR=s_45odI#|KA(X3RL z_t*yl7F`8*gd!s?GMsMqnE;dFKABf-q;j0k`CL80@44K)bF*68PA~Iyx|#LiOGxXI ztD-Rp)bZroQnyR?scD=lFVV;h#wf^0TF0EteCXY0ZD-Yw;D%?XV%<5%2BE1FP92EC zao6S;yjxJayq)w(C##g)MyYhO_qslQR%-d|ZECp6S|33|EG?IZ61{=<+$Wy&O%4Sd z4J8R&8aJ}%;n99yrgpO_?8U|bu{`5yvE4`uvgsv6%k`a*4km*X9EJWAeh^c<<6b_0 z^>jw8Azwf^=Sd!eP&AEvqXSi{?)T_WxeoOHVa0D#s1ilaDi(ApvQuW;%)xH>&QD-w zWU(46Eck{+pdAUJJsW;UF@kfBsT{p=G~^qx??UmLcLoj5MUciT@GM|+MOVWQesP4- z60l=mc|_8Y_2Asjsb)+g;RC`~?)gX9Pr%F}CZ)|ZgukHSs`L{j|C8_Axi34Up{?Af z<_p|xSuS&^TT$O0KnwXtJQKqg2mbX<1yYc7Ld4Tat^AFu$i3Cr%r2zVn@$HqENmg4 z<{+ljloU_eR#@kF=T4wEzgS=KIsTw#`#UXyha`QGS*=lzDUb@^C>qzem%X{ z!T8noh2k@wZ7trd%?iXSa#Q@Q1v%8No8_ZkWINh=#%q&*8g=?FIb8Sr#iqv&9mQQ@+BPw2h}1q!At3{I7?EZY>p8DWuc3X||^Qj2(Gi7B=nA=4?9 zn5v+5pbXPpH)q*7m(RVBs6fxssJ7Czii>RLTX zNHWzrn?ET&~731N?E6oPcVF!7GXf-hh6w$`z+lrXHG040wT-ycsiz zSyhSTMv*njOo<+=;JFzsgb~1zmvJ*V;%xq+eIs`Uo)BfX+NXj?G3H&8q2+wg;>O*8 z-1cmEe?tF=A&NuwWl(~D_m0lHvS&vhZI^ZnwlZHCTH;NBsM?ZA(gsr-=nk28Dmth| zT#;DhXywg1#Y^$$Bw$D{cI(V|hWvueYuCOubMh9jlrd!2xLDbY5IGiLIaYegX?7}7b9vg{g;+tim-*mx`sxLh5;Op^xMYWk*TdClRCXz8(k|n z(cFkNW2{8ccMlDGL>mxh6$QfvQDBtB{BWKA<|gY=|EISZM(>uKuDXy|qic7=^qW9y zJ733;>wb!5hi0wnI`^WD{V8@6jk+akbd{!q&NAO^5wf6QOCoEW@fHHLElZ@tUQ~aioG}w{zK49fV1cuQ=V>=+m3P zJ|$m5yf!>HWx;yiO=tYlg%{*^T^R}z;81F))R#*pCkbQBW}Fr|A5J$a%SA~ijYRPW zC^PcHQgf^bM#mbyk6)J+4EdUoF6C#?(}b7T7HCN z*p^jJjPp;!f3C7lGnP=iGMkt8QoD#$z83LK1at^*xgv;mHe5ZFbzoL;*8Q8zixWb< zJhw8!Gj*qK!h@&yC(g(7o*vsQMP-c!q~>7A_?bmZBiVpWpZZ9C*7R;=ub|y?x3za% zG}!dQ4ta|$((YBg7ZghI6raYN<{Cs*4QT5<71-%?+^*O#Yj#aWA-4u_79OXvu2j8W zq{+)}>xu?{qio+7v;0rm=1Y4K!1g5Uc&Z)&8 zDh~FAZU8KEnSKWV^Vev5o^#iKbJtq+O1et;NQxo?mTq<9+eRZmmSsM%EbSKCmpYpg z6>crTHJSIa(sLmsQCT`H=O+L)xlw(U_t?j8JBnwAHQDd-G`gH9dp>py_sE7Z$< znA#g(l0)*pfA8wxwThz?QIBfj)J%@UL+*S5K9^$jcB^yz4(d0?c@C)GIdMQA6k9eB zxz87*dU*uN_$iD%5qqk4f~N(@8Pzj8npWkT^)Y?Wdh9Sk>V}E~C1%iuFb^@_7OAK2 zB{)b3hVutLlv#8Y$4E`ZX{7w%f3+Pi*8y5Kwy22ptNSln7dxu5Kqb5uBsLsS1s!uz z35A(Ku<7|MlOfL6v-l+M{&g(l!lFSHRL3G`!=U<8{MA{xx(n<&t+r0+9~r69Qj7%H zaIa^$lLCtauX-v+M=;fY46its6R!A~FdcnwbW|WY4U5 zK9X6zefM9r{?yV!kEjN}i4xiDv%2Mw(iR07W4$|o) zmO@)wSS0*cEOHPB{V3MctiBmDyCZBu%;=TnlUeak?J&lbLWk@|b)A)fC0Y|Kc7g2^AT|$o-oeWF7uyci`+ZmRw z$fqO5HIq%E9ubs^Hl9WbM=V=JwLzErhzIlSsTuj;!Bpy{4U3A3$a~)1E0!NlPv|ZP z^0#$Z+s$X_oWJ;d!|#4JzxyrRS-B}=(U8q@OEc;C0r_XB&CZ>7)pZ?*8?Phb0*fXF zF6z@L0xWK z#O15m$u3(k_OQwok!UKh$Y-VO0S*=jsnqn*n-S3RaI%l$QB8Kpv)G9BZL#F(OjEcp zY_5BdX1;1Oh8BLD@uC%(f(fmxi02me{uDteohI478XLG`F zTPhZfMVuM4 z8l#;sR)v49fuRTGyu9cjql~rqVXx3^E4YjAEr>PK?UVoTM8`~D@4i5RRNjqc z%*1~FY1-n%C`B!XS8UFx%DGk97M0SGL( zA2UthFOh#1BxB6x2KK(-aK_gZfUSL_mHK<|P zQPq;C^p`NLyvlBsG4dPDyvj*JA93M@*;H8C+~Cg_J3dNRI>Ry{>CqMlzT>&Lx+s*& zml%l|sQ;Us8gxdP?8XJ_3@~N?Xr+PaPatQ`^X&EeIxXAPJ`Z^k{2$yW(*FmH`mT9d z4q=U!05W4P;AvdQh7qelc5;W^5GC(cCW3lzMtfG$G}4cqI=LJ`tA7=7Ek{?Zkz!wR9@S{%A3e)c!eEf^WMjI zs*`l3aQa>2qIa+T8?R!N7b%GL7)&roBjEImTXMRS@PCk47RN9I+JqXhVQ)KZ6Pvncl%>bxUybn8jvZK|MBKVEib0s>xT|BFUwYo?S zz$Yb62hsdm`V^#((|@k`GGwOYWXfS?<6WyrDIpAoc=4`jGWp_E`{8(ttm638?IhVO zzsPn~6^Xf6nP7;ew$lYGQ-3paLqt+_lcr7ZzQiI1sqz8_-j9|%#q*iAur226H<>1j z;59OB_eq=IuQ-yXS_g=y@%M2*g1-j1x9e(j4MN=J9WhNH3=glQT{-N-Iuy<+;U zHe6t!;j}rz`~TNNF+8Vs9a!G&++Z=9Q@<#%r9&Gq*cb zLjv~Ari`n@J!rzGi*TmWKMJvP#LwY-}j~XGhAHDdh{$ders>@Av4arX5IX|xY5<|+` zwddm!nv<&Sx=oemcrrfx;M<*J@n2unN2J{^D~kJaBBd&rdoGPI7Ajt|bnwLlE~QP) zOH}REo2>D6ydZYWtlH-0`L0?lW&8NdnJ4mD8hla@Zs?^0>C=c9uAI$@8AX(~_RRoy$!p`0qrD zp*W7KV~poYA3hrK=}G}u1cfUL?+gQ%@9jkDh$?6exFApg<+;64CegP??_J@!Vw}n? zmv;~6FzMIGYlE{a3c6wG5ZuRlu-BW1` zrEzLOrK4;2wZHVED`H2{Y#A48auMD>n*Db%K}N4xP9{5)l$j2Hs~)+GAhU?~24S04 zveq@xLK5-cpV~HVulz8yetaQCwS0Qp;SFoItL9q$!^jo;pn3b?{^WHoq_vRvRr6j3 z3HMm%fqLsF$UD`gZx22RYvj;Te+UR(7_}Y`y%U=mawe{Ez}!%d>A-E53_hjP5+@!R ziKx+k)A#5!gHOMX79t0E7T2~r6dVlN8r^-hcpimdt%4mP(l*24e@6i>h z%oOL#LEqbn^*J_ap`S3NRwG|84BOja4brAzBrT$SfmBVbOZbY!jUVTd9ed!%2`57(PJ9>@CTE8LZzwub(tIgY3 zl#X5av{w$*v;FCn*KFR`7lP0gLjvdApE~i{s}*QmV|rnT)fqq4e2C&=_joAjDc9vD zyRf7Yzt<)A$X+cgiyu$RUpxP~nhh2!eWTlFtJtOLG}Up+h^sC6=)@gEF9VBrN>G6% z*?6VC{cZ%r`!Uo)vbk&nRZ6w4h=w4Ujb4+)@AlJcg#V5y)Bn2K>4~BMOb-zYLKO+3~?eerE>bvya z?56Eg+ASfu1UF4+740zhbC^Q)jSM4^SxsL1gtUp9tL3+2%j-4E6ifTjEB^-o%Rn^0 zQpSN-1XAo6t^t$L;Xjk9Ve5R*SnEqqUR>X>MgRMPZZawMBEYI3piIZ>4I*NRT zLmo#I7F_d4+sgY@&FC}$GUI6CoHjVxtAj$TNTZw%l<q)>tAv<$PCgcLEgg&C2xO}BBUT7-p2xvk-s3|R&;=2R0BAsrZJE? zr+m!#1LdS`$hb}kr|i%X$(1={^rca^p45>fxWi!5$re;Aaf+LJpgFhg+z--)C6sQY zUc_`1{{WY_6{gDI3L8F{r)}hu#WlAMPi~aP4UO5UbJU+^NU{Cq%{x1|#t5k64uIq4 zCz_ZRclib>x`-nYfmv7_=9s{NOcLh_j+B$oqClmkARd$)D;35~E(j+BnuMl0edE@fhz}@AWbukrI~Sgm#e;7- z-AbgopW($RM#c>mW07PGz0atm1sKf>8D%z*bySd__5FVq9RfNC*6O2}lNO0Im701dt zP^;yr=Xh#lq!tPZAor|l_UV}+f<-TWHDkPR0G91QaKxu&q`!sOz~0$X!?EQP7x>= zu#;+zw2rJtAKs^#K1_}cG2;qBTFz0np%{RKZ{7DrGFZXJDa|8=TynJ5k%Dg=id{eu z6;&YdQAlKYdu^qS=Fx;k_YzWm9H(k`5cTH0~Yqv4=H4-5afTt(DHkvbY>?Dw# z>KNd9RB=dhLH-_h17MGGS@LDrfGX6ZyC%U2{++IMyKrBy6){{SsDU6+B<)1L{zWM#Yg5L3$&f1tx4tyHi{es(2lM~+G0fCc>U2pjmoy}2&Syh5W|d* zdeKAqhhjG%ecrSqTxb21?@j~E$Q?auRQX26JW}UE=S4zT5(%TrZl+1`2Q^{_ zP;kQ)t)0Z~K<$r}h6MppQEEm&2*)7Pe4?$i)n9W+y+#ZXkb2YM+O5grnj?7jfzppD zTO^DccSszAX=lkCQZ#4obgKwiAnB4iR7x5CX5-q6M!|cGAG=_!o+$w?O7byMsri*; z>(iQD&lH#|kSc~D$ru9)Dk7wO&(CpF@AEPUDn&z%NNm%S8i^vN!?c|JDF@!;kSG!3 zuUcx7r)zei63~kdA1h^fq}ZpIH7HQyG>;Q(+&?PTBj;mLaHO%o^`smdT=58cx3w3a;Sdz&$R+Der)n6_HN|ZUgTzw9qKdpMGC1l zaQMf1jO7M8flhG-$0;BY+qD4!Uzxc6bkK3oW}^hA4{Dh1DLqAq>>EJ9sSISVKQ%7! zSQF6G+iP&OQu8ep_LObkr4eqBu|2wbQ;$C==M^L>s0clK)U^5uvb?Dyje)lN)3$;( z<2d8%QfyO<90S^+8`4p~{aCGH^ae1-#ECj>?NboSpq>Rki+O zhwo&HibxfT5=h%l@j=R0=gjF>6-%kX=9?MBgdp4nHvj{J(wGfnCqwwuCND8I$(oWP zp}8FY06LVXnS;=ZASkjfB2A=H4loCLmvAq#P7OQCanGe)*HE${LQHP0^5MTac*tF? z$fu?T6_+BS2v$SE_M+oNZbsfZ`cg(i@_5BqF(_>3CaY}`y9^R3HE>IqX={ZUBjxQ= ztW2O2)83Xa&M<$5g)Ug5a0jg>^st*NNwzmtUbNXzyN29B9fe9p_dCWm)BJ@C=KlZ@ z=xU>M1ycwkBlu}mR~a8pYR1PSa1|eH$-o_HSg6={ls06rHA+<~jE9WXvSU^X2L_uY zSd5UpX`n?okxJt=B0xq-8OKU&cCXVs3cOUHQs;_ekzP3E{w@VZZOb+fBvrrzMBZ2; ztES{6o=pv+A7ZqT`6GNskxCw4EM)WF>rzHR1+$z|tS4&~?^UIOnkszZunux5$^>I; zjDu1lvNm?${{T9fqhhiCop*t`nkwj>4 zzcp7-#Piaf9Ohx}Wsz!b+vkZmB8Bbri7 zxWrdRAmDRNRA4fA6pS5?2`i4(D+Vj=-!z&fs};yQfhUT2Y&TwgDmKctQ|1Dsjzw-* zRJnPKdP=IrO+>4;%afXNtUC(<$>~wx)uthrTclMAc+EU+j0l5cihNO_`J`Tz3-JE{ zyZvafq$E8!K3;Q*nBi9gsi@*ODi@ROQph9OwD9}8Rah>F!l&_ZSvQiTSc*f8jEb93 z)NSpc;lFq}#(DbJo?Po~b*aLxLq?ed`x??T+Z0zZ)_syDPcm`4xCW`b@hpTp7Gv1- zsP44{OLHPh6=NC6T)O|j+&_=0kY9nUeM}GeRrE)V|LWt%wh9mC}qY^QFg_ z4*o_#^a7?dZ?P&iI~&bH+SzlR#Pr2+lWNyDzG`47ljUA{$Gv7<>oyDW%P0Xy8LnO} zZo_-rLzhPGDm{r4XHOm6wjjc?pEs%Wr^~4`zUAt^5;_8x%y zn$oe*=DWE|i`~GWI1R_@D?fD=16s-MXy@gTixd9W@}}t)w%TR5 zgrB~0?EPH&oOiB+?G`Yplg=9k2g-QK?L-%Hg&KTEDIA-wdF|) z*~VPIQ}n9$mwKJVW-G%|~5*=Cf44-+1@2zhLpq}P*&*w-Ke5ZFfsUx$B<^IngAPhEYoz}CbY4W6U$Ru(z*VEFe z!{e(FDYk|KytX$0O5^$Fr`^5E^rp=C^br>$4DnIwc`jC$1S#AiLb8n_NSmXanp zZ{Py5Af8!1M+b(;^~Y+l=3J=cZr#%#%B><0$t$kX1`oARiy>Fb%MNO)kfUxmG}&Z6 zZybaAQy7*w1D^F;3gli_mI)^$_VlKJ%D*=>;Esfb=8+V(;n0ebmg15GWb!Ejs2?{b zg}I7cLa40$n$&EC*bbwm3$|RaI0B_1cJs|N6peGydsb6=jIS6VoNy@_2Gw49 z=qlnOusP^|O0V;PPjS+%vZD1ERYD!y4%G~Ch9d_%M_%GcDqYBxs4P-itb+6PWeG~{#B1CdMNCK?PuxptBDsLF*09Xbk=41aj1 z9+{_Y&Ivd)>Bmv6%Kl+hDg`rvz&x6;VhEn5oA(Als*FmF`VcoCBXy{^D;=bCr;bT2 z!9C3~Gz2kYxQ=-2DMs$)-7+U&8))M+k}!!zGEYt^*v<=lzvD@i1S1Y})~!jRTCpBV zFU`n5&Y~fMe8Yjz`cv*Yj31>q$ir%F8E?{?WFjr3FfYzON@9jXWo)NOJPpmdX^*%2t5TB9g$U4mDuB{sS&mkxyrEO zm(_-N;}p=Rf=5r%j(|s!r-6`9LnMM9<~){*>n4WjN?5#S{{H5lSeYq;J9Cbf}A?NHO=Z`cOfUMh-L9oI)!oDVD}F zj&c4J;z3<-#K@p-A1-|dr8Ybb$KNKVV42&VK*ATqLOHmt}%n#wJ;2WoaCM=!5zWK^r+kB`sehieSnCKy&DwJ z8O~UeqoVfBJSbM$Dl@r>+SmiAs(0norpoiHGpSL?JdbLcITQhr*Vd78GF0cd`c!K# znt+AD>^sn+*xDkKu0hWcoOh=Ij!33#Yy;Y*LON4~OxhnBsKlV1e5WU+M!dP}#ZRh6)r{ku2RI&!#5Acz|@0!<;&Dj-zBd$hjWm1{-q#&FUDd-seD2#O? zaC%c)3P5h3rA!naJ9epKK)DC5L8q)l z9%*)vpGtOe0rjYCU|TEn>q#4jQdHy)^Z}8M-RX%FCm{T}=sMC#GGt7vfzNt)4ag#! zmN+0EYEooTk};mgwM~jhawx~m(w;aQMIyOuZWS)wqd2LO(?L!muHY~_Q&mF}dkTDe z+mpx?s4_u4DqxJ#)Icx=N~d>fav=n_@Y9^CF69~a6;QU!wYZ!WocQmM`}L~a)BD2%sG0PjHRaoVShb;-slp%gLn zG@C6gMyz3ZBQ+r0PFtlYUBd#Ds}L0NiWP@#NZ01z^c3)+MsvqpP@@Wa)Sv+w&q@M& z4OTeLFbz3Xh~k>KDlj_qsUzT!Y8nVIF>d3%I1Q_eQ=?tH`qE`evYwTkv_+CIRz)<$ z7|72xB7o8DBc(bKv9~`_Qlw{Qgo-uYmdQ0a+^@AyS{0WJSWyz~T=SF7Qm{{Pq99!7 zjMRcM4i~)`JY%g{jQ{|iDrF%j)M}o7akiygD9h7ww43=X*``B%zOFiBcWZT|oY z`s3nl?W}rtn*RVIrvuQFz^{_Tf=j0;nH_Up?g6B%&rc0K4XJVDU~S2+f6Cjt%{*{( z?@kv|TuiAdHAT64X|T#dNz>sM808@Ij|l%%$D6=?RL z=}i+0nRd5s)U~iVB89_C_MO|Zv3B?OrpcI(+GIFpn#DLyd z#(n*0Y|qfQs)vW?icP`#dsSAE8XqrqUmf_Xk6|&llIlay=N+psz$E$6a^Bq4ErgvcCd4B3?%w@=QxyD5Zr=F(iVk)QD9x$u_uYy_%9KO-H@Ne$eRK0*0cpr~7lB|TD0 zi5aa|mkc=`-qk;c?Czp@CcTURxX1U1t$3n)>z(kX>{W}f*0O^$l#K`Z$E_<9$j53V zT|%lGZ}Y4u?b%}3zbW+0f%2H)TLR@R@VDj>L(_r5cM(>~M`GJ9{bSns#Xzi6E>|NJN(8wWc0;V z)Mix1+;#L@F_sBCn|JnpXAWf3vt1wAuZ zR@U;zbfHu}4=38X7Pqz%2`7w6upcZpsj8H&IHb&(Cx-SUf(G5{dxPmn_A)enN{oB^ zRCaMhFD@eyc?%ke5&r#~X zR@NG5ZdMf?Js&+y%vING7;K%irOv;d7sCOZai-MGhCUM z@ML3MK11vapks&txi}S+a(Ot#ZeHzBxf{0uTrI>(TJNE<@*XiN`=qN zw23A{v7uGG&oTMWr)rqBun4=6S%T!}`PA$f^f|>u%EaItF6xyTkQMD$1ST~%s(ix& znHJ_@o|KIHgK_{(7j0I=vDMGjK)Y2w<017j@qa&VrRPshxY5CXnF@gCY5G(1w}LtEQ#cDk6+T+GKP@^oQa1sN(l;tUyXi=SYIEAOaR{*k zxMID)ro$24mg;DgiEnC=H^`akigJz0AF&WHCz>(dKD5oAV9!%eBtyyNjb#RApjO)4 zg3L$`!?d2Y9H>{l zI7ZC8(ll}@!RboqHVzUsaw+Vp{{S%jX?A>>>xu%lcAhHqxddBqzbL0{Wb4VMvY57k znvhEvTu454=}9XNT8Od|%vX^@5ZrF!nH)t92RY`fC=v30Q&B331Q5VL;Qi`_x0x3M z-lUX)jlJpVks6h&=l4bCFtZ~UagmCOP0}cM*pB$Ahb%MFrPu=>j1;7-Uq2HXt&eyHP1^#125DlOjUMr3MEX zrVNlX(v;wzm{KCHaCoe(ZOE{>2jmr8Mpu(k@Wg@-6!ZY(w>YPvq+*5!%HVNK2;oYz zaZ&_sNa$&jaz;*Ra%xIi=rTMh%Wx`a&g_yZ5O*4BjjP#~CR&QOED%-o{9N>D>Rs{>S2R-vz zR7e>b?qj<>DPjr-)|m0*h2z)WqzDjfQPzuDCW1c^AZA>F&{7r$r8gK(J5yuiZ#)X1 zB7By{F^ZpN>u(}@S=#&JiMH*d{5VT|wV zn$iV9cOx&b1|O|17?Xp^p`$K9Kb1WW#4Cz+b_)$$s_h3RqZnp5OP{FHZkI{ z+3FV~bzB3`Q)N~^b$F>=LzBOd1voa?>tA$S!~}@IOk*_}9T(QD81h+&;-T_fNx9A! z9Ao;@Xsd`|U87@X)}&QsiNbglA?9+d8f8wnz;CvoU%0koaj`U6VR ze4zC;3$gQK82X<|sK{xeSyjGK8Q5u<0fMh;n31@V*A)u=*2tvLmg6O48&jOo8--Km z)7BM`b=!`#`4Iww4@#y~WA6|bV%bg>oC3BFGB8%UG^8}0O^ zX8BZs#W7q7Kqz_dQF$*To!li6j-s(^V--33zO_m~(Xy+bm(s7I5S;KT2|*=z;8J23 zvye=9=e1Ierg<4#w|bU9%)yuB#~)gFWmV&?35~mrkwX37#*#NH*NSM3N!}05+#Z!A zYQP=b)94{rJHBJZK|622JrvZWY&odk2)n<%L7^B`U~%$})WShveJL46^(~RdLDHO| zNXrZn(yCDIM&l)amu4_cN|GI-Bsr?435(#IfNIQ38z~%v>rz#^4QSM6Hhy~IvYJ1e z5*oWB;FNE@jh_ltr+r+X9jD`h99CU7V7~BBn8iJoR3l)f*wmUrLp@kp-M8 zlN^(S&1s0*IXy>OAx*2a4X69~=}B;A1Exs%g*NWQ#$<-w(>yQG5|>MEn4#_)R5eq@e{LOxI_$B;A26O2?U z#Bq))!HzZ=9ee#MToG|v4OqlyIV5^|8hmc@KE_X%)|YnDA|oL5H84^}?t-aC#IeQz ztI6P2e5l26rv|MV0gL4CSoaqxVhoa>oxi12RmT{Xo^`fD%tsZ(>mDgs=kj82FVT;G zQCWJvz2@Om;khTb-RoXU;-3;5`6IQni-yn5-HeDDb8r@8+C3iOs8 zEz!~J{nKB>ej{6pIjk;@6@s=i@_P}3SXM6#FxyXWCQ1%7)K{Ifa9u^VJB+LcX>Hv* z)b_WK7=@+9z_%kC4(?7Uoi4_09`B~=uqg87UGfj_bv3#6YmlM^VnyZL4)a8DoP);)#owyWkw6UcMM{Nw@Y>6++lwH+%@3HIxb*i3WR zfz4+)D_DmWW4_Wf=q(@?(>alsyK|pR`-;_Rnh@$!D<9nVuPD3tm#0}~-p)B5P;ts1 zr(Tths`%ejyZzOo5WsVe=hyJA3DA-=Nv3)|#l_yKKb7VScq8QFsXnCpRJJ;fg=0EH zeQ+|Vyf$&T`}_M>irL5F?+_f@Ga)Vhtda-I_2##x_;ssaNNy*&K4fF$_x8`}LyESn z)qi;GwI7If*4Hl`pe0k1Sqp62RFq;qbYsJ#2aSMY z3H0q+BE?Weyk(Vk=CmRh&M9WeQU_kupD^s1mEcn53!L@#s}b#WMSdF` z{c1RKmsdi&2^l^8$F*vVtgb^Mv`Lit>QcyKQ=YvA86 z89I(=2(n6C5->Unk>YFSW(Id*T$;Q!vjs_}Z!xqOG=8?Cbm1%)+IIW$bpqR!Rh8S`>icE9`bM&c1XK@|P zA|VoDM&qy2mogl6b|J|^OLz6BjiH9_0jIJ9^YvPZ)sTS@8R`M{a#T|gEge)hn;>W4&Qr*E1AbD6nokk-B1L;#L-F6dOV-V{R!f z;=Y7zSQ3O_denPyg{d&*j(HVd50Veogi>No954zy_3cl=WhhQ?KPqAw-Eu}0bf)=5 zNMdnD+leN|$Ilq)#VfYg5&Be%w3D|Z(A07!N6prr;%I@RiJVCy;Et5-$})r#nwW<6 z$*S9B4Ul*g_6>&YV%tX;qD564a7R;9W&ZMv;+wE+CQg-6lNx1xpee^*+38Iiop(sT zcem1{&ItbL?@i!7KZO33uOb-~MTsXE_NO~z78D~QVy z2OhL-2%g~6rX^GNLnXNSRAHqE2Hr+E>_s`d4W>O$Os^nuQ5DPNjGB-M33A*6(>;g1 zAjk#RlDuk0&#fbFLKS*{D$Que9mSI%=NYJj zGqSfpJ5;R9qaS-U0p6^je-NTGu!{S0J7nTAI(yP0GDu1`bJI0ws;@h7x}$7k<*ic! zyC@^?9Qsl>l+pa)lC?Uh$P{@b1CjYq%_)?ALN@1f4np_Gu4zz6e)mjq^rw-*>_3$X z50nXPVvF@N8=R6)0)W3R5cTGo0O{*QV;R~=KJ}z*G)0CCP=WQP?QVW-`eLOdWCFuA z0aaI4Y>b?KCYXc)lnuZBzpX+Q!xGJr=zCSC9$Ss8oyU`m^ZpdmjOMB_F4~pb34j}E z{&iiXTX~~^g62hHF^mAX&UyE#iWVEOp8oW>$@|&wOGUVa*q)V8A(e^)w2nyjshI?a zkIed06$-w49y3*-D~Q9W9O9!~=aEm19J%Zpy)-C|*>jxpns-95%w%L9X%rk1->ppJ zVgLZgss6PF&FneAG}5xTBDdWv7q427u?ia*VcMU*Hkg6QUJ1eD+n&FL4637XZaPs2 z>tJLLgd4&F{8A$ZP!HoyF>ZBWao--jseyL3Nx&Vc>a+qW80T+adWrX|sm4e2_o;|h zaoE$O8DgEidWs>qiW4(~oMZ!@l{fm$thood9Y4vbz*S9|$@Mi8vWDY19X%<<=u&8j z!Tu5d0N1ElurrQ*Jt|f$fB?>FG6L}ZPfqo8^%}E8DHsDX9D-;e3G(9v4(GS|H1RY~ zD_g0{Mgb!S13dRCJMgRJfI;*?>@vPkLh^N8s{* zDu~8cADI2BPV>N~4UdC^o_IZ|E){|v-Eq)T{HnmODtgh#(BpC^RUo%OJu0ws89!%0 zSav5BZb8cc-zn^Bp2SHpgTT&x4GVorNB`6Lmuqi1;DgOSV8?ot0$&HIr5G74Ux-Zl zG`bN+xX9c{Kcz|r(m*uO6-Iq(Kr#XKspiyUuv?K*FF-L!k>u@9{{U5A5Vsq8(HRoc zD4~4(+|)05xcs-$a@q!I@;AoFsv0rCooC%QbmLpr$7l?3xv;g4b8-lMWHy}B{( zDqk&!PSuI#NfJ0-xamr^;%L|(n|Dn1rm>JH-OXLJRs#$;Jt&g*z2l0k6^=ITB)4*i zDUmZW10ca8rgMW^`lY)o?rO$VT;!gWjYX;9&vG(xjOR5V-?%Xp3?A9VOsZe*(M-f= zJw;6tl5^64te~l-1wwLpJ*ZL|fQ4Hl2Z2k}aSkxs=%Hxp^dAmDmY<-Yzn0;Eyqap^_~Jx>)YL`o#d18#CD(XKhq0+_o= z_Nh^@a0e8YfS#bIaml6U@TH7yaywG8ki~mdJ%oW9aT)1S403Vbij6|<3DEYbg0gUV z0+fo3ZX$us4o9U*gFh+gX%$9E#yzS?z~m8(bg5Bx(9-CPE_2vY?PBUxxE)8WJ9`Gk z-aAv*=IO;G?8Y!I8-c|=zyk_6J*lo$4jYWrk>S4zcQa}tqOy(_oB%6ZH1!z920`mlHK9Qu-a#ByE!!Y-T4G&qB|M45z5jvi7Zkwo>w@on@4Xk2s{H^)xX{+sIJFFQMW27z`m!S zd`~eOFpitPz4*m^$9HO$ihQWLp4=a;eP!_leC?o(+i-sx`Dest;yIdF*Mr;Az03p9 z^ssvoXz>Xhz#u8=t=!iApttjy5}YSI@l<>}ZHRu+Csq7~Se&W4JJSQR``4)xv8@Hx zt@lJ@gyRDw`+8R|YjbXqn6?nZ@io-TbkYKz)vKAO487Z-|*m~8c&>~o6Yl~sD zmE)yRvx920$bM?mxOIvojlXx6=A;j9k)klqekqd9L&Pzvd3P*!=jF-%m5XPstWrD> zgTTQ!!Tjp}r9AqqlP=IBgy0W)%K}(hD|q4pGEbO${uJG;Ok%Ej9j)tK*{pBhw_{1C z={J$d9$O&xHA6&&*@xOTpxwY9rFx4b5!!j=;iCiSYD1LsUlHQoHB4ee@A~mvjl8~a z%zr55a6M}8jkO!OoXc#x)9!>n$m99d4+X<@bv|y>%Rn=e7WmIP?tFUSw^K9!}d7_Ii5q&MkYlroE{1403p)c0CNK{GxLQWu>d zbi~LwM(S&+w6eOmLoAVyPefjv`_;zKeAG+0t--h*NCSQkTJ&8ZVS>d`fp6~SoL-|! z$CVw)dAXRRae^3sw^9WK@LcU?`M-*`{8=;+%99`oo-yn1Tstgj_H4tm}l9D1@v6xf@1#toc01l0D}H^+D8B&N}QT785#@-@N&U zjkQBWDHOsBU@JiE0D#v|Jn=J-ag)atSj8xXn645&bM0C{WL6Cll4aobG|Q<1w)juTKfT!2 zEzY-Y)A=esQCgOhB(bpDxmb6pA1Q$)%dF*D&UZ0i?(dnplNr9w zepwst{{TwtH2YaBtQDk9tZ|Xtd(~UHCQCzfB9V-nS$hTT{c1*li!8C+U$b}m)|K2W z6l^~}a%*17(Pn|n$-B!3U_P|e>_Spz{*$C>DmMt#bI^Pc|`XP2A@{vza z1!EY>G26o$)VqvLZjv|MP(Sh7&1V5YJ?r3Vt2-V=L{^1e14P`4K^l34gN$~hkh|{k z%{J9t6Ze=c>r0{?3KHa0o>&+u z&T4J4DuO%GA6*EH!G1*?^fe0YBOL_=9r||bQ7C+6sl~;hNwRp?VjP-~=VlaV6pIT*^l$ zy+}U)089#(0i-eDjhM0Go{53Y05d6W!lGs>3B^=oOGL&XJJU)8$?82RRFNK6tw$to zQwM@-IlGf-4&E`0W73r$2M3W&Sb*9X)QKKgm8tkF8*s~aH5p1M_UvdO~R}j^3WNJ7AtVcBZ!ArJ@-ohbG29EgEILDj)-@yVZpK z;(;eqQ7k)HuPg;*m9!nu)d$R6aY&wHvE9&AtFZ0|6wjaTBJ9m+7_kjj*~KRETY-b? zQ~6tV^Ya>z@}spt4#&%qDzF)S^7g6x!;QOXtQ$Db{06j()Xlz8>=SRv&%IVy2+6A@ znNtZ-11lT~B`a)PFVtcHI85rFi_M>6!6HVvBjz+lfsncADeV`?Ffr*<8x5=IAdvq6 z7~|5KitgDxC`ee4N!kTIGxHIR~Y3oayK|@ji06uOpN8Vyb zY8_Zf>r>IgLZmUj#*I%8~uH$o>_GyHx%@Us_tgRTvu?J5dtHO z=QUz2(z=2^?M2F|WA{ZmIF2%$6W)^0PvO)iah;>JLL%PXGwoBAX!(9r^`I*PAD|UZ zLyEYng-^}KX$adU#yf=pl#RgUPeI8!?=1^1$g&2*EJC(xYtTrv{M= zZutSh{VKNtQS&Co`AXAA1Dbj$Jx=3MpS`m@Qj9r7klZ157^@8cMN)VIqcZGeP&ZV7 znG}rf#X6EI2w_BB+Zv+V&T2(fV~}x5j;r!WI6tK*^CE0CG%0}Qp^IZ2^a89DSKzT? zJ*vA$joU^x^{JeJ$qh0gU@?rltxD%%AVni ze7}V~AXF>~&$TDt)WA_s%ipytjE(7^Y|{|F^O3-+h@6O`-5X*~eJBYlrM%|DJ z=}t&|))Aw2z$d5YQpSj&6WXQ#FbqcAR8GN0dVx_i4UQ6ElHDpMmvZ~iSvPG_)|`FY{9R6VoWn%UrVp{oQKpoBmNTA5U$@yRs75{3DB zsQzvVrk#Pwg2VTV{!~c{FbGM&=Zchu+`0R-)!arifmdsS7@;^-IL88}kAim$3XV8Q zbGwg9c>tbAJ?lBZS4d2(XN0D+GcMCo02K>0Ft5xr(DPFmmli}~RpfN1tCC1z#aRjf zBR=@{sDddVnoHe57!B&*D_~R-#tvByMOiyaGKz&F1Ln>>s-lUKA^G8ri{#_;sbXa* z<}U!$#F54_YCa<&8>JAIrA98zN#?j-K?!i0%!ZDo%0K5l~KBViVi0DMN8Y ziQ+2RC#^~}Qd$(HVpYn6oU+tALvo`c ztiIKZXT4XGfwWef$qM8jDzj7KcE~~Ag@_Z!YLG^x44s(#=t2>*5h_=YT8DnnUHQjK zw83_r=bETv+k$>^-m1#LS7?i-^%V+#t{5B+wS8M7%N;vZG9g4IPd$YtZh^ScLq5b_ z2UAd^FdTi+){-#o@^sA}UgNhs56*((FZ#7I6S+@7Y9^D;9|zKU#t>9KHVx~3yqS*RU4nWX&u;Z0C7!Tal4OtVUNjX zAu5{-zAo7jcmFG`VQ z2Or9-tSjc9Lsm*8XMa}dL(w9M%qskmhNVPk*9%plATd@sJ*m=8A^q5HGuoldxE8kW zAdGyyss3mvN$5DmS6ho?`_z1PIj(b9*DWj{CgG03mgC#h)|9T@kV+kmSCv*zGiVX7 zTJk>`_`=`jj@*z5+Umo%PAiV_e~(_~)9jX{u1Rgd9O0M)+T#R*8_PYfuHfO zcLkQa-e%CC{?Qhx;!D}?WrEbdlBWk50I=!#R7-yL>X#S8?*iNX{{Y6g`8-4;Q|7KC zbCNv|tzqh3D-uE@HvVo8$aCA&``5g%cIb6-D;v^k^3AIYwUhU8jAyH#Z1xq*wy6tC zJ1G6hE~JCbYZgsQeXNXe9&@=rg|l3+j&*@iK@E;T^{st|q|}kxS=^wF zjjX{T&HAYGpQ`7jTGJrBHtDwAlN=A?C-C&Hn@#Y&%aCu*_}Hr^I^g#FD>=f_F>K@J zOT>Z&nOqdXEWa`OS9PRXz16-zd}2Zp_qEMm$T4M1|SWy*r)0wVME0ud^(tFY<)<{{RZ~%?H4m z{a?AkCB9R`p|-ey z$!}&1Zs42_gyOWc{{RN+y0lS8G+PH!&G&%*we-AS545Q++FgZMj1GEj^sdf5D#F!} zEMNubI|}A?I|YxLA^2l_E)gXkXhH{;Ps{%R10+|eX&(+@v5dtxD&sr4kzT4qAconU zw2W1hmTjDLt~V==r^0gSz86?I1Vg1=K$lGTszPz}V@;cToIIo(M+8SYYBa|0?y4&TnKE()}GXUp0DiS(#-rxVR-IU3GmP{iwMkmSxcCwLg!7aKAZ{L>pj1*R zQIWtNood;_1I9=kR9IF4GoC7}D9EXfIpCj4abyd#ZgWmzu(NI%@)KySG2CJZ! zrFP06obcRKWjf?$tmh|g+>crqZe62{R5ULlF01o$D!WCwep8CDGOhD3$|-~pr*8+f zD616FSg9W<>rGMtDt__rQ6C5 zXvSA!K2wYw=QybgG7D`R5&gfNXAEB zYKd$Du^8DO%xS8vx96oXgi)|(6z%JddiScj0=ZlPk%~yNvSf~(sbvg|8$T)iDee_; zSG{CiyOA(F=bEb{Bq@>!3)cXWJ@HnIZU6&;)}vsg6P#kIG9ZBEim*8Yr?U}%=)QuQFb#Q4DC>S?6=shXg+M_OZ zMYs%s&{WYOWjO0q+A_m9!Od8SiYVH0D@H?0p#!94gKgweV|Fq+aw)UiDoT-nOF0+- ze?Mw^?=DLY7q6vMWUeu;PajII6b@4OT9=_#(ingsE$C93<7A7 zn3=ran;FG7p(u}b21&>RpK4Fz7zC;PD1j1HEyxE46*9i;w?RXYSgRlff^OrrMk8?Q z7aK=Y?d?)Y8J&Y;1J~M=m0SntJJ!0mjc!I&nB!>2@~CB1QMFWa)cTs8BXnjt%Jvk- z$xvefj(u@T9`539<$Sl@#t83BUE5Cn)jk}IKL@rdG+cE#_M`j5in#)O!+$=*wLjz- zRy>}9o#m5_yejie2YKE{BaHW{ie#0fM`CuVz#JN>mVoYK*Nhs~awCt-bC5kb&*fE` zAp2kY+~D@Dp|B83h@&!uGGvU7;1i7F+L0qFgUvgM=RLXUR#{KoAPiI@Csx{iWgQ9X zY9npNhy(x-V*z&OkFQ!83H!V^tyl^M2I; z%!ju$p8AxC2;4qib4aEcP?RSqc91~?A5LkE*edEu#-lmMCp{`mv#%WoT5d@@qGhT7 z)cLX$Wk9TVA6l8B$oVsl^*Y+fHQMlxvoC4!SEM`&9Z88v6@t`}nr zVy{~=EQU70#ag>@oyrCm^{rt;xxODNoVO{#Y!~GmwOJPA9RC2E)mW}(Uz?9WDse5t z6O)f_)YT-9MmZB}R$exwpa-a_RTWe#a1CV}nbp2bka7vD_T{#NAk9jp6LpfoElEsq zAjmy>)c#GOhvi^N?ca()ZN4%?a%()rBxB|nAmcu?DhlXtCWW*m5y!&h53N{8QMd!8 zVqNEN%h&l;OF5^=3`orw=Gjh-++#-k*- z$E92$WOrb)=u>wha#U|4AoZal^AI>Z9&l+;t0~-ZjxcHJt_WoNzsjBZ9;1DRfwSZz z81GVpw;N7#PL2j=Y@RXRr6{1`J5>#BsU$In;0|iYj53sNeW})8yp>Q^jFv<`@t=Cb zpP}L6pS;m#(S$LseqU<5o@9q7rBH}*j-XbpxnQ^=x#c^ae3;2lDi52bXjwYo2J2O& zQM3{{6qfFa>Q7qIq^`^=Ge=XlNiB}Sk~`N5>d7Gmas_%=iaBE{4;Zcr?l~fqs3RGy zrxtj1rt?NG8DWK^Ir>S+EGkxl3kn9guAdQ`x1 zh3o54Dgc-{H9TWz$E{@AxL;AF71W00(j%Rt@~5!I2pm%2t8VX7pGHK`(!&Fam3Hx- zXiyIdZ8ia2k3VSmyG1T^<)z<|^NU2smtQ?Lgb`|c&Wn)~LMU~j+92%4a zX2IxtQiK5D@U;n|p>Cu6&InPGDoBvHUodk?8X_sd$u%r^3dEjiFCdM9L}*F$uG2*d z(SzQ&fI~I_KK0pYGlWh$j!fj{g8!`O@Lm>z7>PrF%EU z>wC>sDAZ3RTLWS+epwG~-%9XJEpOHhmzWRVX~^QeoGdgwTrSo-Ee6_S2Lx?AWBh9y z#20Z|TrIkj*RQ>Fnl$m+z|AosQ?IRYI-DPExof+Qn~q0LwdvDVIwo7OkV095z7lIePTKJ9`&IOermjvn!yt!k0asGTt*e86yDvEw{b z#%+}yc^J>WHyMfPzOE9D_jIZSfP`$^>~;8#?}V&f0C7 zStGd{RWY!i|)BNe2DG~*R<+^$1U#=cZqW0v__+PuF+)fy>M7vL8D z?@cl8+h`qe>?W_rz?<;|m{i!LxY z_NUFPwYo9#@-g1AmID#lD}1B$tSxTpSt3hVAInq0KEI7C-Hp2xZmwTYKWSr~zcBRr z*F~nq47Tx;f-p1gYn1yWsH+qt1;<}{>$IDB1+qmxJk$p}d;T4%S&lmBN8*i^8gzHa z#Gw8VGJd%Bt}5Q{OTvW6c1S-u?)B>sN{*);8dRGCw+{9P&)z)RYK14#KG0SSF=^y<`Xw{Qm$hchL1A z_9M57dwrfy+)hq=*GGA%+{tEk^l^*Bq`i#C0WkBFuy)x?N{jipe~49qtFjut!LcY%F;ZDJmSsx zR8CAJ`!-Lz#2R_a6L_r}~*kw&1daw<@Z^dgRp zv{6hOxf?iV!5=85@VNt;Ypz?f z4iDYUFr561IXx*hJCxpjQA!p}jlHSNm?6jvLoHK--`1f72gc5oIB*7QB{zOhp5$dW z9yrA|)-%Pc8p?(kwfnsig1^_REILC8OPyIa9K9}(@0~;$m>wMWO+n% zs-?M{qjE)7Vf)Uan6R-TqYE;Rm!(XK$V0Pq?Nx2X1VY(a6&TaYI_}R(P{_x1Bd{YK zJJd=xERi3}U!T1)HW8B9%C#gQe-#Bw@XLczCWCx$_jqAZf#veUbxMknwhuHahTI3t zD@h6xL~7yAISMK~mVZhXHfCY}04&$70Ry?g+lo%>K#Wl`@>zOR!#j32Ue#Pg3g>ku z3~spUDpDI`&h>05ra_I(>r1)AY;LBR@`eaUKGZal8D&9@TaGF?+stf%z^j2uNA;+H z^3W;e56whX#|5cbqhj05SdG)6UAU=SZ`$8=s+m$5NjqstXlF51er6lCihv*u$LCUf ztjv1TaKHi7Gf@fjGeNsx`8!k6IZFpTnv5nGl#ogym?dzzDAMuXV?TF1Q0jj0`?TGGtC2QSkfI9jUF!PiDP_Y}pUe#&i2v=`1oYITb(rFQfD<0JyX%l!jZj})- zA<3x%oxW#5)`&7w=r;?U%D6e}NI+rS(g1dooc$^1B{PndY1|};#tY$l)sTuo{*_%? zAV$NLrij}G6%@Lex{|27x_nOi9wKL9%=qr2Wjb7&K^ML8SPP+!Vp30P7&?} z0s2$0sxWz}xo|_mZDlnN${n%atylqA44#!(aN8JjRZc=kag%uZQ;}N=cJWX+#t%x8 zGUM*_p)tl|BULgxj`c9;GHNhf_25%C1o_zUSGZVKIT%BXQ_-{XUFtehRODq& z4QI?pF*~ROb8tmMRh$Ai6b9eH=BGy49>y4{Z&I7kt^{#{7m{g^sEK(5l4@~iH)k9(!ab>QIjNg#UeK+Y2>L)@8^! z6y{UT{{X_2U;%~VsyFH~kXiRDDF9TBz2s8eD&bAw1Q_?IK??f^PME6!tOwn5oK=6b zub2)vrG2JCqpy0lgb|GN>rmmX#8yZ=ka***ITSD{*!t7fPcgPP%)ROUS&fSi!lr9b z<+%xww_%1rs3yX;;l@2`*oPfDw9 z>nF&gkA6CPRrqDe^7j4FQ3#O`R5&>8+|&fC5CI%i7cVS_5uK_&@u(TqUuZo404kRT zi*N~}i5KVOmZf9mZESp^qD1mn%#riA)~+Nc0Y5P9>M8}1WMZl~ zH2ai|VI|Hm)z7}CWoX;ym&?cWtmKBG*{eJKolK9%@YX!{mhBNUFpnPomBMR2IJUfn zn!%WyV;K3D@#ucF)irM&+F3RsAGz6`{rC3c z{NlWe#J)6>RAX*f>`{|~*w0~H1pXmwo4I40;33Ns@7z`%r>`#Niq*j$>)+QE^;v#b z%F}4-r$O>JYRWL(uQqm@vz{Kp@Kb5dUzw}}VHqviDDy=Tuk z1WM(Zlipnnc>nOEUo&gZMgcE!#D$qul13>WmpKZXKgo;xFblbJ$l$;q4ms z^HUbOl%_dyT@e60AkSLvG#?8{vx#oxNTB6e3F8>jT2Z!`4?NyQOAt=%O$K}S+?V9$l4frn7S@z#H*1s|bwDzwv`B|5k*@)D<>XRQed*^gRbm@J*$Z zg(O6{M*jZ*INRx6J^dRevsuQwFq%pczO^r~=tK-46- z@~p4HMs1jIJ9ivrylU~C^f{)_S+djaqP2};to~B8~o;h>_vzdw)lN^!U z4wU;#8-|4L%aM!|)C%eJ>vMh6MaYkA&5OGyGvkW zC%L6WE6F5}dYng)4@~u^3zsKyoXA(^?NC6@-A2_lXyhJ|b+lCB4Fz=q#ZlNHt zx2`ePn9wQY@J&205rku(T4@MQ?fiNgxXoAwC}WhBNdu?jQ5fVnE_!qoY%&4Qdao>o zGxGC_xVCldoQ!(+slnKHV#n8tCz>r0Sa zvFJK_3S_@K4sdf>&FTx{8jHB#oKsjh1fBq+YXOtn)2$;0*uOPq<*tQwDj68Mra10N z{*?S-um=?4y9NNr?r9z-7}{_tt%+!AyQAzp@Mo;d>M|}EKws0R|98?Sl zBoj{Uiaf+y_I$kwrm7Nh->pdLu;lghrfp{*HwW6O^96{9?%4kTbRH?>4hozx=}F{p z1cw-<+Nq4zlADQh+^%;thkwhrr79DHyR|Hg6lWbyDUPU93<%F!6V!o13^C{pRcYZ4 zu`-g!1Y~|0tHE%=Tb$G_8V3wP1b6 z=Wxgs7Tw2zxGfOnG=d=;wyPZD-kQt@ErNSen_UIVs49VuMMWY5 zA#L1&#Y*Z1Il-#o5y1>Pb3|ofsP`e4f~R>QE z`c*>ce2k4oKxP?WIQGprZrD}0!RhNrvMWB-A9UiJ#EcQrssuHuSri8+1QFl03fVio zDo@@Fl0H-U)GHG+l3NOYhO~~s8{A;bY}q^>YB`!vfuaG9MnO2^zdoX+VvN8yN^8Uw z8J9eBPUGemjE3lH7t1gVIQOSTA(GrVQm>8ysDzG<`|jSIsJICsUBEA2Y5^zZ3!hU` zNgm^rIHgcRgj^{0p~2OklS1 zaf+4M0bGs$EVg@iX?t4~|gRl^yD&!6ay+tBz z!3(!bE&e7$cx^i>rQ_9Na2{&vE4MN9snIvugzTVX#e~>U70m!E9 zLZN`pI#ta*%Z-S{cvh1<4&UKbkxNJN%gFci$4Z7TFh1-P>6*7NX%L4UYw`hvioy;Emk{Q;80EIIARZ0qa3UmAhMZCAw0~>u`oeIUTDlhT?Y~1xS(> z9$JxsQltvTYQb|P=YBSW^8Wz!>rBPB^RoYHYN$XPt zBxAUzraa%9{{Yof>?|A09V%}637N_^H?C^J7Uy`tr%f4DQU-nMH^Y?!pISPPmgszO z$bN8m6%EvZ6u#0*_8n^CZ3%(ep?I>sWS+G^Y4~wkS;EQOab1Lpi=|e&o7~~3&2@Y~G#W*jw<4AY+ zp{)Z@5x-->r=V!ZJc>-`80ac&@tT#OlNuCt$3C?G04(v&b4J%A9gR9PWnx*gnn~Of zxgvwlsizd=3{#K=&QCP<&NGgbYhfNL_lOlE<#Ym$7XQ-!b$I_xuK|IvGizh%-79;-vtw|_33+qEE?V5Pq#^KVl zY=|L>yG~DPlySGN^&+fv^2SWMCrsf}KvkAu)A1C-4^y6a zyw5HfBmLQ{Fxf{E3wRR=-)(LElugcYv~VhtAXWwjC6DP<5yTSA$U22zergF)+(`!P zi7k%g$Eo9=&b3u`utyvkj%#h#1y`W&OQ{^iYq-AA3&5RE`T46V#?kGRK_L0ZUvXVE zt*A+SqTAT^{{Va5vF>fP81+U=gdShlprlF#lY1Gikwp%6kf4Eq>UajWW11^S)mziBth9T(q2-VejPu9M=~iSD zEQ=hGy2T!lHWLn#p1Huy~PJUt1tfud| zKwR9xDx@PD`kzYCwU~*w#xP0hIOeH+kR$nFx^(odn;nqE;g{scQR=mEhrOvPMsJ93 zCy<~y2!oORGX#p)08HPJCQ&mxh6`79gwewAr0EHwLYWBuGik6OLN z+?mbAr^u6SR^zKyquWNS94Py?{Kl-r_Oileg}{*K3H)Q`?@4A*NKOgQ%4!?vW}?w8 zyb?tVY;BqTRZYaOx5>(e{ux zD9OqH0CZPJ;r{>*wcV_mz0-c@1SEeq{r0W>D>C|dqJXRqxx4*4*RJ?-#19Xq=*)fC z9y?U?YhZ)9=eK%f1_e3CqIRmb62WL=nmnjOjHvv|iodJs5%QLpD!(tSV)=4G51%(9 zjL|KLm&9)Cx`JH1A~DGs4Ov=JsJ>KZ+>E#(x>r0T`#{`fA_35UcDJ+-CQJB@!Nh7+ zhr4zLrOVxBbCucp1)<8fS{1a>DaOHp(~NOUc!)nZ+ee44;~E{f2PCK^z41~>B9a@{ zz84t%=6Mr(l(V(=5tOG%_rMgrTXOcO!espYzbe8@-9|`O1I*;{Q4|^JoOi1U3jjgs z+N(1%@ly*0hZxv=+2*6#Td1kmGNw;zAyP4l)0GG!Yz!#iQzTqAPZcDafxziQs}QtB z`@o1Xvjh%J3CP$_H7*W$JPKk*gPPa}fE0`hMkhHxcAt!zX4fF@;0ll&goA<)6y43{ z6P|+=A_qNw?KNUxH#bVFcNAJ9iCI`~sj-8-{$Wm7@S_dICJxX*$f%o$-h+Y$&f|({ z9BmoEr>QO56sj|j+z!=Hiwl(Z1aQRksRI%>ckNO@hGW3RM$y0e#N^bu$6C@i60s7oP;xqVr+{(^JRY<#EQNY!y$Ke`@TVia zDu|-Hd13J1GSvGBKtSS|<*a>qT9lzrn|49%O+79s?_r~G=xTLPvE=lq6}ON`>r<)? zst+Qva@1*RM5G4KQBiNpbopw}ml}<`c8X(e1ymZYbjg%%DyQ9H{{ZaM0CL#mijhz% za@wK5MiGMJ#s$T5#YLv91F%R=LD7{H}wDpgc(6qMMe^(O$j{JdhI;Rhq7PK-bb zo$9GF2{zWS90PfcesP0S7B99m`z6O6zr9K}pu>FIsj7A*$bn>(We7MPwKmL+y)#Pr z`D4umLHUX4ReMBmkw`@7*e5i}0mcS$D%?mGMgZhfL1lA}f}c3ZlsoksR0@|RV^DZC zI^lq9V4l?&1zDOy#Y8}bnC%I-ihCmz+y>lHAXYep^raEVqdwH(CDa%|$PV0MgBi&q zq3camX3GJFN^&E4Y+L1`Z2=d}$Qa_M+sOVV6&fQT$owk8CezJBkvyeeoHK8y#TZ82 zw=OEeA~QR$@cr5lqmAWu;+vJn$)MC(ckj<0l+DA<{pU)V6##FW<)%lS+%L;X$c|P( z#K_F?{l)!h$+eY1UTKXJDfth|TBnRWSw^UAxI}qe+nL$IDj5?Nybzkn-u4@UpE82Xqe!% zE6Bx(0Am$0Z6R=tx}}K(Qa1i7J*3LTPu{CR$~gZ34%Yj=wOHVSYG8}CvG=K|3n|O+ zwF!cW8Yx9IiUOZE^r_0o#XuPpo>M5_`cW10MoXGxZJ3IU`U}?Rk&Fs* z^TFVDsf)0b1YDHLj(gJryK|fY)}`1ZW45C#cX5y@a*^zVK3~cXMMhsWKO4GnPB5dL z!{x_BWPE`}FmX5}b@?hAW+;@v4^g1~nCs`h!toVp{{{H20IsMrPqh zT=uErK!fHPOjKJ?_H2X|2MbdMLy~xEj7OF&)83wtr*5=0sVy=vWJB_fJJf2;yKD6A zQ!=s2gVLf%q*Gf{dIVwzAZ!4dR16d5`MoMeTrbJZH|E#^gYQ|+BC#5)_vmVPI5<5j zG*;b@N_QKN%YrLJN_viBPBBnNxkG1~lX~MA&T24AWkAI~QSytB++w1WBWm-Gl`5tP zBdsQOWm}rgDcE;=fflp&;&-l|CHsFJUO~_&j^K7+MBJ{LVH z#aVsn10i2(()|Gvf*X#)p_HO2X6;G{=z3LBxd$zff0a0laxmGpI+XxaQ%r?bW5NzQ zQ;E+Wl`VlFR*V3HKDq5m+@~$llzhX?9FFwH01gLwh{I5^4<*3ITCjF0+l+hDVh`qf z3Xr3=N{q3po}n0`7v>@f#6DMMo3@J*qL5 z;;k`EFlDF_JhPBG*02ODd!u8te6*fecJ(8_r4Vo!Hzd=Lg#@_4^`-9yq-@O*!}E%b z9k=CyA*$I5{4G}zG-?~DHBd~brcCWSh4M%o@=syyM$n&~A!Hp7;ZaK?=Wk<5Dcn&) zx@Gf@ltzdb%qO2pj!lYJdE9DHRGv7i7}Faraq{MuEOw(D8j(V|C{09=m6Io&cdX>a zu+fkkoMW%nowRNql*dMInNQ(KAY@VP)`$)vA{g-5r6i{-NyglffZr`n6F)9E9Vv4p z5=exxXnhH&jATXf^)+wF02VEhDiw(`TYm$!5Mo6&h17!}tpaAZq_<^63YA&o)hr(uADvsb9OXT zRF30Y*IUnbX?<_`TND%#nt?CBy*U+BYO@H9Dp|dwZdv1Cb^iIAqAP+oSre< z)*aThBykuWx48uFJu%+B+8HcT_l~I1iY6Mh)!dD0E<{o<`n{);2T}C(tjnE3?bb;r zmm#*PKDazr9V4aO=6h0M3D9>Ghfuh;g#PdX*;Bv!r-NRd47Qwp6HZm2%f>R?MsVuN9ydO?~hyALlI$EicN!+;p5V+mCrO;OrcUC&f9}zsR zNZQgM>UtlgO5QEGng{YYk~4rqeb3Iggi^{r&bv!>#VwlJ%CaN5fziK^N*2!;5OXG9DqRN1CGG-t^WY{Pdrx<^QM)-QVIx;&Yr(h*08P9M^phMaVQ_g zIQ;3T>e4ZcWc3s*JvQ}7w+o(!;h&6tEYsHPYA__vEP%zotZk3K?s|2vQ_#LT=odCJ zzP)5^wGTC8jz~F-F3x1-vYeA&HKZovlk&7bl|e0-atw^Sd;b8nSyjuZ&t6icO(X2< zABdLoYKaz?t2CZmd6Fp@4i96V_3D-$F*Do3ZIC=z%#wcszhvO&pI+7Zv16p&MXLR- z2L0rpE?b-odVMRr()>x{iyN6O?JuN`+c=USenZAO8uRL8vHL8^d%K@;-)h7uxYOj> zyPW5b!`8f?#GW|uBooN-OsQr-O^P}moco?@%VF`G*z9}KV}dkcoE+!3uX@Xu#Bu8{ zfghAU@F3(pa>pl8=xq*OW6?Z6t6l0YCAeZ_bN5@E_OeVo#{hiiX(PUC&&A=nBGEJ3L(()$i0zgu7~H>> zHpV*PJu}|A^*b{kQ`_2|Z=peN3QHD0bTjz+8k#tSt>-u~x$RyBSh*N-F(O~Ho=_bA z6*0Y(Mdmy|D)-L=(={5%8bJso`g>LNk8}h$`F#y?&2oxP=6ttT&=|a^%+Afvp!(JM zWsu5$c2&I%J|yyhPg=0>IbiwQ^{7nAqb^sI%gB%Sib2O(p4#MGjH2yj>J4bDQL6L9 zcBpY0EJ^Ea-*d| z68!s{liSv`Z$Yn|jren8|U{t8!enepC8YDL#adINZviI34{d za8nAP7AKQdvmrZI=)^$A>`_KBfA0^zaTVMcLC6cMl-8k81Mz#}4~MGl5n{u7K; zMX`~PUABe59q~{)x=Fhk6=1dr-Nt&FtZ=vylG*j4gi{{40JAkl+j29|Q<(;SVYnXD z#vz8>_u`+Znqwp-Kp=5Q2_Sl!YQ-uSE=g0+8fs-m38ePWaq|&X+H;RP=?9JYSlaZLm-j+ zILP&-C3fNXr>J9-kD#a|g``l-+X+9AJ*xT8;kb>ku0ZKcRWe2&_(<>8r7;8;ZurFq ze*lV^>#=Qnx{Tpe0zQ<%y@3IEJ!x~7!5I{+S$NJV^H{-2uXLtM63NL6O28B<{{Ww* zON=&pQ253eWon$RTV+CyfGH(`?s%X{xptl~YIzR!!93M+nOyeG5dKgatF#fjuWCho znN%4xfmASI#&ABg*;%)Ii}f_A)6}@YBxY3%22CF`k3c$7D(?HkKGX%5X*+h~`FhfH z%}BN{4I$1s8KxBiOpa(#yb%8YbkvFzj+hBq9OO(HPI<*QVwLODwK*ToOy_7H%9`p7 ze=k$twQ8fKfUeT{S;6P@08>ulcPnmEDpY|Arw9{g54IU^4K^`@OqDGMo%sCo;~X0roxSip`5h{N1t5Twa8cc`TrG!0kZu9Q7C!tgcvvZ^E8I$P34<3(R-B7(vKW)~d8D>_Is6 z^{Y8$8=ZOf&X7J`H8SUAO$$*CYCjn zW!UG?dQ^-)Va5h3Hg->C1B2>l5YxCfn9G6FnsE`y_daZXRTz<^jDXlarickau&y!F z+>ncKSo9r%?@ylU#YWvq zyB%ebc-VOdzI`Z_Ld19Qqp78o9DtmPkh;8HSwSEeBph|^NzTYLKmXS7ML^hofC`lg z6(sfPM*Ypl9>b+NH9K%C@k&lBL-#n`WR}BVai5x<3Uf*witJ;OI#PVmu*XkY(Mm0W zX+ekqQSJTbBP&)^1zeH1k6M5REJ)(3OX?@NGT}fN~Py0Ih!DFS5Oq^6e_6% z0rzPJ1LGAt3t}%Vqf-6NOB0k#9y8Xhostdt!5ylu#ACGbdeY|XJ6t7&v$!0qRB%Q^ zd2LU3F|k(rql$AbHoE+z)Z3VmuNtDZ1^}x*SD9`LbR#t!Wr4$TD%z1M91LQs?H0Qj zh^~@v18zIk-JRi#jqRUL#;III$nV8N5|$Z$wW?hVr%E!>o$M2CL5^}M;n`0W&R9-i zU7_-N*7dA{Q;>RBJy=;D4krlHZ5k-*NmfyeQ`yV>gMm>v*iHv0ty+Q=WKs=bBg?3) ztWRpphZx{iCbt+_H>u#)Rc{J~$rZ`#Qa1go(v#To>(%IBsn1hWI;?w5M-(M-Bl1mH zWh8*S1NEkspT93Hgrr7)oJO0mckHZf8xdrsy#skNAf#1s-w{{XI@qd#}2r8$(U zvXMxIQAZgxbpgEy&q|Umn8!+3#>VH7Qf}(YMEer;226~T*V3GkV1iBn?MxB7=NweZ zpkpK*wGvGtJcn{m6re77>qrJq6(<}99D344ErK!6wMm~!6ce0s4Js>!Eyqk!5J|^jLgaE!G^wCoW3WXEqkkisa*i|G)}D$0&r)eSTm})biN=4ONWV8Y zG@(xI+2W@1$s3ZdWC8%A8@p7wUN-OtttmucH}$3g&mE~Za_N$VBo;LYDmlh#NXY>1 z?@BgD&#fidlHK(X0x-s&TP^jVA6}ozjk#b?N|@T?jDU0WsUr&{gB_{GHxZtc^#M+L zRdgq*4#KU#&#g=b;q<9C0yyB(s3^NnT;id!k{1dW9MO&e=qWRS&uT{9uvTr2!HynS z8SXn$s)hiHP=Q8!iejMzGUpYWY=UH6gy7N;N%~TO*wc!r0FTy)h+V`dBbA{dVnh1W z=emw_O&C=e?M~Vn!4v$gfWvMm0UI%)%`Z{MN|SP;e7qjjHezwHByBP(sX6zlRdU;n zRZlSjlTT3lu;(Dr%2ho=GRw)&9V@QWj!+frT+mOL`d3k>#QRh&PQ^u@aq&0Ic-A;& z=N&!k!z8!z?TBIqId8(fi{d@lwz*UzB%wI=72&#_J8Zz=i2j1E7?irldvFPP(M{n~)pL>=ZJ0^HZAk-P3T28vhQ zj8(sf*1AhjfdqYXT$PlGZGN!2VOtnJwdk*Agl<&JAnHGaRc^vD)aNyKp4!*Sv4~8= z2N}kB=k%)aB%%$Mb#mt8mQj`Ur=VFQM&8mJc*K#7tljI7)i7^N zktuBb<6VD>FBeF+NCpE++#l}O2@|=BLvr0m2iBFfDiLU_AdEH#L)cbyR#%UCBN7ta z^!Kexcvf&3$4X?=i#%lIg;>k0ZEFM}H{^=xtYNp39f5MguJ3x}w9g{y=gX5nC+l5A zmv)vAmOpto!1bfqu|}QDO=8y05=?A7!Z`!4K9$bLJaNP=_I$sns9r5bYp1!qBlnru zi}w@!Yacg~U-=?E$M}foYGoS zIrgjxY|M~J*n7(zFg z(fqE*soHvKUm)=Zib1&cj0Drlxn|amC?)%?%uIpDYn4^Wym=U^q zfA#8u2$%P+HpWLKxTP6tWy(W)EySqlY;m!;HEP4{lGvH9uogD~%af#2|} zR@Y&jQZyew8KP{(6~4(e&grwT_s4u!sc3q=#F|=SQt`G|oQ|A-O5`-%Hg7P^kC(k^ z3BJZWf;jE$D7rU-(B;3f#g*&G@_CtOIsW!(0N6k$zqhw{8S+=T?bapqnE7qD;VOrNxKIk$-z0;PZ1^{w3}?5e9N>5;uUpUSX9S{ZgsnSOR{ z@BZ~_Y4Uk80|?n7KmI&wWMNTRpL}>e*v+BZ-a-h9Se1}BTw{vTbqcs+k}EIa`FOlD zXm{>UDKI~}!Fl~_VsK@Zo27g%CHw60=YC>?8F%0eikK-N9MS|VSksk59256z2{&Uq z3dbqQs04iEw+5%>21v-L)CV~|sETY?u*XBWvD=!KHFJg{g8PO5;*}JUfOsCYP9Eq) z4q3|+#W#_VI#Lk(usI#+HWVAWig&a^*CN{M_j}ZZ+yRa;Qw#+k-8E4B?Sqk38FLL6 z0q9R!O~jT1p`lSmJ*n)cab@XJqJ#=jMh9wXWdnndYBDka98{SHXva#@Htqy$7=l3J zq>3CwarNe!2GViUu&1#g6g+`a)#6ozL=xMl8Mmkdq1R((8qSn;Vc^Nr9Dlk;L6ZdK87@VG! zImBzn<682rTbWcN+P+@w^HGvV0QISa3ZYFQKz?q*h|?+qLJ$?@|IswLsvjZYOP2DGT8&;GU-}Da+|lD>E<3wH%rA z0UyIfgeZrQoM%%b!_t|-KPXQeq)t29GNYEJ?cb_)p9yi zb2KLTNJ+s11mc{}^8B4@QSyvqZB~^F6)JcgX{XFM41`EYVa6&*kQHp2bSk?Eq-9iK zI~vfjuEYh;0+m9$ZamUS%wP_b)sO|pK~UsMfY82MG4yJlC*HeXts{k4PDeacag(!( zB9)2eV?%jI1nvf`k1f-0VMrIvhZy8jR4Xn3!zDXuc1_2O0IBzC1G!m-eoA;oNjccM&Qt;)>4_yf4x#FMxQYIwO!*1%yZ2tNg6>gl16SDj8mX|9OsH- zC`j4J$@CRGaTaAeY9nr=ltIy#?)}1Rp9VLw50^Coaz;VsoC5)r9MG&LkgfAD2k%tAT9=Q^{wiTWoE}=Fc@u8K_m}R_ zx6l%>>0?nhn;$3zLIMw&cwhFaIK18e04+y!v&%Si`C}a7npfNjrCq!~&6;d*{hVPG z`qhY475vFM3L0p#S}ua61O_LV(ysbzsb|3LNfY^muieLbK#Uoe?^8@8xh!hqr_EEM z{{RaewO-$P4aTH0VVRH1LUsYJq>YZ*H3;6VpW<4!u?cq1_nB(BC7g=5>;MRfm%T=J zxZKp?l{*h2q*2)y?{uvx0IGbrRS)o*jU)hW9GY>7%PQlgB#?$Gv3I51YBwd1F|jH> zR;v4qpbft$YL{`_!1kgqzrBt(R&lkgWd0&2SNTX>RfH~)Z*D1OMv*rT1y@hIi9dp_ zG0?WenQ}K~nv4h=$0D8=c*>uegCCZ_H&H`M!yA`CLX1>f-P;{aSvyDv992l5!7?bv zr4hA>iX;GqOE->wFp&Hp7kR{ z6#8*fA}W={GGsC6D3(lN@zcFIWRU}I`@IDxKgZs*NrYqw%d{U}^zhzV>I@$&I+}O@=&@fPOV~fmN!J`N=n+s)`h%I3pm)A9kAR#N=^L+(Ft# zb5D(Sf@w$M2}j){D#K|XcB3q$?yCVh7U|xZfkO$iCnL33JV>N-O*0g3d-kf5 z5?9!8n5zQAlloK6@G@$!VAEuZu!=@^o_kV_G&>P4`APFQ6sqUU^1#3!El6a{n?T@I zaCWv|psf(gyAeh^nyO=9ayeR=W>@J@#Lgu-IIPmMxU5PF#JFDmwE`I#80Wo8VhsNP zKSA1;$-{7RJt~}rRCL)dJ*m+|@-|5MMJ%wkflXuPCrlGj4b37(=ob{mjn#?I-4$r#2))*+2~?I1)7q{C z+Qlv7EUefajX^G01X0$kTzP0fUX=?e>c5>eCOE5^s_Ptv0t&Eh#xyHuz8miY)PGu`CFQhf8i@(>P60Kc z5`-a#VbYsgYCc3u<*{57k&J#7B#cr8NRuT-YO87s4E|0xzo(^I7S~cBVgMM)=cQ9> z!N^Z)t0IR9js1`C(LCvB7)o{z_G>C#N$q)$_k?!o&0>AF?@@EPbLtn`qjJqZFSNX7>pDz_*Rn0?MGJ67>7ouu0qnqaaHagmIAH4%g8IY8f$;k1lM-2llX z;=G^6e-f>&EX}Q(=1i0$IKZzu@#n^9bsH0>>EuTa@`6E?d=8&nn()2%m+~8nnJ}z) zKg8LuV*!G@_l}x0y0fjD#uu+Ui03$sa0X6!{w#N_Up7mKM>mAt#ha`Lt!VBpU0EI_ce5=wsU)18{Q@H zV|il2CEC#(N>umz!)LX5ozAT+qslAy+dp@j-&<%(wcXsUBC76R;`x90n#>ka86IH2 zB$eGpnnx{G+0G@=ky-#*Lbo~Seuk^d=N4ZsLWld+(9H}VEwDg}Itt5%HV-n7x`+2? z)E`>xhW_cvXL2Je#!3OXk5m2Xw;6ci#lhX5o969R(ZI@W!;j%^qL+-j?$WX>iht*xIjoxQ zDBQOW#zW>ela8BuwMs3aWnp%^*_%J^)p)HXlJ43tHllpLFU|PY%OhKoTx4`sBfqJv zWxb1w*HUPswaUOE-6Qlqn`=oet(APN;lGHjSGMy~BKrXT@B3c$Y;D=)zsfQAlT9RR z9f-Wy*^z!fKdnT!6kW%gsN$F@ z-U#WAzy7MZ_STbYMahqyzPRsHu15Ebyu35^_N?29C6IpN78^Qq&1mh^nL_53#=RuY zXVehS4)DHM9PT^}dwSPJXM3gFfp2ggHURm1c|{|pO>vhtm&tDp%*vuN2^@^Cwko7@ zPd$u~DgEyJ=e|4EQi3ykp7{@q^ox{+T|y7^fT0LM`?5#Uy%$Tc@V>sEX}7xqNuxVr z1OkV?LFfMftzRWrOL=HFGvyd<=bTqav8*=nUFYUp5Hrqu8uIZNJM337vGt~zr+CXu zNx!qTnH5+KnQ}-Y7~`Sz`d53Sd{OZpm#Iakc#BU-E!beoA1)aG01)RG^%e0hpW}}d zo5-ennIwV+&eBNebK9@=uc15@@ebd_I+AJnjtfikFUStz-;Tz-j7D9isBu?5rqeuE zrra+4hLw3BS8EN`z3sSYj(g{|c!TH`h_cHHl#!F=BZ2dKRh&}(Stzzu*o>s$(* zw;^aYH+FoHz^GWUW^gc`rmn6N_e?r>sGKy6P#=&}gFv<+1Q^>sooYWNn`qruBZRt@ z0~qO2q$44Z%Z@6b#^z@j)--i|>;tDth`E+s#C_hCrEsz{gnVM5XwZGb)2QuQK_fXW z2+D>-k&-*rVlXkkr{`J;8x{T8*lGtzfXDF)%bkQGVinAe%aBb<(U{@|ze=+ERmR*6 z+*G>?N3`?)G~oT?c)+Z)MHu<`&w6>v@}n6Q8$;$OSvwrkq6OjGKGm{)2$0D#vEX#6 zu&SYldK4DU(0+)B93VmHH@mqz#IxN#lB&ZKS~0W z$?ZhZNrTH6EHn3b{A#cT8|M4HY4f9yflnFcnIfsexxmFph>w_L1d*_Qd88q7$El(~ zzzlRB&$T%M$T=8lH9$mE#5W$jGf|dAVC*>QQnDS4nf&RE5s&~#z@y9tuwTC(4r#K+ zzG6S?Q-Be;Tm|fDncVxEfDUK@g*fA`JM^dvG;FHhHt#`!R*1{7>6(d@t_2C`H1!}W zm%{Kn(jSqroYao0vTiDP7~+_v7-w%zD%8s7Vi$GGFH_c;EPiZbBLz->#-6L5N3AY$ z4&zpuCOeTk76Sv7sB*vtC%rva0J?NOw2Wd^%!dk2J!rZ{kKGd>pO}N_YCkN7&g}hr zQ^H0V1pB%CGfvvu_#6s|vp2a|5YOdz>rZ{bFh+C8r3eh0$i_QVEh%D3uq^# zBBGfK1L%5GtR0^lcCW2UVmMhYi3XMs?4sg zcH?jIs)V00r#c+mC$FtUtQ|lHAcK)Yh6+rFAoQk~fLtiS?0qS}h=^`PRHKFd1Nu{B z85<+vl=GhArYJ;vdydr1WA6&iYQ~x}FOVOYed=SV^1#PEhqX#%2*B*=_|s1IY~vI; z+=)iTU%UeH0Q~6^HW&wh4_cFGb~}$Fnp9HRX7sCzx(E@fh~z9+Ja_3(Z5zuFTX%EX zrSh1`)Z@_f#UUXEIsx9P>?ooaLJ)TTRSY{w-1%di3=HC}23Jto2ACKlfI1Vvts=o8 zq-+Ez#%PUO9P()&d$1tjDg5aek?Wq_s)@abm>yY<0HKR2f_Vm!6~Mvdb>@%*yJPgH z%v5Em23^>1#ytS3U3l0}0-2Jpu|OboK9sNXAw%A&4V4jt@`r^uKE{+5ago>Fr~C13 z+kyJjK2TKvxlpG+U#$sUiIF)S`TA5(x9*Ra^~FpQGJMoIQ;Hc88!SfV;)It*A)+M< zm0m|dP6{JXSa5$zXPt~04}1@;G#77~&q{pFJAp5jGle`Jezg(cZYKb62YQk-xMfav zboy0dGa)VXspb%lpmpz2giYIyax?h*)Y!u1xdNJ6HVW9}4*ryM0tVcKxZOEIJSva4C#{Ntnp@#dX*E zf0+?59jCQ&3vDEF?J7ol(td>^%9cD-{4i2;QLI}V2aMBDWbBM*y*}j=#>5;Ro|J>k zGBkL{_*9XM1tfH-${oS+?ME<})f-R@bn0p&wOoPEtyyTnO}WKXL@`Ku{NA+>K`4(3 zV^Vt>riGeK$AGn^u(B0Bs;8H<^N=Xr=xrNBmDIP-oQjQ*DEYh8h(n#ds^dewI&wNw zv$ctGxmGi|aMe5~s^bbO2&4V()6O}o!WU&Mrw7ujl$k4PLh(G2m565pwPGgX#T*sK z;ax4Xj)Nb8tjmjN=9IT12Ru`gvbhRr>_vu*`G6X~rCv`QyAR!LcH~g%>uzJ&!4*#0 zL=DiX_u`Y1Xqt;nPV`6}Hz!)twT+oVC31FKp^tE4N57?YdK}3yB=83V>sUHP;S8j zqydS}F;L7K9?b6^bA$Y;Vhywj4qBQR1A&^EMli%uY?jH0Cj-)>bjMzXoU(0hdQ;I^ zmo3I=p>-SRVd4uX+T7R6YI7~2P^?M_89!YYM1>+4XF$7kf)_MF2UahoQMwsq+#;}H4%=wnb{OMQR;AWF(sN0}1=Odb3pyL^- zRSOUROp7f!1KU$Zd>C%<$sF?0a#xNG69GnAFu0i$B z=}ZU%aZILyHE=#^cmxh;3661^dZ{CU(z9%iP{zy?&S@S$mn%{#06F}rKvJXA(uj^E zYPm%xtvGNnDFOcP6(XQx^Kb=2l3EffAz`0NR#I@y*V2qS{oaP8b~yx$QOs0Dw+u6i zk&r76X|Q+X)5`CDMgL z!z+=}nyTZ1awsl4lf!^c4qCe1Ie~;CcCKC(MPL)PbXsx+08{H@M2`>nr7`<_QAxo- zegi5$B*$IYIAii_;(?q@;0q!{Co#az>3y31`~gmukD ztjpZegM06eT#eqJ-mZ_sw%2n>Aq|lL-b!#tUvBl8YM(h0f4Y9Pv!$EMM|6ncB>q0w z9lsizk;qHp>rd?qNF;s?MgN4Jq4p;$z)~^#Z(>Elz0}yuZFX z?f#WXwk~9K)^FvsayQGLPSqpGZzXuX?%tW|MNooSZbWXcoOR7l69>3y6Xrhjq_rGb zA+c#K)Rx>*p;mY$Nh25vc_ehldf&C#M-u@aWS{=MdbfrAO{ib#QrJT)#*uNu z6dzBPyjR8A9o5y$rG8g)yRU84(M}?P#=)x3adw_$VU5RjBj(L|wvlZuv^y^OBe3mU zUY(#DI8#xUAs~nDoNmVNO7uuo;nT#?xsbBwC$OyQAkszHV~=Y&I3(j8K=!L8L`6)0 zDvq4=s(N&h%^o(L;OFM`t5=aajEvy*q9~~BP?q6--6WXF+qC;FSw=*Q_X8QKLO6-s zr(kcrp7jjY3n0wIqYj<6(aLAe>}I~1b#-tjZgTkxy1IQr*U7dLvMs{#_r6|z>6YGJ z(31_j1~dKYx2ekv7Ko9Ll(!{~Np4zP#Up%5BIEnsoYtO`WpyiV5Qw5i9QxHbEmG}O z5%U`S--UWsfNY}EOmcOM9DDx&6-#y^Qn6~@*4_(!ya-gtsXjpDcc+Mn-(pQx@@J3lgazM1zE_jBH=I|M3pIv=xKSlp%Dhah#q``(*P zYwG%irlF=~1|Jw1>MNd?Q8K_F-o$#=NVtkCYm!OxBKe2Xn`p`{#Kmb;{Gfc}_`dBw zOt`e0SB~3p!TCvFn;w~}x}1oRE~J5#K;^>v_NrbQzKL%F3r{cY1QQ|tRh3PQ>QAxy zIq(u+^y4es$Sbf~r3Gj`N_7Y1I?}A+XhpI5({{SlVJD^yV zE4scmzr@cPce#|UxBc2kSIl#}r)sfqs1aCmQL8v@=s2!^Qg30b3JsXa?@F0Lvuudd?^N^!egfk-kFe3)1@ftI}VU+ z89jScesJ*tO~bWnm%HwdLdJQ>`_&nXamc8ZGW*X;uvJJH?ODaUksI7Z zIV87gdGhiLaf%Wm!kEx5{j6|nPJKZx;=T*@=}cdnBNPQbVcv0%%A_h$@&^?TUhv08 zixB6%O|~#N?^UBD^88e)7{AN+Yeu?@?2)u%Zqw4C@^iETOBFx>?qi)4kP?^q7{ z6#R^hslXKHjq(9}pXE}bk@u;R@XDZPHBaFI7%H&itvNwckUCSDK3%mON6TXwJf74- zASrM`$9jr5SmBRRPDgFr4mVWj88UNHqs)Zeg&!w4=An*7V$F}1oT(y=vu7P?Htr1B z`F$$P$raJnO7Lnu?VNSREKwqz-*{AEHa7FfG&ypW0N5S90H=&ZeW}N82^>@ruwvPy z*<_@!h$%ds9`pH3bnC7>3}=abLITt zR&fZc4GuGh;;bPGfPtJ#p1?V}oxJ9wAtM`Ky)jdBV?Ql9lX%2~ z?)0SwfS5^t0SX&9=rW34$NVIt?H42mSre@f0p#cCpXhiNq+M3b-H62GT0hG0QRgw99yz+>`ffF`!V<4E8lNEETiTtI9-75zhvM<9=JU zQ&wh_som;%pT-XoU1Icj#-uyA~M@!djqkZWNr{xg2+T)$P`u-L9(;3v^oo*9v znU9$}Fco^^#22?kETTBs@}AAQoqWCzNSm+N#aJa(7!nWK#YW&UPn9rt}J=?@D0Qqpya4Xl@G9Poj-J7aflGuFI1xM{@s>eL)h zWHRhkNQFng0}2m4>Z})5_Ynt-_2coU5UI3gxsy4`OFT%UtwLf(UCK^saT_xyqfm<5 zn{VA(QIdNJ?Vz#7ioZ2IBuB{UQc66&I*NrMWApZ^MJ+cZNP?>pX{-BX zQ71I3=6tyOwNRL)0nChe&)uklkfh@$(w~FWgHa+fe(}4}8Q4u+L=C%+m1AQOxb&v8 z0#svd0G#JI6*1IfkdQh2sx=Jzw$p(*%8b;|p+eifU*Z1%fm2SwvLaHXmguzb%EKdy ztnvQ<2srtdvuVQQd>x``X9B<%fwIE|4APxmfAIORiTG~63$O+FG*@}6xj*c zmE#l$N#tjWWPpSI$f{Rld&J9@jY}MgZpLmGjPdlPh&SC;;PX;ScBvSujBF-VKoLsF zcMnrcS0Lff2c=CMY9mn~p*WKzc%>_f!z7O+FHumj2uyhSMOr9SU_UF3TiGJBc&-=H5NGvD9_AI07-+iVSOlJotpy!x#vJCz0ylz4Y3rBzaLqnZdM2wtGlDJy{VJ%ZlwIZiSvHIH{W+esow23L_% zk2KrvMcjWXi7O&xKv4XxoQj`*5ltchqjQXVR7^y_C_EqKPAxEs&~E8Wgntb=W02=P zx>U;uw_S)y$8%60F*zJlgph}zC@|Gglr)C}kye8<4hKqy$}D`vI~aAL$*^UWjZW75 z>S)VG>wnn?N@CINLa_t3H~ZZeVN=dide#?-Q7KEypt>gEy$?l zWRv6(lgXh1Z7!*`g;j}+rzy}?^+2J6@k9iQ*pUWJJ%K5+IW;V~#yu(&Tztoh(5UPq zGe)t73>q#2pGB*XPebHXXf>cngj#{X>^2+h^Rf$iQ+0V^cGdy!hV_807&stFwNbV#+ zcCX+5mCxT_T)g54K|}+S+O-YDHu0C7e9Q9WEpxXwTkd?=#|$~eZy231NUUUh_Z-uc z$cS$sZZwTL63oXNd9Gq<#FKeD@t*zv0Nt+2P-R9Q@uoEAp5@)-!b!>7?b8*p8@wlG zcjKw9T3tp>KQ{4Wa2rpxRIt3%HL2F#9qSdVg7PmJ$8KwHV{ypsWAajOI&~QxJ!;63 zOMqiju@73P(Hy@Mi@~WmuKAnHwsnji% zvfa7H@8aldgx5T4r)ky`-%Tlz<0~J^GWkBWci!A zC9gwjbX(l?PZ9h>x6_QV$98XM!Bl>yIj-nk7%Z?#`aq!yB2 zosZq(pKkbQnFr4pY#+LC-G4gwDP^h%>!(c=%r}E-UZ#CiX1>&QavvvVVJ~>cfXpx0#B_xhwtZ^eIx2 z$tm+l-8Z7h2vO9decG+IEkfDC$+ydIn{{({3fC-HJ``oR?^kTmVYd$m+@1YK>gtSD z%-PUb+oL&*{_-umQ~0q~t|3V?3$DiKyLj7*qi5zqyHxpUDE=?J)XQ|5+x;D%&0xQM zzV;|uFgdI3GW{K8UB~!%UCmi91^u+%ROrb35PKhb^r&uap^cawpEvh&TGsJt*JT>> z=L*}n9e>`fV_8RY8B)H-jxXAL!cn)&+`oUV1{Hpo%?nS|nP<08 zB!GVJ-TZ4NT`TN=yDRb!n-y`b7Qs+x8G>Hf&~sLjZ- zjy=T2TaZBA_*FBiyt2s&AAO54H5MYpxmw)jD`BuGbr$>FCX7g z(y8x_0x0?9Y%3@E?N=18RWoiYhPfb z@T#WnSmIT51n(R#r54ny{{Sg$Tz>xmdmk`VUVF2V9}+inRoi|GBJRo0(uQ*$3m!)x zQjnA83#OeE8=%K$%$e!WwM9JMOlTwGNgto3Swr@fZ#>{0o2sAK%qmgN@OloI6gUde zB(Unmlzwmwl;qm|sI?ssH5Wz7ddy5C&vT2#(Mn$;=S!-it^vh*}Z#uf`65MU}>71`fTW7 za~r82FzUGUudMzY{A1I9wFZ-_U65Tv5Wt+CpLp@dQ(rfk<&CatNHu4+TIsrmn<2Z? z#})=bfm0#yzTgk0RKr$T@FLnX2a-h(X6%l*i0K z{ICbLJwezv_u`R&ZhO)e=%=+x5_TBvvkIdCcc{d25%S5jdehi%IPFrZg&gz6T|2Og z)MozxEMdAIN{Uy*f(B6fdecfdB(rckQYpazecIOI%%3O~W!=8K@I3`I zL_EGu4J!gFhHN&|&q{(Y$ahK4y;xv8(x7rX(q)+ChAG3ah~**hLFw9~R+n*LF-q^{ zkV52>jw(!Hc<6f4kty7+1G*fXZmFXPpcB+oq-{;aaZtHJqb8J7u}eY9>mVu*6wQaH zN@NPC2|TyBO(&7Ai-K{wH47evN7j&|a3^O);*hZzIL?16WP!;-qk=|$l_!_BK*6vv zSFh0*i>ObQyy`iDMCQ+)Q_0=DCByY zA8z2iDOD9dQIm>e5C(SUs``(UQNR_DHgdQ%3x(^{)X9}hFyPZnN(cyg^`~`lMHLIG zfSAv}S~D)?P%tWNINj48)YWaPhT^VVqK1W4-lf=#qY=Q=AX`Jk1$@KtKaYn*0dv*F!DYiA$6rMWrY9-zmuOHT|6S;nF zp0wO>6!aCOQ`mg$tR*G(Fd$=tN#(1Jj1E10K9uxS+%wvM4o`1NbGYC#MN4%aQe}Ez zR1oiVk=y_`e4zFfV;JXyRe@*BZZ?C^dk=c3X`p?P-zp$*DL@1b+zM(bi0$gNDIGx^ zR?0yqW>#eg!yJ2xP5>m1l=2sLdY^i)Gq4*o!S9MWNKqCiNk_~0(_{f(AavlGMMW6T z%1=!6rc7II6m{a7c4A4kMK_#4Ft8mnp2D1vk%nWtJQGEy%^3$L{P(9R!xS8fG%CYX z#;0H$@_6Z0$X4OT^XbQ|ckuVC4vwnD8z;A}D!i@bfUFNV_r*O1Mp??U2EvY@ z_o&f`z$1fJyrf~g{rZfcj2<#*xHg1PGlu9X1Vbc_2W--ScKROF$5~tjW1M#FM>8fd zB9Zn1im;4MQ-G(fAx|uB#&T-gO%)Bu!jReRiiwyL^JE`Nu+oKa zq!Js`p!{kDC0};l{AbdsE2{}TMuHOzIXI}u-T}ZEtKNd`ZMAR1{_+({iORX1Q~|IqQ6!$*Z9=0A;INd8h-;P$C} zl~%#zp7fv(%D)t(v_EZ$THfMFq{m`=*Gp|WynJKa*Eq#U+Hrx$y=_>>xknhSk#Q`U zNn#Hq^c3+3KP#p?)i*|Byp`H|)u*0TkQX`HC{M9b+|RkUk9m!H^fgJK^2qYe2YxE; z#ly74@we$w8AGqnz@w<{Rvhq86?QP>aB>f7i)ueU^*IGb<>^xx>LDYLmm!xpr`+3b zKtLY9N^0SxV~>>gt1JqRyc(C;l@l>mNU}-XG18RcOaMO$x)5x_43ku&b&hir^=_3( zqL-NvQj&391+BBpff0Ul#YJnP&wD5l1B&$RFGNdZUE?kXTDZjXak%)?R!0$I;Y+C| zEJ#*9rn}ou3t6TE^4RA+>v|}XB3(yXwHDAad)AH!`MTMp<+0Bvhcv!+#ud2(jMI@Hw?CXQjS2WOzh{$pCR~+Eh=bc$x;LdE4CbNS%dN+d6byCsG_Aa^(txGN3~^G%3gmSa zN$Lraq7pafrC3d@$2AjRU{uP#E?ccFMwv2gjd}0VnEVmPT3;-YjQ;@jsmg%?9GW?M zfhsNrPg6=qDk-Q5Jvvl}oSMz64KQ2}sHH?>O$vD1#Y&shfNMxtLIq`Gk@D25g&3qD zx5`d&PR1yDtplKgJ*oRn0}60OE5$u{#(D}#Y9IqFKPs3-kEKPlvRI0oR4S`OqtUeyb2N`R+lntczrY?VoQS%A5=BE{4NOl{Lb4wW@;n}jfkto^tYOM*YKdbzNp7_gHfuMO!TQ>MI)ZoA{s$l z40WkhK<|@EM&Y;WMI=tWdM#q=M<(lM#(!Gb`9gI_6h~&VNA16HUdW!Lu0@_I-n;VA}^mrLwIv&Lhf=J)Z7Xy_&PhY~h zYyH!=$mFthwzmoc{_K3&{`F6)K(_u{#@HMCdM#63n7OQDM{5nL2yX zp_ty^&2h#vyVvVjTJEO#+Ze=c-jQ&-(B*Ef-ssfk+up=*TXbVW3JzQaNN!c2Dg~!<}cH|a4m$CP+I<%fyZ&aSH$2jf$Uo~$+#%P*3 zhIit%^p6f$S?;)mpE1unzHXfbI4x{Mb|i%n7kUlBx%_KV&elzaUAsx?p0w5vZ!m^$ zlRTk5m9reS{z4>goK&HuV;54nyN1x)+jITw43qWtt|I0ui;~o<*kUZ6{5@}Do!KEC(zM64=GSsuutz(A^S|1F^IFXKQPA?yLWE|yj#X_dCd|j zM#MG{M;h;sjlZpH@Uf~!+kDPGnXHX0E4xDqwtn_cO0%d+@kPBrW=_BTYR$w+cOcc& z!LkVONX8GPRWl?p26g$5WvbH6HSthRH!`1>wOzZnjgHi-i86_h#yORb+-z1)lw`Qy z8+O{?-Kuxa@Z9~HDO;BQFX>mbx3nzL63>pis%FSs$k`fgl)5v0uP7A%01x-Sy#w@Do_kD0NCT1^`?bs3!xx;}94_;>pW&#Ms>IJ@?~j9*Qp@4^;&{Xu zQ~?6^#{{uIeDxr4UYB?uqVbNk`Yn z2<|JUPQ%)mBf<3sgv*Q?YR26G#W?c~*qI9<$s7u5l3P6~(eB|7YH7$AQCAkla&`l5 zI{VaWoMoxW$6jhA&iuO`J5p}L&~$3skGD#hc|L}aWqJxtxhmlE=|p9D5-!kMkp|tu zp^@1^<0MfOj^i#dQ8>NEiJa|DM+dz|n?r3UgHF%L0TizuWCRW|(ulN}HY3E3kTb_x zu92uYUX?hMF6@j`QXs36c&mXAah#UeI@I9;@MtKicY(zKH<%fPM0YAZ$8exv(n$QM z2P9BFPIl5@6Tcm3Xa~rHuX2dP9w%`UaP;z>nlss(b*wa!o8W4KZgBaM(&y~80uu8EFj+B8m zeCMBPKqYL0z!jXKCIh5$pbX;`S%_xdpLu)Kin(@aIi>&)$fIs~`Kq?~i0VljqkN0S zF#`r{oYTCtE4Xp~?KKun%gzVuL>Wz!_Bs2eqApZyam8AU0thR>sDx^{Y-9?kGbZi1 z0)=7nZUU^vLj}i5MBG&m5hU$nuxd$Xo=)=ieXh#xDF}GT|WN+-K3Dn7;PPT zQ)}HHIv)nYOB2(zJyk|etwH3F*&X?yjyHE5s$#iHBq2hAPZbP^-#5+j)T*LSn4IIa zM3yFT2C4(-`h+`XyM##G?86w`rD{Rv(2tPkl> zE=uo1#axONk2&N4Q6Py9z%YlJT#RLS)-MX&-aIVltfWj_Mk_`OLI~MIM}P> zwIdMCxtBQaQ!p9%7j|kn2bQF$&JHVB$50uxXF1*NPhwG598*$0rMS;ZkyFh1PeEDB zKtpAR4fUm0WB`5Lyi;~a4hX3ND3tFXN<+Uv70Bv7Y5;aD-6&n^`TMl!%AsxDC`kxX z!DQP10CuAipp$S~vJoV2GCQ%u%TGaB^6l)tjX>awt|9m;2v!O>V4f63XnxT(?h3*-(o|!PTa@wLN>oUlsK& zD)C~wk>#>D(N#jkyHvVg0o-XQtcaNC=06Mv4sbAP$ z#4RqJWQ?oj4lu)~KDFjza>{L92Q090YeV%WE0|_R@(x+6MgXOEFw0lRo*DSGE&QRb zN>$5pOb1`^sk+-fs{2o+PG=N-I75YZ3CbE29->{Uedd3 zKT^1RXUtuFDr;Mr3hZj;jF&^7l$Y-0OV6c8BA<|O160nUQOk2qbZGXhpE3&4EsvJl zknGqnIi-*HBX_Mz%&`m)y46HUwCqghwF_~?xUOY&1MbrrKfDJ!dewU_XD=rXeq2@a z8wX_-QMXWHM-l~4ys@XRJU{#fp(yb$UB1-=iJNZkm1?C63t~r8Dfv032;C1S{i;My zC}VduW<_@^+%HyhmAV&A=P@pn6Ksr*$lEt@g-JqLEjCk@(5kd`- z?CL50VvxJeDFR_WQ}n7!LB&{V;C=c9&D#AXQXthxlj&?Z-eWQasr*{Cm_WC4I}c8)>EsYYQ8$ z{i-<>5FD|_DUp_nL%Z(!`ctI9C3`hF6Fta+9-whekOe9T`Dq47BsU9Dt8XBl)L!g- zjChR!-f89b!@Wj9?N3l-9CM0}LdR$WioT@v8y^Hf909quIZnm1;0%P{X*Y%orRBsN7Syd1VOf1xVv_aC3@P8Cr2GoG$=X zwQ}i^1|@P1F-=!~n5Ei7ZygV6YP^B4-6`^-E?ACD&+~k^rpjD=qn!7r1_i+Mq%Y~s zR3e8CU{vFC^r&Xaw;c^m56Eg3VZkFK-iZ80ng@v9o&McBe?Y`*5Gqt*bkV*AOI(06hgUGZ`h9<*D2E zku0&A8Ax5Eaai1uq>xt}FItVGXMB^u?M}lHkII;-!Qaj+NTQ-Es_pB$6eAKiI5gEK zI3ur0a8E4cjtveC1(-0;EPB*PGBFtZXrIg5x=!7yL>m)0!qqK;B&r{7)5xb1t_a5> zqDJR-PAWn?wI%os+MF6h#T7>2jT(#}T9hCO!NEO65yVd_aY?kh01gy&s%;YD!)S}I z8TF?~H;}m%E2=2QatHIOj}{9N#(ioN>{7T!jS(Su{gKR3a;uJx)5*f!$OlIcjkdG(U9cduE|KV*vF)3cm_t zOx0DN%N+7ODsUBfQ^BVrSfFzGCAh^pIN8Aj;2!k8QZnVvN2M`WVlwA}(vxI3kZfmP zlgK|B6D!jLV$>j9UN+TNriG74@%yXU9Ov7mw z<0}R9{{ZV$FC>w~%m{Z*)yrO7%`5$()a~i%TBvGjsj}tV@V@AkORCl{mg|8Mk9_qN zh`OZW?6Cg;QiQEizVRw5J;Z#Be7HI7T~Vgah{xS0*RNK>CFgrc;W6%daa`+5G_keH zukQ%_1##D!#P>5T#o5B`EIaK3zt*_zOUBdONK#MS!ygg-Jx{%M!i(r!X}-s-X;(sf zqHYLuBMd*;9gnSi! z)UI9bUnXJ4{{UlL<=k=E+&YQ=a!V3;#d{R+@krT4Bcaqab-!d_37eh#@yGszYbx(h zw1mIf7nK=Ibvu8(TzW~V-(I|0S&e|?l6c2%eNA_kx->Idpw$q0q;4a!?XLL7G0@f$ zTOy5wjjBNzL4w^u8-F9*R_TD+C^HS4d#_3M*3Ev+m z-M~J^ymwLY1p2kihV9%aI0^mVTng^PQGE<5)aZ_y{{X}{a!jiD+UdJ*_gnp%=T4__ zGU1DsPE&;L7D!uH08zr4(^DBD}0!erCx|=jO#ms#!#= zS8MdGfu!8tzmx$*&ioGfZ<{r_AA_|Ei^Pchv9Iy}0PM8+)r}HoAvNk-pgTTv`>GqQ zCBCC|J=ztB+p3)G&&tGhZ>@U9kMQ>wV&>>_bpW^ygMHY!_vKEKs3OZ4FsABmExl=Ztbc-v0n(MB8Z{pyhtIT*`s+sEBgS-TJ+ zE~OlGQ&ytFg^gFqjr)#;sq8yhmOjGqpErJG13M4gIQOH?c@-KK*sc60sH-x|G)Sma zO2+{DVxicR?lCA%C}lvjyM%~8y3~@ahUodnI6VjO=9U>majwz)TpD}5#l(@206)Zf zQVvv1ZRC?1I8p0PTUL<_j4`)?@Aay3yBQWdN!PbQ_4cdsY?V?YC&~s$&r?A>tfJxI zI8rm*Qbj0)l(;zG&=2CN+SfAquq$CW$A8L~%RW;>j(^&zQ7e&+j!A8#SrJNZ9Dnud z{5z#aOOfVe&l13T^{o!wzcgL-Hhle$2t}X;qobTg305$6i zq+4y0SQzg?v>xKVR;)XrDt0BdzAzOxd@ycyR z2Dr5g6hx7Z_0R0Z&7s-5g1~1dwLm^;Jip?sdksltpUGjhhg{a&XdX@Ffl<&?x+ctw zfDRaR?@}yBJF!k@jq*t8(vmV&mE8T&)3psNi9UpEOhW^sRCybJc0RQJ8cpXUQYeg) zdSks;v}M4I7FkNk$UQ0Nh8qR|rlUq&v&{>D`h$0JjVRk?C41?oT5tOdWDzATgu@Oc#;5`cj@` zI5-sHkb06om0X>o5FvI49Ag+6pmH)gQ}Q#nZ#3A(OD90Tr6@}BD&FZFi2O1Ufz*1` zK>--YN|U*4`*TsElpLNj&0CF$gFudD01>ofkHVvGk-`)6HyNo%%1d%icof&eHykmc zrENmq@d;#!aL11S0F5*#mpot|Dn!8fNX{t(Gs;wq0qaL1Ac0W{Di7W2O(cLJ0Zv6p zBFD*I{{YU9DMD_3Kc!~h*#f#c?>yrJoYaMsBVh1pk^twBF^Y{@Wd=3>018H*;VXrZ z#978M(0^KdX^uhSq*&Er3a5ppDzkn)ewC#;`@{>eIUscEY9g#aIL3O?sySk@x4kjE z!uwl+PoF@Gu!(GttdgP2xasaHAk4$(TovM`3el0C^u~yT!N%`eG~7d69P_~9o1A1f zG~ty5J9OzxbtW)WOh+mzDWlkojIf|s!?%TCM3%4 z>Z}!peJGVx&fU2k#W}VYJC13YVh9R({!}?3r>Po66eNu7R{nJ39>ct6ibeuP3yi2A znW)|ec?6zgD8>qLw4YyJ)`i>})NqV8PI~vMAzC&+Fd=fs*i+(VdzQB)wwcFD8X*sg=ZaZ3vEPY1;N}- z(~+O1DasChZ>XUNMr`w%d*C*ERkfgb5T2#|I{Id-gf4z@k4m!3CJ0_L$*3321Ch-Z z5Z%BbKYItCYE!j_RkBBFKs>Nnhst`?YBw_M93Rqvj^ktlac+asnCK^q=Ew?i2sj|q z%DS-)^9=W0|%VqzR-&=7XKdv=7Fm-WnmE z^#qVklK{izsbztYeOI+-eMfx@7O}G_RqQ&{*4hKz+>So)B#zZCj#b#Ja83ZtdS;iW z3ut`C#^O1xqZ7}@<0A;zO*+wSV_4NdD}YWp;9+j0GSLlWNH{3=cPD%&<{S%92KGh&I_NNrq;~`Mk9Q5n!Rt^+!C`9UNNX|HZ{7_XfiU=OUqzZ62;*(}ZJt$Gg z=ZY>>qB%hr?kZ7(#&9X20`xS{xHSn0=t>!o@+rWhPyswr1dO$Y~!dEWsoB0-k7+?@-~W4Ix*pr%cVVHB!Q;`bt$LU)1 z(03%k-L=lq+N6y++MNY4Bl8N1w5nok_N>vRH>om2M<=y(nr+EcWFLCD&GK#l{o3d> z`)@H;MCv-yMa61(FOK93t#G^n$rjK%rebawgc(fQ1ZWjvuAE+N+dS-`v9I>%Q z!ZtC*Z1{&xk5jZJ@03rQ9;9}xJu_%kGd9h*z^<#_MMft9c_dbW z*D?P9O5*QrI)#?PO+8nQ>hOhzyYcm`CK6p z!U)W2KY90ll*5+gyIa7FM11V)SvuH~Y)KEvyPef;-bo9(JbPdJ`@Z+qy4wo~Z){7t zbjUyL5m6VZl3b>4gjMa5S)XP)aq^mev8gQEte56bN?W^6vMg~ze7@k+)nUKY{JCK;!pPSmP+)UnRI8h&e!m5z&cQO0*GC$ zl4su@HxE#2oOwRfzEEADb)@zbnlup1$l!yHhtn04ac-rQ1PFiG>04H@GDO861~JF0 zfBLH~=m=I>S@}JUXDyC<#QRg=E!+#?+k+ZyQ#eDkHDTMdy(CJxXkxn&q4 zo8|2rr0QFxH?WZR0SC+4qF~>6ahh~!TQx9JymX|#5M%-=5OwQL=rG+VZLWIakSQy< zjz>z-B@ql&Kf-va3~og_G+6Q8g^;tAJS|5s5Ga#&Bkk6$s3+zJ~H1GiH#wi3_2cV}C0^p3$2w=l}#Boh!A~NgJk=PJbMhT~@9h*ARZpdV4 z3lW->CP>}L6ktStwB*~3$FHRh>_ZA4n`->Dz@u&rN@Us%MUvQb=|oTne89eoPaHVU zYDJ5BV4r%KP;Cl$+e$wW2*l$(sf)O_(^5#Rt&Y^O#D4kz0QFS>nJBm`#WprSbkxT# zy?Lm7rVgjLsE*>kwh5OEq0KpQkC@XXM&1J&mN?3eImK-XVAaVVfIX_PQ0Fx}DQ;Vg zQh7@o0y+vOxiCU6LJvv+4aZMfP~7CyIr+)$M>{NvSi-(k(n1_?!-|m(T#s6j0;&0_ zL*fE7E0VGPH1IdLDaff|jx=&}#W3tg!gW5B<}b88MhVHlp;!U5aw(vYpr6j2mFUBP zPMD<|jaFiD_eDgx`GMtXSBwxq`EyAeM{d$M^`zWI1UwaSlThW*upf4wiRFwAl)_p* zzcQXEf(eMy$ccbCri78U=ZcYoNL5ElRbqz>KN@v56airo@;g*b%Y*&em0YhY^9pAn z_Z8x^=18h!G7|jr#Yq%wK5BZV;!kRk(U)ch#T7ASMIi}NH#=k6k~aO>1bnq#LBDF% zk-jaU4fNpvBKgXxQM4s14Xm!zrZ*)>I9f+TF<9JuiQm3y#z7s)42&1$?^R=mcR43M zwO~cJ<>#LChBxEprtk2Kl}S{?9x5>6L5J-~az@qu8e*o`%N$V=#y2F!$6~#zP8~L= z`qTk7D>ia!!l6|8IL$RZMLQJvULU|i~--W)1!17i+8Bod#cADL)MgnimKfyNO3HX z>OM{uqw{b+YFNX{s;A{zb8JRn-DxB_GA2X~n7(Y%KG@}5%}zydk0-4}+x(W4jGfzR zNhB*H9q22-{yIxKczvy=Ke%>64?H@b{RX~=w#-FRUzOLjcn8Pn%4p)#%6B&|yT7;s zb6r>@y{bt1E*xCgxJSD_Fo|A80hEK$Pu>-32zE@dF#xqBEtw-!8xcEtRk>9JPVBtn zHZO!u{>OwG{9{f4)1DwFk@1V^~jj z9nAK&f4YVPvwMB#RsNORMt4?c!)F;>V|i0Xy|nR2q{96Ve_vx(t>ZJ6%I#zGQzEs5 zBEtaM4BT1eVAx(pEU? z)pje($QYPhpKtF`6lXjOK7f{Zu1fiDmZlLS23Gsk;+Fm+xV9@QADneQt6f%?*GHexicU5$aIrc# z2*H+{4%s5!-z_0#3ab4n_($8$D3q>GD8kt)M@6W_$2m>drpm9pfw*m_qlQ9A`?Q+s z5!@qk8_fHyQ7aZ=2*o5j7c8AkKwPMEjP0t9=tYHPX8E{UwuU9zrn2qbCd7_}1JiX* z(a2c0_c~NbSVe-bziu{$sN|E%a1;1ygIu#NH{zs*Tu4-}G$2TryAhqVc|mZ?Riv9@ z{Nrs+X>g3Vf0!D4!D2>~?!e?zSAO;xr=mh-Vh7FXQi0rzH?<^{v=LE*5Xz_VsiKI< z!*--~a@_PZVU+x*D_6^*GuU%Rhz>X=vwXKFf%x{V22$HjdQ=LU@?=@qEJ5fMWQ0O&NH4V;0?o!En_J3Ga99oWE@br zToKZogFIuU1OTA^b#OxExaZ@j?N9)?1qTmJEM0y~;)CX3FduidX${L{@sS_3G$>+K z&Izbd%%G4d>Km4B^{i1XgB^?qYD2T;W5^V^z{4M!lgio%&T~n%5}-X@TNocoQOj~T zqzDE?eW?!hUz)Q{<8mGmSE=MvzG22V6vD>~#sQ|m=5=FQ#gNc}AAhAFMhr7d-z0C9 z8}s^9tB^r&#*;>>2uT%0o5SNHiin&ItaH+&duW)6GtD$E&BTr?HxX^1GkILDNi`7# zx^*=C`GHuB8bII=mzS3YJO@!GLso5{N{k=MVkwP~!__wMUbAZG7|6;eZFjkO$~y;Kal z!vj-G=BDk$W7?|)C#U01E2z>0aAe?Z9qCyEeBE$qQWwvYjfy$?)Y9WPUX==9hDU^q ztZ9t;(ewSx1ZK3cc167HPzTHwq=@27Fvq1(f_HW(t)EK1q=@pz z6`lV8n5!Z2x;r}m0CR)IP`Siy$K9ti?&KgHI?%}O+a&2kWJ{6~IlQrq_4TN(E=+$s zY16eV=^oVC$zNYer!?i5!?Wf+GeTx)c$!HF$KCH!F<-t8PilhR+Cz=qzlNld5(&yX z{qgj{s)8CtDW!(pJn4@YHY;K8DmaO9=Gh=_m|%#(DbJj`)Mc*D*(kq(d4GcVlU;6JGJ%yjIC* zhkVD3p00g(?Os`VtLit>OKl-oqMNs;`&HG4p!Yf{!1aA6UU_`ebuyUQ_9)Kb?~`2p z{{V^OvognP`^~2yXBidcH*GbYpj&%}XvTMZ-G08+&s%tcTiJZJZToxw01wMvt{)1{ zsM9*xwdREOX0vr@S-}d&dO8)XeFPWXd{JVenm8Q?Cv^z__BYgh=yua?(4>qdi zMp6E=INj(yYtzHh*HWKjtvci|Nw|ziqxgsU-CWJ)qWX+W=AD~ckN*H>p%WzDT+GH+ zhm4*$KhC0zTii;;KK3z=z}Kfs47(9MbR#V^3LYmuXJ_u8O3!#D)&VoI8#{k}N3CeY z!YNu7Zk==5tXs(fO}<qI**GFmLn`}=8FX2SfyH_L|q0ODy`Y)?WZc*8V&&t2U{`GTm-@wu`4tU`I0J~O!lH%!MA3Jly6%|1(yxANG{I*u-@TVJf zFqE|ZqgxAz5AQl3YSy1Yw}o13FPWT@eb2RXW(%uuWXTMqpL2TX~$$upha)qD+*znKTjw4SV+-3?KghRZ*5tF+`FQOZ6g>NC=-p*L6|0on5AvsYT0J&dU?k~WTArbHP8ew8|0#&Yn+>ZNkS>(JDfR=!^{ z_vCE;RZ7}xuCAFM?SFc&pd)!CFJ>cj`S`&<%Bne%HS+wzqZ>!J_|w)>Tp1TQ`=X_hpQuV*=m zN-D&R?6ZlQ9H#M;Yj`!9+|I_%&=B%#LcwyKG?a`bmusVOh`sS`q61+ zEclh%hUs1{qs=7d-O^q0k-;4GuSU|X^>`P0TzATXdRK$&`E+J;I~lFa39ybTxG+QI z`Hbkq@s9P9&8|rxcVOO~s`JkxY%&f9QY(@&NP}KN&?*%KpYzRFjin2@`}Xt|LQCMw zxc>mFLDVfIH>q<5_|MEvG2DG>RD`xQ$=JCAgH_509)_B-FhRWM0+J6f7L*>9s%E~; z4mS93+4|I|tl8t`T82x3BV?Q(>sA&(pa6cRs-*5>(FsyBuznQ`0CTujkx!Jj#NmBBy&^`hDjQLVsU*`}EHt1=w@ zYD@+PCwH|+x68`|fI8I1EWUCE1vo-;{HZ}~U;ZAd3Ylv;CHPM>9P0@ zgwQga9h(iLFX;Cj+IXHe0Q4svtoDi(kBX~|aTaZhoWh>P!x zbNuLxt`d!jc{yXi?M+n^ov+aIk=y+GQU%=>7?J5q8hzF2jUqsBNNt$M6)KeA5I`K%B#$)XrBoy-?l8m*fTk(nd1qnAK~4&# zPZWw3_yDLKJq;0^&?ynds4`V>&y15yc(%!ypXMAK^TkN+BLQ~+p!1p{NJH*kqt~@u zM+d1JbB-`atuVw7UP0|ry2548@c=;j9<>oWGM!tftlUE53<`tgUTOw%7$b3-nLOy! zJd6%_80}3VScBAh8nmp0v?64YdK~`%N{l%GCJuZ0RjuG3YO2Ba@1UeGmn0(Or+Tc3 z`_|ZgQZPNL%Q->_?tLmaK_s!{iY^HgkTwp+sLPBmaw=lSB%Ud|cabNhRgfg^Lli8E z?oTdqbKmPtDzB8$6nQ4qmf&35ubjal?bQsmCVP=W{q+|#(Gl#Cma2- zj(Ig>@2)s4pG;I68aG@XJNr^ZAPUQp$C5f4goIZL7?OGBrDbz3nfw4_>rMy{BLlrO zH)H?Oa4i1-dy)lB9)Aj8#z_?D^T-1kug2kfCVgey$@dU2Dy`j=SFtj>z1aJsESDrx=MK{_5WRro|V!Jy_ldx~#R&k3v zrX|LVsVA6#umd=%uo%)s7_Pe6)@Zl-oQ<8!MU?zyJX1D^GgxIjRthHU(&4fB`(xxszn03^^Q9Cp;c8O0k@UKD9E$ z6|+@+0V@l&w*0?#o;b!S$_O7Yry?eIFr-voq|S|v#*tJM;A0dPJPx6{QYm6~p0w?y z%^JCFSAkS+Bo_YwGjIo5(2N2U8t1ji#1XI!oQw}+S~e9CxQA#D?q&N$paOnIizyYNQ+i#Y%E;I|`jv;5Y%Fr%!sA zF7?T%wi0vbDe1-(w-utjfOSyEtA%SOgq$ut2qTYxJ5;*{GHDeyp1Cyt0GN+qS+%H!uOltioU!qh6wtt&W~5eU z1TV{qBe7A6Vz9^+GDaCeEsBT%v;#^zfyFI$Bw#_FD$?!b9;T}R`02$?tGQ18Ju5eI zMzW0j)ZzQIz!{(>NCT5oDmLw%g$+ru#zP?_DPz!6!xZNk%^qIXJkUm4+*7l-n&>nG zoz5y)*ehooQf+Kxi~~X@23w^=xFSL~e8;6QV7Xj#LbDyIj8ls3ITS@}akM`GDF>Q( z1clr8MKw7%^r=-&3Z9isXc2t}V*@?uRDeEVx|-3Q*&Vx5qb70ErpOB@yl19rGN*SO zig+SLB~C!%lte&K4LkP{Bq^|io|Q5wcic@!0Lj|J6)O#=aP3jesZl0XIa=!U)tWWW zi8-K%-5m975IANt?C51_0oQj2u)Nq}Sdd9KCFxvXwgyGxnA>S9yeUQ z)e9vO#fDrrX7t@t%YP=GpJ%rxclD*Efa)PwY}d;pwR!FCpEve{&7YK#dj9}Q>K6WM z_@h(zm+z7C^YpCSrxxGo4BvN*e|XbPbSgWX@%u1ki1+F}4NWvg1dPM?2g_J*9o)0E zz+JgLdf-=450=oN=oEhy36S?H*;}d9qj&q+?c3VDo((u$*vOVHk;s63`thwE32t>| zAecfn(i`}PwRh8AHkD~C(@BWm(UO>|5nKfjHaGwQ8r{eXucJTVtttPaHc720Kd*i}kNd(x!k$@JYiyF-|ad9n2pQJaXQcWe3Ynn66zS zgKMfG4cYyxwz!PS9!XauamNC<+lX#a{K4`^{9eC>Tvd$Rbuz6Wkqeoee5Z_hRhBY{ zmUZR5JqP!zKwFKzYA0IA)NhPZuaVJ{X>Nv9@blGK*E=dXHuOs`%{px(ss{wL{Zo{;%YS@Y# zvZ5c5e68(N^%ZM%+7uAoYd}dAp^Zb5yphOXN|j?^{%obNe-TmGLp9uoYVerP_p0`x zX*eijd@FtZ{{Y>r+Z#D)V7M~*0Q|3(&tY4ZQqKhI8R*N6zuju35?n*5!qM|=ho^EF ze~om|z$HF=FFU^IsBFN{GAqVoVO$&Aw09E|lb+qb-mbS(Eo(9!eZ^s3r`nMsnE5fQ z1D)7B9OLOjh%{3d(^^Rs5k~IM({J$Ab$`+TNg-XxI#!cT zqBRqSZ}9&B8lFMMne;#G_a4NW&G3;aM=iT{Wc#P^0=}NRg;hq@&MW25gO~OT8FO28H6K5DGH z_w5I1uOcTZh~obMHw*stK&n)2&swtR#c(=`s1=t7(yw7L@-y-LRTxrE?Y(Mkr5i6( zBpJaqHxooB`rPTtTH=P#Y(PvQf}i! zprBoqUjPzYr?oT<$Air%eVJD2NJEftG18t%+y;0R5DWtm_kYi7n_(z;plfh&PI;hZ zmj~FHsOijQ?~%1gHZbjj#0?PH)sI!nn2*5 zX!5sUgMn6;KuBW57-O|R3Y-H4R5DSJT< z!h?pVAyhp+Q&9oAw+@vizy=U;nj;Qi5V%9P85FzGI*ut?7VAmCQ@DJhsZ-@Mn8`Nb ziews9llORDm05shZH#Hr#sZLf(NZIUD&dp`Jt={C8Rn+)$}Sg*Xj1rQ&lQxNiezff z{7bf_8?lUTr;@G%gVLG?(Z>~XdJZd5#YdJ{3}%`zfRp@HB9=k@<*1RGKuPIY#v=rB zyyBxWN_S;=p$1Mtz^OlYGN51zu2dH)?QP1$bj?VHWjwE1a0G=I*t(9(Sqi~gljoDx2`EyQ? zY+z4%NWjAacGQd&g6EoDbr}jW$;cG4Gn2INYC=;uUN+KAwCx~N^(xmPfb1+O`DtGg z4h1Y@Yj2EXRAI(8p7gnij^m3+(kKgnl$d8@^8MN)2#Us>e8!La)udEGg+?Fi6 zb{N?1U!@l}=+^Or^Ld;Mf3;D|Cz&bQFjkHh%PRl)@~%1?C*Yz9A@A9}N% zDIpIuF|)UIU*fGzH%qzI^#qQ|9o%#szuvE*G*1NCX)r}OUq0!VmpwE5TWMFWsUyJ5 ztHv?2JXga$9o2Q2Ba+1Yl3{*tmmayVY0x(4F5a}eN6R@JuWBcbS%z2S z-TwfOS2Mda_GoA;8gJW_`>H9*1HRQ9uS`^ysUokG-B<5Wu}K>2KPEqm{hH;R3gsNg zA{mta6qfR0PcaiKO_mU=u>SB#RunC~ETy)sWhKfo%%ur;&nzmeP;ZTiYF32A!JC|q zmaIo?B43>DFGwtk(c1*wwqLvVmY(r$z#liQO%w>E`!(lxy#m+j`k&!Z{nHJ`W{K$qGD}PScuWcpYa`^yo z7P}(&4Nl`y)nj>oV`<$n&Q9VYz$fL&`E&K#Tgxoar-MHHx%i{uh@?wjwkOZg@sYdz z;aRtz7<@Hpi$#^EkP@VU@(h0ouYjS|FP7&nNeAW)SNx@lV{(jJ&iRi&bk>V5j_kPL z&$J@=zoR*qD)D&@w4*2LJ!-%FF0D3Tw-J8*mm#BHk-r>@_~uz|qF*X07_sZ~e>$Kb zl)K3@d3p42n{{g(3|)?h;8FGo`1hr1F*z2~K_oH+DEoOG$UQx)V#DKKhc8w3Z?`e@ z^Al+Q0C$S`lgnstF~e z>Xb&sV&|#&S)i6@;+npW~xFY6KowvIIB`@gv|zm zIM8hz3SyXpp>M*ZM;|i36vdAtXAC;2tWfEeJk6a>R+t(`mjOR;26unAo|vbqm5gz? zcd4TrLjo}!Id&_Us1YHMh>0swNtX+rwIITSj(bxh=yBSdWn@Of0wRp{BAX()0lMa< zSi^kH#YEYNt112}(hV_ABnrf^O!7ZUlx=<9YGc}(7s{7;8?#Mr3moBUXL1xDK~@z+ z$J_#mk-`m~7L~l$LLxXIa8IwjGcO=6{{SkE)pXD(=v6Do$IFVctCO{!s=&ZG-S||o z<$)?NLsiK!+qoo>jDLIURg?tUtM`w3yd~b40;)8w8DlHQdQf6}lc-_ z-dg?M=Co?XNmzBkQ6Ui?DT=v`5S+JTLR(9Mt@nLvpVl?ur$X`DFnMC@j@{^tTL{G5 zy}O3n=5vVvuMzRj#8`BcHVil1P4cMh0qResdDgA*O77Nq0?IEOmQlFyKhJ9MUlLzm z>(af%ugM!rp6S_Z-oa&>`^NC2E~lv8c!}i-(n;odV6i}Ry#5vCx~{dT-K6FxF@-qb zbO*Q7-m|ooeJ!0LoX-6S?b4&vFXk!bPafx!_*bSY*{6VndL1yPqQ?uHSdk{w`F_PY z$NMAwnsvnXnv@X$O6_h4?^&~XDQX}eyD80LCECR)GRgw?Tz&8MYo<6Ty-tX&ZgnjZ z;K%;3IO+F>E0DR9PSdU;5uLGuK?9SM)9|ZJe5$)`8wlY1-qpuUhUJUK;K%RW)q5o! z1t+MQ-TrP~D87DkxBcEKqDWlBA%_Q%{_ob9$8G$Ol+H)){fhOgLJRLN&XOOID@fB< zv75Hy!En1xuuRCmHbqM%lyEtkGqw7Y+dt!26YA|_bH35k@yc~mSyA0da}ZH0D=m6- z@ba-TosG-ANiD5gJ6d8v+{dkQ(&`tQhnFl0;Sb6`hOP^75ZiX5=%1VBtt~zkw6)B# zaNj6n_qTsOYoZY7M>DZn#@blb#N(yl@j+RFBTfSf3AO6OqvR8EZP^1sXTe|owd zIt#heWTm$p{L98OQq_$SO&IxR8NvCRK=OU^aoV|i?LsJ|*#X@gt@3{rZ4FR!8tY*qTkX1F(QPN?JCFO@Yn{|)l2De+ zcE$!3lXl}&uP>cdVls30c&JkOMcR48YIob(x2Hv;9%DOKYp*P%c|wb|Kj1aX3I71J zBLek5e-BayNXPp%>`NY0z0*IDe|E@e9GsC z{h?$}kY+XOy0Re-Cw2?_qw`|DV^i>iak%m^z1V!8#H0AWxU5m(o0~Et19LL&10TY* zwJPzphH$52kV}~4b&cQVM*c3ittkHhcLahZGBC#;m9YG5$5t!{$Z=pzJ}(E$RNvR`OBtDawRg0oy;`spD5L`Enp|c%;>e zac57YYEhIvc`_ky;{KJ|ffTWeh+MLcySlHndBj$+#Gzu_g#9a4E4jpr2y8}ipL)sN zYHJ6lymnUpO9EMN2TWErtEQ>9Hy?4>{GfIp<6F?&M?JEnSXLYZ>OD`rERaGriC=da z$gI@4O@c6p56pU#pwl3+ZZ6!TI?6Qqn+hT!o;)sWIJ zTQIp|ZY1(!9A~~yYLOLTCKv|LoeBPD-m}&-)4_U>EzVRMBQwWNT!^VC=(i#*;-N3u1iM zMHX@EPGlx9JhTV(qB0eU2=b#WqiX*Eo@tgX zG-a;h0FlNTmPqD(k(b$zN<@_{$Cf!m{{Vevx#Xp(C$9Kr$m`JkIBL;V>#rG&&pl({*E~uB_mK3D4nI#If#E80NWY{92hAGbFLd6F-$U zCJ@F%u1@2gm8E#FpWZVK)kl!6j z0;dOW^{M8~yluWummCV#DTHC6px4Usq;d4m=S&{2%Q8eC$+8ssJ{`g6NV~}&-tw7SOvH*7y zcn2P}1ae0teq0}T9#_6AUdAht9`k^BBm50R_;oY)Sv{n4z)X{Xs{CMe%~(hpNj%<& ze>%}s9C@ei`qSYENglM3GKwk-cy|XQr*l_S?gew4{*)rBe2(0DQbME#JqK#iUBv<= z46>7*$_6n?C1qXV4I&}7+=TBPN8|k|@!TmK4Cnb$gkLbD8&cv?K=~5i;1cQ#% zG@KVGImZ;(mR5)?zkAk{u8AOZ-g;u0CP6^JoN>il*stFVDl}GNKsc&{W{y3G1Z=7U z5~DR7xs5P`CZv{4tI5e)j5&~G@rtA<4Fd`Y@7vOsV`n`*b57bek}5d&ta$B0orTIb z1Pr$WJt@1GkUEakyIq_Pf~SrbVYRthsH=_yOvi3I8jLaHJpTYnk)y%DIq#aT!Ig;Z zSL~z^fah`44r;DLpPX_y6(o*O05C^iTB6RUka%huv2j|HuFb_5_Nb(Fje@VtqN+*r zD=TxyKT540*y8z|1wV9A<~FWgS(gk?$|^ZyS%3lXThqNo98zv&kLL_~o`SSvw|IC} z7{+<6(ScAXKn#PQPT!R%^3@IjBiFr50bnvdRq0MpF^podj0(SU4gUZz1RM_ZO1oWH zjxCj3L*HgiU&Pm!k9@L>&xW`I#;>XO$2F|_z0IdOwU`7G{_U_d&i9sd0 z)EQ;vc*RvjNnO?VJCpK*z#f$7;p{uqjLuG1^QR5!GCS1U-2$;m5tTbqNURPz9R77X z@0gXcxV`+ZW`5?gzKI!8f>AMU>0!}*8a~xx!DNv*X zk7}>-1|KoV905~GpfGdOxb>zWO}r;P&03zswP6_n13!6AbLpChF){+D>N?bea*UDk z198)Iov4UKDgSDn_hG938!J`cx7`#~TR1>rO3R!E}H^k~U-? zaOV{ifrfbF+OIM)#mA*lV z?n$^2?nfgyx~-!S9#qzZ})sK=!%1ab>-4K%o5 zM$?2OV0EUF3knWn`G$Qe5TU?S;-806>IX`VnZVB8wA^*DA%Y?aQhQT35OF0+5WIp+ zoa2#5er6<&Dchk==!JI1z%b>%l{^^VcHl~iK&;A6019};GF|Gb@A9U3Bfqs)sFARh z103PLY#yL}4@!xGqhS5gcr_tV?ZKx!Lttab@9j=75&zSXN6EWA4OoN#M-^Xb3Nyt| z2m}M1fnSa;$J9pT`v3(p4FdiK2GO7X=-Us_te+ge7q-qwa56E zPs}YkjzI?kyC_e~^70K;y^P#jx)HmMl~RjwJq#8l)0yOmM%-f<>s<}FM~!d_;B>4T zt9dQ;4=D8O{{YsmmfZs&_N=0Pl{xb+VpqL3s-$%Ethw&Z)0QKO(YexQyHFy1xbNPw zX0o`k8(e)WEApEpA8L44F&=9wdF6HtgXTTzea#}0R|He6kIt>{Q5HpM+AW@`;Mf`~ zKQ@27Mn|@5q`a0yKw<#;)eRLpx4*x7-tn%Dbu3c^Q@}lVUv8PM1HyVW z{2I(MbZqS;kCf-J{{R}9YR-FTePwA6n;OYhLIOx`0Pj_Fw+jj*{oz`f9+gQPFGevG zA;8JaO%4xEDlycP#ZL(eao&?x6iIxu+|rcDz!a;&J@HPGVX)-zv^|7EP$Y_5rC5lK z`_yKsgXR?mrzMaRi~&w7Ls*hcI>Qr};fG4|d+V!<+mbVtu8UICqGd3l%aTXX*ESWP zZOl5>H68RSeSF^rMGpznD%s2e?N4Vi;N!;So!P=#5a^Pt36<}~x!iOzW9n=`oRa8Dy5 zrYAB40*I6&Wb(B3Kg6P^sB{?0P?OS~A1rb+N^nRlahi5i50{!9?gQ8|s4GaSd1?Z* zgJ?gUNEM=79<*J(1qL}(?Z--JQJzLkKae>+X;5NJdetHQkzxdbNySJ<8%KIoU95Pg z1t1I#DJbd}B16=ARMCdrp7e!Af2Bx@Mo+J5a?nUXHZcaIRy_OD5jg$eIUOnIsPw5) zS1R7ZnpI4a;+F&yft*x`6{A*OJ!)klScP1TfFmM~WF#;)?s`;$ zFmbrx8gNA|!{IsA9Wb;a+?-@Uf6i8@drtQT~T6|&1AoERC zK)DB+nJ|MZL(@{=jSC-|RZMhh?gyC#in&GtX`21DRJ!{ib0?tyHELXi;8@a4e z@Q1{mPUQHSSvP#rV0@#X0~O3^TcwpqA0YLvi^t2i#P^SJf@PC~oSY5^TFtZFDk4U3 zsmWv3zM6$kbtBn|_f4RZM8;Lf9nEnqBS)x6@e=7HoDcA>&g$sR2ifEKpYEE)veGpu zE>irD-Defhor;4y8$CWHvx-SR`56_)>d7FT42Ok&N40e3>Ud*$COJgtqxgQc#OgQA zcQBYQ3&m@FENKHz%@N2TSNU9VRHX(M-JSco(4XmY2Z?^*=Bx%*QxD#AO(8{+X-&Au z3EFz`=~HTYXp>Jj+29TJd&99qZ0;^OC-AGDDwS78nmC`!`7%GkvsOh$N0zj*NX4zr zaoVp~G?JapyKvn5RUIB9CB$KeAH`j2+pLPh1;#3&D9JEd=tbuFG7ErtLB>C=Y23-@ z#F5;7^CLJt4O7~X6S#0k`OQZ)?)6pJLLtUL>q)HvT@Sj1&k~pUN40Vqg}v3S#9;jP z%sTf6r%LW`u0$3>DC6Xh;{O0e7~LYqdl6Gv800{ymfh=GHqBzX9nMtRV{jqH@5ZnvnWTg4{Y-7itrHW)1|Q}) z{XMFMyfPF9=Yl&5%!E=5Q%{i_*e9(RquLfqF^tXve2YW>i8_x7$5 z_U<-u42-IN>W2Or(mEl=M&6q+H=80Q5$mRrqlo1IJaz9}J%}-dShC((>+fAgH^cxX zS+UJjWH}K|NZfw^02!-#e5QCFX#oL$^cr>6Y@#s0o@VheS&nKaGFs9r5(paMkzjXBXTCp5nU76f|RcewYGvYVo4)jJq{t=oiM{`g2 zc*oYF)tT-WbVn+kt40AWwV~gPXOCfA^~&7bZZ_mDX+@P5L8RQpEAEw7Vsx&q9YQ#F zNg)cKd+S`yydFr{`+VO~+|y*10KyrL<_Gnp?aWL!&|ODTn)Y=opDc9ss<%-k<(alF zce@XhKPcP&H8f2t&gD~tKc#6A9t?zG$0{kOW@KYWrO73_sr%9V%B|CixMGo$0O5e= zckxxfG1}C*U!A)D0KHfMTs`NM>hbLv&emij>(f5elDaMvN5B5h=Tbf=XNZS}7~IHx z5Ac4q_FUd$kms#@Pw-G~)%@t+$(Bx{BgVx&$JV~tyDb_a>%gy*&La8Q=Hg$zXSi7Y zS6Zj#$WHd)6IM}+?*8>gVP(LVoY##M&M2XU7&^!fX_5l08~AEZEU+jK-KbH3`5&E? zX|zEvFV7gG%qYMp=}4=Ah3QUWVmPHKi&8mR{LIsou>%x<2P{C0KONKT5tzsM@sw103;+)*9|Z zXhp<>1B#UcvV`f1jx}cl15!d<1`WX-Dgrx->=Xcb9+av;8H{~u1=*9&CZ`b<ZLHVTwl}e5a4CAR>?} z4td2%5gUVJBAi!n#C#6)*wxnn9+glY#LT;MQ2g1$RFic2)JwPyPa>p4aB@XXBV_|T z=k%l*CxgW+IRg*clGGC!=d%hXie2qN|w$585W?(ENyR<+LOO#=BN)ayQ<#*&?@@h3)yRGI5H9anrG>X9tbLIi@Q7!B&X0T2~@sRsKJSjVR-Yn}ywtUA!o$w;>RrDIY4c)y ze+>`_-TEFX#EH3ZMk&7_AV+rMoPf4N{rZF}4cVmIu!qkErte@ag+5tA-D;wVH{krK zRznje80`x}fuED7dT~U0X+%H3C8bAs>O9ak{ji(x{o~Wi|P65t8W9`JH@;2rM~s z*VI;GPGf`_h#%cQ-mP6`+Dk1??#AfsxPn5A4;UlZ)+7)Mi;pevRx;mDek1-m6fr&htw9e}@LVdCAM-J|4Cq&E2sj*$2%S-Ro1w`{0DC{J-A*8m+P9 z`H=Pg8cAW4Y}^}XeZ56TEBH;%-A>g}*Ul*_e4?(*@&W;V7v-w?h_{r# zD$-N4B!+3)ONNp!y1yx_n-y0wu`wT7f-7+o5x9K({{XvJ0yC9Xf4SPGPx(r^D9Z+O zleJf+O9X8!JLOH-`Gr`M{UEGiep-rFmMNFZd@tShsg}Wg2ASj7s*Sb%8mx|)!S{sOgV$S{$8;rD^4-NVM7P}ryc03N2I z{Jvf?2Nf}h(CH&*hm-#R*wbuayNBiTHzE0onzIB^7jXFr*^Ng8U%q0`!t|q15XZhp zW&4Xrs9IdX(0%HeiH)|mDORHqh?vHhG~(^CUr z@6hewcCWY99`Y94cyGI2H}M0)x8G!KO2XTF#-}V5nX%h#dii!Od^0)cPRQ{80I*21 z?c6t?l}Bn^u$iGUHe&f({pxL{)QDw`w=9YBm2dA=$km)7Zd>mE0N+*XiY+u#TW27! z<-YTOy;J#(XSLaWe0lbM zUAum7_Exgyw#U`s@)%gnOF0}Um~=m-YFmb9WN63U;;oUqnPXksN8TOkG<~lcl-_q# z&ZFG+@c0^Z{o5aB{11_&(W7)9zKyv*`z?I}%EmU4{`dE*$vzWl{{Y$E9gf(pRvpB- z`^C>+z;>@zSCUAxj91L!Dqd}$ie{5i#MEoM{L0b!k242fl_|2boacqB3RS?xR-1Yc zFRgQ>bIg#{cF$jyl2(uJ?bAr-Z671{uDkT|W>~or(6-xPM z$mX_MAy^p}GD$oiT5M`Je8a6q(U}|(+MTfPUFRD*3YEEh#*$(nKpiT( zs6)Mb&>J6jy(B8c`LFkB$4HrT3(FPer7GAX8K}{uX-f`0D!@VzPw zRg=sEZ$nazyKqK9;M5AgIV->wahRF_yI2M9PgPZZd(>|k-LP~#)SDM8frC*dIH5v$ zX8>dxdu3aJ_)}C84ox+iZzS>1(PZLWS|r-8yo_VDR@eacsoB6@In720BWR^$ktRqY+4?5>H=x z-nogVUBi)CxG|i!%|s?W!~tZFWQS`Sy=NLl2vhuDl~HDm&hy49&v2U5M4@{ma1E?$z$YvWo+Pq`NJ|O!``7$^9Jbe4-rCez@shv*8 zr0M#k7m=2=e5fR1x)_>ib`>8obM>zi(dW80nF>eK(!B#s*W`V+_a7iU{xzedjTQQx ztg|LC>kgHtFtwrN6o}+};;=2e^3lB5j}6GKktAKY-Nh&Tpl0MGhELF>8lr>^aEwCaYZ-?nEg{yNWoM%AZ;G?#$C1Su!#e0 zJGu3z-rgIDeDax2)Zr>h(MJYh2%EExzx{gdRJm59^Oqs}M6N`OwG?f~YN<82w_)c^ zlz+H`sQ0L@Zmwcnt84@KGy2t4zkACDmSQ537Tga2w%X0mXq_3e4TMVIMjS`{Mf?7B zpR4QB+sgKFyQ3iOj(2)iHTR13E0j=(3}j>G_4WSsa`w`&n6&MgPx=1u9Aj3e|h(D{9o`Yz=HjjM<_vVmA$9WG`j#z$`F?KIbIO(4Jip4TzjtlJ{QR`*b-KD3k}oKd*j7DC^r)su)s-$XtPV5$ zD%6v{#)`=h-rir{MKqGKvhX(j-HJcETFwp%uSZ|{G) zwXdXjM*X+Q$%tZbFyn52+OByxL0yh2OyRBc=54dG82rzdKkV0|Xg(ZhqhRW?B#gKn zmb$5QjXu#t4x~=Qj`;QBx+`dHL+d}Enwv2)e3f6lfw?8Dqs`XP< zBesgtDGNT?SGnjv-KT0grLL1{6t>ecIQe9RFYBLb;Pw9i5nE3ZMH8|o-YM9hulqHf zD9YvgNXJu3=U=k2kjptOyNrKYt$E^D=7h+J_W{^{&#igprK>D~p5to|m+t=npS@i1 z*8G@SICJ;6SD{Y}*ynW_yEWbJpu&64oc-E-6BH4_(`U>NZ~N-GM%Av~AgXqgQY4be zvIb&|-;*!BcKaJ6D9YzS9nF-Ily}RsZqMG`Pf22TY=5ovtczPuEu?u)Nzz zl`bM?nRZRMV{hL70D)ArGiU80DB}+y$~PvqF15K*7?uO_TU=x6TLmt2JOn zn|n*O-}pOzbv%d-`+aij&HGG_OTycK5AL_tv@A7=?k|Mw%2oGl57B?w{{RZ(?ib45 zV0=d3F;?!&S+99KKfhtK&HfLi5Q#2QiR|`zU7hsuNpgJ8@1DWEtDm{>L(3$$7IO?C z$_MoS02<{qzZBnT<(}9HP~#|lJq>Mt!dEt>w``wh^4mWz-fiFERG`MWWK)Mq)uO#f z`JA7ZXk248Bik*r`3}FmLPLFP(Y!gY*%-~t(xCwTR1w?jTN<^lhpxrv!55W0V+UdY zTmJy9PBPx+T@N1FD>C_je7|`5eQLCkm|M+?Pm;YN>%jhHlU&7iDMGU8L@|a`wtMC(YQaKLSkLLdXfd2rsRp8T^VNp2pXWXnple_AA;-H!^$RkA?m#6oL_pZxnASK6Mpy#2k zM_9CDX{>}({AfQ%dwz^c>9BZ%#yOvv1k{5ch=8^L> z>k}fZk*WRR;~$MF>{KsfijYfdAyW}^oNn~p>r=|m01AS+2WhJp5*3-GXY*r|u6i1y zhKfHTdHnUjC;-OMO+|^aNMgBE9Pc>lzO_wDG~Z<>i29S)by|tuBu}4jsO!Z&p^7_? zKdJk?)TBqVMav7p70BBjW61LX;~{-3>JJEbpGin8?St%wFcW9jf&P0}%8M&ODUa`Z zS3}|E+cU`{6d>gP0QIZS#^C*=Z6Z|J`WFSY+?H`(Sul8U$2Zi4*vj{F>yxrgu22T_P(vmTOce0E5nJWk`_hc+79;Ypj8j2_E$Rz6OJ>*9IUIC9IUx? z`^wa+N%2LzaT4|HDPy>dHpvJK-6<8cb9Zj5R)kRP0IKU#pr z8_Du?rg<_ln8sCOC;W<-M#O_}Ig=R`PG*r&HfJry-qm>`D!472dh=3C7?3CnxBP2b zX(LDx+oNL=a0N-Qmd0?sssj|ELEJ_=`kzBq8szyPl=+7SvvAy8>|iBSs*IXJA~59A ziK7fMI@JrtiYdIMY%_CL8FUUo?AT(Y;{!RWzH-P$P8YR8<=ZMx2C3s=D0!`Yt01#1 zs)VxgSYw{v^+rRo3?ApLK`Ou65u+GfVDp-v$~OoRxWUP*ea$J4jNCf3Qv=BBkMqqc zS(ez2nT|e(*w&^(z@YPriDoma6$BAkMJ<@0!Z;$P0^nn)rSnj>(A%-rmqDdL1C>LU>;QETP?5E`irxe_sg3U6o z&IS)m@M%D1Q;v&H@)a^i@p5_NG?61bWGif8>Nu>#;qMSg*i)V{RnkE)#&+ZL&06xy zM~Oz>dGAe)VN? z4$E-Ble0d7U)>Q zv9!lleXGrPdelhp5$tQk;?+LKtBZMlQ@DYSoK(+7eP&%#o}G_Sg-marfb`8ls>2=4 zvmWW*w3ErZvlA&K0s7W$*>AHH9Ce~sKhaqijSxyM+(A8MsnmeJ7yPi0!&Z5}x za!*m3w`9@Hc?4MMMND9uvNOd$b+gs9xY?}G5sov*O4x=hat}(aXxpL+qW}uI8EEsK zL9VA4dmjl|`_APX{VF@yiaEe)%(3vTot&mb!8~Ae!TQ%qgs{NxN>7!H_o%ThPnX>u zk*cr&Rj9!&&j8T7Trc;k(!?>9Jk=O;YD7^ot%|D76^`E3af+VZD;{ZfP0vG9utF%* zws1xX#Wv&Q1&7`ps=cIxoN_6XqqF-S^qkd;Ng#slBRgLirfOQUHL!}*jpY87%Uxfj zGQ4PV%f&~hm7ZPF9%~r*ZP8R#iO3}KmsSktFku3tITLe^q0&$KhPc4DP1Qf@5EGv&WLxrX&BocCJOz-0v zrzcPtRK+`*3~qo9eZ4AWRmdRoNE9*UY4NI-Jant&BylGdA{>23YHuu06yOLaj8vCR z2(5v*)X|coE7F)3f)7fbD1cH){3$TCnHd|7eJV)D%ag$rB0IJg~>*>Hh%hucpI8M0+t##rrv$ z3#`ic-6l>ym3R8|j~0ZpMnVz+1NgD)_*a$L$8)J_@RD+YhX8(guT#8fCbWvvX5kpy zis`?+X&sJI8EAxJxY0*}D&zy{*YT>>x_VhV$r!Q;bkTzPo> zYOH49M+MH%1jA`hx;Oo2Z*Hsi~r8f))>sT|}M{O^h=jJ~z*0=2Z^^hwjcGRU}`U`tBQOdTd zhrs04Ia3siFmM%nRg0M}uI~&F9?}nPz*6cud%+r9HyegO8f^kBYBx5kr#xtQarOOc zjnk%$qH!9H-*@JzWw>Rw`kD*}wyBN7{SmxTzgQys@-nkl7>F zt-zrefJjlurA>x$EAS6Whc1kEHRpDg+({2!GoH1WR(T)fY@C1JHF>wZY^Zppwz4tF zl^8$Lf?7un;xvxbLnN8=cWw5p0b?BGPjMddy*TMxo+i_8u3_O9Ol08W5g?cgY0ea(60#H$?Z97FeM zN+U>H$t0dKs{UTjyjSm6OKk4iL?Qv64s+a}TIX${d9EF2W%5Yi_sw=XWG^E}X9)*u za4MqpDQscIZF2-I_N*y-)v-%>teInv8S3Zst&bDf%ck3jna1A7A1eBTUR!mm-#d9Q zl6vp|0CuC$h??T<9%lsngXA?z?PIo^5R4(~f%?{7jS|gtMZ~|pCjvj=`qa9#8iVQ) z!xtaKeF*x{&|MRGxJO9N?Ee6J_-MWpTw5x_nUjt>DIdglds956l6|Olu>0PX&_xr- z6^e!(K3r>BYOpUZwz#y_o2RFJt8@}oPACj0_V09B-0iz0oa zsm5v?qJ8R_RGy=XJiLwvO0{D!jY#LB&<6Ly@+xhFF5ZTjv_{wmiXycIqttpv5rKZS zVRqxCQ(hZAMLhA%DIumuCnMz;#XT91G+~P46(T0p#Wvz0#!v_(a4C{)eorEr+e+eq zg-%KNYd%q?MG6FBN$XPrS3KYfhZ&QKnTHVzR989Y)Wb*D(D%lSK0X%m2PRM)x! zqiy-IQfW?%sy%rRJI8u)Q$>~nuswnq`|=$TrYD| z1Z0mMwO}Y;kT!F_l$km@H-RXNk5hU7KDe=RVJn`C)M4^b?_bOFmju#6`{XkO@jy(F*5#>?V zuCO~XRlwQ~4slvWUhvUhXUT)}Rh3+guG~~eH!maQsMQ%;BauoU5Ql-W*baiDGO6T! z+L2j9ZeN<3fgMj`X*2^&jJVo(J?K}Fh6j2I0yYnr3P_^))Uf#~lsR_+!I+LehMW=A zgAQt4s;bOt64Dm=e}<+}0mNf*lby9xTqJS@2L$w|2Lnq*4FRRumYcn({oHq>?oUpU>0&BDBG3Hf*NPe+i=<*M%g0NHA2;)(OW z_-Z0+OLO!4zH8c}icx|;Rm(VnGQ%!! ziD-8^M~2%(f)OI5jKFUtcAkH`T9HQ>kf8g&`VC#4N#vDK{omzO-YvW@ZuP-Zq@0fy zwjy(ur8%Q`l=+yEhuz!!H5zr1`JqN~h)N=|!cy>oW_FnG>fyY8Na) z4pStdvh2HR(vt3xNH=;@n8gwO*keRQo>z^(-l%m2Vd-olm6j&lzul(Bh(7S${pJ4k zJ(FYkk#6VZs03{i{LI;W;-)Niu#QM?Bn_$PDrn<{SLMkfq1=mx?!)-L^-URFzujR= zlEOos_otONYI{5=ik(@%N{NlY830^M}>S#@VScV z^^F$W%JZ9i!8&gK{@U?z;sm#qtfm-pGn`l2@<9~wx->#Wbs&cR?Ro6d?RZG&kwtqib6*^uKk=v0%vk@pxJ3WnvgYaAJu9%DJ$K>lW|MIy50kx2Wy zYN=5y{{Svm1m>fQ&XCAU6m8s8 z`g|8x*EX7HlQ$B~k*mK0=R12);;dTxxzEZg<>xkkKVu}_NlB5cM7GhDBBYTD zzs*yS<1A{lip8^o#b>F?Czp(c8P61}3KUp@*k}epA0M4Z60UysTBT@b0(V4xsh*U( zKu`x1$v#E-IL%2Mpbww!iVVu{h_;Y^T7WTkI6W%MGRTU!$Q>z>uEJT56>)ZEuVEun z2nU*PlwFQ^#XYd9+gp{OmtUBi)xuhkK!`F)JXK{3U5X#hrZXLdLj1z3;0(C$R+!Bg z)Ro8_(;t4_r-4-)n8EIz$7;>fa#s$J5rl%f#CC?X|;L#!OOf`Mr7cYUsn!DhlVT zU3jNTw8Zns5)WRrUeCt5WUnR7#msiL@s6d`WcDBMF4gi@t#hdxnPExJ_2of4bp313 zTf|dY+&!i1HPL~$l+WF7QC^)4vNGJ#F+Pp)U&U!Zv}A_TZILJd?;Yzp3$@nZj`w~t zHv#?s0DAdPUDn@Gxfjq%P&e?Y=Z{+SZw7eM*}S`XBvlcN6VsaXYG7d)`+{pz>F)_@ zlL(9xk-xY2R=xbQ8<QgjP46fe|S9r?nAW?5B%wuP#}d}56y~yoJdq3DXMdMzFv20KXTnF@2e-Xim&xc2MfPMy;BH)VTXT}(*i>({IStARvP;Cu!ATy} zmZ=`{sF@2{8os{99xoiqI_T5Fluu2;%y+_I!w%XxeKE66qde$oeMW0P!(-@Mp* zRULE3+IC8;f;5aAzD7OA*1kvahs1yFDdvkt5<-OM%n#Ih*U(^c`E#qHqLVwXh`u$; zs@Te}aS|2(0Cl?@de?->s_Ht-o3(PK(bL1m8XK(+n$BB8X7@r&1UpDP{{WoU9o_xK^oHFSrMVd@1~d58 zD}nY{Rsk6n;Dy5W`McKKK2$cv-0n~?ap~-}v|_g^?9Yw?C8v{O!_1HFmppw9O!|q6 z*E>_pZ@+`MZtsKKS3iGyZwtt6qvO{jpRIEVcQkI_YU9~DV!9(tu65MWlJ|V92MA9a zdy3Aw)EZK@e{?$mpYf*Lur89scq6Cy))meCanGD(6R-EHrV&p=8=G%7##q@fiO1HZ zd;21WPJGC{zlyLfbyuB4aUAFG40NiN`~10)x0O-1IPd9QGLD*xTW+TJ%ENT_Wr?ITo(s6=7g*0rRC_b7yofa8v}l;_M;6^!;55x1QR zeCxGw*b39J)9+`y-Es0lM&q}+^!#f6m<^5CYooCCRr}el=F?WtWe*TR9IiPH(*wAy z`MFW78j>n$I&wr@1s+-t-H+)^GL=`7?ZQVN2Y<_oqj9T!goI3-1GJCpUTJ^gp_YPj zCbxb_{!RE-BxpK@p4mr3(B9#0VoUfOOA=*J`U>Q=ZxY+ZZzwZ)c>K+I<>!m;ZKEr0 zc7JpZhwEGw)}?cN#z~y=E4q$bWp;B<5v8Jam%b#BUa(x0bi$x)g>PSK!Z%YDc5{{u z_$^|wJw>b9In4A5x4uF!~XVZ!q)BM0!Q-qH(%n#QnQ{x2u6r(kBrvcszrR6 z>N{?%C80%sI#{Mr3$uR106pfTInwAW4-fs@~(F&9fzmVxf`1|vUuSf zzLfS~iCOo6`C;V#Vlylh^hUEE+{3f8bNbcGZB!4txgWol$ahRgS zgCp*Odgim9#eI>AqDRZNRCF2sw6U1{*&~fMsNjEEg<2S+NTeS>T>8_dGes}iRY387Bg{9ZJ{c zX!rSGwMH_j^ zBzx7XLMyY@6^%@BlH_xq20yK2 zU9RVL5$y-56#1-)DMYa;^BPZ`{{V-zHRF{6q3zdgIpd5Jid4x1qSNAbjxtPTBUj}6 zdsOoxn-EJPqXkd7`QocXtIY($H4g6Gl}mprxYI@%=7f2f`F0W7s6vuyQ${4(RP^=R z?^NTVl-7qyrRrb2nXU@$^dER1di2i>_`$T>^tPD~mmue#m3I19jBSm#+*>I?=aL6f zK3cmq_mviA1sR40I+6Yr=hvX6?y*VgeK7tuO-Q6i3V`4q{{ZhFrF0gTnq~c{YiRtt zg8u;P@wCWCT>f?QE{Ux}Bxc@L5z25e{Lj|A81+E_j^5T;Bo2Cmjfd%8Rcs!*8lIVZ zaV5T>tXRwkBooHpX7sL-FNi}xI-Dgjcb~``FpX?5%y@yOXK9M}IxOKq!$_$c6^sh0)mDq89@wMRZ1KXQHb#T67 zlm4&$p560a)23+Fw$`BnA}AOb?!LcT@>^EDlGY=oOXTIZ@xjNT71~*9cZmK)#^+Pl z(M@FBiJ9G6`4P9-nf_Jd6tTdmH<&mExw{G7Z<*#@?d$DbDqIMZ@xiVcuXs&;lwG#6 zg^PzhPXzX+T$YTO)13abnlJZ;BZc>`7EVL_Y?;E(59UQALF!A4K7^r@7sc1^V@$rsMb7Y07(`cfsJE4}_wdI8>| zYl#iP4Cjt8-RnjP@^^ALqH_uIl@(qxyS_!~Pm&KY0w259pO8Zt4$^3gE0HP6o|K^^ zHSZLow<_DlFe+F|uwsU#X!a1X46F4ysKZ8?A9U4TLgYnhmumz(hN_KiwU-|->T$uV zdzd$wCn|aX7(wU0QnLs{FkX9oYT%iW5Ohg{n_*bDoUVY9?PTOFna2 zMLo-Z2^o#HZUZB|Kjty+lZB_e!UZF60G6m051rk*aZM{CqwupmCV7#>N^%Y}NA`Wo&SqwBpOC$Q>0LV8 z#}i>x59VrZfE)u?7`u|%FyORupg&dn#~A0^+Ll{wuD)9V?OQGs4n8*!OHg{xfs^2o6oqn{68P~YQA35U~2cK$eX(u^uohgb^ zxXB)LMlq)59RWD~d8ceHaC_8|^(BQr0eTz->S;%E2p8qfe+r2Fqndas!*cQsFrJwl zQcM;8(G=JKGV|;yfG*(doYUCJ=6&Cn)Keu4aBzN=ZQRlXQbrlF+`zj^l_{HIx$@L=p7k^+R7eja-kc-(vClne6-pK#fE1%5=CmRk zQF8pKsN;x&WXKA716G0sTy@>oj+DiSjOXr-l<)4DwPK|1s~-0TLcNDQY6*AnLg5?J zv8%pM1;2)nu6pn~RIf7Wl;OcRW0Q(V~n{$`Yq)^`^#~a_55GYUOc7s|?v8euHW2 zO7ai7KJ`8v5KeR2q62B)jOLZVg_W3wJZhQ>PYis`#QeU3k@nziQ~1-8 zXsZol_i}Nbpm(OMU^#Gj^ruLm;5Xw>X4raUW33U3xDnth=QtndicgrHIU<5f{xuwF zwNGL@`qS5{5Z6$sT0`=Vb5&4hl^6$}YHu+4jTEd3w@>y>D*%IMTz@JO8chGyycuu^ z=ZbPWXC9Rp8%G?0OhQZZ#eOvzA6FQ(UqxWMSApqCEHTPCQN=L`P}{OGOBP=}Mk?dD zpur>?_Hk(=PCLwj3Uwqt`WrA{PhI@54-nw%VCwPvKpbVPRngVv^v zKyEXW-jiwFkZMer@t(CnIaPr<=A}#)=aEcR#&h0<8%I4VTuSC1zyrYG)VavoIHa3j)29p6uIL$wy3f(GFRspGl+oeCt&q_hGw$&J^QA%)oR7w{H zh=A=%12W^FpoiQ^Ja(y(Nyu(E=7~nb`y&Bpz3HpZ%zM<~KpdVa3@3L7Dtc3ht)S?W zkWXrm?IQ+=#xb6h>-W`F{veU2+UX*QTzyqx}w!=olG_8q>Xxwn7xAh5HJu+TM1rA6VKbLyN zvy4c}7}@p5nEH?keh<;frn<+|W-Gw3T5P`CR_8)z7+ z5%aG}6cWleM87%yl_c!O)D!aL;Cj`jOJ@nXV1@)Ns(Ls6%UA4-k+#WB-&0F{ zrN~LSGi?K~s~R*>%@%X!W23cHTDcl?7a*2tVN%!!xb65&pc{)t$5OfyF6j($Md2Y2580D7tne5ZSRtH5nc8+V82o~v91!&^Md{6nwzYe}X_ zWf06i-K?Eb)&kMCPac&hY9~Q!E}o(=jth~~(yl{%*4m6RjHf@PbGDZ1n>g~>dK1NM z+1r`jo!_6-{{Z!=Y-NA4YqC61#q1nyAHXc^s)bMs_bdg-*)zIh>8Ezr#aDRb*>; zK1o~0c2@R*oXW`>fcru9C;i^F`Wa@Zwg+D9DN-HvwG%I1x^T;Z>&n}^({oTO!xigOZQWmkNpn@?`_;vXa5>$BK;uD_~I_%;eb6&J>QgsiPjf>L}QZs}IJX8QL;xl<^@^&w5afpc@#Bp53V%pzKd-jATAT zaB0DF!x}BzXc|$#r>kcmbfws`4WLpY82+1DbC0za2482tnOX zm}%IL3>RtqDk4fTL(NR+3FPxk3dMUPXeX?0A+Zn_7v;Q7WYO>poGHprtW40vB;ztRmi1$d3`aOQTJ8Bf)!4kDZhK1 z;8Gzf4h2Ax?_=mH;Q2=sSvyN&na1o?c-W+>?)Iq^e(77KXVh2f0R&?o!ds7OK<9SR z&MHX|u>lXERh(gncup>s$I&J-NeR|B8B zQU(s(kCvEFv#{+`8cYRZ2T`2WgxFLA-mC0x6R@dUcF;%O6>2v?OPqY7t8L>sJC@=u|s=Fhiovrek%0i9qC`FAJ^%T^@IAA_e zP?ApE&>4a9`U)dap^~_DVn;`(MupRp_i5=OEPpp_Qb0fp#W_^>fJjDEi8&prBcD5L zW9wF=d<6?t?d{@@Mv^`rPF(ub&Ue^p4=S6smExMaVv)9u)Y*~NOz-(>+-kmBp7n}j zmHL&&5r>w)GWDq%V*D`0BV}Dfe5@+Kw`q2&uG%C?Mc2q+2SZjqQrQO!S`Tj=k^KJv z!Crf=c$(JO$!83qC6DDlH_95WoLhPuQHyTK$??aC8YqROkIyOjN$vjt0=Ug7K@h%Hz`xUS6-F{s2_rKn+R*njC*!nCgvOTKk zh~ImY7(KgIDqjM{032s;`&HnYzr_7fp(T`I00b_1KkU~WJYV7|)ox@a6g-HEkU{?d zYrS>DDxXuPHEexVHN-8nvxQMte%oy86l)^00h}N9Yvh|B6KeBHRjyp)u3NYJHJLuM ztIc^L30y?1Hm>I7M?C)kz`Ila&h9Bxx%Lm8X6?95hxA&b=gA$yqDi?ES`fMSe~tRj$3nI|9PP#bvCUo8CIpX}Gn zx_`u-UfKS`a;8R;?!Wgds?z=h zHyExbO!3Zv2=cWnpDfJk5bZmOZkw_E>!z~Sw9BbJ%^PiF(f|Z~i8fHI`&X3Y?b(KnLYpG(?OqUyD9D&rf z+P{}OLku!^tgAGV);}gSV1w?KtHGsbSsjim9#f((v1$)4=Wu5u=ILIO@Q+DL-x)^C z3qxWzyKVVH{{RQ#Ys?*z*-ORpx%pI&@UN`?0{B_%beT1q_^~bH1_i&45WFAE*A8Kd zbgBC2c-j6wR4}q@ccMOwwu$A!s2hLu8qtQ{FyBAjsA6Qt$@gkDmR#&S1+SZ@CeOwu zAB$I_Y! z-gCuNm4bT`F%G+5nrw@miU&$tc1-MVyeh#trPf_0gAgfcNG1~syA`#Odeql4+L~H%z27D zKiSuI^UHLug{4S$%KT(}*sfw_Hz-`DFg{(r^$LH?Tw+rcW*Oloz{7J4| zOv#^^{O8biuJ>9+i%GbUoZ$^}KM&M-61Be{KIc7n^fl;HdsuK*)Zsj9rTvok?9-;- zFcPl6C}*L0=U zETl7h*&RC(Ulr@tu;~6Ix>jabZQo>nFF!E*r}61twid6nPq;}Qh2g8K{XbEPKeRGK zARDlG`d8atAJ(iNO}8l7+KRdV0PEN1BI=XHG;=2QF%E*hnfOuS(RKcfsN^hpKDqW$ z^{y<-4(-eBoE^Gt6s|KCW*F2e|j=LUA0J#LJdw;c1&8RiZzh!1SSM?Q~+LPG@X&j>a{{VKTwOH=uX_0V^-_%mD zL2F}7+$@dd!Z1hOHEnHLC^q#wx%H*CwvIUb*uG&OuUePRj^O1tf4XUVKXe)?tWl^1 z+pTFv>l+|O+!w7Q#?F|=+|`R1VnlehV-=q%o&Dl6cKKe0KRr;`M&tt!Mbh z;%$^B=fn3malv>4xsBVXLC#M=eY0O7>RvH7Xm4ec5R-u?U-O##EVC(5jpkHWL!RweeOB<@}E$j$xUYhz1UgN(#N4^H6v z*S`qzqfSd~Sc*G{0FDsvx2u2kt7_6oZROuD$rBE}^Yo{@F)S|SHtnj=+)F$}UOE*{ zGM{}tm{iG{MOf9hxVBRw3y(Rb9S%A#TngqdbxUbOTO(x$$_GvbP#0Qpo_M#Gc)1Qf zRpYkm%ZgDew6c7kH}`97J|C%^rO=i~jbhsuUcU8*bADl9S$fs!?;~IJYrWKN&rUs! zbGH{l?TMWiryZ-Z5bk8X(pmKqn;H{_+E*XKYXb6lw+Ebm7bdPU0=e0=pZs>J8(Gzn zq(dxjKZI_<`c~0OI}vthX;#cGcFpo+ai4nVCrLcjMU_y0v)!q-F&lBuI|nDyn)bHR zN-i!5Qy9P>?A30KO1CggE2=_rSNLceOWzeq30yWR{gOi(IoxEC$R|C%m8Av7UQkuT z$G7iy&+!VI6>>d0Opd^8k=dmOg&%Vsxvf-;qe&(_z?}VPvRJSZ{!c3aZ1p773yoSN zcY+V^bDouy2lh*=JUe{2LizF@+=LBU)>?(M5bT4JPSQ_ob>g_ky|Rj9_E6DinET)DQ*ifeTn?X6)gF7&z&04|On>NAhkvVFo%S)0E@RY#)hjM(_DCj- z9!KF>^WNM?B3!xohe7DQ$KzC?bz?glvTK*7+}Me-fME;vUjG1%akE^>xS-|PstdUt z+`ru?rB_fCgl56O`_|x4sy$;CHJM#rBxV zR4QWyn0-I3bTcx9LO0sLU?*c!TZMT>@rCTvii+01DwN&GIOjg}*l=c8B>6z^=}93M zt($ZC%?GJMLXLSkkzPIA_|cl1D}9 zT4@OR5k}3e_iG`pA96@}DmzvG0JTdKE$q<|v*q9tcKror(McT@y{t+5!Sa*FDQ%L< zBJtism2bVf`cllu5pJM7<2gp%#a5D4c8=+vcpt<5)k=Des~NZ2TsG>{!f!QmbFcc`EA^LQO-{;w=^LS670z+do@>*)+r?_z_)*! zwMz>RETp?wHz4{`UvR(;xegVJP?gGYv07*Hq##D5H&5?=G}z&tQ|4j3^&jI`Bv^Lk zo1a>yZEm4;m_GE!&W-%V4g``$ilK4S)};}~B@W}Ds6+^x(jY+OM)JOP z{^{oxHqa4s%Z*d*TS}*Vbo{GECtauj+#9d8GB31ULzomO`>cbY{{Z#W@LQ;KDZxt3 z!5YQ}y}qk^1YvQIqXQ@PHF^n+(kGYzZg-K_HI3)RljM;uI}X&?UBVr_Z|60fAZZr* znsa@s33ppKJ9?hNwbpp9N7>|K=XLh16uFrcDCdlk>S%)a0yBtNjtY9z@*;WBvoggS zZBdihnn_5({M9;kmK+aDadjnUeS)kNKz05!d8BTHl zs=5`KL7C)Y>b&DQ?zIa`HPZP7HX!I4t+NRwX`#ybXCBAj=~X3~MVriDmA>sui(uOk z)>w|%V+f>ud93zh6#i?dW{_a1`{TSR$Z*=X>`6~6<&jHIo#E_BofAdfF6xeC8-uj=WHPm z-QQ@W$KSz^3qxRH`18;Bj+rO`~TbauLB z!>qRvUfdZ8%d?;3$4b|WUuae{V!lfclxO&>&DG|U&5;fWGTiAe*0cE|TC*dnmZqVC>IvH7uI9$D&a*CZl8&1^e_ zxmh#Zbob2?1ckO1BbEMDs~)2>+iX|lde;`$c9)oFKflwDrDrM@9Ff~yNx#b|a52jMuqdx4#Kl=&?1c}O}Jqs$7^s&KJ~FID#2YO%6nHg1eW@pqR9~~ zBq+w5G+O6frDov{iQm zx66aKu6-%;HdqC2PC8S3qDktzhB)jgxY$v4B4BVC4_{h_KRb3Cra7x5Y)>smLBaZZ z(k@C8KJlR|iaLs;pPP_7Q*kS}+Bl~oWG;I5sRU&oh9FclToFwbmP3<+(29QW3uNTf zgd*~@=r?6 z7r9c6ffOqIy#VNaX&N;Lo&oLsY7EIB+Mt3DKT4WRY#0YLn=W!INY0+XR1v!jdE8|7 zsiTv4`IO`y^sRQULbqX7$V~1W)mM%- zkU1I0E1Gf8Ug-~*5UfnObIBv1seHakV4YOeD*wsBu$oW83KRS$g zq9Uuw9CK4D{Fr7r6&jBuG?~HxNzZInvS}eDZ3^%s?cdV}ntX|t&sC+4K;tX-TcM|@ z#~H|@dlXetV?2ZG1t;-khZQ>%;IDd*kaFCEnl70aBT}%VcisG|EvY1Xl;i8gN}#i4 zhSl#&Bw!Ai9+WvC_ln9k{e9^lU}3m&!>vm0LW8#hx6+_+7X`9O=mjSoZcx;W4bQaX z<3EK+IZP4PoYUi1K-lNl)GS*pznwUV5P5hwetwiG*^%4Qr3zSY-R(?`0mwX&O-jtG zkoinx10W8y6GJ3f*~;gf^{WpNQdl=9r=X^gKp8xN%|2}cL6~ z+*1myD0Y)hh!*62HDJQBEEpQa(XkNqtG$(u%q3n|c5%0tF74aY+H&A<32q($~esffM%NG<8-AQghLU^kSt==Tc`N$ugQI;{d5IWQ{ zt03Quik8kwmHE#{vGHt}jcx$s^&D5EY1dI*z_SCBUMZt2SD-={4e$On>sD6g-pwOZ z)6%Ik&8Y)@R4!XTg#>fcH4J#bC%0OdF>(h%SGmI|h(hFU7&R(B7?aYOB83^x0 zIOjP7^5(h?GU9ZFTmrb`k=%8yk$n@!=6{rqhZQ%AGji17Y;XKPkq@>&>PMi?e=Pq1 zI^CLmL11ICmjiJfbH;cAx02yT!3!z$t*C(V)uh2S5QE(cO!HkIQ`8pYa;Yl$Ip-Ct zajsuL!CYrPg#Q34?GoPI31ER#_5+OlD#*09k#fihH8Oe`$)01Vc%M~)8_S8M3IHmg zmdWq=R`!Q~CatBV#l$ZIF>jT|4gtX9->r2M+uM{?F%EeD0QJ>L94a0$v{rVJoS$Qt zyz=5=syXdd0nZECtlX*Hyi`k!98%>okra%~LCyfFqXmidsF5&6?m??XS~G#tlXnP4 z;jZM_Jmv_x`G6hv_o<|l#D zo|(pKJUR@Z+(kY;*yp7_QXRog*YApypy7u~i9p}!Q>OJNH4AZ}GyDWn#5ZSeYF*sq zj+ET<@{9_G#Vv^(yluh7JRSc4Fl^$NYJ9n*#=(_Z#$y~o#zjvG@tHWL$G9(wvgsM$KJW5c%+c31_W&)wDq}!_in0jgVwVIo=i&`p(@=ASJq*ZQAfW|WN1k) zVQjAT{c2q|Z2thcU*Y+yI_Bl2O^BNcjC`V}@Ys0Y5B{?}p4HO!)TqUp*YKGXWA85& zm2KunBe~%^8t(3`E!xz~$%4Fb>TAy>l0!F;@3C{q{**~*I~sRw1eQN&iA(I;^%<<~ z7Br6Ku7(Ial6tSWsO@zq;CXEj?^pi-BCWxuG>|;+Ccrv-iqTuBM(0O1u+MD&0A)`x zf7E_O*u?9EJ3fPpFiPkp=?} zcsZ?zUE+&spg-sDRys7UxIxJNUbU-kj}YA>bLmGZ3M~~@Yl){b`J2>yq&KZxXhTQ~ z$&g1Q-1=2>7ujTgCO!UP+(*B?ShIl*`bZ9BAHsSHm#{%H!-~__V1blKpX)&F-|JlEub3weSbzmuj)m%6yOujb>H^_^hPiJw8tA^? zkhjb$pt!epm8M==U;hAAV#9Blwmzb!M z%1HiX$0O3DigP5YAqUeUm769-tKUB1*s^ES(wyl!EJj7x+o+OL5NRJcXzY(R}83xkzT)m@5P#M9(~ zyJ#Mjq*qcceT?g!_Ey^?PoH;MVi$N;LZSV0PnQ!&AXhSRP&`uGKay3jVA~%vTP^r)QSsy)F~nG-6+|a$bfGn=J|lB)j=eBP)cJ9Q5?m{ z&f`@i`idjT3O0__7(I__XfDamtxB;Sp__qI9quN`cDYYXQ;IW?NvT(26aCXl@nCRs z-mc}vf|99%DXiO&?ylaxhIiI>+*)Dr^vjXwN)N~DxP^5 z2AD^2)4eaq``3L70ODBM=QgSKFUx||k34?I&F8wbByayH@5G{G+7uI4!$VwNd> zZKsN0a~Z(r6p6UDNTtd$cOh`Yp{Oz#VxHJ#F}G@r1P9u#5;K7g4t`z*NT3sgQW2Nr zaY~>D!8}#7L|7z7xj|KyLfo*$SX`d<3#Q|+@tT-0BO}biFM5%3+&5ZP0eI(%n}9Ko z#-+51jBZ4Bp&*J-na4aDbeneoMrpf_0)tT!n?zZ_+Vu5*EClPCYm@v`!SW3C`qrGL zWUQxmsHR8rWcpM7aynBPOYp6NdeesELXEh{JXD+VoK!(PwAiC2rBx~b$0nQYLzptAounvoZFkh;jpG29*@C${LPhYzi15-ANe= zgNzeQ+`>Yc;-y8w`Hn?CVF)&mGr-LwdJdE}H|ztNIt&xij$jxL%o1~&aV2_xdYG`u zBknvP=A;DYJprWM$FUoEnZm6sVC)^K0p3P)kqQtjQe2J23gGIFCPs++a$QX(18G^vbZH6jhm&)%pX zgMq=P0Ty=cZcf#vyBP+-^6jA_ZK}cYX_Kp~1jky=KtZ$16(n)xJm0*3yH6{Tv~~2T z7(9DgvxzEKC16)-h2o_|Y<=IDRb+F9FY{3gG;Nbt7>ti^H7N|CU3=7o#?OP!>X;yY zqopR1NUjjGFU^IiikOCTQJwOy?$?#46l|!Is{a5LWK@V*q?y=l`=5HO+1-IT-?(wb zBw1!ALHBFIej$8Iw(#V}&eP|-&dr{f``PRz8+v&GN@7+O9k9sy;69CC`Yjy!+?N4x4^b-|v65T;;Hl zV=D>_EqxXT0Ft{sY&IQ7Q75`tB_d3hPn+fY)lw9aQY9<2uiel0YDfcy+{yF(+O=;k zXE8te#r_{^_M)w#JsW6PhA$~vZGhx_wNg0AY~9Mwj+?)RrZY}mV~cOT@9xq{BZA&S z2bnQ$H-8N%y+n~*qFddwsKPE+9=WEZQMx<1*vHf6sHc^f#IpYY`yz&PXH-MStxZU_ zh7hP#`Hu1TX|Y4Jl@hUx{m|X2MTTT8)9-Zkq0lq{29sw=Bo zKGaXnnGuQ35qC=$U-p0d8lDSTF7xD%-VegLB~1&d>iQSND+pnYFIN)~8*uGjt!b&I zr2@}t$m!IK?jpWUTLwvfb-`ZSe~P+K3;4G8LcTG&7l|9W;<#$zSJ^5vvGlw|#u`=r z9>3nLHAiT`lwr#LwS(ckde2<5H;{Gvr*|CJLI&mD=L8Rw3i6zN<7FbJDz6js>s8v` zS&zb`32@Hbb5xeI7Ya2+_Z7!h~5J|o%c}DN~HEhXq_K0@{+b{5sU-qiKizZPLNeh)f z#r#`ohG$gRKMI!G6)WXU#VxRt&GOFEvbCp9!N_smC()+Ww22pBcW=5I`^#T7m}j%T zk{QMwKJxzncD~V?2^kxA%g5an^Iwj12{heJ?xJ0>IQ&2FrmtrKQ%*zcvK(5svu7pd zKF^)Euc4_CnsnVG0HgSSyHst%%BshuEUi4vI$)=j6pku_`k;>raPpk1`*cw3yJ)xWTIT5WI>&I5n!0sa!JD z5-C%b6)2u`WW^8JNIh!uhw{nJThgH;Dp~m*sdv0?hvnx2t;wc^r@|l%$IEUQb^1}6 z0mGgFs~FGBcr_VO4=i(^(yyN7DAI?Nlh9P~O43F)^0d`AV1$WUB7S0d6xE0kz54r526NboYdH~|ap_9t zmLDvpIQISQ);mI|Mn3a;)X~f40voSytpu|~RP<5Sloz~1Lv6q%wzhj#j7Y(K4NxR&QYxM&XO+GB#>?C{mq__FFI(eB`wJZXZYfzI3>)yez~wOD*JEK*z< z9KQXBk1u!2f&A;X58O#`+B249b_cilpkNhheNb)s{Sg2O1aUV+{BYRCeo+;_O8qxEy8+^_R#pROom%{i2M0c zyUFWaFNXCSts3$aP1ee;3~rrNiq*OByb`0w0X}RW_txL{YnYcx)HK-M=5&yler5Jv z+iTtSk*OU@TAyfmSH};iPj71`BrcyksmI;^_q}>_@HdXxE8( ze)$EtUqIjN*VR&MgI2eVAdnc!?#iBj-LC@^g>ZTq&K72Vsd(D7rph0@-!Wmzs@J1w zg55ObwFl+{jW2B0DtjS&`M^v{ovt$hYehunh5KXHGwzhpW&w4L*)}Qe5(C- zR%8zzq!VM1@b&)yfYzPF<{134x&HuqlZY24pUR6NYmUG1K(Hbe`@}cr+N^52jFz_K z^xlUDzUA*;Jq^vp{;)TVq_-@7ZM%N$IIT8!31zCWVQ-0q-JO2RVwCPfEc8M(=8*1%kY|~t}<~)Ir zKJV7PSop2+Ye<+jnl1!;hne!W4%GXcgUQW#N5xNycYY+e{?3I`J1D*Pd5lN!`&Z7g zguQHCWr82_EA29zpV=>IJ;cAdKJxYaL2)GWxR=ju8YC<%}jD=0LdZIa~0z}LTIU8xvtZ}BrInUnPLW!IUazottr@-%wu^sFETT7qxIcVJ-?bZ$^sO}Ez=cv+lb_3=u`Bm zRb%p61D(&@*3g}qE-Z;G#NWJQgBpx&^rpnXt7AKd1O3`nh=w7*)q(#2pwxEk?x4x? z9pA&+s-U9_mr}!YC_^6PpS{neR=BY8V+{WQeE$HRYgX9Y#Ki9HkjL7gxsu}MH4-R} zM)c^_lDSc*+~*;*l6D|`r2Ayn>`5h*sFMt!9DKEYD1=I>o!<9ZDs?EBzKfLG^=kcr?xv>;h4Pz&l6kuQ+l1cpiYVfzp z2}dq{s@h5R&BRHA{m?N>0~OuooDtjUSw>w3WHqJKY#1-^3CQP+eQ9Ba8^<$4{<1T* zl#YkmwTP1KGaXLeDUdab7nL)lU4zT!U?|C$@M)v2~BNY^KZ<Cj-gXC}t>9)rCJ+>6OcB_6)why)w+!y{zFhkn&jM(a88s<1gA%8b#-Ryc$ zw-kO8ckNrDc?@`d)mqx>TljZKJgDROe;S2keET&tH~PCB7Xk>&<@qFX?rErqfDGK_VlhvQ)tbvc+^yJH<|%C?c3{72WFAmZ_U`# zp}G>xyRxdie!ibd0|^Ph!36a0=}2}%En$?GVsLtaR)aZ1=eJIVs4R|TF{tEH6=x%N z7^s|)oU|e&1tumfk6yo(M~9PU(alab`Kp7R#~G`!BbLH|IsB-Cx)D($-!9f1FR!gE zHlk@a72q6nt!V9|R^I2YTDYVrX&%x)8UjSF9zOKxqX@XqN~$C* z6e{!3Q?OlZPUMS#K0~sHva$*t!J_{ zOPG!{cFq9&deV7t^N>SS~J?YJPvG@|u07bGaf9tpxMjy5 zjXw>wRWLE@=|BY-Z{TCSZym#wX5?Z*@<(q7?$++Cd%aL>tv)@7F)lpD9uUj&V}txrlp}00-qHocExR0RV2t2b!G3i}MmeJx8Tg z5$tW`oxKme4i{pJxXx6J^r71ljCLJ8Ds6-gPDg5t+aVbp4_aw#F^c4Tq~Lqf2+Ffa z2_&Arl>Y!ME)j~76cGL0-R%K9%k-_n1BZNJ?dI_ z3s_Bra>H+NkLySWJt@SJ*zHV+#+%k0kPkUIIr^G(;Kion3}@zGc8^Mf%8dNZ#A2S# zJfQi=Cz`Ku3rh~j@;mX?wB=(z|JTEw-d9lF7#^hdt2%nBHphIL!#b4nCek*s>q!`q z0DakSOxNPFs<%Gd>h0`$BqdaJt!R)kdshQva_k24%J;6zO_)0EcH*nr>7gH0luJe& z41=0jqdUHCYRP2>2sot#hRCW?MlLOAhWQ{63F5MKeJotZx;~(DTkD;hm~{PV!PP+^ zb)m&GN`22DxwZ;CmdUPUg}1s99;|EJWVE%p$aDs{?MK4a&3Ly8+jjP;+eklPR5r)igw+*^fS4k*+o z5Wrh@74Ui(>}PS5WZYxoaVN8Ai_8Jm=8o zv8vYIB-AV>j?(=be3{1?PCE1atJIc6d^4ZDRd1~AX7c>?40^8}Dq|kR^Bm-Q%eV^M zdXN7AU33uY)`lbzzFBxUJq=M^9>U;!%e9xG9Dn-jH~taH?QTWPQ{@2}9=-XeW=mH# zF7Jx~LE&pMYu`U`=(T$GF&tx#wa&0W*&KUQljw-IL1lDog+GlRSlPF|M5~E}$5hA`IG7B#7^xSj+&+|xyr`)c0A!5NpL0aJ5Awhpo25twNHo;RKD6e{e6KW{ zv6_!4_ie)+g(-iO4A2z0Ij4C*5C`W{(jAAQw-o#Vg>Ig-9IgQEN=8UiP8*KaBihQ{ zeosn&OnOoT+m-E4Q@Jn)HEzWHp~d!qJ!yG8Mkr9&=eJ5z`qZOI4hX}6)YFi8hn_J@ z4(_I$`N#{}vU-`T^c8@{De<8r<-h`%0RVBq4nfxw>|uGSqQ*9H8fRa7V2@i#8RwBc&0lx#z7; zQFFUI(vt>5hKz>AIA@kq)}FutxxYFW9SOjt7WM?JH92fI6y{N!(7^7>(}EB-`qlIo zD2O+lj@0!mK?G7LDsZEY^)l^VdK%|!7Q|?WZdhRZ(#F3xHDD&?$*5B*dQuxiiVHd8 zj8w>+svb>76t-|^kMCpnsvEFJu{a@4F`AGze(2(>`D=s8sYdl$BFc&$6Xx`(V^xi~ zJt`&3o#&vZpeorFGKPYZ)OPG2m#sQ4nO7&~r^Zo<9WhRUBU8O=G?`17+pr9clT7i0 z70@J^{{ZElcpXST&ZV)5*pDsAnpC`5lYU;y6@=V_ktdviTF0Eyg zQJUc8SJTqw(DynQ zjjLMPhlxIZi=XzY)`J>6j7x2G+mL^yE~HvGgh29tD$Ucp=%jHN`Insf*3*l73Nk%1 z2Pte&g(6PmfALl18pLwPd$kVr-N+T`GwO0KlKYp+eS>M}GhSZHB$qyEIX!CJZ=i?- z5IX#^>~h^lTJ5wL-L&yzJAB)^w?IF{*CZ1&Cf+eyh|Ul;epNL|12pw%}AZ~J~M;q>G@SyB8_`*I?+t7-!pZ^ zWh&cwhIs~L&mdIu$d@unZb^)e=b;^bT87Fv%-&KC7a1+ypEC<`mYY--=#j!1FyE>5 zr|R-t+`zW?N-zU$^~vl-T{=`yvP(GFyZ2!Jm19tfDONcF>Fa^%M=1Fa+gM;SG$iHyD(p653xMdm z0jM;~3#YwniNL}BRi&!j6m$`|0CgSdKEVJ6_CqhTdxA|12{%eR8m*tnx_7#&Y>cH)7 zCyV&D1a6Nm3hQu>Syhx$B0yxRK>K$vMY=%C&7G`$MD284>}> z^{7NenkLAES9ayy@m{Gg`We?m$@ly?0ig>*zH58+y5t zGqp~~_5Ss8;$mcPJ~f&%)BWYE`i;!`g~W2P9#{ks>S~>;Kb_<%(^sfguPmvrL#A)qJmTHa8<@vY^QWf8w-*{DbEC$jm=67eC7w->| zNmA+jHC&yM;!CB1IHBNibhl%;-V;d3Tn)MEPGE{)(LWfSp1RU zzZ!TMz+Q7t*jV$(sa0^Ji~;LPGXkE+8SH6Sa`TQVQUelm(xe;?D^$Q>2XPj!v3 z-Eq>8Zzmm%CN|^)Szq2V3v4V{=g?6E?kOt`RNMi_NnYNba#D2mXL z&KE3dIHXd%9%>1t!+9j&nnZSLX;~B{M5AI- zBnJo!RYx5AQ_%6V?^6u88&66|q{jpfK5o@u7}p=AQp1+Yuggs30#4bQCr4dLI>Sim63qyLzoScVz97e$81ze#z@s^+j3Y*!2Id{UK_7Y)wX~= zeqWN9(Sx}6t11JG5zRomSsRLgDg<>Km*(42?2(m9w$-2`uTPh6-lu`JSjo*`0IK^i zje+k~%5B;oky0b=k1jR}fkx(Cr>`|@;R44feqI#Sb|sr}2Csw>t{bIOnl}U-@M>6H zScC~wZWT8V#W3#sx#4I~M?A3i+gD9C?1dd&j4v2`O1JRVpF9!Ao4!#GWq!r0;f;G-)O8EHhH_*xJ3GEx zB$oan)v@DEdj9}fzxzzr8_DAz{8e)n_f4>kzq}&8mji_MYnh|j!%&LVl~F~^BaOKG z+5RfC6iXD_KyN9=YVE8_(6Te_-Q9YMf@rO5VMqfRRQ~`Mf0?V&hw`1!eGJmm30R}? z?@I3^6Q`7l@^?SP7NVZqd7#AX7=H(@+FvemJmw$#RXBV`jmE{MkgM!1%%3;oRSdar zCAr7mG=29w&cLIsP#%0xeW8X~Tka=2gI1A-pzK(9e93&MTer-nm=+61ShN1=tN6A7 zBn(5Jz4fSP5eatVb~(*gG8L>m+-_ep_?xvgBMQu2i+tSsQxRAx@|Kn#GtN5~Xz!ZJ zGmMF03k6AGTG{gPe{{VWmY_H>m8d(&D`?Zvlm`X;g)AFXfA%;Ya`u_k6f9N%vi{>5fXw7mi zMpXUd^8G5Dk(NhO+pR@r(q{}fAH!M`+*>SWAU=M-EllZ0m}uDWH;C@E-A+46ilh!g z@^<{y^%F}g2uV9~17&OC+r*Ck6iaimSo-7p)$AS)@tZ|rmim>!XSM)*{R-CxF9e^y zi-fd3f|;$YqVuLZ6aN5auQ>5n#Em;ivv@4zOPSy0*`2^Isl|C`iGCw$8iUDcW?e0l z{hz$u>&~rR86iY{{VKq9@Fgdl`uG8=U*kk5rR#v@`R$-#Jc5`!_TJNyo$dnI{oEd z`)kdqm#?yI8Ql9G25&I#bzpz*s^UH%X~shA4)oG3~E2+wCJw*f(n;(%gKgygK z0IRm8ZaCiKi3E;ntg(+U9;3ZjL;N_3q zPkON%24CGa&?>a;xOr$WDmYb;D1McsA3$idT2};algm1E>E0UXkPx{QW)a zCK;IAI~Vy66%`*ro1+0oJv!BS8)_4r3TN9Of*wA1^c4-%peQTRs;NXxSkknWh}n*U zu8Gdp-kVBSH*b3%o3s-5ny zdhGW0_*7NePhNehor=#c>vt{dnwqq+{yu0C^r5&aH)J~pb?)f-v%f)++t!*8? zmhCcS@7gtsdv`*G{&2)` z^0!LQnnb(4k=Yt2Prd&2Y)Yo$Z!v#*3w0yzuio2Ox3+~OCLg|j@BaX0MyQ*Wu3<$0 zDcvi4%zp0QYNu%wS1RczAv*s6y;>T2O)DzRmD=6vT|&wmJA)`~kvI2x=AGTmDfK+Z zP_ehO){4U4ynnhsg_r%Rz5SS%QN5+d41Qi{)}J@4GX+V$=x6k)-eq`Wk1FndS1R5A z0KHzFIkc=O?s;E`^eOB=b8IuSZd{-H>1$u%{{W02(yrS})ZE7T+Zwkj+lTm9qg~ng zdN;|3oUr@f!~X!qSA}@nO4OmaTZp6b?jifK4hSBfEqZj)sUAs{y0P|lmiE^cao$G1 zbC7!O-TYM_pE045EyGX{`*js7k5oX+MkpBSRCby@!Qv%1FGIHL(pL)xg8o;T@D*Y>o@mGkDTe?Rn zjILCX{7aAgb!$In*>vD+YdWQ+{DQ^__sbtpIw{@%0HIb~x3*A1u?%_N-`k8I{=Ioj zI^~>ez7ypSRrM9kYo0Hdag=E(m58tubioaJP6LI8%w^(Zzs`|9@kZ#X7q_UcSH<2en(3sA%qB)SGG~wn@PS@- z#yFt!#A^8J-}^OvmRpn3q?F#~60_LEYl$zf9`0E&58Xlhn{P_9IFQ0(PmmG!>KlpC z<4{m8-a-B^rBXKc+K5=Ke-_&JoibvJx?CVyeCK|~$@Z z?dw_aBHBXnk=tqyZ}zIP$>%n9>3wPwl@ z7Skk|^**(oZ~z!h+o*~6e(;vc{I%Bwpq#oAw9cwV8*x8&n9a+GqH%P2{dey0ya=yh3{{VSG;;Rdrl8EyR zx7|PcEep(+ku{v@X>RgJ*E0z z7<~0R+cm;Ae(ZgJ{ZuqKBD@jDBIj#1eSe0mkP(3&>Q{kLtI2K5e5?NedaeXpr1K#> z#&(csS{gzoH1-cJ^oOrenvLvbShh^KmOlRgcnavPEs-RZqa>5h{{X1gWcGPdUGfKG zS59M+jgE2%#F4p_o*SB$C|IUqj0n}UR^ft4Vq5|M`EYvB%`s51pOkg>tCaO3C3lip z7<{~Oik;j^DxmBA+J;#twnEVS^&yJ`Ue z^FMnQNc)HQYB}`Kq>jQ1aFHQI-f^5%cb;^1o=NzOj@YCSqw?ju`y6sr%rxA=aP zUs>LyS-bgyw+*|m`&G=}y{W2$GXRV7pZ1!lt&xU5C4O_(wdI~QzKRJ( zH>qvkN`h_M+DNjop6l20u9#Zp5^SjPf{G+u2B_miw-^n*yBYuvt|wk!*ZlESl4v%% zPIqj^KiQ?WffIHMnKz(#+^T@UgSC0Cj>1tihy#u1I32}iK`p$IM;bW7jt5$|Z7r>o z&QA(kdD=2_S*WGav8PE3+(lVS+K5-nP{3Z;0C_8@B#8eLZQDXwh5) zGPV;O1I9?Kr#|M581Mw%MEEM*J!;MxG6Hj+x$W*N8p*>TSq8_Cou{f|x2>m&S28&B z5DnNJe=2Pl(-s7WahS352Tw}345ihFmzVYTs+Lz4?;uqe2ftdoB7KVDNaOkQ$tU

{{W+gF%0{9dx~DBaea$23A~ed$K}S+>(8ZSiNd6D6bBvg&U;m) zxFjDimUVBFcWSLI(4JqJ4p+N+{VL-jSfMnxQe)@)nFM-{^--b+^m`_&|{+RUi&#$UEaLG`U89WF$pb2%kiD>D`4(aVF$LH_GbWx>k9DC%7dy zF3y!=Ij#-Fkz9btgE<{dE<&zp#?i)~yWn*pze>&2%RFOZbJy0b!R0F%S0H1jr8-9& ze{`QY9MXz+Cf@PO#~j5Oyi6n-<&*USq?*=Zq?ISU!*M? zT^-RVBR-8vYQv^L*7rJRnLK|wu;6E${{Z!=EpKE(WBca zagKdzlslR!Hb^5%eHVqU!dz= zcNLw`fJ@YlN@t<^)%#?bB>PM$<|;7U4SBeXB5Olvxg*rHsNlGjrG*_C4#He;<-IG_ zJStIIYgy(BulJGqW9wcyqiU+iP@G`%k6QN+1=`u_(Mt?+Bit@Bu6BnW-lSK9T9vM> zQrA;`1dvRNZiJ{fJ2=_@0M@SB+g2e3yu|PS0Arp%3e2(5}`F@`wc8iAvg9FzAytvJ0}Bg|-3 zcg}EqYETtN^{Cng{{Wt~q#tq_Nf!7rE1Y{l*^O}&720w;~v@)S1 zJPcx*>e49k`}C;-jrd@8(Xm637{C=Gat88{aCrCitn(vtxo|VZS@IK>$;YKb875MC z?HC#8Dd;=gSlyUrRomK~wV6t(;LVH{+hze;Kpa#sWj6AP_^NWv!voPM=epc{`h zJjlQ63E_P`svniqNrExcBa>EL;vrSY^7uXIX#Py&1ooiZC{SDl9;TY4FeLN3p`gFI zN0#6>3MsLmhw0DblS=!zOmya^Kmu-lI|^}?h$^>oft+fyU2Qa{3*=7Y!>$8TDB8;(x^epJ&6l?*x>&9E9ka7p=b)83k>06Wf2 zK1EPHhd-4uGQ?x1D@aA$ak!GH+5q4Rs_x5hkc2pOCvokMO0g_{XBjvilsl4BE1YqW z*i}kN=pw756NVZ7wB5V2p4Dj(JLH|%qCvHZJdaAJ9YGY>Ng9O-kWX4-4TJ;VwOQm0 zvFp;KokjzWzSSFOE3Js+a)g2jsN;CqbA!i1dsEg!w}IEzhEN9nIjc^@6@v}Lw{Fx6 zfr6;Jy$`KBD5vh{6xjeE6&p@?tx{%?k|1E@;ej7tT0EdLxDtKpS0+aQf=xBc5=X5Z zz*Y?^F5L0g6!02Pm~aPrcuZxw`p|I`-*MG?PL~w`%+?MXMwB3V1cx=xt;>x?yWl zEBWn|l=+2o7Pl;>2NR&S*5+TnxHY(Sm|=@8&3Vk4oMYvU zcYmJr({yIq2_rO>Mvfdt1}R+c6U4G-Xg1d1}H5fuR(4^P%%vdSKNgVUa z>aOIBV-*`f1D&F*K!YoR^HlR(u2x?*Ov62@B~@8=Nz`<%hTCdJH}gw%5=d2m=7}ba zBO4rEwWW)gnUs9pD~h+aHj@32lg3ERdgC)6-I0-8X04`qHy>#n_2<%}>vnoLZM7ey z>W^zEMn5mDbb5q~J-J|aX1G0}(fPI@0Ou?IBZ zl3?~CuUqUn&6W@TB7C9Sh7_?>ratzfY3o4ZR6ISLEE)@Q;n`- z?k$Do#7;uD2iCeswR|Y^#zOb5RUiq1oMNsW%nJ5BYU4IU(bC&$P{`TnD@sd{E_oDn zG|&g84JceT59wJ-I+ERx@P15m#VTZ;oKw8D923^2Sc37K)s7C}hny(-&^Py~w&NHa z3TmS zo(?&r3P(dvAfDYQ4sAskUzz##sXDM>kSU6!5j2X>-_pTHQPQ&hB*!7} z%&;c~^Pl&B&sykon{{_m8;Z*Kg%t0g%3*N45tHlMy0EQt8{t#uJ{8iVk*)msTjnP( z=nu7R+NzlZt;Q=l^7=HoYiP$R{i^6_p4p@s-aC8O)4}_^$GaG4CDQ$_U5WQaK^m>P zmvQ$!Kdn-Z;%I|R0pquN=$CEAp7I3QAsHF|FRf__+{=-zj(+=5d%In-H|~n#9*5Sl z(#@b$2zO_%wOEEJ8bcZlgQ*>={7~Qr2N|tn+_z&PA#`V%esSCi(T&75NcASQ{HKcG#C~Ism;1F) zLU$aR36C!^SjDnXWf|j-YIuvwm(AJ#0DRWaw%r;zJ!+-G~VAB8MhS}b81vHt)9+rh6xg7(A1*0CgO%M8BG{j>Pf zjBZ7`9E`d|_As;;r#L?$_O5Eo+ARJ`V*vB(^{%7DTG-Tsi)hSIzi#!#T3aez7Xxay z^Q-0T4R$>S2Z?PZlyI>QeXEfZJE!dlH51S<7xG*`#2_BxeK<~e#r;{1ooRCFrXz{JRm}!*z`u%F7*vMQR-?|<9pQTF@&*roX{-kzp;}ktc zmW6BWR}RrzjHkVFt1JbBmpGBR-AG4TH zHtd7ZhxMzF>4`qeoq>Z6Pk+L*Je}-koDl3dQNRbicD@vg&9N;r@}HpfsgC9+5q$$i zDny(reqyWu<%gNhDqj#ay4)CHlRq~H)|p~0W{g75iK85kZ(5fpb6DyI(HV?~@AdpD zji%+k`$Uoui;yEH1Ja?NP>|d*Krw^1pCc$i`@FcS7Nz_BMPkB5ls%71$Vg!de9ztn zIp^lZTbd>?iEaXrojr{~Vd-~IzOZjq7^2nU$+NYKy zgd^r7pT@GMkW2(+iUt1nT2t7LV)VDodtzOFQ2hs{D+s{j5=yU+@Ez6c5n8pV#dmAWJHyIcl*Ymf=Hc;1uE42_WuBLam9Fl&Sfo+mY%^#=b)>IoRHuXYZ2C=+0P_yG|1GJ;~);ys{%O&o*1azif~|3xFATSha#;ZQlK{!#|4{n4Cbw( zso}>pv)B{RW*cz8%}B^X?dwi-JcZy@a36ZB8cl%Z0YT3sRaDA16*{;dbW#LnWo7%d zoE$(@h?2zhrSbv!$5Gm+LRCl{R6}y(X}}acb`sQjp;Av=Qg3%2;*=6WEy1WrWcid; zbJ`($4-7VvSYc&>F$BhtV{{Rn4pw9C!3&0h2 zMJ{~F4;5c(1DxblxY+>aXZyVcH6J*@+SM{D%Gd{*R)foB6+Y+=w?D%pRD&#hwCTE- zpD@NY(*sVAwMJ5%NNOwVVfSq!S}==;#e6aGM^o_u@hj=~lDu4RM@`#aGw6RqUu;kN z$rf}ZvT^>;-xrm8UTTI0HMqYo+l9lY66IJ*KYXB~X&6DWLAjf$993Cl`#q_(e*wMIzzk!5p9VYTv?CY(s9|NO&a}`My)_RuMNLJvM#9dY`RV zj7V9;oG0+Je|D^Su@f2+H*>~*^-UGjhRPQ=PA&HZ54YuU_fOWjElyQ94{!EkaWIOl`ySr%AdJz(=~ljlEsp4FWv+b$uF>fy{W z6SrsGE$>sFwOYl%q(LMZvZ zZoh>^d*)lZLOyNT#U*r7U52YlGJyj6VxBDC)tM#X`uwJd40|^(JAPlrmA=?+5=kQ5 z=r-@_%#Hk2gOiah>OdN1RROoMw${)0YQTxCn23V;Z~p*&Q6$T4B9AMB@{?05ou>=D zjw$jo;JHZ>C?eY-CB1pBpTqtwywcRdet2XY=c=B}D~oHB1YTpIVfTOCrpW}1%P#Mb z_WuBD*0}0WZ{00Er`SIad|PhUHumv1mo?8HGhsJ3`(BmweXC4Y%#nKfecJrO@OOzW zblpHpFCyMetc~+!d;b8ytMq@udeyGAq{VrrNFN6*oh}xim0Nm9-Bw!vY2%b-w8F>EndAlBNgu(Wf+w!eIuJSPl{`#qY&n9uVidBj@ z%MjaIrsf>6D$XQE`@fAfM$BXH8lByk{QamA5WAA9`VBr(84t~cJkYIzx#pc3F73vi z&ZK|^K5YwX=z2`iot>$GzA)YC6(0(5xv4>93^AG|xiW&>YoP-Hw^T91x#9FpBC>8(qGWu-$VU%f*R-zMYIi-YCh`qQD8Y*{qdx@pLVBup9i z@}{}_#}K$25IZ+Y(ZAG^IMz76{%e(vIp>w~`Hb`P^UX_bkqg|@8lm&erLtvLsXmpY z^X-X39xIuLO&eIWg(S~W>FHJt?VK`shlf0W^{K%PXlt=RJkECtl-y?r?|SCB(JH%n ziulbXy~LBA4(0c)`Ff6TpzU*Ag4_#0%pJW3aJ5p-Rhc75Pv02~dyiVg)-GADViCo@ z5Z^JaZ7Sbkn6uk9s3(3gq?^cp!nS=|_{{R>FY4OB}r)S;oSjgHe zitg3|$iRem94#fBK_lMnwZFYpCXdKpI!52O?hgL|H6%CQPQf7nNluujvCu^A8Zkk< z)d%zE-??_W{o1`{GDyP*twDDphuWk60J5okp$Y0_YT|U#j`=z1{{RB7nXaDeOz}Of z%fz6`@{Q~Avh+VsYWhQ8(p9+)D_jPZ3$`b z9;FS`A7|PFZDG>0^|>wJWk@;RyRtoKybjt*-`lHhF^2>AtDQ@vxs4^8j_Xcv)Tb|a z*3%UmY>wOI{{TP3Q}~Q8*)NZftx2?|I zx!OHepCI|!%=p5_+DlZ`VUzA{&U$Sv(W@%JrQNY~AwqnMkGoqst+lQ8l63OqN?AYj zEY~$QmnvPNMD1$`8)HQKt&i_lWjL{@*z2@+dEKp}KQsd;Kf*uVs$MC!v$&7Rl^b~b z+gGmN=T>x^aV5(!T(&ve>F-*4w!>iU_vAvVpYSHFl;svU!RXJMuJlBW(n!NZ(H;8- z@mJ6v556NsYo~pN?5^ne0Jl}IGSuT1wRwRt7~ z0Eu>>bF**1<6e<#WER!Q+CmNAH_P(>0KHC*1`&E2LMY}Zgj&Kbrkwdme&?xb^1l^$ zs#7pa9mSvJ-TW#3)pWif*Wz@ZB{+mO)d}-4uMWJ`+1@~YUB18kReN|GDud=Sl=>LA zD(>0N*uk4MrH2SCJWCuw|;L=F2B8 zspWTOsU<9|h{FtiQ%Om62rh&X%QJmzGB3{hG~&^d$H~th`VM>4uuNryC~~iyk3uNq zCNUc%tDaK<8-}e*6nP^iB?{g1!9QBDX=MX~jQfh5fLHiw=^OcMRQX{3qLf(LwuN~W z8AOhAv*jcjf)a(^ez@p8y{c%V3h1x$DCYydD&Vz(YmM8sdU|GpUd1AZ&IkCPoR8~Q z-Zq5@C+9zvPYg*LKF7oK-?yi(1vchbqbV3YdU4MbjeVOlBc4})qmKPQtv1#Rr`)mQ zp1Y3~WndQ#=4TikJ${uqa5jk}DADwyO%rnLcIH@82pmS^*P{xuH1{jzoIWbCnch&c zV;zrrw{JS_k|km!4d41y^B3%yjP`~$WQgZ?YRB@D5b;fo=lE8;2DN5ywmg1G#?pOx ztV`bO8p7qhID357DzLYa}jq$fJYrSnJ{Q8FifU{*^J+>^@DOF6RFCr~5QAM-Be~*+AO+cP{Twy5IQqZ(Z9ho!JC@@AHw_zO^cdZzM%= zn%hS0(iEU>Uxt|ma2<0dGc+O)BT#fkh|sOjaU1-eJE)T zE3vh2aSKfxQodP!>GrPX*ugYP!}o-L7dYKsV{a2YL?4uf>0Ks~s80rl#ePZ?pk`e_v|Hvl7718>T71%PEOpg55j(zV**)8dRQc-n)7q zZ*N+vbvhL&_BjieNEs!JY$Wry`PAm?&QF!jPpGT%*tw2G#~lwnee0i&)_YlkN5nDvL(ts4Znz%eoT*R?}1*hF)tH+uA~VFFYMZ&DSL&qgjg zdwkuhjLc+`Ez#umJ;fJ-NJ^t}oO4hlpJ-n$L5zBJtr|0);~bWo<~a$&QRfJ}vlrf% zfLe)Tw<8b_z1QnbSi*?n&gC^OF2JQ>(SpU6MfumQHR4{Oww3vgX=E}VGs{0R`gf>G zOFVvA7~Y@o5I^3bT$Zjf-rvnh51YC7eb?*%0M@1$?ouNVP^*%}_p93i6_*%2_R`9N zWsmH{gU&(jDw1gDIltX25bRL)+uEohZ#{DPKj)g-olsnq5ubBeZlq7=Lb;6w)9cTA zXXJ4YjvwTC2Cdp5bVRtP-I{L7QgYibJ|yB%}9VVL$W-->tC zxE#BN^T(P<+y4NMQn{OHR8Y#_#r#WJ*G4FJd5ej0)9YOPo8u;I{KlzS6ZVR~YI}JA z%Q};T>Ibbw_URfng@+mWM{+&tITBX|m%n4*6+x0!bdmo6c2oPNw~Q0qnr-tMHkZ@G zCe+PW<~THDG9lMS2^o`=xZRpPo12IZxU z*HOK?ljdOW_C1ALMw-qKC31y0Z>>Juyl*2y-dv8=d8LwE5^__gx2dl_ap-LxQI<1D z4ZLt%sg6L|$m5>b_O80aU%%3)j^f$I(TwAvKZS9ZB)TLGhYEQ0tyGy=j?saRSE$W- z*os3;_HPe(?@%owUCbR_@LBqRdkXZMZyQ-g(dl4~@h2d1GwEM1#U0eP%wWhoS68CH z_HEQ{b{%(&D>CvoSCv-_8(1Q)&!*+nQtlK;QPyT3y9@kdx#P8LTX<6H`qO>Hom!H=)zeQEZgS-iG5e&gxsP^End=0%BPEA2W}*mpdrQ6Ev(-&0o37!v8ysg(ql z#wy87tr_z3&o5TcMpI|;8j2V|JD;5JDL9T^hn}@-aSU+F!t;u&1UCWO%)yM0UiGA= zFn&b`J!%yaB&0a`Dw07N5tz!U zc8(1ga+{6+1I}v=mZE z#^OS%GF7`&3Q9J`t2b%KXf72=7sS7~^skQd@R&noeU3K+m;H zxJUyI0H*Q5>x#ItUgRJRr<`{lv^pe!Za5U-8yCqPYBf2Kp&LLPdT~~y%|6JGi3^VG*{DU z9$iqF*Ga`FJLwmLrk4{MpWGNesKN!;(11ITaguj6q(5v7uV} z3>qRBbMp2S%qTmX*YKqTyOwN#2LKE~^S(+~%c%KtPGqvQxz6Fx9%+n$mj|UHt2CQP z=z4loj;tLNjvI`QaDDx#(GAy^GBTD zy924}D%HiDGZPuW2aYO@rmDLXNWD7K7g3B&&nupl_%<_BHoqJF?3jifa{7qM~Lc18RBdtd

HQ)rO7BEjui9nQ>LErPORLjn%TCJ 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

onJQK?d^r;4N8M@Rqx&?@C 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 >fN8wuB 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ɬmLhdY2jg-yJ$B=9@^DMrTuqwD!qL?PI2 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�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 >i_ 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�!BC6p@!X#{dYzncrB;;{X4TZ7yO(|`e!RLxm z21+9f^Njr}3?12TlvBen<=dr2mLz&pp1~48xMFknXxRMoL&yRy1q%CD1Z19Q_d`;6 zfde?}Ri)1FrAYFg2T&>&T%7LWwTMKL9!4LUbg{YPwIU6SaZehKC7Q@_kE6jpoQriuwF% z#eibJ+2n9@&#h_dFv^mHFWgq9wWicd#rZb>01ZrcHjP8(kBYhk_L4)WFZ!f%Huv0r zPvNc?NR=fb8UFx__A7l5IEoe1n#?w|g~zEBoddKJjEy7}c(w>9Ep zX#3Yb{{V+EaCEtEsl)ikNAj-@>`9LQ0PlNOAz^2;QiX(@h#=H-&*slJ5y(N#&fqB-2H`P8oF5fNUmghY;dkr%HtUOwLjS6nbi|^@BId{wC0Xz z(n%k3FWoiK>2?!MezzgPg)xNsf3;Xnas$(}mX<3R;gPo$9A~vddvGnBDLBvff7++{ zkAT?v)-I;2EPv?lvP1pu)t1IGSKQ9=2Z$|fEsQ7`+~=Q4@cmE4cee9Mb0ORP)MntC z(eVzi3?<{5QWu|_Z{5Xs*0-)afszBCo2gyZ>R_<^+KbrsI4_7=-1?M|t-@mKIY905 z0D9y7-qpxyvb~+mcUHgagD(yITWe=gu!?(uHP&P;-RnNy(Vp|mAwtI8dIhhjqU{uq zGQBO&QM(Xc*xTI3cFS{MD@~Bgd~tLy)tR&D2fo94TcK z33z?Bg^~VQkMQ$>Ug@N0_SV+kP>*;{ryTQ9j;OhHCk;v5*wbw7vX2q_y@#cD7J*2? z``^P{&7Pi~RC7Z69OJhY&_kPuQIAh7eUoK zn%IrNMId3SBy^(8S@T4QPtVr07C7elW*N`)st^Gp`ghGClCQr4KIp}&+ z%DYqsJT*qd<#zU`83^MUsF_jNlpUmEr6id$rl^lx;~%YAg^M!o6;1Rm#h6$EPkON! z54n$OtGN*E6*6JQNyaK_OF{Ay?+G3N=B0?2;Pk4+Nl-;hp|BKGTirE-&_W!)_f%6i zsBe^UQxmjc_Ulj>NpF<&s5QAioOlPJtH~H$xUA&)3g?xpXv981II4!=Sc*gDa(Jm7 zz-}raf!i44)}<@hQkgB>j!lDa7~fEc+i%{$HDH!T-Hp^Me3@>Pinyo*Q7<{gLm(~l z1Jb5tKX_Dl801tmX?vo+)Rxn`H0Bz{HlIm z@u6;{Oi^eJr0Q@shG|sqa4^Fi9koiTVakITtw7iL;b$s#uc%m-mJjRM$$rA)| zlqYU~-mbSwm11n7e4D<1{>HfbYs+}u6ejlWTeWwZOosX~D{bTOu4%>G(jM`)7AeN; zV{b~L*-g>o>+MrCB_d-Z?f(E~nI)?tV765EtYmBL5pFw`U7HrQ!=kF6ytT(mF^VLF zoG$L&TAlW|;~PWehxfmRq0wbSQ?-Xs*ouDWr_ZWK5^g_y*B5E4Mngtbo%;U(z-tdu z)uo8F!oJjRmtkH3{`P;pS<|BBE>u@PDmJy^pA z6N2$4@eksz-p9dDY^w#jx00VUZT`)4F?eEV8_zM}SCO~w?XNyqsB;|(l&of0YZ{K5 zaU2Cfg5!h!#^2(u;=@$8^50|fxoWO7>p85_<{0@-cJ29_{hAJi9lSql$uIYh*176d zi+<@&G9LHL9QmI<@%&v^Ki#ZlkfhG74ij@f`TfH_< zHc2-LKJxYZw0)9!^ef&)9k4gI4(ke?xT^YxiFE5tIEeC5$IM4R_s_jj)U{8y#?VQ` zS>3bUd*-+uQSRiKZ8Y@Vw{QEk(@#j8^R4`+2d`>(nzXGn$jCqCmVdckb^Volb#o#} za;J9A{{Tw%d)+c*oFwOTpLu=1y^76)Ns=kuWnU?dHe$UzHYb&6d2^=Z^*rj!MYvM1 zvXx9!dWI*>hflZJ;HzziO9j?_rboo9SIRg%Q(d0XtHwjFWan z)1;zh>AD;i6J`VQzbF0g>0Y0vLL`M*Q+$fuf4y9G#<+ky2jyeW@U|;z-tuiWMJq2+ zit{RNb<#}Q)UNK*SB>~a?e}q99E~*BTjX8gcmaR-s@$IGuhr&rh5M(z?X{3(EV6kc zZa(3tjD6#;+6W|F+lT@_pDlIzTy~~NB)1+|Pm#{=nEwD3aF&*$`IaXpA^ceX01EAN zTSKQr_VboxI4U~r{{U*UpJQ4#Jugp?3!&v)?(*9{SMeJ3aXgbmvP6Xl;kos%9q`50 zoF{nNHg{j*{{U*elSqndn_yzV9dh04%fv$3v(uu^qeU{!Y!m~vc<23};;jScNZvr< zzw{c-w~RtkF}uticJ!?TmRA{ter|_9EqPOt<~q|Pf!$YZ(e0D^e|niJ1eb8+H}`*p z)QXbhGJM2!sxn38w)8Bm+nzt*Rg|8(3`UPJGq3Q~KooA9ze<0c(YmZ(al3zZpqeJ~ zv61(`RjPE}#!gxlT4YyYaJ+j~9psV9H>AZ;I@Rg!;>dUR&2v*Ik)Li?HPKJ8&n?je zuN$xd^S6#V)+Cb{o5U z^8D-H{gztDn%)bBfo9yVZ7-c35AooReMSv!NVrcX51E_qe|D=ngt{TgEpGEofdi6I;f^`4i)|KH)Pj=6M1SM?e_HyxPg!m> zt73N@$QXC(D`>}4MY^ ztDFt1xAm+Q(IL3H^J0zGbY*Og%)J_f&KSk=pGZmLOE^P$;0*r&bmKKXlj6+>RFFa+ zWP_r&`RQLY-HW7mH!jjR>VLga*hzg08SUR{pOo+GM!{q2xGyxRBzKNj+oAbeG{$Wn zS28mp&3wH2_NN(0fx{lWR;;?!$B>INea?BIFjg(R&K*d#? z=C2&H@wLsk%u_QW{{RWDg#1e|$qKd$KYE+Hig!n4sCZ6Qm3*1iv-ws;z8tj2`&!RwA0lSXd(?xBEXcRXf<0-Oo6c;*RC5*RNf)!DxhujGGyL?%MQ24U0sv z$r#`KEw-`7g>5M=yOjR`vrQ+|XCdX3lczNsMrGZU9Da4!p9-U(GfmaLUUvRRA$)m-Fw$V9gC5YGEFvHQX|-lj5l8Orj{t?qKw6j-*j}T z33n=RO>QNs%yzfS?zH)>LgQ%roxN(E>=93?&&oCoD&)OG3e4m&#|_PD2pU35j1K

N=uA1h2{* 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�*(xZILBQ}X=S{{RZk7rCYROVXl% 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%0A{beVWLFa^A5E1 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�qEu*f*+o-3S}R*lJyDGGwvBmJS+*Ec&C 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

EvrFXFVyI_Gmg9(}EQHR39Dv7AJ>gF5 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

3jdfqGy=%EtD99KWRD07qF9qRK%9(nyK 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

6e08ZRFHs$O4c}2wl^6ifNoM70F_OSHO0nEm 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 STyVJU>szh09Tj(LAOG2cxRf&h literal 0 HcmV?d00001 diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java new file mode 100644 index 00000000..16e1b8f5 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -0,0 +1,120 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_send_message_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +/* Class to demonstrate the use of Gmail Send Message with attachment API */ +public class SendMessageWithAttachment{ + /** + * Send an email with attachment from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the sent message. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmailWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to send message: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_send_message_with_attachment] \ No newline at end of file From bd434c5687bd7a653804e6cc05075a74fffc10d6 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:41:08 -0800 Subject: [PATCH 038/254] Added file CreateShortcut for file's create shortcut use-case (#168) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file CreateShortcut for creating file's shortcut use-case. * Added file CreateShortcut for file's create shortcut use-case. * Added file CreateShortcut for file's create shortcut use-case. Added file CreateShortcut for file's create shortcut use-case.It includes Google ADC as well. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateShortcut.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateShortcut.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..9e02dc20 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * @throws IOException if service account credentials file not found. + */ + private static void createShortcut() throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] From 500408653e893814b4a7800f2ed8b5ac25acc611 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:41:27 -0800 Subject: [PATCH 039/254] Enable Forwarding gmail snippet (#175) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Enable Forwarding gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableForwarding.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 gmail/snippets/src/main/java/EnableForwarding.java diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java new file mode 100644 index 00000000..838a6cef --- /dev/null +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_enable_forwarding] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.AutoForwarding; +import com.google.api.services.gmail.model.ForwardingAddress; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Enable Forwarding API */ +public class EnableForwarding { + /** + * Enable the auto-forwarding for an account. + * + * @param forwardingEmail - Email address of the recipient whose email will be forwarded. + * @return forwarding id and metadata, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try{ + // Enable auto-forwarding and move forwarded messages to the trash + ForwardingAddress address = new ForwardingAddress() + .setForwardingEmail(forwardingEmail); + ForwardingAddress createAddressResult = service.users().settings().forwardingAddresses() + .create("me", address).execute(); + if (createAddressResult.getVerificationStatus().equals("accepted")) { + AutoForwarding autoForwarding = new AutoForwarding() + .setEnabled(true) + .setEmailAddress(address.getForwardingEmail()) + .setDisposition("trash"); + autoForwarding = service.users().settings().updateAutoForwarding("me", autoForwarding).execute(); + System.out.println(autoForwarding.toPrettyString()); + return autoForwarding; + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to enable forwarding : " + e.getDetails()); + throw e; + } + return null; + } +} +// [END gmail_enable_forwarding] \ No newline at end of file From 39c8e0c9d7842d4d32e2452e7d210513a8e42164 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 8 Feb 2022 09:05:59 -0700 Subject: [PATCH 040/254] Update CalendarQuickstart.java --- calendar/quickstart/src/main/java/CalendarQuickstart.java | 1 - 1 file changed, 1 deletion(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index 0ae61d8f..8cdde63f 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -44,7 +44,6 @@ public class CalendarQuickstart { /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** Directory to store authorization tokens for this application. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** From d68bb45733c7965791711ee07ae72063eb58a877 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:28:57 -0800 Subject: [PATCH 041/254] Drive create drive (#176) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files CreateDrive.java from Drive snippets. * Update CreateDrive.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../drive_v2/src/main/java/CreateDrive.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateDrive.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java new file mode 100644 index 00000000..4cdd999c --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * @param + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + From 7664e2b2bc22ccd880bc1c2b6b771cb24f8cce26 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:29:36 -0800 Subject: [PATCH 042/254] Added file RecoverDrive.java (#177) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file RecoverDrive.java for listing shared-drives without an organizer use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/build.gradle | 1 + .../drive_v2/src/main/java/RecoverDrive.java | 161 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/RecoverDrive.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 609d4c93..a9b22fb3 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -8,6 +8,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..50022eaa --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -0,0 +1,161 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_recover_drives] + +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.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +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.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + private com.google.api.services.drive.Drive service; + /** Application name. */ + private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(DriveScopes. DRIVE); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Constructor that initialize Drive API client service. + */ + public RecoverDrive(com.google.api.services.drive.Drive service) { + this.service = service; + } + + /** + * Creates an authorized Credential object. + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { + // Load client secrets. + InputStream in = RecoverDrive.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + RecoverDrive drive = new RecoverDrive(service); + // replace below email id value with actual user email. + drive.recoverDrives("test@gmail.com"); + } + + /** + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + From 4e3ba72f46d29f0eeef011374c18c98274d0708a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:30:01 -0800 Subject: [PATCH 043/254] Added files UploadToFolder.java and UploadWithConversion.java (#178) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadToFolder.java and UploadWithConversion.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/files/report.csv | 3 + .../src/main/java/UploadToFolder.java | 76 +++++++++++++++++++ .../src/main/java/UploadWithConversion.java | 75 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 drive/snippets/drive_v2/files/report.csv create mode 100644 drive/snippets/drive_v2/src/main/java/UploadToFolder.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadWithConversion.java diff --git a/drive/snippets/drive_v2/files/report.csv b/drive/snippets/drive_v2/files/report.csv new file mode 100644 index 00000000..801005b7 --- /dev/null +++ b/drive/snippets/drive_v2/files/report.csv @@ -0,0 +1,3 @@ +"Name", "Phone Number" +"Bob", "123-4567" +"Mary", "234-5678" \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..6348be81 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(realFolderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..52cab884 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] From 9acda748690f037b1ef5676428e4ed70f172ab2e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:30:46 -0800 Subject: [PATCH 044/254] Added files UploadRevision.java and ExportPdf.java (#182) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadRevision.java and ExportPdf.java from drive File snippets. * Update ExportPdf.java * Update UploadRevision.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../drive_v2/src/main/java/ExportPdf.java | 68 ++++++++++++++++++ .../src/main/java/UploadRevision.java | 72 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/ExportPdf.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadRevision.java diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java new file mode 100644 index 00000000..fbc5f047 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java new file mode 100644 index 00000000..4f4af5a5 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadRevision(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] From 0ed3e1bf0faef06e50406836471c5737ca8c2566 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:13:05 -0800 Subject: [PATCH 045/254] Added file DownloadFile.java from drive File snippets. #45 (#185) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file DownloadFile.java from drive File snippets. * Update DownloadFile.java Updated comments Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/DownloadFile.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/DownloadFile.java diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java new file mode 100644 index 00000000..8cf14a80 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -0,0 +1,69 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] From 99b1eb7b9879fc4e69661a18328425314e451b86 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:13:31 -0800 Subject: [PATCH 046/254] Drive search file (#186) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file SearchFile.java from drive File snippets. * Added file SearchFile.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/SearchFile.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/SearchFile.java diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java new file mode 100644 index 00000000..bc6a3989 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -0,0 +1,78 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + private static List searchFile() throws IOException{ + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + files.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] From 009e3d846fbdf6c90237be93d565239f0ab7b3ed Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:14:10 -0800 Subject: [PATCH 047/254] Added file ShareFile.java from drive File snippets (#187) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file ShareFile.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/ShareFile.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/ShareFile.java diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java new file mode 100644 index 00000000..a78e6baa --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -0,0 +1,115 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setValue(realUser); + try { + service.permissions().insert(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setValue(realDomain); + + service.permissions().insert(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] From a4c3d392fe306b5cda0d78709641353883b27f3c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:14:54 -0800 Subject: [PATCH 048/254] Unit Test Case for gmail_create_filter (#188) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_create_filter * Update CreateFilter.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateFilter.java | 38 ++++++++---- .../src/test/java/TestCreateFilter.java | 59 +++++++++++++++++++ 2 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestCreateFilter.java diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index 06840c76..fa044761 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,41 +27,55 @@ import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate the use of Gmail Create Filter API */ public class CreateFilter { /** * Create a new filter. * - * @throws IOException + * @param realLabelId - ID of the user label to add + * @return the created filter id + * @throws IOException - if service account credentials file not found. */ - public static void createNewFilter() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static String createNewFilter(String realLabelId) throws IOException { + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); - // Create the gmail API client + // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Gmail samples") .build(); - // Filter the mail from sender and archive them(skip the inbox) + // [START createFilter] + String labelId = "Label_14"; // ID of the user label to add + // [START_EXCLUDE silent] + labelId = realLabelId; + // [END_EXCLUDE] + try { + // Filter the mail from sender and archive them(skip the inbox) Filter filter = new Filter() .setCriteria(new FilterCriteria() - .setFrom("gduser1@workspacesamples.dev")) + .setFrom("gduser2@workspacesamples.dev")) .setAction(new FilterAction() + .setAddLabelIds(Arrays.asList(labelId)) .setRemoveLabelIds(Arrays.asList("INBOX"))); Filter result = service.users().settings().filters().create("me", filter).execute(); // Prints the new created filter ID System.out.println("Created filter " + result.getId()); + return result.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create filter: " + e.getDetails()); @@ -69,4 +83,4 @@ public static void createNewFilter() throws IOException { } } } -// [END gmail_create_filter] \ No newline at end of file +// [END gmail_create_filter] diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java new file mode 100644 index 00000000..8a6dc287 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.Label; +import com.google.api.services.gmail.model.ListLabelsResponse; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestCreateFilter extends BaseTest{ + + private Label testLabel = null; + + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } + } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } + + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; + } + } + + @Test + public void testCreateNewFilter() throws IOException { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } +} From 861b1328a6c6db040158a06680e282be9d06fc5e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:17 -0800 Subject: [PATCH 049/254] Unit Test Case for gmail_enable_forwarding (#189) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_enable_forwarding * Update EnableForwarding.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableForwarding.java | 15 ++++++--- .../src/test/java/TestEnableForwarding.java | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestEnableForwarding.java diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index 838a6cef..59d70497 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -37,10 +37,15 @@ public class EnableForwarding { * @throws IOException if service account credentials file not found. */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -74,4 +79,4 @@ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws return null; } } -// [END gmail_enable_forwarding] \ No newline at end of file +// [END gmail_enable_forwarding] diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java new file mode 100644 index 00000000..7c7cd5f6 --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.AutoForwarding; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestEnableForwarding extends BaseTest { + + @Test + public void TestEnableAutoForwarding() throws IOException { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } +} From d8a7c5308c201669e3e54388fcbbe3f6be9d904d Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:35 -0800 Subject: [PATCH 050/254] Unit Test Case for gmail_update_signature (#190) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_update_signature Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/UpdateSignature.java | 23 ++++++++++------ .../src/test/java/TestUpdateSignature.java | 27 +++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestUpdateSignature.java diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index b6ca985e..9bc29454 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -32,13 +32,19 @@ public class UpdateSignature { /** * Update the gmail signature. * - * @throws IOException + * @return the updated signature id + * @throws IOException - if service account credentials file not found. */ - public static void updateGmailSignature() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static String updateGmailSignature() throws IOException { + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -59,7 +65,7 @@ public static void updateGmailSignature() throws IOException { } } // Updating a new signature - SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); SendAs result = service.users().settings().sendAs().patch( "me", primaryAlias.getSendAsEmail(), @@ -67,6 +73,7 @@ public static void updateGmailSignature() throws IOException { .execute(); //Prints the updated signature System.out.println("Updated signature - " + result.getSignature()); + return result.getSignature(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to update signature: " + e.getDetails()); diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java new file mode 100644 index 00000000..ea5bff3e --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -0,0 +1,27 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +public class TestUpdateSignature extends BaseTest{ + + @Test + public void testUpdateGmailSignature() throws IOException{ + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } +} \ No newline at end of file From e10bf463e60616afaa9a0751f32244fa6fd469bb Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:58 -0800 Subject: [PATCH 051/254] Unit Test Case for gmail_enable_auto_reply (#191) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_enable_auto_reply Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableAutoReply.java | 30 ++++++++++++------- .../src/test/java/TestEnableAutoReply.java | 28 +++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestEnableAutoReply.java diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index ef6e052c..33ffd77b 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -34,13 +34,19 @@ public class EnableAutoReply { /** * Enables the auto reply * - * @throws IOException + * @return the reply message and response metadata. + * @throws IOException - if service account credentials file not found. */ - public static void autoReply() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static VacationSettings autoReply() throws IOException{ + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -57,12 +63,16 @@ public static void autoReply() throws IOException{ .setEnableAutoReply(true) .setResponseBodyHtml("I am on vacation and will reply when I am back in the office. Thanks!") .setRestrictToDomain(true) - .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) - .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); + .setStartTime(LocalDateTime.now() + .toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7) + .toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); - VacationSettings response = service.users().settings().updateVacation("me", vacationSettings).execute(); + VacationSettings response = service.users().settings() + .updateVacation("me", vacationSettings).execute(); // Prints the auto-reply response body System.out.println("Enabled auto reply with message : "+response.getResponseBodyHtml()); + return response; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to enable auto reply: " + e.getDetails()); diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java new file mode 100644 index 00000000..04778cfa --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.VacationSettings; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestEnableAutoReply extends EnableAutoReply { + + @Test + public void testAutoReply() throws IOException { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } +} \ No newline at end of file From ee125771385f3977424d9509fddb090af6a15da0 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:16:36 -0800 Subject: [PATCH 052/254] Unit Test Case for gmail_create_smime_info (#192) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_create_smime_info Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/files/cert.p12 | 1 + .../src/test/java/TestCreateSmimeInfo.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 gmail/snippets/files/cert.p12 create mode 100644 gmail/snippets/src/test/java/TestCreateSmimeInfo.java diff --git a/gmail/snippets/files/cert.p12 b/gmail/snippets/files/cert.p12 new file mode 100644 index 00000000..9ea906b2 --- /dev/null +++ b/gmail/snippets/files/cert.p12 @@ -0,0 +1 @@ +This file should not be empty, it represents the contents of an S/MIME certificate. diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java new file mode 100644 index 00000000..7d6b1fdb --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -0,0 +1,65 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.SmimeInfo; +import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class TestCreateSmimeInfo { + + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + null /* password */); + + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + "certpass"); + + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/notfound.p12", + null /* password */); + assertNull(smimeInfo); + } +} From ebf2147f87561820ef53be68c150c117f12a16b7 Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Wed, 2 Mar 2022 22:52:43 +0000 Subject: [PATCH 053/254] git-on-borg files of classroom-api-snippets (#193) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * git-on-borg files of classroom-api-snippets * Update Courses.java * Update BaseTest.java * Update CoursesTest.java Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- classroom/snippets/.gitignore | 8 + classroom/snippets/build.gradle | 22 ++ classroom/snippets/settings.gradle | 19 ++ classroom/snippets/src/main/java/Courses.java | 257 ++++++++++++++++++ .../snippets/src/test/java/BaseTest.java | 87 ++++++ .../snippets/src/test/java/CoursesTest.java | 126 +++++++++ 6 files changed, 519 insertions(+) create mode 100644 classroom/snippets/.gitignore create mode 100644 classroom/snippets/build.gradle create mode 100644 classroom/snippets/settings.gradle create mode 100644 classroom/snippets/src/main/java/Courses.java create mode 100644 classroom/snippets/src/test/java/BaseTest.java create mode 100644 classroom/snippets/src/test/java/CoursesTest.java diff --git a/classroom/snippets/.gitignore b/classroom/snippets/.gitignore new file mode 100644 index 00000000..0df08ceb --- /dev/null +++ b/classroom/snippets/.gitignore @@ -0,0 +1,8 @@ +.gradle +.settings +bin +build +gradle +src/main/java/com/google/api +.classpath +.project diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle new file mode 100644 index 00000000..da3d8a86 --- /dev/null +++ b/classroom/snippets/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'java' +apply plugin: 'application' +apply plugin: 'eclipse' + +mainClassName = 'ClassroomQuickstart' +sourceCompatibility = 1.7 +targetCompatibility = 1.7 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + testCompile 'junit:junit:4.11' + compile 'com.google.api-client:google-api-client:1.20.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' +} + +test { + testLogging.showStandardStreams = true +} diff --git a/classroom/snippets/settings.gradle b/classroom/snippets/settings.gradle new file mode 100644 index 00000000..c5f47228 --- /dev/null +++ b/classroom/snippets/settings.gradle @@ -0,0 +1,19 @@ +/* + * This settings file was auto generated by the Gradle buildInit task + * by 'ekoleda' at '6/25/15 1:48 PM' with Gradle 2.3 + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at http://gradle.org/docs/2.3/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'java' diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java new file mode 100644 index 00000000..df399390 --- /dev/null +++ b/classroom/snippets/src/main/java/Courses.java @@ -0,0 +1,257 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.ListCourseAliasesResponse; +import com.google.api.services.classroom.model.ListCoursesResponse; +import com.google.api.services.classroom.model.Student; +import com.google.api.services.classroom.model.Teacher; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class Courses { + public static Course createCourse(Classroom service) throws IOException { + // [START createCourse] + Course course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + // [END createCourse] + return course; + } + + public static Course getCourse(Classroom service, String _courseId) throws IOException { + // [START getCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } + } + // [END getCourse] + return course; + } + + public static List listCourses(Classroom service) throws IOException { + // [START listCourses] + String pageToken = null; + List courses = new ArrayList(); + + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); + } + } + // [END listCourses] + return courses; + } + + public static Course updateCourse(Classroom service, String _courseId) throws IOException { + // [START updateCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + // [END updateCourse] + return course; + } + + public static Course patchCourse(Classroom service, String _courseId) throws IOException { + // [START patchCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + // [END patchCourse] + return course; + } + + public static CourseAlias createCourseAlias(Classroom service, String _courseId, String _alias) + throws IOException { + // [START createCourseAlias] + String courseId = "123456"; + String alias = "p:bio10p2"; + // [START_EXCLUDE silent] + courseId = _courseId; + alias = _alias; + // [END_EXCLUDE] + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + try { + courseAlias = service.courses().aliases().create(courseId, courseAlias).execute(); + System.out.printf("Alias '%s' created.\n", courseAlias.getAlias()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("Alias '%s' is already in use.\n", alias); + } else { + throw e; + } + } + // [END createCourseAlias] + return courseAlias; + } + + public static List listCourseAliases(Classroom service, String _courseId) + throws IOException { + // [START listCourseAliases] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + String pageToken = null; + List courseAliases = new ArrayList(); + + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); + } + } + // [END listCourseAliases] + return courseAliases; + } + + public static Teacher addTeacher(Classroom service, String _courseId, String _teacherEmail) + throws IOException { + // [START addTeacher] + String courseId = "123456"; + String teacherEmail = "alice@example.edu"; + // [START_EXCLUDE silent] + courseId = _courseId; + teacherEmail = _teacherEmail; + // [END_EXCLUDE] + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + teacher = service.courses().teachers().create(courseId, teacher).execute(); + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else { + throw e; + } + } + // [END addTeacher] + return teacher; + } + + public static Student enrollAsStudent(Classroom service, String _courseId, + String _enrollmentCode) throws IOException { + // [START enrollAsStudent] + String courseId = "123456"; + String enrollmentCode = "abcdef"; + // [START_EXCLUDE silent] + courseId = _courseId; + enrollmentCode = _enrollmentCode; + // [END_EXCLUDE] + Student student = new Student().setUserId("me"); + try { + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else { + throw e; + } + } + // [END enrollAsStudent] + return student; + } + + public static void batchAddStudents(Classroom service, String _courseId, + List _studentEmails) throws IOException{ + // [START batchAddStudents] + String courseId = "123456"; + List studentEmails = Arrays.asList("alice@example.edu", "bob@example.edu"); + // [START_EXCLUDE silent] + courseId = _courseId; + studentEmails = _studentEmails; + // [END_EXCLUDE] + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } + + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) + throws IOException { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); + } + batch.execute(); + // [END batchAddStudents] + } +} diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..41064b8e --- /dev/null +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -0,0 +1,87 @@ +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.http.HttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.classroom.Classroom; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +/** + * Base class for integration tests. + */ +public abstract class BaseTest { + /** Application name. */ + private static final String APPLICATION_NAME = "Google Classroom API Java Snippet Tests"; + + /** Directory to store user credentials. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File( + BaseTest.class.getResource("/credentials").toString()); + + /** Global instance of the {@link FileDataStoreFactory}. */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + + /** Global instance of the HTTP transport. */ + private static HttpTransport HTTP_TRANSPORT; + + /** Global instance of the scopes required by this quickstart. */ + private static final List SCOPES = + Arrays.asList("https://www.googleapis.com/auth/classroom.courses", + "https://www.googleapis.com/auth/classroom.rosters"); + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.out.print(true); + System.exit(1); + } + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + private Credential authorize() throws IOException { + // Load client secrets. + InputStream in = BaseTest.class.getResourceAsStream("/client_secret.json"); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, + JSON_FACTORY, clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline").build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + return credential; + } + + /** + * Build and return an authorized Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException + */ + protected Classroom getService() throws IOException { + Credential credential = authorize(); + return new com.google.api.services.classroom.Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, + credential).setApplicationName(APPLICATION_NAME).build(); + } +} diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java new file mode 100644 index 00000000..dc7342bd --- /dev/null +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -0,0 +1,126 @@ +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.Student; +import com.google.api.services.classroom.model.Teacher; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * Tests for the courses snippets. + */ +public class CoursesTest extends BaseTest { + private Classroom service; + private Course testCourse; + private String otherUser = "erics@homeroomacademy.com"; + + public CoursesTest() throws IOException { + this.service = this.getService(); + } + + @Before + public void setUp() throws IOException { + this.testCourse = createTestCourse("me"); + } + + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } + + @Test + public void testCreateCourse() throws IOException { + Course course = Courses.createCourse(this.service); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } + + @Test + public void testGetCourse() throws IOException { + Course course = Courses.getCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testListCourses() throws IOException { + List courses = Courses.listCourses(this.service); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } + + @Test + public void testUpdateCourse() throws IOException { + Course course = Courses.updateCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testPatchCourse() throws IOException { + Course course = Courses.patchCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testCreateCourseAlias() throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + CourseAlias courseAlias = + Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); + } + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = + Courses.listCourseAliases(this.service, this.testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), + teacher.getCourseId()); + } + + @Test + public void testEnrollAsStudent() throws IOException { + Course course = this.createTestCourse(this.otherUser); + Student student = + Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); + this.deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = + Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); + Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); + } + + private Course createTestCourse(String ownerId) throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + Course course = new Course().setId(alias).setName("Test Course").setSection("Section") + .setOwnerId(ownerId); + return this.service.courses().create(course).execute(); + } + + private void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } +} From 1ea9e3cd44491e2207dc4d43b44af11dacfb0997 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:07 -0800 Subject: [PATCH 054/254] Classroom snippets (#194) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * classroom-api-snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateCourse.java | 81 ++++++++++++++++ .../snippets/src/main/java/GetCourse.java | 71 ++++++++++++++ .../src/main/java/ListCourseAliases.java | 93 +++++++++++++++++++ .../snippets/src/main/java/ListCourses.java | 84 +++++++++++++++++ .../snippets/src/main/java/PatchCourse.java | 75 +++++++++++++++ .../snippets/src/main/java/UpdateCourse.java | 76 +++++++++++++++ 6 files changed, 480 insertions(+) create mode 100644 classroom/snippets/src/main/java/CreateCourse.java create mode 100644 classroom/snippets/src/main/java/GetCourse.java create mode 100644 classroom/snippets/src/main/java/ListCourseAliases.java create mode 100644 classroom/snippets/src/main/java/ListCourses.java create mode 100644 classroom/snippets/src/main/java/PatchCourse.java create mode 100644 classroom/snippets/src/main/java/UpdateCourse.java diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java new file mode 100644 index 00000000..d1bca2d4 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_create_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Create Course API */ +public class CreateCourse { + /** + * Creates a course + * + * @return newly created course + * @throws IOException - if credentials file not found. + */ + public static Course createCourse() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Adding a new course with description + course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + // Prints the new created course Id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.err.println("Unable to create course, ownerId not specified.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_create_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java new file mode 100644 index 00000000..ff20a729 --- /dev/null +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_get_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Get Course API */ +public class GetCourse { + /** + * Retrieve a single course's metadata. + * + * @param courseId - Id of the course to return. + * @return a course + * @throws IOException - if credentials file not found. + */ + public static Course getCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_get_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java new file mode 100644 index 00000000..71101eb1 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -0,0 +1,93 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_list_aliases] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.ListCourseAliasesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Alias API */ +public class ListCourseAliases { + /** + * Retrieve the aliases for a course. + * + * @param courseId - id of the course. + * @return list of course aliases + * @throws IOException - if credentials file not found. + */ + public static List listCourseAliases(String courseId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + String pageToken = null; + List courseAliases = new ArrayList<>(); + + try { + // List of aliases of specified course + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); + } + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return courseAliases; + } +} +// [END classroom_list_aliases] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java new file mode 100644 index 00000000..65a2be80 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -0,0 +1,84 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_list_courses] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.ListCoursesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Course API */ +public class ListCourses { + /** + * Retrieves all courses with metadata + * + * @return list of courses with its metadata + * @throws IOException - if credentials file not found. + */ + public static List listCourses() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + String pageToken = null; + List courses = new ArrayList<>(); + + try { + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); + } + } + } catch (NullPointerException ne) { + // TODO(developer) - handle error appropriately + System.err.println("No courses found.\n"); + } + return courses; + } +} +// [END classroom_list_courses] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java new file mode 100644 index 00000000..fd0f8e5b --- /dev/null +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_patch_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Patch Course API */ +public class PatchCourse { + /** + * Updates one or more fields in a course. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course patchCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + Course course = null; + try { + course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_patch_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java new file mode 100644 index 00000000..bdd577cf --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_update_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Update Course API */ +public class UpdateCourse { + /** + * Updates a course's metadata. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course updateCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Updating the section and room in a course + course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + // Prints the updated course + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_update_course] \ No newline at end of file From 4185fa9f4f00c0f62ef5c070047728e9eab0751e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:30 -0800 Subject: [PATCH 055/254] Moved test files from dev-rel. (#195) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Moved test files from dev-rel. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/test/java/AppDataSnippetsTest.java | 42 ++++++ .../drive_v2/src/test/java/BaseTest.java | 118 +++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 32 +++++ .../src/test/java/DriveSnippetsTest.java | 51 ++++++++ .../src/test/java/FileSnippetsTest.java | 120 ++++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 51 ++++++++ .../src/test/java/AppDataSnippetsTest.java | 42 ++++++ .../drive_v3/src/test/java/BaseTest.java | 118 +++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 32 +++++ .../src/test/java/DriveSnippetsTest.java | 51 ++++++++ .../src/test/java/FileSnippetsTest.java | 120 ++++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 51 ++++++++ 12 files changed, 828 insertions(+) create mode 100644 drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/BaseTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/BaseTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java new file mode 100644 index 00000000..747103f5 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -0,0 +1,42 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class AppDataSnippetsTest extends BaseTest { + + private AppDataSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new AppDataSnippets(this.service); + } + + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.fetchAppDataFolder(); + assertNotNull(id); + } + + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = this.snippets.listAppData(); + assertNotEquals(0, files.getItems().size()); + } + +} diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java new file mode 100644 index 00000000..0bfcdc19 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -0,0 +1,118 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.apache.ApacheHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + return GoogleCredential.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + } + + public Drive buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Drive.Builder( + //new ApacheHttpTransport(), + //GoogleNetHttpTransport.newTrustedTransport(), + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + //GsonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java new file mode 100644 index 00000000..3a33e4e8 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -0,0 +1,32 @@ +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class ChangeSnippetsTest extends BaseTest { + + private ChangeSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new ChangeSnippets(this.service); + } + + @Test + public void fetchStartPageToken() throws IOException { + String token = this.snippets.fetchStartPageToken(); + assertNotNull(token); + } + + @Test + public void fetchChanges() throws IOException { + String startPageToken = this.snippets.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = this.snippets.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java new file mode 100644 index 00000000..cbe27af2 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class DriveSnippetsTest extends BaseTest { + + private DriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new DriveSnippets(this.service); + } + + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } + + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = this.snippets.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = this.snippets.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java new file mode 100644 index 00000000..dab8987b --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -0,0 +1,120 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.*; + +public class FileSnippetsTest extends BaseTest { + + private FileSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new FileSnippets(this.service); + } + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = this.snippets.uploadRevision(id); + assertEquals(id, id2); + } + + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + File file = this.snippets.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } + + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = this.snippets.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } + + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = this.snippets.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } + + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = this.snippets.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = this.snippets.touchFile(id, now); + assertEquals(now, modifiedTime); + } + + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = this.snippets.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } + + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = this.snippets.searchFiles(); + assertNotEquals(0, files.size()); + } + + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = this.snippets.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java new file mode 100644 index 00000000..59bdf809 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TeamDriveSnippetsTest extends BaseTest { + + private TeamDriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new TeamDriveSnippets(this.service); + } + + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } + + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = this.snippets.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = this.snippets.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java new file mode 100644 index 00000000..39d5111b --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -0,0 +1,42 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class AppDataSnippetsTest extends BaseTest { + + private AppDataSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new AppDataSnippets(this.service); + } + + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.fetchAppDataFolder(); + assertNotNull(id); + } + + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = this.snippets.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } + +} diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java new file mode 100644 index 00000000..1177eee1 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -0,0 +1,118 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.apache.ApacheHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + return GoogleCredential.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + } + + public Drive buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Drive.Builder( + //new ApacheHttpTransport(), + //GoogleNetHttpTransport.newTrustedTransport(), + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + //GsonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java new file mode 100644 index 00000000..3a33e4e8 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -0,0 +1,32 @@ +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class ChangeSnippetsTest extends BaseTest { + + private ChangeSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new ChangeSnippets(this.service); + } + + @Test + public void fetchStartPageToken() throws IOException { + String token = this.snippets.fetchStartPageToken(); + assertNotNull(token); + } + + @Test + public void fetchChanges() throws IOException { + String startPageToken = this.snippets.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = this.snippets.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java new file mode 100644 index 00000000..f520db8b --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class DriveSnippetsTest extends BaseTest { + + private DriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new DriveSnippets(this.service); + } + + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } + + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = this.snippets.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = this.snippets.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java new file mode 100644 index 00000000..94eafc4c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -0,0 +1,120 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.*; + +public class FileSnippetsTest extends BaseTest { + + private FileSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new FileSnippets(this.service); + } + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = this.snippets.uploadRevision(id); + assertEquals(id, id2); + } + + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + File file = this.snippets.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } + + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = this.snippets.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } + + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = this.snippets.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } + + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = this.snippets.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = this.snippets.touchFile(id, now); + assertEquals(now, modifiedTime); + } + + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = this.snippets.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } + + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = this.snippets.searchFiles(); + assertNotEquals(0, files.size()); + } + + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = this.snippets.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java new file mode 100644 index 00000000..3e46bd38 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TeamDriveSnippetsTest extends BaseTest { + + private TeamDriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new TeamDriveSnippets(this.service); + } + + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } + + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = this.snippets.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = this.snippets.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} From f36f71ab08c6318fc9798b2fb5897efb21abe268 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:52 -0800 Subject: [PATCH 056/254] classroom api snippets (#196) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * classroom-api-snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/AddStudent.java | 80 +++++++++++++++++++ .../snippets/src/main/java/AddTeacher.java | 78 ++++++++++++++++++ .../src/main/java/BatchAddStudents.java | 77 ++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 classroom/snippets/src/main/java/AddStudent.java create mode 100644 classroom/snippets/src/main/java/AddTeacher.java create mode 100644 classroom/snippets/src/main/java/BatchAddStudents.java diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java new file mode 100644 index 00000000..b3237c9a --- /dev/null +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_add_student] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Add Student API */ +public class AddStudent { + /** + * Add a student in a specified course. + * + * @param courseId - Id of the course. + * @param enrollmentCode - Code of the course to enroll. + * @return newly added student + * @throws IOException - if credentials file not found. + */ + public static Student addStudent(String courseId, String enrollmentCode) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Student student = new Student().setUserId("me"); + try { + // Enrolling a student to a specified course + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + // Prints the course id with the Student name + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return student; + } +} +// [END classroom_add_student] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java new file mode 100644 index 00000000..bede3367 --- /dev/null +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_add_teacher] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Teacher; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Add Teacher API */ +public class AddTeacher { + /** + * Add teacher to a specific course. + * + * @param courseId - Id of the course. + * @param teacherEmail - Email address of the teacher. + * @return newly created teacher + * @throws IOException - if credentials file not found. + */ + public static Teacher addTeacher(String courseId, String teacherEmail) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + // Add a teacher to a specified course + teacher = service.courses().teachers().create(courseId, teacher).execute(); + // Prints the course id with the teacher name + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return teacher; + } +} +// [END classroom_add_teacher] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java new file mode 100644 index 00000000..676cddc3 --- /dev/null +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_batch_add_students] +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Batch Add Students API */ +public class BatchAddStudents { + /** + * Add multiple students in a specified course. + * + * @param courseId - Id of the course to add students. + * @param studentEmails - Email address of the students. + * @throws IOException - if credentials file not found. + */ + public static void batchAddStudents(String courseId, List studentEmails) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } + + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); + } + batch.execute(); + } +} +// [END classroom_batch_add_students] \ No newline at end of file From d557d5d7c87c2d93505be4d4e47d72c895cb0535 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:54:21 -0800 Subject: [PATCH 057/254] Changed auth to use ADC. (#197) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Changed auth to use ADC. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/RecoverDrive.java | 105 +++++------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index 50022eaa..cf56f346 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -13,101 +13,47 @@ // limitations under the License. // [START drive_recover_drives] -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.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; -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.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - private com.google.api.services.drive.Drive service; - /** Application name. */ - private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DriveScopes. DRIVE); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - /** - * Constructor that initialize Drive API client service. - */ - public RecoverDrive(com.google.api.services.drive.Drive service) { - this.service = service; - } - - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = RecoverDrive.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; - } - - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - - RecoverDrive drive = new RecoverDrive(service); - // replace below email id value with actual user email. - drive.recoverDrives("test@gmail.com"); - } /** + * Find all shared drives without an organizer and add one. * @param realUser User's email id. * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - public List recoverDrives(String realUser) + private static List recoverDrives(String realUser) throws IOException { - com.google.api.services.drive.Drive driveService = this.service; + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); List drives = new ArrayList(); // Find all shared drives without an organizer and add one. @@ -122,12 +68,12 @@ public List recoverDrives(String realUser) .setType("user") .setRole("organizer") .setValue("user@example.com"); - // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] + do { - DriveList result = driveService.drives().list() + DriveList result = service.drives().list() .setQ("organizerCount = 0") .setUseDomainAdminAccess(true) .setFields("nextPageToken, items(id, name)") @@ -138,7 +84,7 @@ public List recoverDrives(String realUser) drive.getName(), drive.getId()); // Note: For improved efficiency, consider batching // permission insert requests - Permission permissionResult = driveService.permissions() + Permission permissionResult = service.permissions() .insert(drive.getId(), newOrganizerPermission) .setUseDomainAdminAccess(true) .setSupportsAllDrives(true) @@ -148,9 +94,8 @@ public List recoverDrives(String realUser) permissionResult.getId()); } - // [START_EXCLUDE silent] drives.addAll(result.getItems()); - // [END_EXCLUDE] + pageToken = result.getNextPageToken(); } while (pageToken != null); From bfd382b289b0d8a24bb312f995356cac44da011b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:54:41 -0800 Subject: [PATCH 058/254] Drive: team drive snippets (#198) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive: team drive snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateTeamDrive.java | 68 +++++++++++ .../src/main/java/RecoverTeamDrive.java | 109 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java create mode 100644 drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java new file mode 100644 index 00000000..2a1e324e --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_create_team_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.TeamDrive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create team drive. */ +public class CreateTeamDrive { + + /** + * Create a drive for team. + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createTeamDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + return teamDrive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_team_drive] + diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java new file mode 100644 index 00000000..0d8dd337 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -0,0 +1,109 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_recover_team_drives] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's recover all team drives without an organizer. */ +public class RecoverTeamDrive { + + /** + * Finds all Team Drives without an organizer and add one. + * @param realUser User ID for the new organizer. + * @return All team drives without an organizer. + * @throws IOException if service account credentials file not found. + */ + private static List recoverTeamDrives(String realUser) throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List teamDrives = new ArrayList(); + + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + + newOrganizerPermission.setValue(realUser); + try { + do { + TeamDriveList result = service.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + } + + teamDrives.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return teamDrives; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to recover team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_recover_team_drives] + From 6311ed7ab42ae86e6c8d5c58209b10937808687c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:03 -0800 Subject: [PATCH 059/254] Drive v3: AppData snippets (#199) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive v3: AppData snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v3/build.gradle | 4 +- .../src/main/java/FetchAppDataFolder.java | 68 ++++++++++++++++ .../drive_v3/src/main/java/ListAppData.java | 76 ++++++++++++++++++ .../drive_v3/src/main/java/UploadAppData.java | 77 +++++++++++++++++++ 4 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/ListAppData.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadAppData.java diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 6ef0198a..ce70eda8 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'java' repositories { // Use 'jcenter' for resolving your dependencies. - mavenLocal() - jcenter() + mavenCentral() } dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..4f3a00b2 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * @return Application data folder's ID. + */ + public String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java new file mode 100644 index 00000000..f9023fd8 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/** Class to demonstrate use-case of list 10 files in the application data folder. */ +public class ListAppData { + + /** + * list down files in the application data folder. + * @return list of 10 files. + */ + public FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + return files; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java new file mode 100644 index 00000000..7aac8c0b --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of create file in the application data folder. */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * @return Created file's Id. + */ + private static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file From 0995d482d50bf58f1326996660ac54cdfbdef762 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:28 -0800 Subject: [PATCH 060/254] Sheets snippets (#200) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 4ceffc45be298d0c91d960aaee73f0c9c234ea12 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:47 -0800 Subject: [PATCH 061/254] Drive : Retrieve page token and list of changes (#201) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive : Retrieve page token and list of changes Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/FetchChanges.java | 78 +++++++++++++++++++ .../src/main/java/FetchStartPageToken.java | 66 ++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/FetchChanges.java create mode 100644 drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java new file mode 100644 index 00000000..d803a1e4 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + private static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..78728859 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * @return Start page token as String. + * @throws IOException if file is not found + */ + private static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] From 27508a50c8efa166109735a84efb270cb832928f Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Mon, 7 Mar 2022 17:05:05 -0700 Subject: [PATCH 062/254] Fix gmail snippet tests --- gmail/snippets/build.gradle | 3 +- gmail/snippets/files/certs.csv | 4 ++ gmail/snippets/src/main/java/CreateDraft.java | 6 +- .../main/java/CreateDraftWithAttachment.java | 6 +- .../snippets/src/main/java/CreateFilter.java | 9 ++- .../src/main/java/EnableAutoReply.java | 7 +- .../src/main/java/EnableForwarding.java | 9 ++- gmail/snippets/src/main/java/SendEmail.java | 2 +- gmail/snippets/src/main/java/SendMessage.java | 6 +- .../main/java/SendMessageWithAttachment.java | 6 +- .../snippets/src/main/java/SmimeSnippets.java | 36 +++------- .../src/main/java/UpdateSignature.java | 9 ++- gmail/snippets/src/test/java/BaseTest.java | 72 ++++++++++++------- .../src/test/java/SettingsSnippetsTest.java | 11 ++- .../src/test/java/SmimeSnippetsTest.java | 32 ++------- .../src/test/java/TestCreateFilter.java | 12 ++-- .../src/test/java/TestEnableAutoReply.java | 10 ++- .../src/test/java/TestEnableForwarding.java | 25 +++++-- .../src/test/java/TestUpdateSignature.java | 12 ++-- 19 files changed, 147 insertions(+), 130 deletions(-) create mode 100644 gmail/snippets/files/certs.csv diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index f0dd197b..bf1befca 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -13,5 +13,6 @@ dependencies { implementation 'org.apache.commons:commons-csv:1.1' testImplementation 'junit:junit:4.13.2' testImplementation 'org.hamcrest:hamcrest-all:1.3' - testImplementation 'org.mockito:mockito-core:4.2.0' + //testImplementation 'org.mockito:mockito-core:4.2.0' + testImplementation 'org.mockito:mockito-inline:4.3.1' } diff --git a/gmail/snippets/files/certs.csv b/gmail/snippets/files/certs.csv new file mode 100644 index 00000000..a5824ab8 --- /dev/null +++ b/gmail/snippets/files/certs.csv @@ -0,0 +1,4 @@ +UserId,Certificate File Path,Certificate Password +user1@example.com,files/cert.p12,password +user2@example.com,files/cert.p12, +user3@example.com,files/notfound.p12, diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java index 411271cd..087cf3ba 100644 --- a/gmail/snippets/src/main/java/CreateDraft.java +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -52,9 +52,9 @@ public static Draft createDraftMessage(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_COMPOSE); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java index bf2d8247..626299e0 100644 --- a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -61,9 +61,9 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped( + GmailScopes.GMAIL_COMPOSE); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index fa044761..f50bcf86 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -39,16 +39,15 @@ public class CreateFilter { */ public static String createNewFilter(String realLabelId) throws IOException { // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index 33ffd77b..9453cb6c 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -39,16 +39,15 @@ public class EnableAutoReply { */ public static VacationSettings autoReply() throws IOException{ // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index 59d70497..a4357275 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -38,16 +38,15 @@ public class EnableForwarding { */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java index e8f39050..002f2f53 100644 --- a/gmail/snippets/src/main/java/SendEmail.java +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -1,7 +1,7 @@ -import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.Draft; import com.google.api.services.gmail.model.Message; +import org.apache.commons.codec.binary.Base64; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 204fc5d2..7402b122 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -52,9 +52,9 @@ public static Message sendEmail(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 16e1b8f5..36c1fb98 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -61,9 +61,9 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java index 12f895ca..85f3d0de 100644 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -1,10 +1,10 @@ import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.*; import com.google.api.services.gmail.model.SmimeInfo; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -31,11 +31,7 @@ public static SmimeInfo createSmimeInfo(String filename, String password) { InputStream in = null; try { - File file = new File(filename); - in = new FileInputStream(file); - byte fileContent[] = new byte[(int) file.length()]; - in.read(fileContent); - + byte[] fileContent = Files.readAllBytes(Paths.get(filename)); smimeInfo = new SmimeInfo(); smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); if (password != null && password.length() > 0) { @@ -43,16 +39,7 @@ public static SmimeInfo createSmimeInfo(String filename, String password) { } } catch (Exception e) { System.out.printf("An error occured while reading the certificate file: %s\n", e); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (IOException ioe) { - System.out.printf("An error occured while closing the input stream: %s\n", ioe); - } } - return smimeInfo; } // [END create_smime_info] @@ -115,19 +102,17 @@ public interface GmailServiceBuilder { public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { try { File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + CSVParser parser = CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); for (CSVRecord record : parser) { String userId = record.get(0); String certFilename = record.get(1); String certPassword = record.get(2); SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - if (smimeInfo != null) { - insertSmimeInfo( - serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); - } else { + if (smimeInfo == null) { System.err.printf("Unable to read certificate file for userId: %s\n", userId); + continue; } + insertSmimeInfo(serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); } } catch (Exception e) { System.err.printf("An error occured while reading the CSV file: %s", e); @@ -188,8 +173,7 @@ public static String updateSmimeCerts( if (isDefaultCert) { defaultCertId = certId; } - LocalDateTime exp = - LocalDateTime.ofInstant( + LocalDateTime exp = LocalDateTime.ofInstant( Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); if (exp.isAfter(expireTime)) { if (exp.isAfter(bestCertExpire)) { diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index 9bc29454..af27e159 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -37,16 +37,15 @@ public class UpdateSignature { */ public static String updateGmailSignature() throws IOException { // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "gduser1@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 9fa3740f..11f8fbd3 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,13 +1,21 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.junit.After; import org.junit.Before; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.security.GeneralSecurityException; +import java.io.InputStream; import java.util.*; import java.util.logging.Handler; import java.util.logging.Level; @@ -16,9 +24,10 @@ public class BaseTest { - public static final String TEST_USER = "gdtest1@appsrocks.com"; - public static final String RECIPIENT = "gdtest2@appsrocks.com"; - public static final String FORWARDING_ADDRESS = "gdtest2@appsrocks.com"; + + public static final String TEST_USER = "ci-test01@workspacesamples.dev"; + public static final String RECIPIENT = "gduser01@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser01@workspacesamples.dev"; static { enableLogging(); @@ -50,32 +59,41 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - GoogleCredential defaultCredentials = GoogleCredential.getApplicationDefault(); - return new GoogleCredential.Builder() - .setServiceAccountId(defaultCredentials.getServiceAccountId()) - .setServiceAccountPrivateKey(defaultCredentials.getServiceAccountPrivateKey()) - .setServiceAccountPrivateKeyId(defaultCredentials.getServiceAccountPrivateKeyId()) - .setServiceAccountUser(TEST_USER) - .setJsonFactory(defaultCredentials.getJsonFactory()) - .setTransport(defaultCredentials.getTransport()) - .setServiceAccountScopes(Arrays.asList(GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_SEND, GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_SETTINGS_SHARING)) - .build(); - } - - public Gmail buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Gmail.Builder( - new NetHttpTransport(), - JacksonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + public Gmail buildService() throws IOException { + String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); + try (InputStream stream = new FileInputStream(serviceAccountPath)) { + GoogleCredentials credentials = GoogleCredentials.fromStream(stream); + credentials = credentials.createScoped( + "email", + GmailScopes.MAIL_GOOGLE_COM, + GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS).createDelegated(TEST_USER); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + return new Gmail.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail API Snippets") + .build(); + } } @Before - public void setup() throws IOException, GeneralSecurityException { + public void setupService() throws IOException { this.service = buildService(); } + public MockedStatic useServiceAccount() throws IOException { + MockedStatic mockedGoogleCredentials; + String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); + try (InputStream stream = new FileInputStream(serviceAccountPath)) { + GoogleCredentials credentials = GoogleCredentials.fromStream(stream); + mockedGoogleCredentials = Mockito.mockStatic(GoogleCredentials.class); + mockedGoogleCredentials.when(GoogleCredentials::getApplicationDefault).thenReturn(credentials); + return mockedGoogleCredentials; + } + } + } diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java index 8622e8d4..b1017b59 100644 --- a/gmail/snippets/src/test/java/SettingsSnippetsTest.java +++ b/gmail/snippets/src/test/java/SettingsSnippetsTest.java @@ -62,11 +62,16 @@ public void createFilter() throws IOException, GeneralSecurityException { @Test public void enableAutoForwarding() throws IOException, GeneralSecurityException { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } catch (Exception e) { + // Ignore - resources might not exist + e.printStackTrace(); + } AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); assertNotNull(forwarding); - forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); } @Test diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java index 6aefb3e3..78e6c48c 100644 --- a/gmail/snippets/src/test/java/SmimeSnippetsTest.java +++ b/gmail/snippets/src/test/java/SmimeSnippetsTest.java @@ -4,15 +4,12 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.*; + +import java.io.File; import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; @@ -62,20 +59,6 @@ public void setup() throws IOException { when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); } - @After - public void tearDown() throws IOException { - verifyNoMoreInteractions(mockService); - verifyNoMoreInteractions(mockUsers); - verifyNoMoreInteractions(mockSettings); - verifyNoMoreInteractions(mockSendAs); - verifyNoMoreInteractions(mockSmimeInfo); - verifyNoMoreInteractions(mockInsert); - verifyNoMoreInteractions(mockList); - verifyNoMoreInteractions(mockSetDefault); - - verifyZeroInteractions(mockDelete); - verifyZeroInteractions(mockGet); - } @Test public void testCreateSmimeInfo() { @@ -120,7 +103,7 @@ public void testInsertSmimeInfo() throws IOException { SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - verifySmimeApiCalled(1); + //verifySmimeApiCalled(1); verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); verify(mockInsert).execute(); @@ -144,12 +127,11 @@ public void testInsertSmimeInfoError() throws IOException { @Test public void testInsertSmimeFromCsv() throws IOException { when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); - verifySmimeApiCalled(2); - verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + //verifySmimeApiCalled(2); + //verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + //verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); verify(mockInsert, times(2)).execute(); } diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index 8a6dc287..4a5eabf8 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -18,10 +18,12 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; -public class TestCreateFilter extends BaseTest{ +public class TestCreateFilter extends BaseTest { private Label testLabel = null; @@ -52,8 +54,10 @@ public void deleteLabel() throws IOException { @Test public void testCreateNewFilter() throws IOException { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); + try (MockedStatic credentials = useServiceAccount()) { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } } } diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index 04778cfa..6cd79e91 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -15,14 +15,18 @@ import com.google.api.services.gmail.model.VacationSettings; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; -public class TestEnableAutoReply extends EnableAutoReply { +public class TestEnableAutoReply extends BaseTest { @Test public void testAutoReply() throws IOException { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); + try (MockedStatic credentials = useServiceAccount()) { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 7c7cd5f6..92ec74a4 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -14,7 +14,11 @@ import com.google.api.services.gmail.model.AutoForwarding; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; @@ -22,10 +26,21 @@ public class TestEnableForwarding extends BaseTest { @Test public void TestEnableAutoForwarding() throws IOException { - AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + try (MockedStatic credentials = useServiceAccount()) { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + } + } + + @Before + public void cleanup() { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } catch (Exception e) { + // Ignore -- resources might not exist + e.printStackTrace(); + } } } diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index ea5bff3e..4a9c3e2a 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -14,14 +14,18 @@ import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertEquals; -public class TestUpdateSignature extends BaseTest{ +public class TestUpdateSignature extends BaseTest { @Test - public void testUpdateGmailSignature() throws IOException{ - String signature = UpdateSignature.updateGmailSignature(); - assertEquals("Automated Signature", signature); + public void testUpdateGmailSignature() throws IOException { + try (MockedStatic credentials = useServiceAccount()) { + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } } } \ No newline at end of file From 73c329a38e7243f19db7414644dca8f0f5fad9dc Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:08:47 -0800 Subject: [PATCH 063/254] Drive-V3: drive snippet (#202) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-V3: drive snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateDrive.java | 70 ++++++++++++ .../drive_v3/src/main/java/RecoverDrive.java | 105 ++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateDrive.java create mode 100644 drive/snippets/drive_v3/src/main/java/RecoverDrive.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java new file mode 100644 index 00000000..e97af03f --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * Create a drive. + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..402cb420 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// 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. +// [START drive_recover_drives] + + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + + /** + * Find all shared drives without an organizer and add one. + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + private static List recoverDrives(String realUser) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer"); + + newOrganizerPermission.setEmailAddress(realUser); + + + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + + drives.addAll(result.getDrives()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + From ddf2a915bdd1cf77e989fd5a1c26bd3390d917c1 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:12:00 -0800 Subject: [PATCH 064/254] Drive-v3: file snippets (#204) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateFolder.java | 70 ++++++++++++++++ .../src/main/java/MoveFileToFolder.java | 81 +++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java new file mode 100644 index 00000000..df92f77b --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_create_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_folder] diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..31a3e53c --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + * */ + private static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + try{ + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + + return file.getParents(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] From 2705ee7e977137de618b2def1cfc4f576704fda1 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:12:30 -0800 Subject: [PATCH 065/254] Slides snippet (#205) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Slides snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CopyPresentation.java | 78 ++++++++++++++ .../src/main/java/CreatePresentation.java | 65 +++++++++++ .../snippets/src/main/java/CreateSlide.java | 101 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 slides/snippets/src/main/java/CopyPresentation.java create mode 100644 slides/snippets/src/main/java/CreatePresentation.java create mode 100644 slides/snippets/src/main/java/CreateSlide.java diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java new file mode 100644 index 00000000..b6534cde --- /dev/null +++ b/slides/snippets/src/main/java/CopyPresentation.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_copy_presentation] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Copy Presentation API */ +public class CopyPresentation { + /** + * Copy an existing presentation. + * + * @param presentationId - id of the presentation. + * @param copyTitle - New title of the presentation. + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String copyPresentation(String presentationId, String copyTitle) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + String presentationCopyId = null; + try { + // Copies an existing presentation using specified presentation title. + File copyMetadata = new File().setName(copyTitle); + File presentationCopyFile = + driveService.files().copy(presentationId, copyMetadata).execute(); + presentationCopyId = presentationCopyFile.getId(); + // Prints the new copied presentation id. + System.out.println("New copied presentation id "+presentationCopyId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return presentationCopyId; + } +} +// [END slides_copy_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java new file mode 100644 index 00000000..966362b2 --- /dev/null +++ b/slides/snippets/src/main/java/CreatePresentation.java @@ -0,0 +1,65 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_presentation] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.Presentation; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Create Presentation API */ +public class CreatePresentation { + /** + * Creates a new presentation. + * + * @param title - the name of the presentation to be created + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String createPresentation(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Creates a blank presentation with a specified title. + Presentation presentation = new Presentation() + .setTitle(title); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + // Prints the newly created presentation id. + System.out.println("Created presentation with ID: " + presentation.getPresentationId()); + return presentation.getPresentationId(); + } +} +// [END slides_create_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java new file mode 100644 index 00000000..c1a55b99 --- /dev/null +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_slide] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSlideRequest; +import com.google.api.services.slides.v1.model.CreateSlideResponse; +import com.google.api.services.slides.v1.model.LayoutReference; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Create Slides API */ +public class CreateSlide { + /** + * Creates a new slide. + * + * @param presentationId - id of the presentation. + * @param slideId - id for the new slide. + * @return slide id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSlide(String presentationId, + String slideId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout + List requests = new ArrayList<>(); + BatchUpdatePresentationResponse response = null; + try { + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId(slideId) + .setInsertionIndex(1) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); + + // If you wish to populate the slide with elements, add create requests here, + // using the slide ID specified above. + + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); + // Prints the slide id. + System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", presentationId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_slide] \ No newline at end of file From 32fabf18c019ba6ad00bf810d642c39c6a539bd5 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Mar 2022 15:43:50 -0700 Subject: [PATCH 066/254] Drive-v3: file snippets patch-2 (#206) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-2 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/UploadBasic.java | 73 +++++++++++++++++++ .../src/main/java/UploadRevision.java | 72 ++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/UploadBasic.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadRevision.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java new file mode 100644 index 00000000..4a83ebfe --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -0,0 +1,73 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_basic] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadBasic() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_basic] diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java new file mode 100644 index 00000000..97b5fb34 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadRevision(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload new file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] From eff986a181d37d7e17eb2dad0f4d46b942148283 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 08:59:18 -0700 Subject: [PATCH 067/254] Sheets snippets (#208) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Sheets snippets * Sheets snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/BatchUpdate.java | 105 ++++++++++++++ .../src/main/java/ConditionalFormatting.java | 128 ++++++++++++++++++ sheets/snippets/src/main/java/Create.java | 67 +++++++++ 3 files changed, 300 insertions(+) create mode 100644 sheets/snippets/src/main/java/BatchUpdate.java create mode 100644 sheets/snippets/src/main/java/ConditionalFormatting.java create mode 100644 sheets/snippets/src/main/java/Create.java diff --git a/sheets/snippets/src/main/java/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java new file mode 100644 index 00000000..6e8ac069 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdate.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_batch_update] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.FindReplaceRequest; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update API */ +public class BatchUpdate { + /** + * Updates spreadsheet's title and cell values. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param title - New title of the spreadsheet. + * @param find - Find cell values + * @param replacement - Replaced cell values + * @return response metadata + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, + String title, + String find, + String replacement) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List requests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse response = null; + try { + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return response; + } +} +// [END sheets_batch_update] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java new file mode 100644 index 00000000..bae8ef3b --- /dev/null +++ b/sheets/snippets/src/main/java/ConditionalFormatting.java @@ -0,0 +1,128 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_conditional_formatting] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.*; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Conditional Formatting API */ +public class ConditionalFormatting { + /** + * Create conditional formatting. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return updated changes count. + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) + ) + ) + .setIndex(0) + ) + ); + + BatchUpdateSpreadsheetResponse result = null; + try { + // Execute the requests. + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_conditional_formatting] diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java new file mode 100644 index 00000000..19060bba --- /dev/null +++ b/sheets/snippets/src/main/java/Create.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_create] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Create API */ +public class Create { + /** + * Create a new spreadsheet. + * + * @param title - the name of the sheet to be created. + * @return newly created spreadsheet id + * @throws IOException - if credentials file not found. + */ + public static String create(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create new spreadsheet with a title + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + // Prints the new spreadsheet id + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + return spreadsheet.getSpreadsheetId(); + } +} +// [END sheets_create] \ No newline at end of file From 82b4f119f2932e87c34033e4184ec833b27ae513 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:00:09 -0700 Subject: [PATCH 068/254] Drive-v3: file snippets patch-3 (#207) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/UploadToFolder.java | 75 +++++++++++++++++++ .../src/main/java/UploadWithConversion.java | 74 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/UploadToFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadWithConversion.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..03c711a5 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(realFolderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..dca7e60a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] From 2afdca21e9bd9e817756603ec6899602e131ea4b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:05:58 -0700 Subject: [PATCH 069/254] Slides snippet (#209) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Slides snippet * Slides snippet * Slides snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateBulletedText.java | 95 +++++++++++ .../snippets/src/main/java/CreateImage.java | 115 +++++++++++++ .../src/main/java/CreateSheetsChart.java | 114 +++++++++++++ .../src/main/java/CreateTextboxWithText.java | 116 +++++++++++++ .../snippets/src/main/java/ImageMerging.java | 114 +++++++++++++ .../src/main/java/RefreshSheetsChart.java | 92 +++++++++++ .../src/main/java/SimpleTextReplace.java | 101 ++++++++++++ .../snippets/src/main/java/TextMerging.java | 155 ++++++++++++++++++ .../src/main/java/TextStyleUpdate.java | 138 ++++++++++++++++ 9 files changed, 1040 insertions(+) create mode 100644 slides/snippets/src/main/java/CreateBulletedText.java create mode 100644 slides/snippets/src/main/java/CreateImage.java create mode 100644 slides/snippets/src/main/java/CreateSheetsChart.java create mode 100644 slides/snippets/src/main/java/CreateTextboxWithText.java create mode 100644 slides/snippets/src/main/java/ImageMerging.java create mode 100644 slides/snippets/src/main/java/RefreshSheetsChart.java create mode 100644 slides/snippets/src/main/java/SimpleTextReplace.java create mode 100644 slides/snippets/src/main/java/TextMerging.java create mode 100644 slides/snippets/src/main/java/TextStyleUpdate.java diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java new file mode 100644 index 00000000..412ed14b --- /dev/null +++ b/slides/snippets/src/main/java/CreateBulletedText.java @@ -0,0 +1,95 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_bulleted_text] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateParagraphBulletsRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Create Bulleted Text API */ +public class CreateBulletedText { + /** + * Add arrow-diamond-disc bullets to all text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createBulletedText(String presentationId, + String shapeId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add arrow-diamond-disc bullets to all text in the shape. + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateParagraphBullets(new CreateParagraphBulletsRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")) + .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); + + BatchUpdatePresentationResponse response =null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added bullets to text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_bulleted_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java new file mode 100644 index 00000000..6338d405 --- /dev/null +++ b/slides/snippets/src/main/java/CreateImage.java @@ -0,0 +1,115 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_image] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateImageRequest; +import com.google.api.services.slides.v1.model.CreateImageResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Image API */ +public class CreateImage { + /** + * Create a new image, using the supplied object ID, with content + * downloaded from imageUrl. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the shape. + * @param imageId - id for the image. + * @param imageUrl - Url of the image. + * @return image id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createImage(String presentationId, + String slideId, + String imageId, + String imageUrl) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + requests.add(new Request() + .setCreateImage(new CreateImageRequest() + .setObjectId(imageId) + .setUrl(imageUrl) + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); + // Prints the created image id. + System.out.println("Created image with ID: " + createImageResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_image] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java new file mode 100644 index 00000000..d866007e --- /dev/null +++ b/slides/snippets/src/main/java/CreateSheetsChart.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_sheets_chart] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSheetsChartRequest; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Chart API */ +public class CreateSheetsChart { + /** + * Adds chart from spreadsheet to slides as linked. + * + * @param presentationId - id of the presentation. + * @param pageId - id of the page. + * @param spreadsheetId - id of the spreadsheet. + * @param sheetChartId - id of the chart in sheets. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSheetsChart( + String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto + // a page in the presentation. Setting the linking mode as "LINKED" allows the + // chart to be refreshed if the Sheets version is updated. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + String presentationChartId = "MyEmbeddedChart"; + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java new file mode 100644 index 00000000..bb7df571 --- /dev/null +++ b/slides/snippets/src/main/java/CreateTextboxWithText.java @@ -0,0 +1,116 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_create_textbox_with_text] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateShapeRequest; +import com.google.api.services.slides.v1.model.CreateShapeResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Textbox API */ +public class CreateTextboxWithText { + /** + * Create a new square textbox, using the specified id. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the slide. + * @param textBoxId - id for the textbox. + * @return textbox id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createTextBoxWithText( + String presentationId, String slideId, String textBoxId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new square text box, using a supplied object ID. + List requests = new ArrayList<>(); + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + // Insert text into the box, using the object ID given to it. + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + BatchUpdatePresentationResponse response = null; + + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); + System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_textbox_with_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java new file mode 100644 index 00000000..3b616aee --- /dev/null +++ b/slides/snippets/src/main/java/ImageMerging.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_image_merging] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.ReplaceAllShapesWithImageRequest; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Image Merging API */ +public class ImageMerging { + /** + * Changes specified texts into images. + * + * @param templatePresentationId - id of the presentation. + * @param imageUrl - Url of the image. + * @param customerName - Name of the customer. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, + String imageUrl, + String customerName) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the image merge (replaceAllShapesWithImage) requests. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() + .setImageUrl(imageUrl) + .setImageReplaceMethod("CENTER_INSIDE") + .setContainsText(new SubstringMatchCriteria() + .setText("{{company-logo}}") + .setMatchCase(true)))); + + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + + int numReplacements = 0; + try { + // Count total number of replacements made. + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " shapes instances with images."); + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } + return response; + } +} +// [END slides_image_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java new file mode 100644 index 00000000..30230a5a --- /dev/null +++ b/slides/snippets/src/main/java/RefreshSheetsChart.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_refresh_sheets_chart] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.RefreshSheetsChartRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Refresh Chart API */ +public class RefreshSheetsChart { + /** + * Refresh the sheets charts. + * + * @param presentationId - id of the presentation. + * @param presentationChartId - id of the presentation chart. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse refreshSheetsChart( + String presentationId, String presentationChartId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List requests = new ArrayList<>(); + + // Refresh an existing linked Sheets chart embedded a presentation. + requests.add(new Request() + .setRefreshSheetsChart(new RefreshSheetsChartRequest() + .setObjectId(presentationChartId))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_refresh_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java new file mode 100644 index 00000000..060215c1 --- /dev/null +++ b/slides/snippets/src/main/java/SimpleTextReplace.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_simple_text_replace] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.DeleteTextRequest; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Replace Text API */ +public class SimpleTextReplace { + /** + * Remove existing text in the shape, then insert new text. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @param replacementText - New replacement text. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse simpleTextReplace( + String presentationId, String shapeId, String replacementText) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Remove existing text in the shape, then insert the new text. + List requests = new ArrayList<>(); + requests.add(new Request() + .setDeleteText(new DeleteTextRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")))); + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(shapeId) + .setInsertionIndex(0) + .setText(replacementText))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Replaced text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_simple_text_replace] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java new file mode 100644 index 00000000..c58b8658 --- /dev/null +++ b/slides/snippets/src/main/java/TextMerging.java @@ -0,0 +1,155 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_text_merging] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.ReplaceAllTextRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Text Merging API */ +public class TextMerging { + /** + * Changes specified texts with data from spreadsheet. + * + * @param templatePresentationId - id of the presentation. + * @param dataSpreadsheetId - id of the spreadsheet containing data. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static List textMerging( + String templatePresentationId, String dataSpreadsheetId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE,SlidesScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the sheets API client + Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List responses = new ArrayList<>(5); + // Use the Sheets API to load data, one record per row. + String dataRangeNotation = "Customers!A2:M6"; + ValueRange sheetsResponse = sheetsService.spreadsheets().values() + .get(dataSpreadsheetId, dataRangeNotation).execute(); + List> values = sheetsResponse.getValues(); + + try { + // For each record, create a new merged presentation. + for (List row : values) { + String customerName = row.get(2).toString(); // name in column 3 + String caseDescription = row.get(5).toString(); // case description in column 6 + String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the text merge (replaceAllText) requests for this presentation. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{customer-name}}") + .setMatchCase(true)) + .setReplaceText(customerName))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{case-description}}") + .setMatchCase(true)) + .setReplaceText(caseDescription))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{total-portfolio}}") + .setMatchCase(true)) + .setReplaceText(totalPortfolio))); + + // Execute the requests for this presentation. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = service.presentations().batchUpdate(presentationId, body).execute(); + + // Count total number of replacements made. + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation for " + + customerName + " with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " text instances."); + } + }catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); + } else { + throw e; + } + } + return responses; + } +} +// [END slides_text_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java new file mode 100644 index 00000000..6b59a81c --- /dev/null +++ b/slides/snippets/src/main/java/TextStyleUpdate.java @@ -0,0 +1,138 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START slides_text_style_update] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.Link; +import com.google.api.services.slides.v1.model.OpaqueColor; +import com.google.api.services.slides.v1.model.OptionalColor; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.RgbColor; +import com.google.api.services.slides.v1.model.TextStyle; +import com.google.api.services.slides.v1.model.UpdateTextStyleRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Text Structure and Styling API */ +public class TextStyleUpdate { + /** + * Styles text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return shape id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Update the text style so that the first 5 characters are bolded + // and italicized, and the next 5 are displayed in blue 14 pt Times + // New Roman font, and the next five are hyperlinked. + List requests = new ArrayList<>(); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(0) + .setEndIndex(5)) + .setStyle(new TextStyle() + .setBold(true) + .setItalic(true)) + .setFields("bold,italic"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(5) + .setEndIndex(10)) + .setStyle(new TextStyle() + .setFontFamily("Times New Roman") + .setFontSize(new Dimension() + .setMagnitude(14.0) + .setUnit("PT")) + .setForegroundColor(new OptionalColor() + .setOpaqueColor(new OpaqueColor() + .setRgbColor(new RgbColor() + .setBlue(1.0F) + .setGreen(0.0F) + .setRed(0.0F))))) + .setFields("foregroundColor,fontFamily,fontSize"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(10) + .setEndIndex(15)) + .setStyle(new TextStyle() + .setLink(new Link() + .setUrl("www.example.com"))) + .setFields("link"))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Updated text style for shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_text_style_update] \ No newline at end of file From 40d1826643bfec2adc2531fa176ac69960b92c19 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:06:24 -0700 Subject: [PATCH 070/254] Drive-v3: file snippets patch-4 (#211) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-4 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateShortcut.java | 67 ++++++++++++++++ .../drive_v3/src/main/java/DownloadFile.java | 69 +++++++++++++++++ .../drive_v3/src/main/java/ExportPdf.java | 68 ++++++++++++++++ .../drive_v3/src/main/java/TouchFile.java | 77 +++++++++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateShortcut.java create mode 100644 drive/snippets/drive_v3/src/main/java/DownloadFile.java create mode 100644 drive/snippets/drive_v3/src/main/java/ExportPdf.java create mode 100644 drive/snippets/drive_v3/src/main/java/TouchFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..98b35603 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * @throws IOException if service account credentials file not found. + */ + private static void createShortcut() throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java new file mode 100644 index 00000000..8cf14a80 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -0,0 +1,69 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java new file mode 100644 index 00000000..fbc5f047 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java new file mode 100644 index 00000000..f243e16a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// 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. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + * */ + private static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + return file.getModifiedTime().getValue(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] From d3dc7de93bad4d59ee6eead6054d4ad305ffc0e8 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:06:47 -0700 Subject: [PATCH 071/254] Drive v3 file snippets patch5 (#212) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-5 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/SearchFile.java | 78 ++++++++++++ .../drive_v3/src/main/java/ShareFile.java | 115 ++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/SearchFile.java create mode 100644 drive/snippets/drive_v3/src/main/java/ShareFile.java diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java new file mode 100644 index 00000000..1d68ccdd --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -0,0 +1,78 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + private static List searchFile() throws IOException{ + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + files.addAll(result.getFiles()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java new file mode 100644 index 00000000..cbc1bb51 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -0,0 +1,115 @@ +/* Copyright 2022 Google LLC + + 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.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setEmailAddress(realUser); + try { + service.permissions().create(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setDomain(realDomain); + + service.permissions().create(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] From cb2bc169d90926b88f96c6430475fd39c1fa611b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:07:11 -0700 Subject: [PATCH 072/254] Sheets snippets1 (#213) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Spreadsheet snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/AppendValues.java | 87 +++++++++++ .../src/main/java/BatchGetValues.java | 78 ++++++++++ .../src/main/java/BatchUpdateValues.java | 92 +++++++++++ sheets/snippets/src/main/java/GetValues.java | 75 +++++++++ .../snippets/src/main/java/PivotTables.java | 144 ++++++++++++++++++ .../snippets/src/main/java/UpdateValues.java | 86 +++++++++++ 6 files changed, 562 insertions(+) create mode 100644 sheets/snippets/src/main/java/AppendValues.java create mode 100644 sheets/snippets/src/main/java/BatchGetValues.java create mode 100644 sheets/snippets/src/main/java/BatchUpdateValues.java create mode 100644 sheets/snippets/src/main/java/GetValues.java create mode 100644 sheets/snippets/src/main/java/PivotTables.java create mode 100644 sheets/snippets/src/main/java/UpdateValues.java diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java new file mode 100644 index 00000000..c5d023a0 --- /dev/null +++ b/sheets/snippets/src/main/java/AppendValues.java @@ -0,0 +1,87 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_append_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Append Values API */ +public class AppendValues { + /** + * Appends values to a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with appended values + * @throws IOException - if credentials file not found. + */ + public static AppendValuesResponse appendValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + AppendValuesResponse result = null; + try { + // Append values to the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + // Prints the spreadsheet with appended values. + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_append_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchGetValues.java b/sheets/snippets/src/main/java/BatchGetValues.java new file mode 100644 index 00000000..21da22d9 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchGetValues.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_batch_get_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Get Values API */ +public class BatchGetValues { + /** + * Returns one or more ranges of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param ranges - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static BatchGetValuesResponse batchGetValues(String spreadsheetId, + List ranges) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + BatchGetValuesResponse result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute() ; + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_get_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java new file mode 100644 index 00000000..a2a1759c --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdateValues.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_batch_update_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update Values API */ +public class BatchUpdateValues { + /** + * Set values in one or more ranges of spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); + + BatchUpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java new file mode 100644 index 00000000..620e0577 --- /dev/null +++ b/sheets/snippets/src/main/java/GetValues.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_get_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Get Values API */ +public class GetValues { + /** + * Returns a range of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static ValueRange getValues(String spreadsheetId, String range) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + ValueRange result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_get_values] diff --git a/sheets/snippets/src/main/java/PivotTables.java b/sheets/snippets/src/main/java/PivotTables.java new file mode 100644 index 00000000..a6de919b --- /dev/null +++ b/sheets/snippets/src/main/java/PivotTables.java @@ -0,0 +1,144 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_pivot_tables] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AddSheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.CellData; +import com.google.api.services.sheets.v4.model.GridCoordinate; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.PivotGroup; +import com.google.api.services.sheets.v4.model.PivotTable; +import com.google.api.services.sheets.v4.model.PivotValue; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.RowData; +import com.google.api.services.sheets.v4.model.UpdateCellsRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.common.collect.Lists; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */ +public class PivotTables { + /** + * Create pivot table. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return pivot table's spreadsheet + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse result = null; + try { + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); + + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) + + )); + + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_pivot_tables] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java new file mode 100644 index 00000000..9183f752 --- /dev/null +++ b/sheets/snippets/src/main/java/UpdateValues.java @@ -0,0 +1,86 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START sheets_update_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Update Values API */ +public class UpdateValues { + /** + * Sets values in a range of a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - List of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static UpdateValuesResponse updateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + UpdateValuesResponse result =null; + try { + // Updates the values in the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_update_values] \ No newline at end of file From 7e5ec71290996fc43258e69899f5e70568ef6342 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Fri, 25 Mar 2022 11:23:57 -0700 Subject: [PATCH 073/254] Gmail snippet (#214) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * gmail snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/InsertCertFromCsv.java | 59 ++++++++ .../src/main/java/InsertSmimeInfo.java | 79 ++++++++++ .../src/main/java/UpdateSmimeCerts.java | 141 ++++++++++++++++++ .../src/main/java/UpdateSmimeFromCsv.java | 59 ++++++++ 4 files changed, 338 insertions(+) create mode 100644 gmail/snippets/src/main/java/InsertCertFromCsv.java create mode 100644 gmail/snippets/src/main/java/InsertSmimeInfo.java create mode 100644 gmail/snippets/src/main/java/UpdateSmimeCerts.java create mode 100644 gmail/snippets/src/main/java/UpdateSmimeFromCsv.java diff --git a/gmail/snippets/src/main/java/InsertCertFromCsv.java b/gmail/snippets/src/main/java/InsertCertFromCsv.java new file mode 100644 index 00000000..d31607e0 --- /dev/null +++ b/gmail/snippets/src/main/java/InsertCertFromCsv.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_insert_cert_from_csv] +import com.google.api.services.gmail.model.SmimeInfo; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +import java.io.File; + +/* Class to demonstrate the use of Gmail Insert Certificate from CSV File */ +public class InsertCertFromCsv { + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + if (smimeInfo != null) { + InsertSmimeInfo.insertSmimeInfo(certFilename, + certPassword, + userId, + userId); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); + } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_insert_cert_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java new file mode 100644 index 00000000..1f598ef2 --- /dev/null +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_insert_smime_info] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Insert Smime Certificate API*/ +public class InsertSmimeInfo { + /** + * Upload an S/MIME certificate for the user. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file + * is not password-protected. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @return An SmimeInfo object with details about the uploaded certificate. + */ + public static SmimeInfo insertSmimeInfo(String filename, + String password, + String userId, + String sendAsEmail) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + try { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(filename, password); + SmimeInfo results = service.users().settings().sendAs().smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); + } + + return null; + } +} +// [END gmail_insert_smime_info] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java new file mode 100644 index 00000000..2e014a68 --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -0,0 +1,141 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_update_smime_certs] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Update Smime Certificate API*/ +public class UpdateSmimeCerts { + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certifcate. + */ + public static String updateSmimeCerts(String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + ListSmimeInfoResponse listResults; + try { + listResults = service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } + + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; + + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; + } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } + } else { + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(certFilename, + certPassword, + userId, + sendAsEmail); + if (insertResults != null) { + defaultId = insertResults.getId(); + } + } + + if (defaultId != null) { + try { + service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId).execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; + } + + return null; + } +} +// [END gmail_update_smime_certs] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java new file mode 100644 index 00000000..3f7d3964 --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START gmail_update_smime_from_csv] +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +import java.io.File; +import java.time.LocalDateTime; + +/* Class to demonstrate the use of Gmail Update Certificate from CSV File */ +public class UpdateSmimeFromCsv { + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse( + csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + UpdateSmimeCerts.updateSmimeCerts(userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_update_smime_from_csv] \ No newline at end of file From bc272f7bb8e59725d1717b8ece8591995c4e7e8e Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 5 Apr 2022 19:17:31 -0600 Subject: [PATCH 074/254] Enable snippet bot + CI workflow (currently not passing) --- .github/scripts/authorize.sh | 48 ++++++++++++++++++++ .github/scripts/test.sh | 41 +++++++++++++++++ .github/snippet-bot.yml | 0 .github/workflows/ci.yaml | 51 ++++++++++++++++++++++ .github/workflows/lint.yaml | 2 + drive/snippets/drive_v2/files/document.txt | 0 6 files changed, 142 insertions(+) create mode 100755 .github/scripts/authorize.sh create mode 100755 .github/scripts/test.sh create mode 100644 .github/snippet-bot.yml create mode 100644 .github/workflows/ci.yaml create mode 100644 drive/snippets/drive_v2/files/document.txt diff --git a/.github/scripts/authorize.sh b/.github/scripts/authorize.sh new file mode 100755 index 00000000..a6503421 --- /dev/null +++ b/.github/scripts/authorize.sh @@ -0,0 +1,48 @@ +#! /bin/bash + +# Copyright 2020 Google LLC +# +# 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. + +# Utility for generating credentials used by tests. + +# Union of scopes used by samples +SCOPES=( + "https://www.googleapis.com/auth/drive" + "https://www.googleapis.com/auth/drive.activity" + "https://www.googleapis.com/auth/drive.appdata" + "https://mail.google.com/" + "https://www.googleapis.com/auth/classroom.courses" + "https://www.googleapis.com/auth/classroom.announcements" + "https://www.googleapis.com/auth/classroom.rosters" + "https://www.googleapis.com/auth/classroom.topics" + "https://www.googleapis.com/auth/classroom.guardianlinks.students" + "https://www.googleapis.com/auth/classroom.coursework.students" +) + +if [ -z "$CLIENT_ID_FILE" ]; then + echo "CLIENT_ID_FILE environment not set. Please set and run again." + exit 1 +fi + +if [ ! -f "$CLIENT_ID_FILE" ]; then + echo "$CLIENT_ID_FILE not found." + exit 1 +fi + +printf -v EXPANDED_SCOPES '%s,' "${SCOPES[@]}" +gcloud auth application-default login \ + --client-id-file="$CLIENT_ID_FILE" \ + --scopes="${EXPANDED_SCOPES}" + +cat "${HOME}/.config/gcloud/application_default_credentials.json" \ No newline at end of file diff --git a/.github/scripts/test.sh b/.github/scripts/test.sh new file mode 100755 index 00000000..cab34629 --- /dev/null +++ b/.github/scripts/test.sh @@ -0,0 +1,41 @@ +#! /bin/bash +# Copyright 2020 Google LLC +# +# 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. + +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 +export GOOGLE_APPLICATION_CREDENTIALS="${HOME}/secrets/default_credentials.json" +export SERVICE_ACCOUNT_CREDENTIALS="${HOME}/secrets/service_account.json" + +dirs=() + +IFS=$'\n' read -r -d '' -a dirs < <( find . -name 'build.gradle' -exec dirname '{}' \; | sort -u ) + +exit_code=0 + +for dir in "${dirs[@]}"; do + pushd "${dir}" || exit + gradle test + status=$? + if [ $status -ne 0 ]; then + exit_code=$status + fi + popd || exit +done + +if [ $exit_code -ne 0 ]; then + echo "Tests failed." +fi + +exit $exit_code \ No newline at end of file diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml new file mode 100644 index 00000000..e69de29b diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..88816de2 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: + +jobs: + test: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + # Only run for internal PRs or after a merge + if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + strategy: + matrix: + # TODO - expand matrix once stable + java-version: [11] + steps: + - uses: actions/checkout@v3 + - name: Fetch and Diff PR with base from which it was cloned + if: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin master "${{ github.event.pull_request.base.sha }}" + git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: ${{ matrix.java-version }} + - name: Write test credentials + run: | + mkdir "${HOME}/secrets" + echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" + echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" + echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" + env: + DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} + SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} + CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2.1.1 + with: + gradle-version: 7.4 + - name: Run tests + run: ./.github/scripts/test.sh diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 659b0c58..285a7e99 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -19,6 +19,8 @@ on: pull_request: branches: - master + workflow_dispatch: + jobs: lint: concurrency: diff --git a/drive/snippets/drive_v2/files/document.txt b/drive/snippets/drive_v2/files/document.txt new file mode 100644 index 00000000..e69de29b From 34788fba868059b22b018f637d9106fa8dcd08e0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:39:06 -0600 Subject: [PATCH 075/254] Fix mismatched region tag --- .../snippets/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gmail/snippets/src/main/java/CreateFilter.java | 1 - 2 files changed, 1 deletion(-) create mode 100644 gmail/snippets/gradle/wrapper/gradle-wrapper.jar diff --git a/gmail/snippets/gradle/wrapper/gradle-wrapper.jar b/gmail/snippets/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index f50bcf86..8faea942 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -56,7 +56,6 @@ public static String createNewFilter(String realLabelId) throws IOException { .setApplicationName("Gmail samples") .build(); - // [START createFilter] String labelId = "Label_14"; // ID of the user label to add // [START_EXCLUDE silent] labelId = realLabelId; From 7f78dca6b3ee3d0649457aab36c0747802fb6ae0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:40:15 -0600 Subject: [PATCH 076/254] Delint quickstart --- tasks/quickstart/src/main/java/TasksQuickstart.java | 6 +++--- vault/quickstart/src/main/java/Quickstart.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 3b8abca9..8a522fdd 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.tasks.Tasks; import com.google.api.services.tasks.TasksScopes; @@ -38,7 +38,7 @@ public class TasksQuickstart { private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -81,7 +81,7 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep // Print the first 10 task lists. TaskLists result = service.tasklists().list() - .setMaxResults(10L) + .setMaxResults(10) .execute(); List taskLists = result.getItems(); if (taskLists == null || taskLists.isEmpty()) { diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 36b2a8c2..21188873 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -20,7 +20,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.vault.v1.VaultScopes; @@ -46,12 +46,13 @@ public class Quickstart { private static FileDataStoreFactory DATA_STORE_FACTORY; /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = - JacksonFactory.getDefaultInstance(); + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** Global instance of the HTTP transport. */ private static HttpTransport HTTP_TRANSPORT; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** Global instance of the scopes required by this quickstart. * * If modifying these scopes, delete your previously saved credentials From 8bf970d9d33f550f3404f654f0e229b4feec7214 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:42:27 -0600 Subject: [PATCH 077/254] Fix compile errors --- .../drive_v2/src/main/java/CreateDrive.java | 2 +- .../drive_v2/src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v2/src/main/java/FetchChanges.java | 4 ++-- .../drive_v2/src/main/java/ListAppData.java | 2 +- .../drive_v2/src/main/java/MoveFileToFolder.java | 13 +++++++++---- .../drive_v2/src/main/java/TeamDriveSnippets.java | 4 +--- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index 4cdd999c..bf5a82bb 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -54,7 +54,7 @@ private static String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); try { - Drive drive = service.drives().create(requestId, + Drive drive = service.drives().insert(requestId, driveMetadata) .execute(); System.out.println("Drive ID: " + drive.getId()); diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index 9820e21c..a12f9e5d 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -58,7 +58,7 @@ public String fetchAppDataFolder() throws IOException { .setApplicationName("Drive samples") .build(); try { - File file = driveService.files().get("appDataFolder") + File file = service.files().get("appDataFolder") .setFields("id") .execute(); System.out.println("Folder ID: " + file.getId()); diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index 69a7fbb3..deafc9d1 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -55,9 +55,9 @@ private static String fetchChanges(String savedStartPageToken) throws IOExceptio // current token from getStartPageToken() String pageToken = savedStartPageToken; while (pageToken != null) { - ChangeList changes = service.changes().list(pageToken) + ChangeList changes = service.changes().list().setPageToken(pageToken) .execute(); - for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + for (com.google.api.services.drive.model.Change change : changes.getItems()) { // Process change System.out.println("Change found for file: " + change.getFileId()); } diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 704eb9b2..2aa87b7d 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -58,7 +58,7 @@ public FileList listAppData() throws IOException { .setApplicationName("Drive samples") .build(); try { - FileList files = driveService.files().list() + FileList files = service.files().list() .setSpaces("appDataFolder") .setFields("nextPageToken, items(id, title)") .setMaxResults(10) diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index c46e45ab..74b0df73 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -31,14 +31,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /* Class to demonstrate use case for moving file to folder.*/ public class MoveFileToFolder { /** - * @param realFileId Id of file to be moved. - * @param realFolderId Id of folder where the fill will be moved. + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ private static List moveFileToFolder(String fileId, String folderId) @@ -60,7 +62,10 @@ private static List moveFileToFolder(String fileId, String folderId) File file = service.files().get(fileId) .setFields("parents") .execute(); - String parentIds = file.getParents().map(ParentReference::getId); + List parentIds = file.getParents() + .stream() + .map(ParentReference::getId) + .collect(Collectors.toList()); String previousParents = String.join(",", parentIds); try { // Move the file to the new folder @@ -70,7 +75,7 @@ private static List moveFileToFolder(String fileId, String folderId) .setFields("id, parents") .execute(); - List parents = new ArrayList(); + List parents = new ArrayList<>(); for (ParentReference parent : file.getParents()) { parents.add(parent.getId()); } diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java index 7cbdb71a..0a6572b6 100644 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -69,9 +69,7 @@ public List recoverTeamDrives(String realUser) .setSupportsTeamDrives(true) .setFields("id") .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - + System.out.printf("Added organizer permission: %s\n", permissionResult.getId()); } // [START_EXCLUDE silent] teamDrives.addAll(result.getItems()); From 27ad6eb46cf8f6365ed49dedc1509da569c762dd Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Fri, 29 Apr 2022 12:46:24 -0700 Subject: [PATCH 078/254] All Admin-SDK API's quickstarts (#216) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * All Admin-SDK API's quickstarts Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../java/AdminSDKAlertCenterQuickstart.java | 3 +- .../java/AdminSDKDirectoryQuickstart.java | 3 ++ .../main/java/AdminSDKReportsQuickstart.java | 34 ++++++++++------- .../main/java/AdminSDKResellerQuickstart.java | 37 +++++++++++-------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java index ded0d8fe..3df8e3ea 100644 --- a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java +++ b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java @@ -35,8 +35,9 @@ import java.util.List; public class AdminSDKAlertCenterQuickstart { - + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Alert Center API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index a93605db..55ee4899 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -37,8 +37,11 @@ import java.util.List; public class AdminSDKDirectoryQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Directory API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index 2a63f0aa..0c8a9566 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -19,6 +19,7 @@ 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.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; @@ -37,8 +38,11 @@ import java.util.List; public class AdminSDKReportsQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Reports API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -82,20 +86,24 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep // Print the last 10 login events. String userKey = "all"; String applicationName = "login"; - Activities result = service.activities().list(userKey, applicationName) - .setMaxResults(10) - .execute(); - List activities = result.getItems(); - if (activities == null || activities.size() == 0) { - System.out.println("No logins found."); - } else { - System.out.println("Logins:"); - for (Activity activity : activities) { - System.out.printf("%s: %s (%s)\n", - activity.getId().getTime(), - activity.getActor().getEmail(), - activity.getEvents().get(0).getName()); + try { + Activities result = service.activities().list(userKey, applicationName) + .setMaxResults(10) + .execute(); + List activities = result.getItems(); + if (activities == null || activities.size() == 0) { + System.out.println("No logins found."); + } else { + System.out.println("Logins:"); + for (Activity activity : activities) { + System.out.printf("%s: %s (%s)\n", + activity.getId().getTime(), + activity.getActor().getEmail(), + activity.getEvents().get(0).getName()); + } } + }catch (GoogleJsonResponseException ge){ + ge.printStackTrace(); } } } diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index d0f45ff4..6dfdac8c 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -19,6 +19,7 @@ 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.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; @@ -37,8 +38,11 @@ import java.util.List; public class AdminSDKResellerQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Reseller API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -78,22 +82,25 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep Reseller service = new Reseller.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) .setApplicationName(APPLICATION_NAME) .build(); - - // Print the first 10 subscriptions you manage. - Subscriptions result = service.subscriptions().list() - .setMaxResults(10L) - .execute(); - List subscriptions = result.getSubscriptions(); - if (subscriptions == null || subscriptions.size() == 0) { - System.out.println("No subscriptions found."); - } else { - System.out.println("Subscriptions:"); - for (Subscription sub : subscriptions) { - System.out.printf("%s (%s, %s)\n", - sub.getCustomerId(), - sub.getSkuId(), - sub.getPlan().getPlanName()); + try { + // Print the first 10 subscriptions you manage. + Subscriptions result = service.subscriptions().list() + .setMaxResults(10L) + .execute(); + List subscriptions = result.getSubscriptions(); + if (subscriptions == null || subscriptions.size() == 0) { + System.out.println("No subscriptions found."); + } else { + System.out.println("Subscriptions:"); + for (Subscription sub : subscriptions) { + System.out.printf("%s (%s, %s)\n", + sub.getCustomerId(), + sub.getSkuId(), + sub.getPlan().getPlanName()); + } } + }catch (GoogleJsonResponseException ge){ + ge.printStackTrace(); } } } From ba5a8864bacae18296f28cc416379d98172b4073 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 4 May 2022 13:12:51 -0600 Subject: [PATCH 079/254] Move groups settings starter code to github, update to latest client libraries --- .../groups-settings/quickstart/build.gradle | 17 ++++ .../quickstart/settings.gradle | 18 ++++ .../main/java/GroupsSettingsQuickstart.java | 85 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 adminSDK/groups-settings/quickstart/build.gradle create mode 100644 adminSDK/groups-settings/quickstart/settings.gradle create mode 100644 adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle new file mode 100644 index 00000000..34720176 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'GroupsSettingsQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' +} diff --git a/adminSDK/groups-settings/quickstart/settings.gradle b/adminSDK/groups-settings/quickstart/settings.gradle new file mode 100644 index 00000000..a9b08d47 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'Groups Settings Quickstart' diff --git a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java new file mode 100644 index 00000000..e5a69e33 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java @@ -0,0 +1,85 @@ +// Copyright 2018 Google LLC +// +// 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. + +// [START admin_sdk_groups_settings_quickstart] +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.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.groupssettings.Groupssettings; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.List; + +public class GroupsSettingsQuickstart { + private static final String APPLICATION_NAME = "Google Admin SDK Group Settings API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList( + "https://www.googleapis.com/auth/apps.groups.settings"); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { + // Load client secrets. + InputStream in = GroupsSettingsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Groupssettings service = new Groupssettings.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + // TODO(developer) - API is ready to use + System.out.println("API Initialized"); + + } +} +// [END admin_sdk_groups_settings_quickstart] From 423c871bea8f54cd925f7b7fef81351bda33d693 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 5 May 2022 13:07:16 -0600 Subject: [PATCH 080/254] Add API call to groups settings quickstart --- .../src/main/java/GroupsSettingsQuickstart.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java index e5a69e33..a267cd88 100644 --- a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java +++ b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java @@ -24,6 +24,7 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.groupssettings.Groupssettings; +import com.google.api.services.groupssettings.model.Groups; import java.io.FileNotFoundException; import java.io.IOException; @@ -77,9 +78,20 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep .setApplicationName(APPLICATION_NAME) .build(); - // TODO(developer) - API is ready to use - System.out.println("API Initialized"); + // API is ready to use + if (args.length == 0) { + System.out.println("No group email specified."); + return; + } + try { + String groupEmail = args[0]; + Groups settings = service.groups().get(groupEmail).execute(); + System.out.println(String.format("Description: %s", settings.getDescription())); + } catch (Exception e) { + // TODO(developer) - Handle errors + e.printStackTrace(); + } } } // [END admin_sdk_groups_settings_quickstart] From 8e7656b7e2f7f5a6aeaa4d5cd7b70e73473e4f7a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:26:25 -0700 Subject: [PATCH 081/254] Classroom Unit Testcase (#218) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 30af16f4e9bee6cf61c69e899ba7b16371424c52 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:45:13 -0700 Subject: [PATCH 082/254] Drive-v2: file snippets patch-1 UnitTest (#219) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-1 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateFolder.java | 2 +- .../drive_v2/src/main/java/UploadBasic.java | 4 ++-- .../drive_v2/src/test/java/TestCreateFolder.java | 14 ++++++++++++++ .../drive_v2/src/test/java/TestUploadBasic.java | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadBasic.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java index 8bb1b908..169c796d 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -34,7 +34,7 @@ public class CreateFolder { * @return Inserted folder id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String createFolder() throws IOException { + public static String createFolder() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java index 22732967..dc99bb5b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -35,7 +35,7 @@ public class UploadBasic { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadBasic() throws IOException{ + public static String uploadBasic() throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. @@ -61,7 +61,7 @@ private static File uploadBasic() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); - return file; + return file.getId(); } catch (IOException e) { System.out.println("An error occurred: " + e); return null; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..4d744772 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -0,0 +1,14 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateFolder { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..35cdf8a4 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadBasic { + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + } +} From b0367bc77e9232e0dce8792c919a287576ead71c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:46:01 -0700 Subject: [PATCH 083/254] Classroom unit testcase (#221) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Classroom Unit Testcase * Update BaseTest.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- classroom/snippets/build.gradle | 15 +- .../snippets/src/test/java/BaseTest.java | 128 ++++++++---------- .../src/test/java/TestCreateCourse.java | 29 ++++ .../snippets/src/test/java/TestGetCourse.java | 29 ++++ .../src/test/java/TestListCourses.java | 29 ++++ .../src/test/java/TestPatchCourse.java | 29 ++++ .../src/test/java/TestUpdateCourse.java | 29 ++++ 7 files changed, 205 insertions(+), 83 deletions(-) create mode 100644 classroom/snippets/src/test/java/TestCreateCourse.java create mode 100644 classroom/snippets/src/test/java/TestGetCourse.java create mode 100644 classroom/snippets/src/test/java/TestListCourses.java create mode 100644 classroom/snippets/src/test/java/TestPatchCourse.java create mode 100644 classroom/snippets/src/test/java/TestUpdateCourse.java diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index da3d8a86..1f4cdc7b 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -1,20 +1,15 @@ apply plugin: 'java' -apply plugin: 'application' -apply plugin: 'eclipse' - -mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 -version = '1.0' repositories { + // Use 'jcenter' for resolving your dependencies. mavenCentral() } dependencies { - testCompile 'junit:junit:4.11' - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.api-client:google-api-client:1.34.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' + testImplementation 'junit:junit:4.13.2' } test { diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 41064b8e..8fa029f5 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,87 +1,69 @@ -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.http.HttpTransport; -import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.junit.After; +import org.junit.Before; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; +import java.util.UUID; -/** - * Base class for integration tests. - */ -public abstract class BaseTest { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Classroom API Java Snippet Tests"; + // Base class for integration tests. +public class BaseTest { + protected Classroom service; + protected Course testCourse; - /** Directory to store user credentials. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File( - BaseTest.class.getResource("/credentials").toString()); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; + /** + * Creates a default authorization Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException - if credentials file not found. + */ + protected Classroom buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - /** Global instance of the scopes required by this quickstart. */ - private static final List SCOPES = - Arrays.asList("https://www.googleapis.com/auth/classroom.courses", - "https://www.googleapis.com/auth/classroom.rosters"); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom Snippets") + .build(); - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.out.print(true); - System.exit(1); - } + return service; } - /** - * Creates an authorized Credential object. - * - * @return an authorized Credential object. - * @throws IOException - */ - private Credential authorize() throws IOException { - // Load client secrets. - InputStream in = BaseTest.class.getResourceAsStream("/client_secret.json"); - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + @Before + public void setup() throws IOException{ + this.service = buildService(); + this.testCourse = CreateCourse.createCourse(); + createAlias(this.testCourse.getId()); + } - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, - JSON_FACTORY, clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline").build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) - .authorize("user"); - return credential; + @After + public void tearDown() throws IOException{ + deleteCourse(this.testCourse.getId()); + this.testCourse = null; } - /** - * Build and return an authorized Classroom client service. - * - * @return an authorized Classroom client service - * @throws IOException - */ - protected Classroom getService() throws IOException { - Credential credential = authorize(); - return new com.google.api.services.classroom.Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, - credential).setApplicationName(APPLICATION_NAME).build(); + public CourseAlias createAlias(String courseId) throws IOException { + String alias = "p:" + UUID.randomUUID(); + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); + return courseAlias; } + + public void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java new file mode 100644 index 00000000..caa70281 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Create Course classroom snippet +public class TestCreateCourse extends BaseTest{ + + @Test + public void testCreateCourse() throws IOException{ + Course course = CreateCourse.createCourse(); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java new file mode 100644 index 00000000..a17cf197 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Get Course classroom snippet +public class TestGetCourse extends BaseTest{ + + @Test + public void testGetCourse() throws IOException { + Course course = GetCourse.getCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java new file mode 100644 index 00000000..55a3a1fc --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; +import java.util.List; + +// Unit test class for List Course classroom snippet +public class TestListCourses { + + @Test + public void testListCourses() throws IOException { + List courses = ListCourses.listCourses(); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java new file mode 100644 index 00000000..3cf341c8 --- /dev/null +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Patch Course classroom snippet +public class TestPatchCourse extends BaseTest{ + + @Test + public void testPatchCourse() throws IOException { + Course course = PatchCourse.patchCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java new file mode 100644 index 00000000..3926443e --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Update Course classroom snippet +public class TestUpdateCourse extends BaseTest{ + + @Test + public void testUpdateCourse() throws IOException { + Course course = UpdateCourse.updateCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} From 3f49c5a9f5f01ffdc8ea9b9ca03015cb7888c2b2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:02:22 -0700 Subject: [PATCH 084/254] Drive-v2: file snippets patch-2 UnitTest (#222) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-2 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateShortcut.java | 3 ++- .../drive_v2/src/main/java/TouchFile.java | 2 +- .../drive_v2/src/main/java/UploadToFolder.java | 2 +- .../src/test/java/TestCreateShortcut.java | 15 +++++++++++++++ .../drive_v2/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 18 ++++++++++++++++++ 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestTouchFile.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java index 9e02dc20..35393483 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -34,7 +34,7 @@ public class CreateShortcut { * Creates shortcut for file. * @throws IOException if service account credentials file not found. */ - private static void createShortcut() throws IOException{ + public static String createShortcut() throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ @@ -57,6 +57,7 @@ private static void createShortcut() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create shortcut: " + e.getDetails()); diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java index 4a9e56e0..31ee8f82 100644 --- a/drive/snippets/drive_v2/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -38,7 +38,7 @@ public class TouchFile { * @return long file's latest modification date value. * @throws IOException if service account credentials file not found. * */ - private static long touchFile(String realFileId, long realTimestamp) + public static long touchFile(String realFileId, long realTimestamp) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java index 6348be81..ac0f156d 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -38,7 +38,7 @@ public class UploadToFolder { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadToFolder(String realFolderId) throws IOException { + public static File uploadToFolder(String realFolderId) throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..a9aec655 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateShortcut extends BaseTest{ + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..3280bcbb --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestTouchFile extends BaseTest{ + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..6dceb63b --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertTrue; + +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} From 14da45bc2313f60e09a60ee46574c0fa89ab4656 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:02:41 -0700 Subject: [PATCH 085/254] Drive-v2: file snippets patch-3 UnitTest (#223) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-3 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/MoveFileToFolder.java | 2 +- .../src/main/java/UploadRevision.java | 2 +- .../src/test/java/TestMoveFileToFolder.java | 22 +++++++++++++++++++ .../src/test/java/TestUploadRevision.java | 18 +++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadRevision.java diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index 74b0df73..c45ba0e2 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -43,7 +43,7 @@ public class MoveFileToFolder { * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ - private static List moveFileToFolder(String fileId, String folderId) + public static List moveFileToFolder(String fileId, String folderId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java index 4f4af5a5..c9fccd93 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -37,7 +37,7 @@ public class UploadRevision { * @return Inserted file ID if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadRevision(String realFileId) throws IOException{ + public static String uploadRevision(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..b563346d --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,22 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class TestMoveFileToFolder extends BaseTest{ + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } + +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..77682baa --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class TestUploadRevision extends BaseTest{ + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} From bca85648e1e2d47d794145325c4025be5061acf2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:03:14 -0700 Subject: [PATCH 086/254] Drive-v2: file snippets patch-4 UnitTest (#224) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-4 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/ExportPdf.java | 2 +- .../src/main/java/UploadWithConversion.java | 2 +- .../drive_v2/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestExportPdf.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java index fbc5f047..16d86539 100644 --- a/drive/snippets/drive_v2/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -37,7 +37,7 @@ public class ExportPdf { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java index 52cab884..36602e10 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -37,7 +37,7 @@ public class UploadWithConversion { * @return Inserted file id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadWithConversion() throws IOException { + public static String uploadWithConversion() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..f8741feb --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestExportPdf extends BaseTest{ + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..a3d69c52 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadWithConversion extends BaseTest{ + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 454a5d887f7ce105d4438eebe5ae19d266ba7d3a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:03:38 -0700 Subject: [PATCH 087/254] Drive-v2: file snippets patch-5 UnitTest (#225) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-5 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/DownloadFile.java | 2 +- .../drive_v2/src/main/java/SearchFile.java | 2 +- .../drive_v2/src/main/java/ShareFile.java | 2 +- .../src/test/java/TestDownloadFile.java | 18 ++++++++++++++++++ .../src/test/java/TestSearchFiles.java | 18 ++++++++++++++++++ .../drive_v2/src/test/java/TestShareFile.java | 17 +++++++++++++++++ 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestDownloadFile.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestSearchFiles.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestShareFile.java diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java index 8cf14a80..0931acc5 100644 --- a/drive/snippets/drive_v2/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -37,7 +37,7 @@ public class DownloadFile { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java index bc6a3989..242c575b 100644 --- a/drive/snippets/drive_v2/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -37,7 +37,7 @@ public class SearchFile { * @return search result list. * @throws IOException if service account credentials file not found. */ - private static List searchFile() throws IOException{ + public static List searchFile() throws IOException{ /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java index a78e6baa..1b423722 100644 --- a/drive/snippets/drive_v2/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -44,7 +44,7 @@ public class ShareFile { * @return list of modified permissions if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..2c4806f6 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestDownloadFile extends BaseTest{ + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..48a8b818 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestSearchFiles extends BaseTest{ + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java new file mode 100644 index 00000000..746ef71a --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TestShareFile extends BaseTest{ + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} From 1a78adfa6239aacb562a09f56f7472eaf5023465 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:04:01 -0700 Subject: [PATCH 088/254] Drive-v2: AppData snippets UnitTest (#226) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: AppData snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v3/src/main/java/ListAppData.java | 2 +- .../drive_v3/src/main/java/UploadAppData.java | 2 +- .../src/test/java/TestFetchAppDataFolder.java | 14 ++++++++++++++ .../drive_v3/src/test/java/TestListAppData.java | 17 +++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 16 ++++++++++++++++ 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestListAppData.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java index 4f3a00b2..dd00bdf4 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -33,7 +33,7 @@ public class FetchAppDataFolder { * Fetches appDataFolder and prints it's folder id. * @return Application data folder's ID. */ - public String fetchAppDataFolder() throws IOException { + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java index f9023fd8..1f611d3c 100644 --- a/drive/snippets/drive_v3/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -34,7 +34,7 @@ public class ListAppData { * list down files in the application data folder. * @return list of 10 files. */ - public FileList listAppData() throws IOException { + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java index 7aac8c0b..8192f009 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -35,7 +35,7 @@ public class UploadAppData { * Creates a file in the application data folder. * @return Created file's Id. */ - private static String uploadAppData() throws IOException { + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java new file mode 100644 index 00000000..4049e5f6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -0,0 +1,14 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestFetchAppDataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java new file mode 100644 index 00000000..52544bfd --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -0,0 +1,17 @@ +import com.google.api.services.drive.model.FileList; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotEquals; + +public class TestListAppData extends BaseTest{ + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..67e2d13c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadAppdata extends BaseTest{ + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 50ce84b406943f91b42c29312eec09351b98f5fe Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 31 May 2022 15:24:28 -0700 Subject: [PATCH 089/254] Test drive v2 change snippets (#229) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Change snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/FetchChanges.java | 2 +- .../src/main/java/FetchStartPageToken.java | 2 +- .../src/test/java/TestFetchChanges.java | 17 +++++++++++++++++ .../src/test/java/TestFetchStartPageToken.java | 13 +++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchChanges.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index deafc9d1..3ff6e584 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -35,7 +35,7 @@ public class FetchChanges { * @return Saved token after last page. * @throws IOException if file is not found */ - private static String fetchChanges(String savedStartPageToken) throws IOException { + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java index 060cccd7..c77419a6 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -35,7 +35,7 @@ public class FetchStartPageToken { * @return Start page token as String. * @throws IOException if file is not found */ - private static String fetchStartPageToken() throws IOException { + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..b5a60ee3 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TestFetchChanges extends BaseTest{ + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..701ee971 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,13 @@ +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +public class TestFetchStartPageToken extends BaseTest{ + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} From 461d14725c396672ce69a11b10bc8c35bad90c44 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 31 May 2022 15:25:10 -0700 Subject: [PATCH 090/254] Sheets testcase (#228) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Sheets unit testcase * Sheets unit testcase * Update Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- sheets/snippets/build.gradle | 6 +- sheets/snippets/src/main/java/Create.java | 2 +- .../src/main/java/SpreadsheetSnippets.java | 297 ------------------ sheets/snippets/src/test/java/BaseTest.java | 108 ++----- .../test/java/SpreadsheetSnippetsTest.java | 121 ------- .../src/test/java/TestAppendValues.java | 42 +++ .../src/test/java/TestBatchGetValues.java | 39 +++ .../src/test/java/TestBatchUpdate.java | 37 +++ .../src/test/java/TestBatchUpdateValues.java | 40 +++ .../test/java/TestConditionalFormatting.java | 33 ++ sheets/snippets/src/test/java/TestCreate.java | 28 ++ .../snippets/src/test/java/TestGetValues.java | 34 ++ .../src/test/java/TestPivotTable.java | 16 + .../src/test/java/TestUpdateValues.java | 38 +++ 14 files changed, 336 insertions(+), 505 deletions(-) delete mode 100644 sheets/snippets/src/main/java/SpreadsheetSnippets.java delete mode 100644 sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java create mode 100644 sheets/snippets/src/test/java/TestAppendValues.java create mode 100644 sheets/snippets/src/test/java/TestBatchGetValues.java create mode 100644 sheets/snippets/src/test/java/TestBatchUpdate.java create mode 100644 sheets/snippets/src/test/java/TestBatchUpdateValues.java create mode 100644 sheets/snippets/src/test/java/TestConditionalFormatting.java create mode 100644 sheets/snippets/src/test/java/TestCreate.java create mode 100644 sheets/snippets/src/test/java/TestGetValues.java create mode 100644 sheets/snippets/src/test/java/TestPivotTable.java create mode 100644 sheets/snippets/src/test/java/TestUpdateValues.java diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 56829c60..6988f011 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,9 +5,9 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java index 19060bba..bf4e0c6b 100644 --- a/sheets/snippets/src/main/java/Create.java +++ b/sheets/snippets/src/main/java/Create.java @@ -36,7 +36,7 @@ public class Create { * @return newly created spreadsheet id * @throws IOException - if credentials file not found. */ - public static String create(String title) throws IOException { + public static String createSpreadsheet(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java deleted file mode 100644 index 9b37346f..00000000 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.*; -import com.google.common.collect.Lists; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpreadsheetSnippets { - private Sheets service; - - public SpreadsheetSnippets(Sheets service) { - this.service = service; - } - - public String create(String title) throws IOException { - Sheets service = this.service; - // [START sheets_create] - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle(title)); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - // [END sheets_create] - return spreadsheet.getSpreadsheetId(); - } - - public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String title, - String find, String replacement) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update] - List requests = new ArrayList<>(); - // Change the spreadsheet's title. - requests.add(new Request() - .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() - .setProperties(new SpreadsheetProperties() - .setTitle(title)) - .setFields("title"))); - // Find and replace text. - requests.add(new Request() - .setFindReplace(new FindReplaceRequest() - .setFind(find) - .setReplacement(replacement) - .setAllSheets(true))); - // Add additional requests (operations) ... - - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(requests); - BatchUpdateSpreadsheetResponse response = - service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); - FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); - System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - // [END sheets_batch_update] - return response; - } - - public ValueRange getValues(String spreadsheetId, String range) throws IOException { - Sheets service = this.service; - // [START sheets_get_values] - ValueRange result = service.spreadsheets().values().get(spreadsheetId, range).execute(); - int numRows = result.getValues() != null ? result.getValues().size() : 0; - System.out.printf("%d rows retrieved.", numRows); - // [END sheets_get_values] - return result; - } - - public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_get_values] - List ranges = Arrays.asList( - //Range names ... - ); - // [START_EXCLUDE silent] - ranges = _ranges; - // [END_EXCLUDE] - BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) - .setRanges(ranges).execute(); - System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - // [END sheets_batch_get_values] - return result; - } - public UpdateValuesResponse updateValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - UpdateValuesResponse result = - service.spreadsheets().values().update(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells updated.", result.getUpdatedCells()); - // [END sheets_update_values] - return result; - } - - public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String range, - String valueInputOption, - List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - List data = new ArrayList<>(); - data.add(new ValueRange() - .setRange(range) - .setValues(values)); - // Additional ranges to update ... - - BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() - .setValueInputOption(valueInputOption) - .setData(data); - BatchUpdateValuesResponse result = - service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); - System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - // [END sheets_batch_update_values] - return result; - } - - public AppendValuesResponse appendValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_append_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - AppendValuesResponse result = - service.spreadsheets().values().append(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - // [END sheets_append_values] - return result; - } - - public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { - Sheets service = this.service; - - // Create two sheets for our pivot table. - List sheetsRequests = new ArrayList<>(); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - - BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(sheetsRequests); - BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() - .batchUpdate(spreadsheetId, createSheetsBody).execute(); - int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() - .getSheetId(); - int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() - .getSheetId(); - - // [START sheets_pivot_tables] - PivotTable pivotTable = new PivotTable() - .setSource( - new GridRange() - .setSheetId(sourceSheetId) - .setStartRowIndex(0) - .setStartColumnIndex(0) - .setEndRowIndex(20) - .setEndColumnIndex(7) - ) - .setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(1) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(4) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(4) - )); - List requests = Lists.newArrayList(); - Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() - .setFields("*") - .setRows(Collections.singletonList( - new RowData().setValues( - Collections.singletonList( - new CellData().setPivotTable(pivotTable)) - ) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) - - )); - - requests.add(updateCellsRequest); - BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, updateCellsBody).execute(); - // [END sheets_pivot_tables] - return result; - } - - public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) - throws IOException { - // [START sheets_conditional_formatting] - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor( - new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) - ) - ); - - BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - System.out.printf("%d cells updated.", result.getReplies().size()); - // [END sheets_conditional_formatting] - return result; - } -} diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 34ff8dad..12a1db27 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -1,120 +1,62 @@ -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.json.jackson2.JacksonFactory; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; import com.google.api.services.sheets.v4.model.CellData; import com.google.api.services.sheets.v4.model.ExtendedValue; import com.google.api.services.sheets.v4.model.GridRange; import com.google.api.services.sheets.v4.model.RepeatCellRequest; import com.google.api.services.sheets.v4.model.Request; -import com.google.api.services.sheets.v4.model.Spreadsheet; -import com.google.api.services.sheets.v4.model.SpreadsheetProperties; import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; + +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; public class BaseTest { - static { - enableLogging(); - } - protected Sheets service; protected Drive driveService; - protected Set filesToDelete = new HashSet<>(); - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE); + return credentials; } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); - } - - public Sheets buildService(GoogleCredential credential) throws IOException, - GeneralSecurityException { + public Sheets buildService(GoogleCredentials credentials){ return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Drive buildDriveService(GoogleCredentials credentials) { return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } @Before - public void setup() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); this.service = buildService(credential); this.driveService = buildDriveService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } - } - - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); } - protected String createTestSpreadsheet() throws IOException { - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle("Test Spreadsheet")); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - return spreadsheet.getSpreadsheetId(); + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); } protected void populateValuesWithStrings(String spreadsheetId) throws IOException { diff --git a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java b/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java deleted file mode 100644 index 9e632720..00000000 --- a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java +++ /dev/null @@ -1,121 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.sheets.v4.model.*; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SpreadsheetSnippetsTest extends BaseTest { - private SpreadsheetSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new SpreadsheetSnippets(this.service); - } - - @Test - public void testCreate() throws IOException { - String id = this.snippets.create("Title"); - assertNotNull(id); - this.deleteFileOnCleanup(id); - } - - @Test - public void testBatchUpdate() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); - List replies = response.getReplies(); - assertEquals(2, replies.size()); - FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); - assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); - } - - @Test - public void testConditionalFormat() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithNumbers(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.conditionalFormat(spreadsheetId); - assertEquals(spreadsheetId, response.getSpreadsheetId()); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - ValueRange result = this.snippets.getValues(spreadsheetId, "A1:C2"); - List> values = result.getValues(); - assertEquals(2, values.size()); - assertEquals(3, values.get(0).size()); - } - - @Test - public void testBatchGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List ranges = Arrays.asList("A1:A3", "B1:C1"); - BatchGetValuesResponse result = this.snippets.batchGetValues(spreadsheetId, ranges); - List valueRanges = result.getValueRanges(); - assertEquals(2, valueRanges.size()); - List> values = valueRanges.get(0).getValues(); - assertEquals(3, values.size()); - } - - @Test - public void testUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - UpdateValuesResponse result = - this.snippets.updateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(2, result.getUpdatedRows().intValue()); - assertEquals(2, result.getUpdatedColumns().intValue()); - assertEquals(4, result.getUpdatedCells().intValue()); - } - - @Test - public void testBatchUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - BatchUpdateValuesResponse result = - this.snippets.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(1, result.getResponses().size()); - assertEquals(2, result.getTotalUpdatedRows().intValue()); - assertEquals(2, result.getTotalUpdatedColumns().intValue()); - assertEquals(4, result.getTotalUpdatedCells().intValue()); - } - - @Test - public void testAppendValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - AppendValuesResponse result = - this.snippets.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals("Sheet1!A1:J10", result.getTableRange()); - UpdateValuesResponse updates = result.getUpdates(); - assertEquals(2, updates.getUpdatedRows().intValue()); - assertEquals(2, updates.getUpdatedColumns().intValue()); - assertEquals(4, updates.getUpdatedCells().intValue()); - } - - @Test - public void testPivotTable() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - BatchUpdateSpreadsheetResponse result = this.snippets.pivotTables(spreadsheetId); - assertNotNull(result); - } -} diff --git a/sheets/snippets/src/test/java/TestAppendValues.java b/sheets/snippets/src/test/java/TestAppendValues.java new file mode 100644 index 00000000..489218f8 --- /dev/null +++ b/sheets/snippets/src/test/java/TestAppendValues.java @@ -0,0 +1,42 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet append values snippet +public class TestAppendValues extends BaseTest{ + + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchGetValues.java b/sheets/snippets/src/test/java/TestBatchGetValues.java new file mode 100644 index 00000000..d23e5582 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchGetValues.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch get values snippet +public class TestBatchGetValues extends BaseTest{ + + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, + ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdate.java b/sheets/snippets/src/test/java/TestBatchUpdate.java new file mode 100644 index 00000000..5dc5799f --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdate.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Response; +import org.junit.Test; +import java.io.IOException; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch update snippet +public class TestBatchUpdate extends BaseTest{ + + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdateValues.java b/sheets/snippets/src/test/java/TestBatchUpdateValues.java new file mode 100644 index 00000000..e17646d2 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.BatchUpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch update values snippet +public class TestBatchUpdateValues extends BaseTest { + + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java new file mode 100644 index 00000000..5d094165 --- /dev/null +++ b/sheets/snippets/src/test/java/TestConditionalFormatting.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet conditional formatting snippet +public class TestConditionalFormatting extends BaseTest { + + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + ConditionalFormatting.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java new file mode 100644 index 00000000..c75f0f4f --- /dev/null +++ b/sheets/snippets/src/test/java/TestCreate.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for create spreadsheet snippet +public class TestCreate extends BaseTest{ + + @Test + public void testCreate() throws IOException { + String id = Create.createSpreadsheet("Test Spreadsheet"); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/sheets/snippets/src/test/java/TestGetValues.java b/sheets/snippets/src/test/java/TestGetValues.java new file mode 100644 index 00000000..ed640bfb --- /dev/null +++ b/sheets/snippets/src/test/java/TestGetValues.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.ValueRange; +import org.junit.Test; +import java.io.IOException; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet get values snippet +public class TestGetValues extends BaseTest{ + + @Test + public void testGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java new file mode 100644 index 00000000..84c1b043 --- /dev/null +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -0,0 +1,16 @@ +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for spreadsheet pivot table snippet +public class TestPivotTable extends BaseTest{ + + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); + assertNotNull(result); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestUpdateValues.java b/sheets/snippets/src/test/java/TestUpdateValues.java new file mode 100644 index 00000000..133cb48d --- /dev/null +++ b/sheets/snippets/src/test/java/TestUpdateValues.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.sheets.v4.model.UpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet update values snippet +public class TestUpdateValues extends BaseTest{ + + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, + "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} From 83f0a162003b8f0c2bac2d20df75b7ef72ce8a54 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:02:59 -0700 Subject: [PATCH 091/254] Test drive v2 drive snippets (#230) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateDrive.java | 4 +- .../drive_v2/src/main/java/RecoverDrive.java | 2 +- .../drive_v2/src/test/java/BaseTest.java | 43 ++++++++++++------- .../src/test/java/TestCreateDrive.java | 15 +++++++ .../src/test/java/TestRecoverDrives.java | 33 ++++++++++++++ 5 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateDrive.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index bf5a82bb..70da1fe3 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -31,11 +31,11 @@ public class CreateDrive { /** - * @param + * Create a drive. * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createDrive() throws IOException { + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index cf56f346..038f1a57 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -39,7 +39,7 @@ public class RecoverDrive { * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - private static List recoverDrives(String realUser) + public static List recoverDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index 0bfcdc19..d3851aed 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -1,8 +1,8 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpTransport; -import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; @@ -51,22 +51,33 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); } - public Drive buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Drive.Builder( - //new ApacheHttpTransport(), - //GoogleNetHttpTransport.newTrustedTransport(), - new NetHttpTransport(), + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), - //GsonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; } @Before diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..dee4bc33 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateDrive extends BaseTest{ + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..d8b246a2 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -0,0 +1,33 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestRecoverDrives extends BaseTest{ + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} From 0d0c69352d1b4ff20174ff5f1a8487f8a3942938 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:06:38 -0700 Subject: [PATCH 092/254] Drive-v2: Team-Drive snippets UnitTest (#232) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Team-Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateTeamDrive.java | 2 +- .../src/main/java/RecoverTeamDrive.java | 2 +- .../src/test/java/TestCreateTeamDrive.java | 15 +++++++++ .../src/test/java/TestRecoverTeamDrives.java | 32 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java index 2a1e324e..8dad2711 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -35,7 +35,7 @@ public class CreateTeamDrive { * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createTeamDrive() throws IOException { + public static String createTeamDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java index 0d8dd337..a11d4a24 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -39,7 +39,7 @@ public class RecoverTeamDrive { * @return All team drives without an organizer. * @throws IOException if service account credentials file not found. */ - private static List recoverTeamDrives(String realUser) throws IOException { + public static List recoverTeamDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java new file mode 100644 index 00000000..bca94def --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateTeamDrive extends BaseTest{ + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = CreateTeamDrive.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java new file mode 100644 index 00000000..41399754 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -0,0 +1,32 @@ +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import com.google.api.services.drive.model.TeamDrive; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestRecoverTeamDrives extends BaseTest{ + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = RecoverTeamDrive.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = CreateTeamDrive.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} From bb59d2e17d7204f5155b7062ed7331c539b67991 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:07:05 -0700 Subject: [PATCH 093/254] Drive-v3: File snippets UnitTest patch1 (#233) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch1 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/UploadBasic.java | 4 ++-- .../drive_v3/src/main/java/UploadRevision.java | 2 +- .../src/test/java/TestUploadBasic.java | 15 +++++++++++++++ .../src/test/java/TestUploadRevision.java | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadBasic.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadRevision.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java index 4a83ebfe..65b30ad3 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -36,7 +36,7 @@ public class UploadBasic { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadBasic() throws IOException{ + public static String uploadBasic() throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. @@ -62,7 +62,7 @@ private static File uploadBasic() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); - return file; + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to upload file: " + e.getDetails()); diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java index 97b5fb34..93e1c4f5 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -37,7 +37,7 @@ public class UploadRevision { * @return Inserted file ID if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadRevision(String realFileId) throws IOException{ + public static String uploadRevision(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..c301131c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadBasic extends BaseTest{ + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..77682baa --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class TestUploadRevision extends BaseTest{ + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} From 05736e82e407e54a82a26819cf563564fbbeda56 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:08:05 -0700 Subject: [PATCH 094/254] Gmail unit testcase (#234) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Gmail-snippets * Gmail unit testcase * Gmail unit testcase * Gmail snippet * Gmail snippet * Gmail snippet * Gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/build.gradle | 14 +- gmail/snippets/src/main/java/CreateDraft.java | 23 +- .../main/java/CreateDraftWithAttachment.java | 24 +- gmail/snippets/src/main/java/CreateEmail.java | 53 +++ .../snippets/src/main/java/CreateFilter.java | 28 +- .../snippets/src/main/java/CreateMessage.java | 45 ++ .../src/main/java/EnableAutoReply.java | 20 +- .../src/main/java/EnableForwarding.java | 17 +- .../src/main/java/InsertCertFromCsv.java | 5 +- .../src/main/java/InsertSmimeInfo.java | 20 +- gmail/snippets/src/main/java/SendMessage.java | 18 +- .../main/java/SendMessageWithAttachment.java | 19 +- .../src/main/java/UpdateSignature.java | 19 +- .../src/main/java/UpdateSmimeCerts.java | 14 +- .../src/main/java/UpdateSmimeFromCsv.java | 4 +- gmail/snippets/src/test/java/BaseTest.java | 92 +--- .../snippets/src/test/java/SendEmailTest.java | 70 ---- .../src/test/java/SettingsSnippetsTest.java | 82 ---- .../src/test/java/SmimeSnippetsTest.java | 392 ------------------ .../src/test/java/TestCreateDraft.java | 31 ++ .../java/TestCreateDraftWithAttachment.java | 33 ++ .../src/test/java/TestCreateEmail.java | 37 ++ .../src/test/java/TestCreateFilter.java | 11 +- .../src/test/java/TestCreateMessage.java | 35 ++ .../src/test/java/TestCreateSmimeInfo.java | 1 + .../src/test/java/TestEnableAutoReply.java | 10 +- .../src/test/java/TestEnableForwarding.java | 6 +- .../src/test/java/TestInsertCertFromCsv.java | 102 +++++ .../src/test/java/TestInsertSmimeInfo.java | 117 ++++++ .../src/test/java/TestSendMessage.java | 30 ++ .../java/TestSendMessageWithAttachment.java | 34 ++ .../src/test/java/TestUpdateSignature.java | 5 +- .../src/test/java/TestUpdateSmimeCerts.java | 270 ++++++++++++ .../src/test/java/TestUpdateSmimeFromCsv.java | 140 +++++++ 34 files changed, 1079 insertions(+), 742 deletions(-) create mode 100644 gmail/snippets/src/main/java/CreateEmail.java create mode 100644 gmail/snippets/src/main/java/CreateMessage.java delete mode 100644 gmail/snippets/src/test/java/SendEmailTest.java delete mode 100644 gmail/snippets/src/test/java/SettingsSnippetsTest.java delete mode 100644 gmail/snippets/src/test/java/SmimeSnippetsTest.java create mode 100644 gmail/snippets/src/test/java/TestCreateDraft.java create mode 100644 gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java create mode 100644 gmail/snippets/src/test/java/TestCreateEmail.java create mode 100644 gmail/snippets/src/test/java/TestCreateMessage.java create mode 100644 gmail/snippets/src/test/java/TestInsertCertFromCsv.java create mode 100644 gmail/snippets/src/test/java/TestInsertSmimeInfo.java create mode 100644 gmail/snippets/src/test/java/TestSendMessage.java create mode 100644 gmail/snippets/src/test/java/TestSendMessageWithAttachment.java create mode 100644 gmail/snippets/src/test/java/TestUpdateSmimeCerts.java create mode 100644 gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index bf1befca..85351fa9 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,14 +5,10 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' - implementation 'com.google.code.gson:gson:2.4' - implementation 'javax.mail:mail:1.4' - implementation 'org.apache.commons:commons-csv:1.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' + implementation 'javax.mail:mail:1.4.7' + implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.hamcrest:hamcrest-all:1.3' - //testImplementation 'org.mockito:mockito-core:4.2.0' - testImplementation 'org.mockito:mockito-inline:4.3.1' + testImplementation 'org.mockito:mockito-inline:4.5.1' } diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java index 087cf3ba..683119c8 100644 --- a/gmail/snippets/src/main/java/CreateDraft.java +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -14,6 +14,7 @@ // [START gmail_create_draft] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -32,7 +33,6 @@ import javax.mail.internet.MimeMessage; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Collections; import java.util.Properties; /* Class to demonstrate the use of Gmail Create Draft API */ @@ -42,16 +42,16 @@ public class CreateDraft { * * @param fromEmailAddress - Email address to appear in the from: header * @param toEmailAddress - Email address of the recipient - * @return the created draft - * @throws MessagingException - * @throws IOException + * @return the created draft, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. */ public static Draft createDraftMessage(String fromEmailAddress, String toEmailAddress) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_COMPOSE); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -95,9 +95,14 @@ public static Draft createDraftMessage(String fromEmailAddress, return draft; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create draft: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to create draft: " + e.getMessage()); + } else { + throw e; + } } + return null; } } // [END gmail_create_draft] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java index 626299e0..b7b2144d 100644 --- a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -14,6 +14,7 @@ // [START gmail_create_draft_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -45,12 +46,12 @@ /* Class to demonstrate the use of Gmail Create Draft with attachment API */ public class CreateDraftWithAttachment { /** - * Create a draft email. + * Create a draft email with attachment. * * @param fromEmailAddress - Email address to appear in the from: header. * @param toEmailAddress - Email address of the recipient. * @param file - Path to the file to be attached. - * @return the created draft + * @return the created draft, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ @@ -58,11 +59,11 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, String toEmailAddress, File file) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped( - GmailScopes.GMAIL_COMPOSE); + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_COMPOSE); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -114,9 +115,14 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, return draft; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create draft: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403){ + System.err.println("Unable to create draft: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_create_draft_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/CreateEmail.java b/gmail/snippets/src/main/java/CreateEmail.java new file mode 100644 index 00000000..5a9b3497 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateEmail.java @@ -0,0 +1,53 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + +// [START gmail_create_email] +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Email API */ +public class CreateEmail { + + /** + * Create a MimeMessage using the parameters provided. + * + * @param toEmailAddress email address of the receiver + * @param fromEmailAddress email address of the sender, the mailbox account + * @param subject subject of the email + * @param bodyText body text of the email + * @return the MimeMessage to be used to send email + * @throws MessagingException - if a wrongly formatted address is encountered. + */ + public static MimeMessage createEmail(String toEmailAddress, + String fromEmailAddress, + String subject, + String bodyText) + throws MessagingException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(subject); + email.setText(bodyText); + return email; + } +} +// [END gmail_create_email] diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index 8faea942..354eafbf 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -14,6 +14,7 @@ // [START gmail_create_filter] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -33,20 +34,17 @@ public class CreateFilter { /** * Create a new filter. * - * @param realLabelId - ID of the user label to add - * @return the created filter id + * @param labelId - ID of the user label to add + * @return the created filter id, {@code null} otherwise. * @throws IOException - if service account credentials file not found. */ - public static String createNewFilter(String realLabelId) throws IOException { - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - + public static String createNewFilter(String labelId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_LABELS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -56,11 +54,6 @@ public static String createNewFilter(String realLabelId) throws IOException { .setApplicationName("Gmail samples") .build(); - String labelId = "Label_14"; // ID of the user label to add - // [START_EXCLUDE silent] - labelId = realLabelId; - // [END_EXCLUDE] - try { // Filter the mail from sender and archive them(skip the inbox) Filter filter = new Filter() @@ -76,9 +69,14 @@ public static String createNewFilter(String realLabelId) throws IOException { return result.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create filter: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to create filter: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_create_filter] diff --git a/gmail/snippets/src/main/java/CreateMessage.java b/gmail/snippets/src/main/java/CreateMessage.java new file mode 100644 index 00000000..c5e43d86 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateMessage.java @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + +// [START gmail_create_message] +import com.google.api.services.gmail.model.Message; +import org.apache.commons.codec.binary.Base64; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/* Class to demonstrate the use of Gmail Create Message API */ +public class CreateMessage { + + /** + * Create a message from an email. + * + * @param emailContent Email to be set to raw of message + * @return a message containing a base64url encoded email + * @throws IOException - if service account credentials file not found. + * @throws MessagingException - if a wrongly formatted address is encountered. + */ + public static Message createMessageWithEmail(MimeMessage emailContent) + throws MessagingException, IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + emailContent.writeTo(buffer); + byte[] bytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(bytes); + Message message = new Message(); + message.setRaw(encodedEmail); + return message; + } +} +// [END gmail_create_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index 9453cb6c..8cff0c9a 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -14,6 +14,7 @@ // [START gmail_enable_auto_reply] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -38,15 +39,11 @@ public class EnableAutoReply { * @throws IOException - if service account credentials file not found. */ public static VacationSettings autoReply() throws IOException{ - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -74,9 +71,14 @@ public static VacationSettings autoReply() throws IOException{ return response; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to enable auto reply: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to enable auto reply: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_enable_auto_reply] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index a4357275..c18183bd 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -14,6 +14,7 @@ // [START gmail_enable_forwarding] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -34,18 +35,14 @@ public class EnableForwarding { * * @param forwardingEmail - Email address of the recipient whose email will be forwarded. * @return forwarding id and metadata, {@code null} otherwise. - * @throws IOException if service account credentials file not found. + * @throws IOException - if service account credentials file not found. */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -72,8 +69,12 @@ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws } } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to enable forwarding : " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to enable forwarding: " + e.getDetails()); + } else { + throw e; + } } return null; } diff --git a/gmail/snippets/src/main/java/InsertCertFromCsv.java b/gmail/snippets/src/main/java/InsertCertFromCsv.java index d31607e0..2259098c 100644 --- a/gmail/snippets/src/main/java/InsertCertFromCsv.java +++ b/gmail/snippets/src/main/java/InsertCertFromCsv.java @@ -43,10 +43,9 @@ public static void insertCertFromCsv(String csvFilename) { SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, certPassword); if (smimeInfo != null) { - InsertSmimeInfo.insertSmimeInfo(certFilename, - certPassword, + InsertSmimeInfo.insertSmimeInfo(userId, userId, - userId); + smimeInfo); } else { System.err.printf("Unable to read certificate file for userId: %s\n", userId); } diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java index 1f598ef2..e686126d 100644 --- a/gmail/snippets/src/main/java/InsertSmimeInfo.java +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -14,6 +14,8 @@ // [START gmail_insert_smime_info] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -31,23 +33,21 @@ public class InsertSmimeInfo { /** * Upload an S/MIME certificate for the user. * - * @param filename Name of the file containing the S/MIME certificate. - * @param password Password for the certificate file, or null if the file - * is not password-protected. * @param userId User's email address. * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @return An SmimeInfo object with details about the uploaded certificate. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. */ - public static SmimeInfo insertSmimeInfo(String filename, - String password, - String userId, - String sendAsEmail) + public static SmimeInfo insertSmimeInfo(String userId, + String sendAsEmail, + SmimeInfo smimeInfo) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -63,7 +63,6 @@ public static SmimeInfo insertSmimeInfo(String filename, } try { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(filename, password); SmimeInfo results = service.users().settings().sendAs().smimeInfo() .insert(userId, sendAsEmail, smimeInfo) .execute(); @@ -72,7 +71,6 @@ public static SmimeInfo insertSmimeInfo(String filename, } catch (IOException e) { System.err.printf("An error occured: %s", e); } - return null; } } diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 7402b122..9e0ec4b7 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -14,6 +14,7 @@ // [START gmail_send_message] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -42,16 +43,16 @@ public class SendMessage { * * @param fromEmailAddress - Email address to appear in the from: header * @param toEmailAddress - Email address of the recipient - * @return the sent message + * @return the sent message, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ public static Message sendEmail(String fromEmailAddress, String toEmailAddress) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_SEND); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -93,9 +94,14 @@ public static Message sendEmail(String fromEmailAddress, return message; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to send message: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_send_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 36c1fb98..29c28ec4 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -14,6 +14,7 @@ // [START gmail_send_message_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -28,7 +29,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.Properties; import javax.activation.DataHandler; @@ -50,7 +50,7 @@ public class SendMessageWithAttachment{ * @param fromEmailAddress - Email address to appear in the from: header. * @param toEmailAddress - Email address of the recipient. * @param file - Path to the file to be attached. - * @return the sent message. + * @return the sent message, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ @@ -58,9 +58,9 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, String toEmailAddress, File file) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_SEND); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -112,9 +112,14 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, return message; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to send message: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_send_message_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index af27e159..ca21e77e 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -14,6 +14,7 @@ // [START gmail_update_signature] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -25,26 +26,21 @@ import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; /* Class to demonstrate the use of Gmail Update Signature API */ public class UpdateSignature { /** * Update the gmail signature. * - * @return the updated signature id + * @return the updated signature id , {@code null} otherwise. * @throws IOException - if service account credentials file not found. */ public static String updateGmailSignature() throws IOException { - // TODO(developer) - Replace with your email address. - String userEmail = "gduser1@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -75,9 +71,14 @@ public static String updateGmailSignature() throws IOException { return result.getSignature(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to update signature: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to update signature: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_update_signature] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java index 2e014a68..cd9ccb2c 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeCerts.java +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -47,7 +47,8 @@ public class UpdateSmimeCerts { * password-protected. * @param expireTime DateTime object against which the certificate expiration is compared. If * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certifcate. + * @return The ID of the default certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. */ public static String updateSmimeCerts(String userId, String sendAsEmail, @@ -59,7 +60,7 @@ public static String updateSmimeCerts(String userId, TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -114,10 +115,11 @@ public static String updateSmimeCerts(String userId, if (defaultCertId == null) { String defaultId = bestCertId; if (defaultId == null && certFilename != null) { - SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(certFilename, - certPassword, - userId, - sendAsEmail); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, + sendAsEmail, + smimeInfo); if (insertResults != null) { defaultId = insertResults.getId(); } diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java index 3f7d3964..efe3052b 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -36,9 +36,7 @@ public class UpdateSmimeFromCsv { public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { try { File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse( - csvFile, + CSVParser parser = CSVParser.parse( csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); for (CSVRecord record : parser) { diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 11f8fbd3..4e287a9f 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,99 +1,49 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpRequestInitializer; -import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.After; import org.junit.Before; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; public class BaseTest { - public static final String TEST_USER = "ci-test01@workspacesamples.dev"; - public static final String RECIPIENT = "gduser01@workspacesamples.dev"; - public static final String FORWARDING_ADDRESS = "gduser01@workspacesamples.dev"; - - static { - enableLogging(); - } + public static final String RECIPIENT = "gduser1@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; protected Gmail service; - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.ALL); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); - } - + /** + * Create a default authorization Gmail client service. + * + * @return an authorized Gmail client service + * @throws IOException - if credentials file not found. + */ public Gmail buildService() throws IOException { - String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); - try (InputStream stream = new FileInputStream(serviceAccountPath)) { - GoogleCredentials credentials = GoogleCredentials.fromStream(stream); - credentials = credentials.createScoped( - "email", - GmailScopes.MAIL_GOOGLE_COM, - GmailScopes.GMAIL_SETTINGS_BASIC, - GmailScopes.GMAIL_COMPOSE, - GmailScopes.GMAIL_SETTINGS_SHARING, - GmailScopes.GMAIL_LABELS).createDelegated(TEST_USER); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - return new Gmail.Builder( - new NetHttpTransport(), + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the Gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Gmail API Snippets") .build(); - } + return service; } @Before public void setupService() throws IOException { this.service = buildService(); } - - public MockedStatic useServiceAccount() throws IOException { - MockedStatic mockedGoogleCredentials; - String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); - try (InputStream stream = new FileInputStream(serviceAccountPath)) { - GoogleCredentials credentials = GoogleCredentials.fromStream(stream); - mockedGoogleCredentials = Mockito.mockStatic(GoogleCredentials.class); - mockedGoogleCredentials.when(GoogleCredentials::getApplicationDefault).thenReturn(credentials); - return mockedGoogleCredentials; - } - } - } diff --git a/gmail/snippets/src/test/java/SendEmailTest.java b/gmail/snippets/src/test/java/SendEmailTest.java deleted file mode 100644 index 6d17129b..00000000 --- a/gmail/snippets/src/test/java/SendEmailTest.java +++ /dev/null @@ -1,70 +0,0 @@ -import com.google.api.services.gmail.model.*; -import org.junit.Test; - -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class SendEmailTest extends BaseTest { - - @Test - public void createEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - assertEquals("test", mimeMessage.getSubject()); - assertEquals("Hello!", mimeMessage.getContent()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } - - @Test - public void createEmailWithAttachment() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, - TEST_USER, - "test", - "Hello!", - new java.io.File("files/photo.jpg")); - assertEquals("test", mimeMessage.getSubject()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } - - @Test - public void createMessageWithEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - - com.google.api.services.gmail.model.Message message = SendEmail.createMessageWithEmail(mimeMessage); - assertNotNull(message.getRaw()); // Weak assertion... - } - - @Test - public void createDraft() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - Draft draft = SendEmail.createDraft(this.service, "me", mimeMessage); - assertNotNull(draft); - this.service.users().drafts().delete("me", draft.getId()); - } - - @Test - public void sendEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, - TEST_USER, - "test", - "Hello!", - new java.io.File("files/photo.jpg")); - com.google.api.services.gmail.model.Message message = SendEmail.sendMessage(this.service, "me", mimeMessage); - assertNotNull(message); - } -} diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java deleted file mode 100644 index b1017b59..00000000 --- a/gmail/snippets/src/test/java/SettingsSnippetsTest.java +++ /dev/null @@ -1,82 +0,0 @@ - -import com.google.api.services.gmail.model.AutoForwarding; -import com.google.api.services.gmail.model.Label; -import com.google.api.services.gmail.model.ListLabelsResponse; -import com.google.api.services.gmail.model.VacationSettings; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; - -public class SettingsSnippetsTest extends BaseTest { - - private SettingsSnippets snippets; - private Label testLabel = null; - - @Before - public void createSnippets() { - this.snippets = new SettingsSnippets(this.service); - } - - @Before - public void createLabel() throws IOException { - ListLabelsResponse response = this.service.users().labels().list("me").execute(); - for (Label l : response.getLabels()) { - if (l.getName().equals("testLabel")) { - testLabel = l; - } - } - if (testLabel == null) { - Label label = new Label() - .setName("testLabel") - .setLabelListVisibility("labelShow") - .setMessageListVisibility("show"); - testLabel = this.service.users().labels().create("me", label).execute(); - } - } - - @After - public void deleteLabel() throws IOException { - if (testLabel != null) { - this.service.users().labels().delete("me", testLabel.getId()).execute(); - testLabel = null; - } - } - - @Test - public void updateSignature() throws IOException, GeneralSecurityException { - String signature = this.snippets.updateSignature(); - assertEquals("I heart cats.", signature); - } - - @Test - public void createFilter() throws IOException, GeneralSecurityException { - String id = this.snippets.createFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); - } - - @Test - public void enableAutoForwarding() throws IOException, GeneralSecurityException { - try { - AutoForwarding forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); - } catch (Exception e) { - // Ignore - resources might not exist - e.printStackTrace(); - } - AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - } - - @Test - public void enableAutoReply() throws IOException, GeneralSecurityException { - VacationSettings settings = this.snippets.enableAutoReply(); - assertNotNull(settings); - } -} diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java deleted file mode 100644 index 78e6c48c..00000000 --- a/gmail/snippets/src/test/java/SmimeSnippetsTest.java +++ /dev/null @@ -1,392 +0,0 @@ -import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; - -import java.io.File; -import java.io.IOException; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -public class SmimeSnippetsTest { - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - private static final String TEST_USER = "user1@example.com"; - - @Mock private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - - @Test - public void testCreateSmimeInfo() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - - assertNotNull(smimeInfo); - assertNull(smimeInfo.getEncryptedKeyPassword()); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } - - @Test - public void testCreateSmimeInfoWithPassword() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", "certpass"); - - assertNotNull(smimeInfo); - assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } - - @Test - public void testCreateSmimeInfoFileNotFound() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/notfound.p12", null /* password */); - - assertNull(smimeInfo); - } - - @Test - public void testInsertSmimeInfo() throws IOException { - SmimeInfo insertResult = makeFakeInsertResult(); - when(mockInsert.execute()).thenReturn(insertResult); - - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - - //verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertEquals(insertResult, result); - } - - @Test - public void testInsertSmimeInfoError() throws IOException { - when(mockInsert.execute()).thenThrow(IOException.class); - - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertNull(result); - } - - @Test - public void testInsertSmimeFromCsv() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); - - //verifySmimeApiCalled(2); - //verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - //verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); - verify(mockInsert, times(2)).execute(); - } - - @Test - public void testInsertSmimeFromCsvFails() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); - } - - @Test - public void testUpdateSmimeCertsNoCerts() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - null /* certFilename */, - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertNull(defaultCertId); - } - - @Test - public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertEquals(defaultCertId, "existing_certificate_id0"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { - LocalDateTime expireTime = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - expireTime); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id1"); - } - - @Test - public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(false, false, false, false), - Arrays.asList( - CURRENT_TIME_MS + 2, - CURRENT_TIME_MS + 1, - CURRENT_TIME_MS + 4, - CURRENT_TIME_MS + 3)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id2"); - } - - @Test - public void testUpdateSmimeCertsError() throws IOException { - when(mockList.execute()).thenThrow(IOException.class); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertNull(defaultCertId); - } - - @Test - public void testUpdateSmimeFromCsv() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - SmimeSnippets.updateSmimeFromCsv((u) -> mockService, "files/certs.csv", CURRENT_TIME); - - verifySmimeApiCalled(9); - verify(mockSmimeInfo).list(eq("user1@example.com"), eq("user1@example.com")); - verify(mockSmimeInfo).list(eq("user2@example.com"), eq("user2@example.com")); - verify(mockSmimeInfo).list(eq("user3@example.com"), eq("user3@example.com")); - verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user3@example.com"), eq("user3@example.com"), any()); - verify(mockSmimeInfo) - .setDefault(eq("user1@example.com"), eq("user1@example.com"), eq("new_certificate_id")); - verify(mockSmimeInfo) - .setDefault(eq("user2@example.com"), eq("user2@example.com"), eq("new_certificate_id")); - verify(mockSmimeInfo) - .setDefault(eq("user3@example.com"), eq("user3@example.com"), eq("new_certificate_id")); - verify(mockList, times(3)).execute(); - verify(mockInsert, times(3)).execute(); - verify(mockSetDefault, times(3)).execute(); - } - - @Test - public void testUpdateSmimeFromCsvFails() { - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); - // tearDown() verifies that there were no interactions with the API. - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } - - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } -} diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java new file mode 100644 index 00000000..e3eb2fb2 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraft.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.Draft; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create draft snippet +public class TestCreateDraft extends BaseTest{ + + @Test + public void testCreateDraft() throws MessagingException, IOException { + Draft draft = CreateDraft.createDraftMessage(RECIPIENT,TEST_USER); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java new file mode 100644 index 00000000..d0031682 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.Draft; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create draft with attachment snippet +public class TestCreateDraftWithAttachment extends BaseTest{ + + @Test + public void testCreateDraftWithAttachment() throws MessagingException, IOException { + Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, + TEST_USER, + new java.io.File("files/photo.jpg")); + assertNotNull(draft); + this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateEmail.java b/gmail/snippets/src/test/java/TestCreateEmail.java new file mode 100644 index 00000000..1248aa35 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateEmail.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +// Unit testcase for gmail create email snippet +public class TestCreateEmail extends BaseTest{ + + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index 4a5eabf8..b345afa1 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -18,11 +18,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail create filter snippet public class TestCreateFilter extends BaseTest { private Label testLabel = null; @@ -54,10 +53,8 @@ public void deleteLabel() throws IOException { @Test public void testCreateNewFilter() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); - } + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); } } diff --git a/gmail/snippets/src/test/java/TestCreateMessage.java b/gmail/snippets/src/test/java/TestCreateMessage.java new file mode 100644 index 00000000..775e7c1f --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateMessage.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create message snippet +public class TestCreateMessage extends BaseTest{ + + @Test + public void testCreateMessageWithEmail() throws MessagingException, + IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + + com.google.api.services.gmail.model.Message message = CreateMessage.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } +} diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 7d6b1fdb..5357536e 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +// Unit testcase for gmail create smime info snippet public class TestCreateSmimeInfo { @Test diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index 6cd79e91..c961b734 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -12,21 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. - import com.google.api.services.gmail.model.VacationSettings; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail enable auto reply snippet public class TestEnableAutoReply extends BaseTest { @Test public void testAutoReply() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); - } + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 92ec74a4..6250c13c 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -14,22 +14,18 @@ import com.google.api.services.gmail.model.AutoForwarding; -import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail enable forwarding snippet public class TestEnableForwarding extends BaseTest { @Test public void TestEnableAutoForwarding() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); assertNotNull(forwarding); - } } @Before diff --git a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java new file mode 100644 index 00000000..2853cc2e --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail insert cert from csv snippet +public class TestInsertCertFromCsv extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; + public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; + + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); + verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java new file mode 100644 index 00000000..3c70b89a --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java @@ -0,0 +1,117 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; + +// Unit testcase for gmail insert smime info snippet +public class TestInsertSmimeInfo extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + + @Mock private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, + smimeInfo); + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessage.java b/gmail/snippets/src/test/java/TestSendMessage.java new file mode 100644 index 00000000..2bde312c --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessage.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.Message; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail send email snippet +public class TestSendMessage extends BaseTest{ + + @Test + public void testSendEmail() throws MessagingException, IOException { + Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java new file mode 100644 index 00000000..56161969 --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.model.Message; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.File; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail send email with attachment snippet +public class TestSendMessageWithAttachment extends BaseTest{ + + @Test + public void testSendEmailWithAttachment() throws MessagingException, + IOException{ + Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, + TEST_USER, + new File("files/photo.jpg")); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index 4a9c3e2a..43f0559e 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -14,18 +14,15 @@ import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertEquals; +// Unit testcase for gmail update signature snippet public class TestUpdateSignature extends BaseTest { @Test public void testUpdateGmailSignature() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { String signature = UpdateSignature.updateGmailSignature(); assertEquals("Automated Signature", signature); - } } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java new file mode 100644 index 00000000..c66ebb57 --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java @@ -0,0 +1,270 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail update smime certs snippet +public class TestUpdateSmimeCerts extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java new file mode 100644 index 00000000..35bcee1e --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java @@ -0,0 +1,140 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail update smime from csv snippet +public class TestUpdateSmimeFromCsv extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(6); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo) + .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList, times(2)).execute(); + verify(mockInsert, times(2)).execute(); + verify(mockSetDefault, times(2)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList<>(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} From 86e5c4a50b4153a1c7bf903c26fccfae948971a5 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:08:29 -0700 Subject: [PATCH 095/254] Test drive v2 file snippets patch2 (#235) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-3 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 5eaef5ee644b62eefa0b62df413f54ebaf624254 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:09:03 -0700 Subject: [PATCH 096/254] Drive v3 file snippets patch3 (#236) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 4f843afe50a3c20ba40a77497caa285000ff48df Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:09:27 -0700 Subject: [PATCH 097/254] Drive-v3: File snippets UnitTest patch4 (#237) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch4 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateFolder.java | 2 +- .../src/main/java/MoveFileToFolder.java | 2 +- .../drive_v3/src/main/java/SearchFile.java | 2 +- .../drive_v3/src/main/java/ShareFile.java | 2 +- .../src/test/java/TestCreateFolder.java | 15 +++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 22 +++++++++++++++++++ .../src/test/java/TestSearchFiles.java | 18 +++++++++++++++ .../drive_v3/src/test/java/TestShareFile.java | 17 ++++++++++++++ 8 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestSearchFiles.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestShareFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java index df92f77b..c9ee24b8 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -36,7 +36,7 @@ public class CreateFolder { * @return Inserted folder id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String createFolder() throws IOException { + public static String createFolder() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java index 31a3e53c..4b5603e8 100644 --- a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -38,7 +38,7 @@ public class MoveFileToFolder { * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ - private static List moveFileToFolder(String fileId, String folderId) + public static List moveFileToFolder(String fileId, String folderId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 1d68ccdd..632bf4ae 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -37,7 +37,7 @@ public class SearchFile { * @return search result list. * @throws IOException if service account credentials file not found. */ - private static List searchFile() throws IOException{ + public static List searchFile() throws IOException{ /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java index cbc1bb51..899edfef 100644 --- a/drive/snippets/drive_v3/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -44,7 +44,7 @@ public class ShareFile { * @return list of modified permissions if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..8d2a10bf --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateFolder extends BaseTest{ + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..857c20d7 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,22 @@ +import org.junit.Test; + +import javax.annotation.CheckReturnValue; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class TestMoveFileToFolder extends BaseTest{ + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..48a8b818 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestSearchFiles extends BaseTest{ + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java new file mode 100644 index 00000000..746ef71a --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TestShareFile extends BaseTest{ + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} From c96f26aaaa1d5814b6c8753b0c70125d77ad87de Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 18 May 2022 12:19:37 -0600 Subject: [PATCH 098/254] Switch to guard clause --- vault/quickstart/src/main/java/Quickstart.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 21188873..742b6184 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -123,12 +123,12 @@ public static void main(String[] args) throws IOException { List matters = response.getMatters(); if (matters == null || matters.size() == 0) { System.out.println("No matters found."); - } else { - System.out.println("Matters:"); - for (Matter matter: matters) { - System.out.printf("%s (%s)\n", matter.getName(), - matter.getMatterId()); - } + return; + } + System.out.println("Matters:"); + for (Matter matter: matters) { + System.out.printf("%s (%s)\n", matter.getName(), + matter.getMatterId()); } } } From 94f8d43f83102f1a91238967ff8f94873cae933d Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:01:14 -0700 Subject: [PATCH 099/254] Classroom testcase (#231) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Classroom unit testcase * classroom snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/test/java/TestAddStudent.java | 33 +++++++++++++++++++ .../src/test/java/TestAddTeacher.java | 31 +++++++++++++++++ .../src/test/java/TestBatchAddStudents.java | 29 ++++++++++++++++ .../src/test/java/TestListCourseAliases.java | 29 ++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 classroom/snippets/src/test/java/TestAddStudent.java create mode 100644 classroom/snippets/src/test/java/TestAddTeacher.java create mode 100644 classroom/snippets/src/test/java/TestBatchAddStudents.java create mode 100644 classroom/snippets/src/test/java/TestListCourseAliases.java diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java new file mode 100644 index 00000000..8d6a9bb9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import com.google.api.services.classroom.model.Student; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Add Student classroom snippet +public class TestAddStudent extends BaseTest{ + + @Test + public void testAddStudent() throws IOException { + Course course = CreateCourse.createCourse(); + Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); + deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java new file mode 100644 index 00000000..f66ce0bd --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Teacher; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Add Teacher classroom snippet +public class TestAddTeacher extends BaseTest{ + private String otherUser = "gduser1@workspacesamples.dev"; + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), + teacher.getCourseId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java new file mode 100644 index 00000000..c21eb3f2 --- /dev/null +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +// Unit test class for Batch Add Students classroom snippet +public class TestBatchAddStudents extends BaseTest { + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", + "gduser3@workpsacesamples.dev"); + BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java new file mode 100644 index 00000000..b7396361 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.CourseAlias; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; +import java.util.List; + +// Unit test class for List Course Aliases classroom snippet +public class TestListCourseAliases extends BaseTest{ + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } +} \ No newline at end of file From 4021b58d831570d5dcbbe138cabbf65c7c84d067 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:01:49 -0700 Subject: [PATCH 100/254] Test drive v3 change snippets (#238) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: Change snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../drive_v3/src/main/java/FetchChanges.java | 2 +- .../src/main/java/FetchStartPageToken.java | 2 +- .../src/test/java/TestFetchChanges.java | 32 +++++++++++++++++++ .../test/java/TestFetchStartPageToken.java | 28 ++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchChanges.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java index d803a1e4..aa921837 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -34,7 +34,7 @@ public class FetchChanges { * @return Saved token after last page. * @throws IOException if file is not found */ - private static String fetchChanges(String savedStartPageToken) throws IOException { + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java index 78728859..de8a2da3 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -34,7 +34,7 @@ public class FetchStartPageToken { * @return Start page token as String. * @throws IOException if file is not found */ - private static String fetchStartPageToken() throws IOException { + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..7df7821a --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +// Unit test class for fetchChanges change snippet +public class TestFetchChanges extends BaseTest{ + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..fd4be2ad --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for fetchStartPageToken change snippet +public class TestFetchStartPageToken extends BaseTest{ + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} From 5bb5996fe623e8c4162bf1b6ccb346693196bacd Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:02:11 -0700 Subject: [PATCH 101/254] Test drive v3 drive snippets (#239) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../drive_v3/src/main/java/CreateDrive.java | 2 +- .../drive_v3/src/main/java/RecoverDrive.java | 2 +- .../src/test/java/TestCreateDrive.java | 30 ++++++++++++ .../src/test/java/TestRecoverDrives.java | 48 +++++++++++++++++++ 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateDrive.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java index e97af03f..be69cbec 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -34,7 +34,7 @@ public class CreateDrive { * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createDrive() throws IOException { + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java index 402cb420..adf8162e 100644 --- a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -38,7 +38,7 @@ public class RecoverDrive { * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - private static List recoverDrives(String realUser) + public static List recoverDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..c8937fa4 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for create-drive Drive snippet +public class TestCreateDrive extends BaseTest{ + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..a638f0e6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java @@ -0,0 +1,48 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +// Unit test class for recover-drives Drive snippet +public class TestRecoverDrives extends BaseTest{ + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} From 60edf7fd2d2520e9379911c4480e47eebfe37f12 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:02:33 -0700 Subject: [PATCH 102/254] Test drive v3 appdata snippets (#240) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: AppData snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v2/src/main/java/ListAppData.java | 2 +- .../drive_v2/src/main/java/UploadAppData.java | 2 +- .../src/test/java/TestFetchAppdataFolder.java | 29 +++++++++++++++++ .../src/test/java/TestListAppdata.java | 32 +++++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 31 ++++++++++++++++++ 6 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestListAppdata.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index a12f9e5d..c402a18a 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -38,7 +38,7 @@ public class FetchAppDataFolder { * Fetches appDataFolder and prints it's folder id. * @return Application data folder's ID. */ - public String fetchAppDataFolder() throws IOException { + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 2aa87b7d..7ed0782e 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -38,7 +38,7 @@ public class ListAppData { * list down files in the application data folder. * @return list of 10 files. */ - public FileList listAppData() throws IOException { + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java index 56d469d7..7731be4e 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -37,7 +37,7 @@ public class UploadAppData { * Creates a file in the application data folder. * @return Created file's Id. */ - private static String uploadAppData() throws IOException { + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java new file mode 100644 index 00000000..f53dcd75 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for testing of FetchAppDataFolder snippet +public class TestFetchAppdataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java new file mode 100644 index 00000000..fe137a43 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.drive.model.FileList; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotEquals; + +// Unit test class for testing of ListAppData snippet +public class TestListAppdata extends BaseTest{ + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getItems().size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..d5cd5e9e --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for testing of UploadAppData snippet +public class TestUploadAppdata extends BaseTest{ + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 1d101ff57f704a843fb335fc7503ae7de8a46cca Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 6 Jul 2022 20:20:45 +0000 Subject: [PATCH 103/254] test: drive v3 file snippets patch2 (#242) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch2 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar --- .../drive_v3/src/main/java/UploadToFolder.java | 2 +- .../src/main/java/UploadWithConversion.java | 2 +- .../src/test/java/TestUploadToFolder.java | 18 ++++++++++++++++++ .../test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java index 03c711a5..db2be62f 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -38,7 +38,7 @@ public class UploadToFolder { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadToFolder(String realFolderId) throws IOException { + public static File uploadToFolder(String realFolderId) throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java index dca7e60a..21d871b5 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -36,7 +36,7 @@ public class UploadWithConversion { * @return Inserted file id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadWithConversion() throws IOException { + public static String uploadWithConversion() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..bf4702e9 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertTrue; + +public class TestUploadToFolder extends BaseTest{ + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..a3d69c52 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadWithConversion extends BaseTest{ + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From a5e8727fb3c1e745f46b7544a5d2e58e3ac78c53 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 6 Jul 2022 20:21:13 +0000 Subject: [PATCH 104/254] test: drive v3 file snippets patch3 (#243) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar --- .../drive_v3/src/main/java/CreateShortcut.java | 3 ++- .../drive_v3/src/main/java/DownloadFile.java | 2 +- .../drive_v3/src/main/java/ExportPdf.java | 2 +- .../drive_v3/src/main/java/TouchFile.java | 2 +- .../src/test/java/TestCreateShortcut.java | 15 +++++++++++++++ .../src/test/java/TestDownloadFile.java | 18 ++++++++++++++++++ .../drive_v3/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ 8 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestDownloadFile.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestExportPdf.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestTouchFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java index 98b35603..d75f104e 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -34,7 +34,7 @@ public class CreateShortcut { * Creates shortcut for file. * @throws IOException if service account credentials file not found. */ - private static void createShortcut() throws IOException{ + public static String createShortcut() throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ @@ -57,6 +57,7 @@ private static void createShortcut() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create shortcut: " + e.getDetails()); diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java index 8cf14a80..0931acc5 100644 --- a/drive/snippets/drive_v3/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -37,7 +37,7 @@ public class DownloadFile { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java index fbc5f047..16d86539 100644 --- a/drive/snippets/drive_v3/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -37,7 +37,7 @@ public class ExportPdf { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java index f243e16a..2729133c 100644 --- a/drive/snippets/drive_v3/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -38,7 +38,7 @@ public class TouchFile { * @return long file's latest modification date value. * @throws IOException if service account credentials file not found. * */ - private static long touchFile(String realFileId, long realTimestamp) + public static long touchFile(String realFileId, long realTimestamp) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..a9aec655 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateShortcut extends BaseTest{ + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..2c4806f6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestDownloadFile extends BaseTest{ + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..f8741feb --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestExportPdf extends BaseTest{ + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..3280bcbb --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestTouchFile extends BaseTest{ + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} From 9647a4a59b1e6cea61d36133464acfe0e4e73e0b Mon Sep 17 00:00:00 2001 From: Sanjukta Ghosh Date: Wed, 13 Jul 2022 16:11:29 +0000 Subject: [PATCH 105/254] test: added testcase for slide snippets (#245) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * test: added testcase for slide snippets * test: added testcase for slide snippets * fix: update in slide snippets Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../snippets/src/main/java/CreateImage.java | 3 +- .../snippets/src/main/java/CreateSlide.java | 5 +- slides/snippets/src/main/java/Snippets.java | 450 ------------------ slides/snippets/src/test/java/BaseTest.java | 108 ++--- .../snippets/src/test/java/SnippetsTest.java | 160 ------- .../src/test/java/TestCopyPresentation.java | 31 ++ .../src/test/java/TestCreateBulletedText.java | 35 ++ .../src/test/java/TestCreateImage.java | 39 ++ .../src/test/java/TestCreatePresentation.java | 30 ++ .../src/test/java/TestCreateSheetsChart.java | 40 ++ .../src/test/java/TestCreateSlide.java | 37 ++ .../test/java/TestCreateTextboxWithText.java | 38 ++ .../src/test/java/TestImageMerging.java | 45 ++ .../src/test/java/TestRefreshSheetsChart.java | 38 ++ .../src/test/java/TestSimpleTextReplace.java | 35 ++ .../src/test/java/TestTextMerging.java | 46 ++ .../src/test/java/TestTextStyleUpdate.java | 35 ++ 17 files changed, 482 insertions(+), 693 deletions(-) delete mode 100644 slides/snippets/src/main/java/Snippets.java delete mode 100644 slides/snippets/src/test/java/SnippetsTest.java create mode 100644 slides/snippets/src/test/java/TestCopyPresentation.java create mode 100644 slides/snippets/src/test/java/TestCreateBulletedText.java create mode 100644 slides/snippets/src/test/java/TestCreateImage.java create mode 100644 slides/snippets/src/test/java/TestCreatePresentation.java create mode 100644 slides/snippets/src/test/java/TestCreateSheetsChart.java create mode 100644 slides/snippets/src/test/java/TestCreateSlide.java create mode 100644 slides/snippets/src/test/java/TestCreateTextboxWithText.java create mode 100644 slides/snippets/src/test/java/TestImageMerging.java create mode 100644 slides/snippets/src/test/java/TestRefreshSheetsChart.java create mode 100644 slides/snippets/src/test/java/TestSimpleTextReplace.java create mode 100644 slides/snippets/src/test/java/TestTextMerging.java create mode 100644 slides/snippets/src/test/java/TestTextStyleUpdate.java diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java index 6338d405..132b3493 100644 --- a/slides/snippets/src/main/java/CreateImage.java +++ b/slides/snippets/src/main/java/CreateImage.java @@ -46,14 +46,12 @@ public class CreateImage { * * @param presentationId - id of the presentation. * @param slideId - id of the shape. - * @param imageId - id for the image. * @param imageUrl - Url of the image. * @return image id * @throws IOException - if credentials file not found. */ public static BatchUpdatePresentationResponse createImage(String presentationId, String slideId, - String imageId, String imageUrl) throws IOException { /* Load pre-authorized user credentials from the environment. @@ -73,6 +71,7 @@ public static BatchUpdatePresentationResponse createImage(String presentationId, // Create a new image, using the supplied object ID, with content downloaded from imageUrl. List requests = new ArrayList<>(); + String imageId = "MyImageId_01"; Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); requests.add(new Request() .setCreateImage(new CreateImageRequest() diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java index c1a55b99..9a809264 100644 --- a/slides/snippets/src/main/java/CreateSlide.java +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -41,12 +41,10 @@ public class CreateSlide { * Creates a new slide. * * @param presentationId - id of the presentation. - * @param slideId - id for the new slide. * @return slide id * @throws IOException - if credentials file not found. */ - public static BatchUpdatePresentationResponse createSlide(String presentationId, - String slideId) throws IOException { + public static BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ @@ -64,6 +62,7 @@ public static BatchUpdatePresentationResponse createSlide(String presentationId, // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout List requests = new ArrayList<>(); + String slideId = "MyNewSlide_001"; BatchUpdatePresentationResponse response = null; try { requests.add(new Request() diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java deleted file mode 100644 index c1c07907..00000000 --- a/slides/snippets/src/main/java/Snippets.java +++ /dev/null @@ -1,450 +0,0 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.ValueRange; -import com.google.api.services.slides.v1.Slides; -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class Snippets { - - private Slides service; - private Drive driveService; - private Sheets sheetsService; - - Snippets(Slides service, Drive driveService, Sheets sheetsService) { - this.service = service; - this.driveService = driveService; - this.sheetsService = sheetsService; - } - - public String createPresentation(String title) throws IOException { - Slides slidesService = this.service; - // [START slides_create_presentation] - Presentation presentation = new Presentation() - .setTitle(title); - presentation = slidesService.presentations().create(presentation) - .setFields("presentationId") - .execute(); - System.out.println("Created presentation with ID: " + presentation.getPresentationId()); - // [END slides_create_presentation] - return presentation.getPresentationId(); - } - - public String copyPresentation(String presentationId, String copyTitle) throws IOException { - Drive driveService = this.driveService; - // [START slides_copy_presentation] - File copyMetadata = new File().setName(copyTitle); - File presentationCopyFile = - driveService.files().copy(presentationId, copyMetadata).execute(); - String presentationCopyId = presentationCopyFile.getId(); - // [END slides_copy_presentation] - return presentationCopyId; - } - - public BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_slide] - // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout - // and the ID "MyNewSlide_001". - List requests = new ArrayList<>(); - String slideId = "MyNewSlide_001"; - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId(slideId) - .setInsertionIndex(1) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); - - // If you wish to populate the slide with elements, add create requests here, - // using the slide ID specified above. - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); - System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); - // [END slides_create_slide] - return response; - } - - public BatchUpdatePresentationResponse createTextBoxWithText( - String presentationId, String slideId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_textbox_with_text] - // Create a new square text box, using a supplied object ID. - List requests = new ArrayList<>(); - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - // Insert text into the box, using the object ID given to it. - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); - System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); - // [END slides_create_textbox_with_text] - return response; - } - - - public BatchUpdatePresentationResponse createImage(String presentationId, - String slideId, - GoogleCredential credential) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_image] - String imageUrl = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - - // Create a new image, using the supplied object ID, with content downloaded from imageUrl. - List requests = new ArrayList<>(); - String imageId = "MyImageId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - requests.add(new Request() - .setCreateImage(new CreateImageRequest() - .setObjectId(imageId) - .setUrl(imageUrl) - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); - System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - // [END slides_create_image] - return response; - } - - public List textMerging( - String templatePresentationId, String dataSpreadsheetId) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - Sheets sheetsService = this.sheetsService; - List responses = new ArrayList<>(5); - // [START slides_text_merging] - // Use the Sheets API to load data, one record per row. - String dataRangeNotation = "Customers!A2:M6"; - ValueRange sheetsResponse = sheetsService.spreadsheets().values() - .get(dataSpreadsheetId, dataRangeNotation).execute(); - List> values = sheetsResponse.getValues(); - - // For each record, create a new merged presentation. - for (List row: values) { - String customerName = row.get(2).toString(); // name in column 3 - String caseDescription = row.get(5).toString(); // case description in column 6 - String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 - - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the text merge (replaceAllText) requests for this presentation. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-name}}") - .setMatchCase(true)) - .setReplaceText(customerName))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{case-description}}") - .setMatchCase(true)) - .setReplaceText(caseDescription))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{total-portfolio}}") - .setMatchCase(true)) - .setReplaceText(totalPortfolio))); - - // Execute the requests for this presentation. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - // [START_EXCLUDE silent] - responses.add(response); - // [END_EXCLUDE] - // Count total number of replacements made. - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation for " + - customerName + " with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " text instances."); - } - // [END slides_text_merging] - return responses; - } - - public BatchUpdatePresentationResponse imageMerging(String templatePresentationId, - String imageUrl, - String customerName) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - String logoUrl = imageUrl; - String customerGraphicUrl = imageUrl; - - // [START slides_image_merging] - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the image merge (replaceAllShapesWithImage) requests. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(logoUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{company-logo}}") - .setMatchCase(true)))); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(customerGraphicUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-graphic}}") - .setMatchCase(true)))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - // Count total number of replacements made. - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " shapes instances with images."); - // [END slides_image_merging] - return response; - } - - public BatchUpdatePresentationResponse simpleTextReplace( - String presentationId, String shapeId, String replacementText) throws IOException { - Slides slidesService = this.service; - // [START slides_simple_text_replace] - // Remove existing text in the shape, then insert the new text. - List requests = new ArrayList<>(); - requests.add(new Request() - .setDeleteText(new DeleteTextRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")))); - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(shapeId) - .setInsertionIndex(0) - .setText(replacementText))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Replaced text in shape with ID: " + shapeId); - // [END slides_simple_text_replace] - return response; - } - - public BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) - throws IOException { - Slides slidesService = this.service; - // [START slides_text_style_update] - // Update the text style so that the first 5 characters are bolded - // and italicized, and the next 5 are displayed in blue 14 pt Times - // New Roman font, and the next five are hyperlinked. - List requests = new ArrayList<>(); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(0) - .setEndIndex(5)) - .setStyle(new TextStyle() - .setBold(true) - .setItalic(true)) - .setFields("bold,italic"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(5) - .setEndIndex(10)) - .setStyle(new TextStyle() - .setFontFamily("Times New Roman") - .setFontSize(new Dimension() - .setMagnitude(14.0) - .setUnit("PT")) - .setForegroundColor(new OptionalColor() - .setOpaqueColor(new OpaqueColor() - .setRgbColor(new RgbColor() - .setBlue(1.0F) - .setGreen(0.0F) - .setRed(0.0F))))) - .setFields("foregroundColor,fontFamily,fontSize"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(10) - .setEndIndex(15)) - .setStyle(new TextStyle() - .setLink(new Link() - .setUrl("www.example.com"))) - .setFields("link"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Updated text style for shape with ID: " + shapeId); - // [END slides_text_style_update] - return response; - } - - public BatchUpdatePresentationResponse createBulletedText(String presentationId, - String shapeId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_bulleted_text] - // Add arrow-diamond-disc bullets to all text in the shape. - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateParagraphBullets(new CreateParagraphBulletsRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")) - .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added bullets to text in shape with ID: " + shapeId); - // [END slides_create_bulleted_text] - return response; - } - - public BatchUpdatePresentationResponse createSheetsChart( - String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_sheets_chart] - // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto - // a page in the presentation. Setting the linking mode as "LINKED" allows the - // chart to be refreshed if the Sheets version is updated. - List requests = new ArrayList<>(); - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - String presentationChartId = "MyEmbeddedChart"; - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added a linked Sheets chart with ID " + presentationChartId); - // [END slides_create_sheets_chart] - return response; - } - - public BatchUpdatePresentationResponse refreshSheetsChart( - String presentationId, String presentationChartId) throws IOException { - Slides slidesService = this.service; - // [START slides_refresh_sheets_chart] - List requests = new ArrayList<>(); - - // Refresh an existing linked Sheets chart embedded a presentation. - requests.add(new Request() - .setRefreshSheetsChart(new RefreshSheetsChartRequest() - .setObjectId(presentationChartId))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); - // [END slides_refresh_sheets_chart] - return response; - } -} diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index 99e97610..f88fec7c 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -1,117 +1,71 @@ -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.json.jackson2.JacksonFactory; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.*; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.*; import java.util.List; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; +import org.junit.After; public class BaseTest { - static { - enableLogging(); - } - - protected GoogleCredential credential; protected Slides service; protected Drive driveService; protected Sheets sheetsService; - protected Set filesToDelete = new HashSet<>(); - - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); - } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); + return credentials; } - public Slides buildService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Slides buildService(GoogleCredentials credential) { return new Slides.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Drive buildDriveService(GoogleCredentials credential) { return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } - public Sheets buildSheetsService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Sheets buildSheetsService(GoogleCredentials credential) { return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } @Before - public void setup() throws IOException, GeneralSecurityException { - this.credential = getCredential(); + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); this.service = buildService(credential); this.driveService = buildDriveService(credential); this.sheetsService = buildSheetsService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } } - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); } protected String createTestPresentation() throws IOException { @@ -120,9 +74,7 @@ protected String createTestPresentation() throws IOException { presentation = service.presentations().create(presentation) .setFields("presentationId") .execute(); - String presentationId = presentation.getPresentationId(); - this.deleteFileOnCleanup(presentationId); - return presentationId; + return presentation.getPresentationId(); } protected String createTestSlide(String presentationId) throws IOException { diff --git a/slides/snippets/src/test/java/SnippetsTest.java b/slides/snippets/src/test/java/SnippetsTest.java deleted file mode 100644 index ec2a4ce7..00000000 --- a/slides/snippets/src/test/java/SnippetsTest.java +++ /dev/null @@ -1,160 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SnippetsTest extends BaseTest { - - private Snippets snippets; - - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - private final Integer CHART_ID = 1107320627; - - private final String CUSTOMER_NAME = "Fake Customer"; - - @Before - public void createSnippets() { - this.snippets = new Snippets(this.service, this.driveService, this.sheetsService); - } - - @Test - public void testCreatePresentation() throws IOException { - String presentationId = this.snippets.createPresentation("Title"); - assertNotNull(presentationId); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testCopyPresentation() throws IOException { - String presentationId = this.createTestPresentation(); - String copyId = this.snippets.copyPresentation(presentationId, "My Duplicate Presentation"); - assertNotNull(copyId); - this.deleteFileOnCleanup(copyId); - } - - @Test - public void testCreateSlide() throws IOException { - String presentationId = this.createTestPresentation(); - BatchUpdatePresentationResponse response = this.snippets.createSlide(presentationId); - assertNotNull(response); - assertEquals(1, response.getReplies().size()); - String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); - assertNotNull(pageId); - } - - @Test - public void testCreateTextBox() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createTextBoxWithText(presentationId, pageId); - assertEquals(2, response.getReplies().size()); - String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); - assertNotNull(boxId); - } - - @Test - public void testCreateImage() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = this.snippets.createImage( - presentationId, pageId, this.credential); - assertEquals(1, response.getReplies().size()); - String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); - assertNotNull(imageId); - } - - @Test - public void testTextMerge() throws IOException { - List responses = - this.snippets.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); - for (BatchUpdatePresentationResponse response: responses) { - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(3, response.getReplies().size()); - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - assertEquals(4, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - } - - @Test - public void testImageMerge() throws IOException { - BatchUpdatePresentationResponse response = - this.snippets.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(2, response.getReplies().size()); - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - assertEquals(2, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testSimpleTextReplace() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testTextStyleUpdate() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.textStyleUpdate(presentationId, boxId); - assertEquals(3, response.getReplies().size()); - } - - @Test - public void testCreateBulletText() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.createBulletedText(presentationId, boxId); - assertEquals(1, response.getReplies().size()); - } - - @Test - public void testCreateSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createSheetsChart( - presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - assertEquals(1, response.getReplies().size()); - String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - assertNotNull(chartId); - } - - @Test - public void testRefreshSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String chartId = - this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - BatchUpdatePresentationResponse response = - this.snippets.refreshSheetsChart(presentationId, chartId); - assertEquals(1, response.getReplies().size()); - } -} diff --git a/slides/snippets/src/test/java/TestCopyPresentation.java b/slides/snippets/src/test/java/TestCopyPresentation.java new file mode 100644 index 00000000..a4772d09 --- /dev/null +++ b/slides/snippets/src/test/java/TestCopyPresentation.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for copy presentation snippet +public class TestCopyPresentation extends BaseTest{ + + @Test + public void testCopyPresentation() throws IOException { + String presentationId = createTestPresentation(); + String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); + assertNotNull(copyId); + deleteFileOnCleanup(copyId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateBulletedText.java b/slides/snippets/src/test/java/TestCreateBulletedText.java new file mode 100644 index 00000000..c6c00cf9 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateBulletedText.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for createBulletedText snippet +public class TestCreateBulletedText extends BaseTest{ + + @Test + public void testCreateBulletText() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + CreateBulletedText.createBulletedText(presentationId, boxId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateImage.java b/slides/snippets/src/test/java/TestCreateImage.java new file mode 100644 index 00000000..f2493670 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateImage.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createImage snippet +public class TestCreateImage extends BaseTest { + + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + + @Test + public void testCreateImage() throws IOException { + String presentationId = createTestPresentation(); + String slideId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = CreateImage.createImage( + presentationId, slideId, IMAGE_URL); + assertEquals(1, response.getReplies().size()); + String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); + assertNotNull(imageId); + } +} diff --git a/slides/snippets/src/test/java/TestCreatePresentation.java b/slides/snippets/src/test/java/TestCreatePresentation.java new file mode 100644 index 00000000..8a44c76c --- /dev/null +++ b/slides/snippets/src/test/java/TestCreatePresentation.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createPresentation snippet +public class TestCreatePresentation extends BaseTest{ + + @Test + public void testCreatePresentation() throws IOException { + String presentationId = CreatePresentation.createPresentation("Title"); + assertNotNull(presentationId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSheetsChart.java b/slides/snippets/src/test/java/TestCreateSheetsChart.java new file mode 100644 index 00000000..c4905b83 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSheetsChart.java @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSheetsChart snippet +public class TestCreateSheetsChart extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; + private final Integer CHART_ID = 1107320627; + @Test + public void testCreateSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateSheetsChart.createSheetsChart( + presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + assertEquals(1, response.getReplies().size()); + String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + assertNotNull(chartId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSlide.java b/slides/snippets/src/test/java/TestCreateSlide.java new file mode 100644 index 00000000..84997780 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSlide.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSlide snippet +public class TestCreateSlide extends BaseTest{ + + @Test + public void testCreateSlide() throws IOException { + String presentationId = createTestPresentation(); + BatchUpdatePresentationResponse response = + CreateSlide.createSlide(presentationId); + assertNotNull(response); + assertEquals(1, response.getReplies().size()); + String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); + assertNotNull(pageId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateTextboxWithText.java b/slides/snippets/src/test/java/TestCreateTextboxWithText.java new file mode 100644 index 00000000..5fbf15bc --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateTextboxWithText.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createTextboxWithText snippet +public class TestCreateTextboxWithText extends BaseTest{ + + @Test + public void testCreateTextBox() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateTextboxWithText.createTextBoxWithText(presentationId, + pageId, "MyTextBox"); + assertEquals(2, response.getReplies().size()); + String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); + assertNotNull(boxId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestImageMerging.java b/slides/snippets/src/test/java/TestImageMerging.java new file mode 100644 index 00000000..73a16f90 --- /dev/null +++ b/slides/snippets/src/test/java/TestImageMerging.java @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for imageMerging snippet +public class TestImageMerging extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String CUSTOMER_NAME = "Fake Customer"; + @Test + public void testImageMerge() throws IOException { + BatchUpdatePresentationResponse response = + ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(2, response.getReplies().size()); + int numReplacements = 0; + for(Response resp: response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + assertEquals(2, numReplacements); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestRefreshSheetsChart.java b/slides/snippets/src/test/java/TestRefreshSheetsChart.java new file mode 100644 index 00000000..b2c17928 --- /dev/null +++ b/slides/snippets/src/test/java/TestRefreshSheetsChart.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for refreshSheetsChart snippet +public class TestRefreshSheetsChart extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + private final Integer CHART_ID = 1107320627; + @Test + public void testRefreshSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String chartId = + this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + BatchUpdatePresentationResponse response = + RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestSimpleTextReplace.java b/slides/snippets/src/test/java/TestSimpleTextReplace.java new file mode 100644 index 00000000..397a3263 --- /dev/null +++ b/slides/snippets/src/test/java/TestSimpleTextReplace.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for simpleTextReplace snippet +public class TestSimpleTextReplace extends BaseTest{ + + @Test + public void testSimpleTextReplace() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestTextMerging.java b/slides/snippets/src/test/java/TestTextMerging.java new file mode 100644 index 00000000..35917aa3 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextMerging.java @@ -0,0 +1,46 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for textMerging snippet +public class TestTextMerging extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + @Test + public void testTextMerge() throws IOException { + List responses = + TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); + for (BatchUpdatePresentationResponse response: responses) { + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(3, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + assertEquals(4, numReplacements); + deleteFileOnCleanup(presentationId); + } + } +} diff --git a/slides/snippets/src/test/java/TestTextStyleUpdate.java b/slides/snippets/src/test/java/TestTextStyleUpdate.java new file mode 100644 index 00000000..6bf13102 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextStyleUpdate.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for textStyleUpdate snippet +public class TestTextStyleUpdate extends BaseTest{ + + @Test + public void testTextStyleUpdate() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String boxId = this.createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + TextStyleUpdate.textStyleUpdate(presentationId, boxId); + assertEquals(3, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} From f07b8cf24f776c35e82e796a6a3b4856914f38a7 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 13 Jul 2022 16:11:48 +0000 Subject: [PATCH 106/254] test: removing deprecated GoogleCredential from drive v3 BaseTest (#246) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * test: Implemented auth using GoogleCredentials in v3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar Co-authored-by: himanshupr2627 --- drive/snippets/drive_v3/build.gradle | 4 ++ .../drive_v3/src/test/java/BaseTest.java | 42 ++++++++++++------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index ce70eda8..4327d404 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -9,4 +9,8 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' +} + +test { + useJUnitPlatform() } \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index 1177eee1..f46d3225 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -1,6 +1,5 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; @@ -8,6 +7,8 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.After; import org.junit.Before; @@ -51,22 +52,33 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); } - public Drive buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Drive.Builder( - //new ApacheHttpTransport(), - //GoogleNetHttpTransport.newTrustedTransport(), - new NetHttpTransport(), + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), - //GsonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; } @Before From ca7379ced6dd418555daba7ff4f36f2867f3fad2 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Thu, 21 Jul 2022 11:12:44 -0600 Subject: [PATCH 107/254] chore: Synced file(s) with googleworkspace/.github (#248) * chore: Created local '.github/workflows/lint.yml' from remote 'sync-files/defaults/.github/workflows/lint.yml' * chore: Created local '.github/workflows/test.yml' from remote 'sync-files/defaults/.github/workflows/test.yml' * chore: Created local '.github/CODEOWNERS' from remote 'sync-files/defaults/.github/CODEOWNERS' * chore: Created local '.github/sync-repo-settings.yaml' from remote 'sync-files/defaults/.github/sync-repo-settings.yaml' * chore: Created local '.github/workflows/automation.yml' from remote 'sync-files/defaults/.github/workflows/automation.yml' * chore: Created local 'SECURITY.md' from remote 'SECURITY.md' --- .github/CODEOWNERS | 17 ++++++++++ .github/sync-repo-settings.yaml | 54 ++++++++++++++++++++++++++++++++ .github/workflows/automation.yml | 28 +++++++++++++++++ .github/workflows/lint.yml | 24 ++++++++++++++ .github/workflows/test.yml | 24 ++++++++++++++ SECURITY.md | 6 ++++ 6 files changed, 153 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/sync-repo-settings.yaml create mode 100644 .github/workflows/automation.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml create mode 100644 SECURITY.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..804a0939 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,17 @@ +# Copyright 2022 Google LLC +# +# 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. + +# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners + +.github/ @googleworkspace/workspace-devrel-dpe diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml new file mode 100644 index 00000000..757d7bb5 --- /dev/null +++ b/.github/sync-repo-settings.yaml @@ -0,0 +1,54 @@ +# Copyright 2022 Google LLC +# +# 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. + +# .github/sync-repo-settings.yaml +# See https://github.com/googleapis/repo-automation-bots/tree/main/packages/sync-repo-settings for app options. +rebaseMergeAllowed: true +squashMergeAllowed: true +mergeCommitAllowed: false +deleteBranchOnMerge: true +branchProtectionRules: + - pattern: main + isAdminEnforced: false + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + # .github/workflows/test.yml with a job called "test" + - "test" + # .github/workflows/lint.yml with a job called "lint" + - "lint" + # Google bots below + - "cla/google" + - "snippet-bot check" + - "header-check" + - "conventionalcommits.org" + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + - pattern: master + isAdminEnforced: false + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + # .github/workflows/test.yml with a job called "test" + - "test" + # .github/workflows/lint.yml with a job called "lint" + - "lint" + # Google bots below + - "cla/google" + - "snippet-bot check" + - "header-check" + - "conventionalcommits.org" + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true +permissionRules: + - team: workspace-devrel-dpe + permission: admin diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml new file mode 100644 index 00000000..a5b0e865 --- /dev/null +++ b/.github/workflows/automation.yml @@ -0,0 +1,28 @@ +# Copyright 2022 Google LLC +# +# 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. + +name: Automation +on: [pull_request] +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GOOGLEWORKSPACE_BOT_TOKEN}} + steps: + - name: approve + run: gh pr review --approve "$PR_URL" + - name: merge + run: gh pr merge --auto --squash --delete-branch "$PR_URL diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..c5cb1be8 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,24 @@ +# Copyright 2022 Google LLC +# +# 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. + +name: Lint +on: [push, pull_request] +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + echo "No lint checks"; + exit 1; diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..debf4655 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,24 @@ +# Copyright 2022 Google LLC +# +# 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. + +name: Test +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + echo "No tests"; + exit 1; diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..968a1fb3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,6 @@ +# Report a security issue + +To report a security issue, please use https://g.co/vulnz. We use +https://g.co/vulnz for our intake, and do coordination and disclosure here on +GitHub (including using GitHub Security Advisory). The Google Security Team will +respond within 5 working days of your report on g.co/vulnz. From 6ca85bb70195bbb7b9a00ebf0d89e0f9151820d5 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 21 Jul 2022 12:13:18 -0600 Subject: [PATCH 108/254] chore: standardize workflows (#249) * chore: standardize workflows * test: aggregate matrix --- .github/workflows/ci.yaml | 51 ----------------------------- .github/workflows/lint.yaml | 39 ---------------------- .github/workflows/lint.yml | 24 +++++++++----- .github/workflows/test.yml | 65 ++++++++++++++++++++++++++----------- 4 files changed, 62 insertions(+), 117 deletions(-) delete mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/lint.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 88816de2..00000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,51 +0,0 @@ -name: CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - workflow_dispatch: - -jobs: - test: - concurrency: - group: ${{ github.head_ref || github.ref }} - cancel-in-progress: true - # Only run for internal PRs or after a merge - if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} - runs-on: ubuntu-latest - strategy: - matrix: - # TODO - expand matrix once stable - java-version: [11] - steps: - - uses: actions/checkout@v3 - - name: Fetch and Diff PR with base from which it was cloned - if: ${{ github.event.pull_request.base.sha }} - run: | - git fetch origin master "${{ github.event.pull_request.base.sha }}" - git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" - - name: Set up Java ${{ matrix.java-version }} - uses: actions/setup-java@v2 - with: - distribution: 'temurin' - java-version: ${{ matrix.java-version }} - - name: Write test credentials - run: | - mkdir "${HOME}/secrets" - echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" - echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" - echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" - env: - DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} - SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} - CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2.1.1 - with: - gradle-version: 7.4 - - name: Run tests - run: ./.github/scripts/test.sh diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index 285a7e99..00000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2021 Google LLC -# -# 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. -name: Lint -on: - push: - branches: - - master - pull_request: - branches: - - master - workflow_dispatch: - -jobs: - lint: - concurrency: - group: ${{ github.head_ref || github.ref }} - cancel-in-progress: true - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v2.4.0 - with: - fetch-depth: 0 - - uses: github/super-linter/slim@v4.8.5 - env: - ERROR_ON_MISSING_EXEC_BIT: true - VALIDATE_JSCPD: false - VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c5cb1be8..befb9074 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,14 +11,22 @@ # 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. - name: Lint -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] + jobs: lint: - runs-on: ubuntu-latest + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 - - run: | - echo "No lint checks"; - exit 1; + - uses: actions/checkout@v2.4.0 + with: + fetch-depth: 0 + - uses: github/super-linter/slim@v4.8.5 + env: + ERROR_ON_MISSING_EXEC_BIT: true + VALIDATE_JSCPD: false + VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index debf4655..31604d02 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,24 +1,51 @@ -# Copyright 2022 Google LLC -# -# 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. - name: Test -on: [push, pull_request] + +on: [push, pull_request, workflow_dispatch] + jobs: + matrix: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + # Only run for internal PRs or after a merge + if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + strategy: + matrix: + # TODO - expand matrix once stable + java-version: [11] + steps: + - uses: actions/checkout@v3 + - name: Fetch and Diff PR with base from which it was cloned + if: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin master "${{ github.event.pull_request.base.sha }}" + git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: ${{ matrix.java-version }} + - name: Write test credentials + run: | + mkdir "${HOME}/secrets" + echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" + echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" + echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" + env: + DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} + SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} + CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2.1.1 + with: + gradle-version: 7.4 + - name: Run tests + run: ./.github/scripts/test.sh test: + needs: [matrix] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - run: | - echo "No tests"; - exit 1; + - run: echo "Test matrix finished" \ No newline at end of file From fbe50d8a3263deaf65291deba31209868d1137a3 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 21 Jul 2022 12:25:54 -0600 Subject: [PATCH 109/254] chore: add license headers (#250) --- .github/linters/sun_checks.xml | 16 ++++++++++++++++ .github/snippet-bot.yml | 14 ++++++++++++++ .github/workflows/test.yml | 14 ++++++++++++++ .travis.yml | 14 ++++++++++++++ calendar/sync/packaging.yaml | 14 ++++++++++++++ calendar/sync/pom.xml | 16 ++++++++++++++++ classroom/snippets/src/main/java/Courses.java | 16 ++++++++++++++++ classroom/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../snippets/src/test/java/CoursesTest.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/AppDataSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/ChangeSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/DriveSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/FileSnippets.java | 16 ++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 16 ++++++++++++++++ .../src/test/java/AppDataSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/DriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/FileSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestCreateDrive.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestCreateFolder.java | 16 ++++++++++++++++ .../src/test/java/TestCreateShortcut.java | 16 ++++++++++++++++ .../src/test/java/TestCreateTeamDrive.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestDownloadFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestFetchChanges.java | 16 ++++++++++++++++ .../src/test/java/TestFetchStartPageToken.java | 16 ++++++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestRecoverDrives.java | 16 ++++++++++++++++ .../src/test/java/TestRecoverTeamDrives.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestSearchFiles.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestShareFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestUploadBasic.java | 16 ++++++++++++++++ .../src/test/java/TestUploadRevision.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/AppDataSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/ChangeSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/DriveSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/FileSnippets.java | 16 ++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 16 ++++++++++++++++ .../src/test/java/AppDataSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/DriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/FileSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestCreateFolder.java | 16 ++++++++++++++++ .../src/test/java/TestCreateShortcut.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestDownloadFile.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../src/test/java/TestFetchAppDataFolder.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestListAppData.java | 16 ++++++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestSearchFiles.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestShareFile.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestUploadBasic.java | 16 ++++++++++++++++ .../src/test/java/TestUploadRevision.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ gmail/snippets/src/main/java/SendEmail.java | 16 ++++++++++++++++ .../snippets/src/main/java/SettingsSnippets.java | 16 ++++++++++++++++ gmail/snippets/src/main/java/SmimeSnippets.java | 16 ++++++++++++++++ gmail/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ sheets/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../snippets/src/test/java/TestPivotTable.java | 16 ++++++++++++++++ slides/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../vault/chatmigration/DirectoryService.java | 16 ++++++++++++++++ .../vault/chatmigration/DuplicateHold.java | 16 ++++++++++++++++ .../google/vault/chatmigration/HoldsReport.java | 16 ++++++++++++++++ .../vault/chatmigration/MigrationHelper.java | 16 ++++++++++++++++ .../google/vault/chatmigration/QuickStart.java | 16 ++++++++++++++++ .../vault/chatmigration/RetryableTemplate.java | 16 ++++++++++++++++ 77 files changed, 1224 insertions(+) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index 5585111e..59cbc573 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -1,4 +1,20 @@ + + diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml index e69de29b..bb488a81 100644 --- a/.github/snippet-bot.yml +++ b/.github/snippet-bot.yml @@ -0,0 +1,14 @@ +# Copyright 2022 Google LLC +# +# 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. + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 31604d02..1ce73dbb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# 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. + name: Test on: [push, pull_request, workflow_dispatch] diff --git a/.travis.yml b/.travis.yml index c8b5032d..16a64d16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# 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. + language: java jdk: - oraclejdk11 diff --git a/calendar/sync/packaging.yaml b/calendar/sync/packaging.yaml index 4a6cb239..e150add5 100644 --- a/calendar/sync/packaging.yaml +++ b/calendar/sync/packaging.yaml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# 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. + # GOOGLE SAMPLE PACKAGING DATA # # This file is used by Google as part of our samples packaging process. diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index e97d4a68..333decb2 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -1,4 +1,20 @@ + + 4.0.0 diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java index df399390..0526ddd5 100644 --- a/classroom/snippets/src/main/java/Courses.java +++ b/classroom/snippets/src/main/java/Courses.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 8fa029f5..4b69228f 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java index dc7342bd..858d4540 100644 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.classroom.Classroom; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java index a05d5cc3..cee70b57 100644 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java index 23710324..ae8d4558 100644 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.Drive; import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java index 49942b6d..8c70c3da 100644 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java index f79a8159..f1a86c7c 100644 --- a/drive/snippets/drive_v2/src/main/java/FileSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/FileSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java index 0a6572b6..1f740c8a 100644 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java index 747103f5..b4237983 100644 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index d3851aed..1bbf6e2e 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.HttpRequestInitializer; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java index 3a33e4e8..4323cc7d 100644 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Before; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java index cbe27af2..42bbaf53 100644 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java index dab8987b..1efd149b 100644 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java index 59bdf809..bfed9e79 100644 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.TeamDrive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java index dee4bc33..4db53c7b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java index 4d744772..0c7a25af 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java index a9aec655..1853773d 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java index bca94def..72695b33 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java index 2c4806f6..ce285417 100644 --- a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java index f8741feb..fc6deabb 100644 --- a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java index b5a60ee3..751c47ec 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java index 701ee971..270d09a1 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java index b563346d..7ad8f1bf 100644 --- a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java index d8b246a2..c214234e 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java index 41399754..9b1a7892 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; import com.google.api.services.drive.model.TeamDrive; diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java index 48a8b818..6772cb40 100644 --- a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java index 746ef71a..c47ec72c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java index 3280bcbb..aecfabf4 100644 --- a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java index 35cdf8a4..79617d8d 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java index 77682baa..de932e4f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java index 6dceb63b..815982d9 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java index a3d69c52..ae3a889c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java index 05300c26..975aafb6 100644 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java index 147668fa..5710478b 100644 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.Drive; import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java index 0262a6f4..3bedd15e 100644 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; //import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Drive; diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java index 784a2bbe..84117f41 100644 --- a/drive/snippets/drive_v3/src/main/java/FileSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/FileSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java index 10ca713f..eb2e0711 100644 --- a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.TeamDrive; diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java index 39d5111b..cab4ed28 100644 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index f46d3225..75e636f3 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java index 3a33e4e8..4323cc7d 100644 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Before; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java index f520db8b..71ec6b25 100644 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java index 94eafc4c..a9641861 100644 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java index 3e46bd38..43447b4d 100644 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.TeamDrive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java index 8d2a10bf..9c12f12f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java index a9aec655..1853773d 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java index 2c4806f6..ce285417 100644 --- a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java index f8741feb..fc6deabb 100644 --- a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java index 4049e5f6..95c69b6c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java index 52544bfd..fe67a1f2 100644 --- a/drive/snippets/drive_v3/src/test/java/TestListAppData.java +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.FileList; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java index 857c20d7..7e4b2b8d 100644 --- a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import javax.annotation.CheckReturnValue; diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java index 48a8b818..6772cb40 100644 --- a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java index 746ef71a..c47ec72c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java index 3280bcbb..aecfabf4 100644 --- a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java index 67e2d13c..a8dbd5be 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java index c301131c..b33b7866 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java index 77682baa..de932e4f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java index bf4702e9..c328994e 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java index a3d69c52..ae3a889c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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 org.junit.Test; import java.io.IOException; diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java index 002f2f53..9b671f32 100644 --- a/gmail/snippets/src/main/java/SendEmail.java +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.gmail.Gmail; import com.google.api.services.gmail.model.Draft; import com.google.api.services.gmail.model.Message; diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java index fab67fa6..89bb8fd9 100644 --- a/gmail/snippets/src/main/java/SettingsSnippets.java +++ b/gmail/snippets/src/main/java/SettingsSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.FileContent; diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java index 85f3d0de..7c0fd468 100644 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.gmail.Gmail; import com.google.api.services.gmail.model.*; import com.google.api.services.gmail.model.SmimeInfo; diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 4e287a9f..3fc90c8b 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 12a1db27..b1f27a1a 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java index 84c1b043..83d26883 100644 --- a/sheets/snippets/src/test/java/TestPivotTable.java +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import org.junit.Test; import java.io.IOException; diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index f88fec7c..f28c5117 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java index 55d2bf7c..24514a5e 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java index 7cfc8ed7..cf8ef242 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index 8ed6af36..b2bb1a07 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.google.api.services.admin.directory.model.OrgUnit; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index 4e4772f6..2da593c3 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.google.api.client.auth.oauth2.Credential; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java index b4fd4cea..70e5943e 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.google.api.services.admin.directory.Directory; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java index 5f1fc347..d9642d58 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; From fa9e1d2363a1c8f67bc220d0afc85c1587a98a69 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:52:45 -0600 Subject: [PATCH 110/254] chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' (#251) --- .github/workflows/automation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index a5b0e865..aaef124b 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -11,7 +11,7 @@ # 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. - +--- name: Automation on: [pull_request] jobs: @@ -25,4 +25,4 @@ jobs: - name: approve run: gh pr review --approve "$PR_URL" - name: merge - run: gh pr merge --auto --squash --delete-branch "$PR_URL + run: gh pr merge --auto --squash --delete-branch "$PR_URL" From 9e7d6708d7b6b0d02506aa17eee9f1c09495efd0 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:32:37 -0600 Subject: [PATCH 111/254] chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' (#252) --- .github/workflows/automation.yml | 45 ++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index aaef124b..5144afe4 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -13,11 +13,11 @@ # limitations under the License. --- name: Automation -on: [pull_request] +on: [push, pull_request, workflow_dispatch] jobs: dependabot: runs-on: ubuntu-latest - if: ${{ github.actor == 'dependabot[bot]' }} + if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request' }} env: PR_URL: ${{github.event.pull_request.html_url}} GITHUB_TOKEN: ${{secrets.GOOGLEWORKSPACE_BOT_TOKEN}} @@ -26,3 +26,44 @@ jobs: run: gh pr review --approve "$PR_URL" - name: merge run: gh pr merge --auto --squash --delete-branch "$PR_URL" + default-branch-migration: + # this job helps with migrating the default branch to main + # it pushes main to master if master exists and main is the default branch + # it pushes master to main if master is the default branch + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + # required otherwise GitHub blocks infinite loops in pushes originating in an action + token: ${{ secrets.GOOGLEWORKSPACE_BOT_TOKEN }} + - name: Set env + run: | + # set DEFAULT BRANCH + echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> $GITHUB_ENV; + + # set HAS_MASTER_BRANCH + if [ ! -z "$(git ls-remote --heads origin master)" ]; then + echo "HAS_MASTER_BRANCH=true" >> $GITHUB_ENV + else + echo "HAS_MASTER_BRANCH=false" >> $GITHUB_ENV + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: configure git + run: | + git config --global user.name 'googleworkspace-bot' + git config --global user.email 'googleworkspace-bot@google.com' + - if: ${{ env.DEFAULT_BRANCH == 'main' && env.HAS_MASTER_BRANCH == 'true' }} + name: Update master branch from main + run: | + git checkout -b master + git reset --hard origin/main + git push origin master + - if: ${{ env.DEFAULT_BRANCH == 'master'}} + name: Update main branch from master + run: | + git checkout -b main + git reset --hard origin/master + git push origin main From e39e8b5eedfdcffafa27090375a82d9180e46fe9 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Fri, 22 Jul 2022 17:06:47 -0600 Subject: [PATCH 112/254] chore: switch to main (#253) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 189f8f47..2ab1be1a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=master)](https://travis-ci.org/googleworkspace/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=main)](https://travis-ci.org/googleworkspace/java-samples) A collection of samples that demonstrate how to call Google Workspace APIs in Java. From f0b358e76dcd6a5d058d5d1df00029a77643760d Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 28 Jul 2022 10:54:51 -0600 Subject: [PATCH 113/254] build: remove travis (#254) --- .travis.yml | 31 ------------------------------- README.md | 2 -- 2 files changed, 33 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 16a64d16..00000000 --- a/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2022 Google LLC -# -# 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. - -language: java -jdk: - - oraclejdk11 -# Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) -env: - - DIR=adminSDK/alertcenter/quickstart - - DIR=adminSDK/directory/quickstart - - DIR=adminSDK/reports/quickstart - - DIR=adminSDK/reseller/quickstart - - DIR=appsScript/quickstart - - DIR=classroom/quickstart - - DIR=drive/quickstart - - DIR=gmail/quickstart - - DIR=sheets/quickstart - - DIR=slides/quickstart - - DIR=tasks/quickstart -script: cd $DIR && gradle build # gradle -q run diff --git a/README.md b/README.md index 2ab1be1a..46bec9a3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=main)](https://travis-ci.org/googleworkspace/java-samples) - A collection of samples that demonstrate how to call Google Workspace APIs in Java. ## APIs From d2da6ab1106e623eb0802e58f97b526963626b58 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 29 Jul 2022 11:17:43 -0600 Subject: [PATCH 114/254] chore: Synced file(s) with googleworkspace/.github (#255) * chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' * chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' --- .github/sync-repo-settings.yaml | 15 --------------- .github/workflows/automation.yml | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 757d7bb5..1e81cab7 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -34,21 +34,6 @@ branchProtectionRules: - "conventionalcommits.org" requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true - - pattern: master - isAdminEnforced: false - requiresStrictStatusChecks: false - requiredStatusCheckContexts: - # .github/workflows/test.yml with a job called "test" - - "test" - # .github/workflows/lint.yml with a job called "lint" - - "lint" - # Google bots below - - "cla/google" - - "snippet-bot check" - - "header-check" - - "conventionalcommits.org" - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true permissionRules: - team: workspace-devrel-dpe permission: admin diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index 5144afe4..b01e9cf9 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -58,12 +58,12 @@ jobs: - if: ${{ env.DEFAULT_BRANCH == 'main' && env.HAS_MASTER_BRANCH == 'true' }} name: Update master branch from main run: | - git checkout -b master + git checkout -B master git reset --hard origin/main git push origin master - if: ${{ env.DEFAULT_BRANCH == 'master'}} name: Update main branch from master run: | - git checkout -b main + git checkout -B main git reset --hard origin/master git push origin main From 41559c4daa0b838348c9cbc4426ee6d4c4a98ffe Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Thu, 4 Aug 2022 16:41:56 -0600 Subject: [PATCH 115/254] chore: Remove no longer used files. (#256) --- .../drive_v2/src/main/java/FileSnippets.java | 313 ------------------ .../src/main/java/TeamDriveSnippets.java | 98 ------ .../drive_v3/src/main/java/FileSnippets.java | 306 ----------------- .../src/main/java/TeamDriveSnippets.java | 100 ------ .../src/main/java/SettingsSnippets.java | 122 ------- .../snippets/src/main/java/SmimeSnippets.java | 275 --------------- 6 files changed, 1214 deletions(-) delete mode 100644 drive/snippets/drive_v2/src/main/java/FileSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/FileSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java delete mode 100644 gmail/snippets/src/main/java/SettingsSnippets.java delete mode 100644 gmail/snippets/src/main/java/SmimeSnippets.java diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java deleted file mode 100644 index f1a86c7c..00000000 --- a/drive/snippets/drive_v2/src/main/java/FileSnippets.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.ParentReference; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -public class FileSnippets { - - private Drive service; - - public FileSnippets(Drive service) { - this.service = service; - } - - public String uploadBasic() throws IOException { - Drive driveService = this.service; - // [START uploadBasic] - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadBasic] - return file.getId(); - } - - public String uploadRevision(String realFileId) throws IOException { - Drive driveService = this.service; - // [START uploadRevision] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadRevision] - return file.getId(); - } - - - public File uploadToFolder(String realFolderId) throws IOException { - Drive driveService = this.service; - // [START uploadToFolder] - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - File fileMetadata = new File(); - // [START_EXCLUDE silent] - folderId = realFolderId; - // [END_EXCLUDE] - fileMetadata.setTitle("photo.jpg"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId(folderId))); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadToFolder] - return file; - } - - public String uploadWithConversion() throws IOException { - Drive driveService = this.service; - - // [START uploadWithConversion] - File fileMetadata = new File(); - fileMetadata.setTitle("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadWithConversion] - return file.getId(); - } - - public ByteArrayOutputStream exportPdf(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START exportPdf] - String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().export(fileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); - // [END exportPdf] - return (ByteArrayOutputStream) outputStream; - } - - public ByteArrayOutputStream downloadFile(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START downloadFile] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().get(fileId) - .executeMediaAndDownloadTo(outputStream); - // [END downloadFile] - return (ByteArrayOutputStream) outputStream; - } - - public String createShortcut() throws IOException { - Drive driveService = this.service; - // [START createShortcut] - File fileMetadata = new File(); - fileMetadata.setTitle("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - - File file = driveService.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END createShortcut] - return file.getId(); - } - - public long touchFile(String realFileId, long realTimestamp) - throws IOException { - Drive driveService = this.service; - - // [START touchFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); - // [START_EXCLUDE silent] - fileId = realFileId; - fileMetadata.setModifiedDate(new DateTime(realTimestamp)); - // [END_EXCLUDE] - File file = driveService.files().update(fileId, fileMetadata) - .setSetModifiedDate(true) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedDate()); - // [END touchFile] - return file.getModifiedDate().getValue(); - } - - public String createFolder() throws IOException { - Drive driveService = this.service; - // [START createFolder] - File fileMetadata = new File(); - fileMetadata.setTitle("Invoices"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - - File file = driveService.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END createFolder] - return file.getId(); - } - - public List moveFileToFolder(String realFileId, String realFolderId) - throws IOException { - Drive driveService = this.service; - // [START moveFileToFolder] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - // [START_EXCLUDE silent] - fileId = realFileId; - folderId = realFolderId; - // [END_EXCLUDE] - // Retrieve the existing parents to remove - File file = driveService.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (ParentReference parent : file.getParents()) { - previousParents.append(parent.getId()); - previousParents.append(','); - } - // Move the file to the new folder - file = driveService.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); - // [END moveFileToFolder] - List parents = new ArrayList(); - for (ParentReference parent : file.getParents()) { - parents.add(parent.getId()); - } - return parents; - } - - public List searchFiles() throws IOException { - Drive driveService = this.service; - List files = new ArrayList(); - // [START searchFiles] - String pageToken = null; - do { - FileList result = driveService.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } - // [START_EXCLUDE silent] - files.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END searchFiles] - return files; - } - - public List shareFile(String realFileId, String realUser, String realDomain) - throws IOException { - Drive driveService = this.service; - final List ids = new ArrayList(); - // [START shareFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - // [START_EXCLUDE silent] - ids.add(permission.getId()); - // [END_EXCLUDE] - } - }; - BatchRequest batch = driveService.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - userPermission.setValue(realUser); - // [END_EXCLUDE] - driveService.permissions().insert(fileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader") - .setValue("example.com"); - // [START_EXCLUDE silent] - domainPermission.setValue(realDomain); - // [END_EXCLUDE] - driveService.permissions().insert(fileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - // [END shareFile] - return ids; - } - -} diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java deleted file mode 100644 index 1f740c8a..00000000 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.TeamDrive; -import com.google.api.services.drive.model.TeamDriveList; -import com.google.api.services.drive.model.Permission; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class TeamDriveSnippets { - private Drive service; - - public TeamDriveSnippets(Drive service) { - this.service = service; - } - - public String createTeamDrive() throws IOException { - Drive driveService = this.service; - // [START createTeamDrive] - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = driveService.teamdrives().insert(requestId, teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - // [END createTeamDrive] - return teamDrive.getId(); - } - - public List recoverTeamDrives(String realUser) - throws IOException { - Drive driveService = this.service; - List teamDrives = new ArrayList(); - // [START recoverTeamDrives] - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] - - do { - TeamDriveList result = driveService.teamdrives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getItems()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .insert(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", permissionResult.getId()); - } - // [START_EXCLUDE silent] - teamDrives.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverTeamDrives] - return teamDrives; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java deleted file mode 100644 index 84117f41..00000000 --- a/drive/snippets/drive_v3/src/main/java/FileSnippets.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.Permission; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -public class FileSnippets { - - private Drive service; - - public FileSnippets(Drive service) { - this.service = service; - } - - public String uploadBasic() throws IOException { - Drive driveService = this.service; - // [START uploadBasic] - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadBasic] - return file.getId(); - } - - public String uploadRevision(String realFileId) throws IOException { - Drive driveService = this.service; - // [START uploadRevision] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadRevision] - return file.getId(); - } - - - public File uploadToFolder(String realFolderId) throws IOException { - Drive driveService = this.service; - // [START uploadToFolder] - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - File fileMetadata = new File(); - // [START_EXCLUDE silent] - folderId = realFolderId; - // [END_EXCLUDE] - fileMetadata.setName("photo.jpg"); - fileMetadata.setParents(Collections.singletonList(folderId)); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadToFolder] - return file; - } - - public String uploadWithConversion() throws IOException { - Drive driveService = this.service; - - // [START uploadWithConversion] - File fileMetadata = new File(); - fileMetadata.setName("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadWithConversion] - return file.getId(); - } - - public ByteArrayOutputStream exportPdf(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START exportPdf] - String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().export(fileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); - // [END exportPdf] - return (ByteArrayOutputStream) outputStream; - } - - public ByteArrayOutputStream downloadFile(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START downloadFile] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().get(fileId) - .executeMediaAndDownloadTo(outputStream); - // [END downloadFile] - return (ByteArrayOutputStream) outputStream; - } - - public String createShortcut() throws IOException { - Drive driveService = this.service; - // [START createShortcut] - File fileMetadata = new File(); - fileMetadata.setName("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - - File file = driveService.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END createShortcut] - return file.getId(); - } - - public long touchFile(String realFileId, long realTimestamp) - throws IOException { - Drive driveService = this.service; - - // [START touchFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); - // [START_EXCLUDE silent] - fileId = realFileId; - fileMetadata.setModifiedTime(new DateTime(realTimestamp)); - // [END_EXCLUDE] - File file = driveService.files().update(fileId, fileMetadata) - .setFields("id, modifiedTime") - .execute(); - System.out.println("Modified time: " + file.getModifiedTime()); - // [END touchFile] - return file.getModifiedTime().getValue(); - } - - public String createFolder() throws IOException { - Drive driveService = this.service; - // [START createFolder] - File fileMetadata = new File(); - fileMetadata.setName("Invoices"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - - File file = driveService.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END createFolder] - return file.getId(); - } - - public List moveFileToFolder(String realFileId, String realFolderId) - throws IOException { - Drive driveService = this.service; - // [START moveFileToFolder] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - // [START_EXCLUDE silent] - fileId = realFileId; - folderId = realFolderId; - // [END_EXCLUDE] - // Retrieve the existing parents to remove - File file = driveService.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (String parent : file.getParents()) { - previousParents.append(parent); - previousParents.append(','); - } - // Move the file to the new folder - file = driveService.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); - // [END moveFileToFolder] - return file.getParents(); - } - - public List searchFiles() throws IOException { - Drive driveService = this.service; - List files = new ArrayList(); - // [START searchFiles] - String pageToken = null; - do { - FileList result = driveService.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, files(id, name)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } - // [START_EXCLUDE silent] - files.addAll(result.getFiles()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END searchFiles] - return files; - } - - public List shareFile(String realFileId, String realUser, String realDomain) - throws IOException { - Drive driveService = this.service; - final List ids = new ArrayList(); - // [START shareFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - // [START_EXCLUDE silent] - ids.add(permission.getId()); - // [END_EXCLUDE] - } - }; - BatchRequest batch = driveService.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - userPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - driveService.permissions().create(fileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader") - .setDomain("example.com"); - // [START_EXCLUDE silent] - domainPermission.setDomain(realDomain); - // [END_EXCLUDE] - driveService.permissions().create(fileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - // [END shareFile] - return ids; - } - -} diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java deleted file mode 100644 index eb2e0711..00000000 --- a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.TeamDrive; -import com.google.api.services.drive.model.TeamDriveList; -import com.google.api.services.drive.model.Permission; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class TeamDriveSnippets { - private Drive service; - - public TeamDriveSnippets(Drive service) { - this.service = service; - } - - public String createTeamDrive() throws IOException { - Drive driveService = this.service; - // [START createTeamDrive] - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = driveService.teamdrives().create(requestId, - teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - // [END createTeamDrive] - return teamDrive.getId(); - } - - public List recoverTeamDrives(String realUser) - throws IOException { - Drive driveService = this.service; - List teamDrives = new ArrayList(); - // [START recoverTeamDrives] - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - - do { - TeamDriveList result = driveService.teamdrives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, teamDrives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getTeamDrives()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .create(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - teamDrives.addAll(result.getTeamDrives()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverTeamDrives] - return teamDrives; - } -} diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java deleted file mode 100644 index 89bb8fd9..00000000 --- a/gmail/snippets/src/main/java/SettingsSnippets.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -public class SettingsSnippets { - - private Gmail service; - - public SettingsSnippets(Gmail service) { - this.service = service; - } - - public String updateSignature() throws IOException { - Gmail gmailService = this.service; - // [START updateSignature] - SendAs primaryAlias = null; - ListSendAsResponse aliases = gmailService.users().settings().sendAs().list("me").execute(); - for (SendAs alias: aliases.getSendAs()) { - if (alias.getIsPrimary()) { - primaryAlias = alias; - break; - } - } - SendAs aliasSettings = new SendAs().setSignature("I heart cats."); - SendAs result = gmailService.users().settings().sendAs().patch( - "me", - primaryAlias.getSendAsEmail(), - aliasSettings) - .execute(); - System.out.println("Updated signature for " + result.getDisplayName()); - // [END updateSignature] - return result.getSignature(); - } - - public String createFilter(String realLabelId) throws IOException { - Gmail gmailService = this.service; - // [START createFilter] - String labelId = "Label_14"; // ID of the user label to add - // [START_EXCLUDE silent] - labelId = realLabelId; - // [END_EXCLUDE] - Filter filter = new Filter() - .setCriteria(new FilterCriteria() - .setFrom("cat-enthusiasts@example.com")) - .setAction(new FilterAction() - .setAddLabelIds(Arrays.asList(labelId)) - .setRemoveLabelIds(Arrays.asList("INBOX"))); - Filter result = gmailService.users().settings().filters().create("me", filter).execute(); - System.out.println("Created filter " + result.getId()); - // [END createFilter] - return result.getId(); - } - - public AutoForwarding enableForwarding(String realForwardingAddress) throws IOException { - Gmail gmailService = this.service; - // [START enableForwarding] - ForwardingAddress address = new ForwardingAddress() - .setForwardingEmail("user2@example.com"); - // [START_EXCLUDE silent] - address.setForwardingEmail(realForwardingAddress); - // [END_EXCLUDE] - ForwardingAddress createAddressResult = gmailService.users().settings().forwardingAddresses() - .create("me", address).execute(); - if (createAddressResult.getVerificationStatus().equals("accepted")) { - AutoForwarding autoForwarding = new AutoForwarding() - .setEnabled(true) - .setEmailAddress(address.getForwardingEmail()) - .setDisposition("trash"); - autoForwarding = gmailService.users().settings().updateAutoForwarding("me", autoForwarding).execute(); - // [START_EXCLUDE silent] - return autoForwarding; - } - // [END enableForwarding] - return null; - } - - public VacationSettings enableAutoReply() throws IOException { - Gmail gmailService = this.service; - // [START enableAutoReply] - VacationSettings vacationSettings = new VacationSettings() - .setEnableAutoReply(true) - .setResponseBodyHtml("I'm on vacation and will reply when I'm back in the office. Thanks!") - .setRestrictToDomain(true) - .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) * 1000) - .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.UTC) * 1000); - VacationSettings response = gmailService.users().settings().updateVacation("me", vacationSettings).execute(); - // [END enableAutoReply] - return response; - } - -} diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java deleted file mode 100644 index 7c0fd468..00000000 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; -import com.google.api.services.gmail.model.SmimeInfo; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Base64; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; - -class SmimeSnippets { - - SmimeSnippets() {} - - // [START create_smime_info] - /** - * Create an SmimeInfo resource for a certificate from file. - * - * @param filename Name of the file containing the S/MIME certificate. - * @param password Password for the certificate file, or null if the file is not - * password-protected. - * @return An SmimeInfo object with the specified certificate. - */ - public static SmimeInfo createSmimeInfo(String filename, String password) { - SmimeInfo smimeInfo = null; - InputStream in = null; - - try { - byte[] fileContent = Files.readAllBytes(Paths.get(filename)); - smimeInfo = new SmimeInfo(); - smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); - if (password != null && password.length() > 0) { - smimeInfo.setEncryptedKeyPassword(password); - } - } catch (Exception e) { - System.out.printf("An error occured while reading the certificate file: %s\n", e); - } - return smimeInfo; - } - // [END create_smime_info] - - // [START insert_smime_info] - /** - * Upload an S/MIME certificate for the user. - * - * @param service Authorized GMail API service instance. - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. - * @return An SmimeInfo object with details about the uploaded certificate. - */ - public static SmimeInfo insertSmimeInfo( - Gmail service, String userId, String sendAsEmail, SmimeInfo smimeInfo) { - if (sendAsEmail == null) { - sendAsEmail = userId; - } - - try { - SmimeInfo results = - service - .users() - .settings() - .sendAs() - .smimeInfo() - .insert(userId, sendAsEmail, smimeInfo) - .execute(); - System.out.printf("Inserted certificate, id: %s\n", results.getId()); - return results; - } catch (IOException e) { - System.err.printf("An error occured: %s", e); - } - - return null; - } - // [END insert_smime_info] - - // [START insert_cert_from_csv] - /** - * A builder that returns a GMail API service instance that is authorized to act on behalf of the - * specified user. - */ - @FunctionalInterface - public interface GmailServiceBuilder { - Gmail buildGmailServiceFromUserId(String userId) throws IOException; - } - - /** - * Upload S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param serviceBuilder A function that returns an authorized GMail API service instance for a - * given user. - * @param csvFilename Name of the CSV file. - */ - public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - if (smimeInfo == null) { - System.err.printf("Unable to read certificate file for userId: %s\n", userId); - continue; - } - insertSmimeInfo(serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } - } - // [END insert_cert_from_csv] - - // [START update_smime_certs] - /** - * Update S/MIME certificates for the user. - * - *

First performs a lookup of all certificates for a user. If there are no certificates, or - * they all expire before the specified date/time, uploads the certificate in the specified file. - * If the default certificate is expired or there was no default set, chooses the certificate with - * the expiration furthest into the future and sets it as default. - * - * @param service Authorized GMail API service instance. - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. - * @param certFilename Name of the file containing the S/MIME certificate. - * @param certPassword Password for the certificate file, or None if the file is not - * password-protected. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certifcate. - */ - public static String updateSmimeCerts( - Gmail service, - String userId, - String sendAsEmail, - String certFilename, - String certPassword, - LocalDateTime expireTime) { - if (sendAsEmail == null) { - sendAsEmail = userId; - } - - ListSmimeInfoResponse listResults = null; - try { - listResults = - service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); - } catch (IOException e) { - System.err.printf("An error occurred during list: %s\n", e); - return null; - } - - String defaultCertId = null; - String bestCertId = null; - LocalDateTime bestCertExpire = LocalDateTime.MIN; - - if (expireTime == null) { - expireTime = LocalDateTime.now(); - } - if (listResults != null && listResults.getSmimeInfo() != null) { - for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { - String certId = smimeInfo.getId(); - boolean isDefaultCert = smimeInfo.getIsDefault(); - if (isDefaultCert) { - defaultCertId = certId; - } - LocalDateTime exp = LocalDateTime.ofInstant( - Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); - if (exp.isAfter(expireTime)) { - if (exp.isAfter(bestCertExpire)) { - bestCertId = certId; - bestCertExpire = exp; - } - } else { - if (isDefaultCert) { - defaultCertId = null; - } - } - } - } - if (defaultCertId == null) { - String defaultId = bestCertId; - if (defaultId == null && certFilename != null) { - SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - SmimeInfo insertResults = insertSmimeInfo(service, userId, sendAsEmail, smimeInfo); - if (insertResults != null) { - defaultId = insertResults.getId(); - } - } - - if (defaultId != null) { - try { - service - .users() - .settings() - .sendAs() - .smimeInfo() - .setDefault(userId, sendAsEmail, defaultId) - .execute(); - return defaultId; - } catch (IOException e) { - System.err.printf("An error occured during setDefault: %s", e); - } - } - } else { - return defaultCertId; - } - - return null; - } - - /** - * Update S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param serviceBuilder A function that returns an authorized GMail API service instance for a - * given user. - * @param csvFilename Name of the CSV file. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. - */ - public static void updateSmimeFromCsv( - GmailServiceBuilder serviceBuilder, String csvFilename, LocalDateTime expireTime) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse( - csvFile, - java.nio.charset.StandardCharsets.UTF_8, - CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - updateSmimeCerts( - serviceBuilder.buildGmailServiceFromUserId(userId), - userId, - userId, - certFilename, - certPassword, - expireTime); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } - } - // [END update_smime_certs] -} From 39bf07bc89c4fa11fd5ade6abed0cfb1ddd0564b Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Fri, 5 Aug 2022 10:21:46 -0600 Subject: [PATCH 116/254] chore: Remove stray lint to appease linter --- .github/snippet-bot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml index bb488a81..6d6d1266 100644 --- a/.github/snippet-bot.yml +++ b/.github/snippet-bot.yml @@ -11,4 +11,3 @@ # 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. - From 6b09f7c7a4356ae4a33ab0f7e620d226b53aea72 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 5 Aug 2022 12:25:11 -0600 Subject: [PATCH 117/254] chore: Synced local '.github/linters/' with remote 'sync-files/defaults/.github/linters/' (#257) --- .github/linters/.htmlhintrc | 25 ++++++++++++++ .github/linters/.yaml-lint.yml | 59 ++++++++++++++++++++++++++++++++++ .github/linters/sun_checks.xml | 3 -- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 .github/linters/.htmlhintrc create mode 100644 .github/linters/.yaml-lint.yml diff --git a/.github/linters/.htmlhintrc b/.github/linters/.htmlhintrc new file mode 100644 index 00000000..70391a46 --- /dev/null +++ b/.github/linters/.htmlhintrc @@ -0,0 +1,25 @@ +{ + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "attr-value-not-empty": false, + "attr-no-duplication": true, + "doctype-first": false, + "tag-pair": true, + "tag-self-close": false, + "spec-char-escape": false, + "id-unique": true, + "src-not-empty": true, + "title-require": false, + "alt-require": true, + "doctype-html5": true, + "id-class-value": false, + "style-disabled": false, + "inline-style-disabled": false, + "inline-script-disabled": false, + "space-tab-mixed-disabled": "space", + "id-class-ad-disabled": false, + "href-abs-or-rel": false, + "attr-unsafe-chars": true, + "head-script-disabled": false +} diff --git a/.github/linters/.yaml-lint.yml b/.github/linters/.yaml-lint.yml new file mode 100644 index 00000000..e8394fd5 --- /dev/null +++ b/.github/linters/.yaml-lint.yml @@ -0,0 +1,59 @@ +--- +########################################### +# These are the rules used for # +# linting all the yaml files in the stack # +# NOTE: # +# You can disable line with: # +# # yamllint disable-line # +########################################### +rules: + braces: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + brackets: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + colons: + level: warning + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: warning + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: disable + comments-indentation: disable + document-end: disable + document-start: + level: warning + present: true + empty-lines: + level: warning + max: 2 + max-start: 0 + max-end: 0 + hyphens: + level: warning + max-spaces-after: 1 + indentation: + level: warning + spaces: consistent + indent-sequences: true + check-multi-line-strings: false + key-duplicates: enable + line-length: + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: disable + new-lines: + type: unix + trailing-spaces: disable \ No newline at end of file diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index 59cbc573..de6c6cd4 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -1,13 +1,10 @@ - - 4.0.0 - - com.google - google - 5 - - com.google.apis-samples - calendar-sync-samples - 1 - Samples demonstrating syncing techniques for the Calendar API. - TODO: Determine the final URL. - 2014 - - 2.0.9 - + + 4.0.0 + + com.google + google + 5 + + com.google.apis-samples + calendar-sync-samples + 1 + Samples demonstrating syncing techniques for the Calendar API. + TODO: Determine the final URL. + 2014 + + 2.0.9 + - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - org.codehaus.mojo - exec-maven-plugin - 1.1 - - - - java - - - - - - - java.util.logging.config.file - logging.properties - - - - - - ${project.artifactId}-${project.version} - + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.codehaus.mojo + exec-maven-plugin + 1.1 + + + + java + + + + + + + java.util.logging.config.file + logging.properties + + + + + + ${project.artifactId}-${project.version} + - - - com.google.apis - google-api-services-calendar - v3-rev20211026-1.32.1 - - - com.google.api-client - google-api-client - 1.33.0 - - - com.google.http-client - google-http-client-jackson2 - ${project.http.version} - - - com.google.oauth-client - google-oauth-client-jetty - ${project.oauth.version} - - - com.google.collections - google-collections - 1.0 - - + + + com.google.apis + google-api-services-calendar + v3-rev20211026-1.32.1 + + + com.google.api-client + google-api-client + 1.33.0 + + + com.google.http-client + google-http-client-jackson2 + ${project.http.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${project.oauth.version} + + + com.google.collections + google-collections + 1.0 + + - - 1.41.0 - 1.32.1 - UTF-8 - + + 1.41.0 + 1.32.1 + UTF-8 + diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java index e84a36a4..a3b0c500 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,10 +34,14 @@ */ public class ConditionalModificationSample { - /** The maximum number of times to attempt to update the event, before aborting. */ + /** + * The maximum number of times to attempt to update the event, before aborting. + */ private static final int MAX_UPDATE_ATTEMPTS = 5; - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java index 1d20f796..66dd210d 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,7 +34,9 @@ */ public class ConditionalRetrievalSample { - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java index 38b24ee3..396de651 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java @@ -22,7 +22,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Events; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.Date; import java.util.List; @@ -37,18 +36,23 @@ */ public class SyncTokenSample { - /** Global instance of the Calendar client. */ + /** + * The key in the sync settings datastore that holds the current sync token. + */ + private static final String SYNC_TOKEN_KEY = "syncToken"; + /** + * Global instance of the Calendar client. + */ private static Calendar client; - - /** Global instance of the event datastore. */ + /** + * Global instance of the event datastore. + */ private static DataStore eventDataStore; - - /** Global instance of the sync settings datastore. */ + /** + * Global instance of the sync settings datastore. + */ private static DataStore syncSettingsDataStore; - /** The key in the sync settings datastore that holds the current sync token. */ - private static final String SYNC_TOKEN_KEY = "syncToken"; - public static void main(String[] args) { try { List scopes = Lists.newArrayList(CalendarScopes.CALENDAR_READONLY); diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java index 32e9fb87..775dc403 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java @@ -30,7 +30,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Event.Reminders; import com.google.api.services.calendar.model.EventDateTime; - import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; @@ -41,20 +40,27 @@ * A collection of utility methods used by these samples. */ public class Utils { - /** Application name */ + /** + * Application name + */ private static final String APPLICATION_NAME = "Calendar Sync Samples"; - /** Directory to store user credentials. */ + /** + * Directory to store user credentials. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".store/calendar-sync"); - - /** Global instance of the {@link DataStoreFactory}. */ - private static FileDataStoreFactory dataStoreFactory; - - /** Global instance of the JSON factory. */ + /** + * Global instance of the JSON factory. + */ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ + /** + * Global instance of the {@link DataStoreFactory}. + */ + private static FileDataStoreFactory dataStoreFactory; + /** + * Global instance of the HTTP transport. + */ private static HttpTransport httpTransport; static { @@ -67,14 +73,18 @@ public class Utils { } } - /** Creates a new Calendar client to use when making requests to the API. */ + /** + * Creates a new Calendar client to use when making requests to the API. + */ public static Calendar createCalendarClient(List scopes) throws Exception { Credential credential = authorize(scopes); return new Calendar.Builder( httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); } - /** Authorizes the installed application to access user's protected data. */ + /** + * Authorizes the installed application to access user's protected data. + */ public static Credential authorize(List scopes) throws Exception { // Load client secrets. GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, @@ -83,7 +93,7 @@ public static Credential authorize(List scopes) throws Exception { || clientSecrets.getDetails().getClientSecret().startsWith("Enter")) { System.out.println( "Overwrite the src/main/resources/client_secrets.json file with the client secrets file " - + "you downloaded from your Google Developers Console project."); + + "you downloaded from your Google Developers Console project."); System.exit(1); } @@ -94,12 +104,16 @@ public static Credential authorize(List scopes) throws Exception { return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } - /** Gets the datastore factory used in these samples. */ + /** + * Gets the datastore factory used in these samples. + */ public static DataStoreFactory getDataStoreFactory() { return dataStoreFactory; } - /** Creates a test event. */ + /** + * Creates a test event. + */ public static Event createTestEvent(Calendar client, String summary) throws IOException { Date oneHourFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 1); Date twoHoursFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 2); @@ -116,7 +130,7 @@ public static Event createTestEvent(Calendar client, String summary) throws IOEx /** * Gets a new {@link java.util.Date} relative to the current date and time. * - * @param field the field identifier from {@link java.util.Calendar} to increment + * @param field the field identifier from {@link java.util.Calendar} to increment * @param amount the amount of the field to increment * @return the new date */ diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index 29d9ae24..fb174b5e 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START classroom_quickstart] + 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; @@ -36,61 +37,66 @@ import java.util.List; public class ClassroomQuickstart { - private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Classroom service = new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // List the first 10 courses that the user has access to. - ListCoursesResponse response = service.courses().list() - .setPageSize(10) - .execute(); - List courses = response.getCourses(); - if (courses == null || courses.size() == 0) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s\n", course.getName()); - } - } + // List the first 10 courses that the user has access to. + ListCoursesResponse response = service.courses().list() + .setPageSize(10) + .execute(); + List courses = response.getCourses(); + if (courses == null || courses.size() == 0) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s\n", course.getName()); + } } + } } // [END classroom_quickstart] diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index b3237c9a..142072a3 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -14,6 +14,7 @@ // [START classroom_add_student] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,52 +30,52 @@ /* Class to demonstrate the use of Classroom Add Student API */ public class AddStudent { - /** - * Add a student in a specified course. - * - * @param courseId - Id of the course. - * @param enrollmentCode - Code of the course to enroll. - * @return newly added student - * @throws IOException - if credentials file not found. - */ - public static Student addStudent(String courseId, String enrollmentCode) - throws IOException { + /** + * Add a student in a specified course. + * + * @param courseId - Id of the course. + * @param enrollmentCode - Code of the course to enroll. + * @return newly added student + * @throws IOException - if credentials file not found. + */ + public static Student addStudent(String courseId, String enrollmentCode) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Student student = new Student().setUserId("me"); - try { - // Enrolling a student to a specified course - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); - // Prints the course id with the Student name - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", - student.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.println("You are already a member of this course."); - } else if (error.getCode() == 403) { - System.out.println("The caller does not have permission.\n"); - } else { - throw e; - } - } - return student; + Student student = new Student().setUserId("me"); + try { + // Enrolling a student to a specified course + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + // Prints the course id with the Student name + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } } + return student; + } } // [END classroom_add_student] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java index bede3367..9f5652e3 100644 --- a/classroom/snippets/src/main/java/AddTeacher.java +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -14,6 +14,7 @@ // [START classroom_add_teacher] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,50 +30,50 @@ /* Class to demonstrate the use of Classroom Add Teacher API */ public class AddTeacher { - /** - * Add teacher to a specific course. - * - * @param courseId - Id of the course. - * @param teacherEmail - Email address of the teacher. - * @return newly created teacher - * @throws IOException - if credentials file not found. - */ - public static Teacher addTeacher(String courseId, String teacherEmail) - throws IOException { + /** + * Add teacher to a specific course. + * + * @param courseId - Id of the course. + * @param teacherEmail - Email address of the teacher. + * @return newly created teacher + * @throws IOException - if credentials file not found. + */ + public static Teacher addTeacher(String courseId, String teacherEmail) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Teacher teacher = new Teacher().setUserId(teacherEmail); - try { - // Add a teacher to a specified course - teacher = service.courses().teachers().create(courseId, teacher).execute(); - // Prints the course id with the teacher name - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", - teacher.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); - } else if (error.getCode() == 403) { - System.out.println("The caller does not have permission.\n"); - } else { - throw e; - } - } - return teacher; + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + // Add a teacher to a specified course + teacher = service.courses().teachers().create(courseId, teacher).execute(); + // Prints the course id with the teacher name + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } } + return teacher; + } } // [END classroom_add_teacher] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java index 676cddc3..9588ec3d 100644 --- a/classroom/snippets/src/main/java/BatchAddStudents.java +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -14,6 +14,7 @@ // [START classroom_batch_add_students] + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; @@ -32,46 +33,46 @@ /* Class to demonstrate the use of Classroom Batch Add Students API */ public class BatchAddStudents { - /** - * Add multiple students in a specified course. - * - * @param courseId - Id of the course to add students. - * @param studentEmails - Email address of the students. - * @throws IOException - if credentials file not found. - */ - public static void batchAddStudents(String courseId, List studentEmails) - throws IOException { + /** + * Add multiple students in a specified course. + * + * @param courseId - Id of the course to add students. + * @param studentEmails - Email address of the students. + * @throws IOException - if credentials file not found. + */ + public static void batchAddStudents(String courseId, List studentEmails) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback<>() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; - for (String studentEmail : studentEmails) { - Student student = new Student().setUserId(studentEmail); - service.courses().students().create(courseId, student).queue(batch, callback); - } - batch.execute(); + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); } + batch.execute(); + } } // [END classroom_batch_add_students] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java deleted file mode 100644 index 0526ddd5..00000000 --- a/classroom/snippets/src/main/java/Courses.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpHeaders; -import com.google.api.services.classroom.Classroom; -import com.google.api.services.classroom.model.Course; -import com.google.api.services.classroom.model.CourseAlias; -import com.google.api.services.classroom.model.ListCourseAliasesResponse; -import com.google.api.services.classroom.model.ListCoursesResponse; -import com.google.api.services.classroom.model.Student; -import com.google.api.services.classroom.model.Teacher; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -public class Courses { - public static Course createCourse(Classroom service) throws IOException { - // [START createCourse] - Course course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); - course = service.courses().create(course).execute(); - System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); - // [END createCourse] - return course; - } - - public static Course getCourse(Classroom service, String _courseId) throws IOException { - // [START getCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = null; - try { - course = service.courses().get(courseId).execute(); - System.out.printf("Course '%s' found.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Course with ID '%s' not found.\n", courseId); - } else { - throw e; - } - } - // [END getCourse] - return course; - } - - public static List listCourses(Classroom service) throws IOException { - // [START listCourses] - String pageToken = null; - List courses = new ArrayList(); - - do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courses.addAll(response.getCourses()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); - - if (courses.isEmpty()) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s (%s)\n", course.getName(), course.getId()); - } - } - // [END listCourses] - return courses; - } - - public static Course updateCourse(Classroom service, String _courseId) throws IOException { - // [START updateCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = service.courses().get(courseId).execute(); - course.setSection("Period 3"); - course.setRoom("302"); - course = service.courses().update(courseId, course).execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - // [END updateCourse] - return course; - } - - public static Course patchCourse(Classroom service, String _courseId) throws IOException { - // [START patchCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - // [END patchCourse] - return course; - } - - public static CourseAlias createCourseAlias(Classroom service, String _courseId, String _alias) - throws IOException { - // [START createCourseAlias] - String courseId = "123456"; - String alias = "p:bio10p2"; - // [START_EXCLUDE silent] - courseId = _courseId; - alias = _alias; - // [END_EXCLUDE] - CourseAlias courseAlias = new CourseAlias().setAlias(alias); - try { - courseAlias = service.courses().aliases().create(courseId, courseAlias).execute(); - System.out.printf("Alias '%s' created.\n", courseAlias.getAlias()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("Alias '%s' is already in use.\n", alias); - } else { - throw e; - } - } - // [END createCourseAlias] - return courseAlias; - } - - public static List listCourseAliases(Classroom service, String _courseId) - throws IOException { - // [START listCourseAliases] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - String pageToken = null; - List courseAliases = new ArrayList(); - - do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courseAliases.addAll(response.getAliases()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); - - if (courseAliases.isEmpty()) { - System.out.println("No aliases found."); - } else { - System.out.println("Aliases:"); - for (CourseAlias courseAlias : courseAliases) { - System.out.println(courseAlias.getAlias()); - } - } - // [END listCourseAliases] - return courseAliases; - } - - public static Teacher addTeacher(Classroom service, String _courseId, String _teacherEmail) - throws IOException { - // [START addTeacher] - String courseId = "123456"; - String teacherEmail = "alice@example.edu"; - // [START_EXCLUDE silent] - courseId = _courseId; - teacherEmail = _teacherEmail; - // [END_EXCLUDE] - Teacher teacher = new Teacher().setUserId(teacherEmail); - try { - teacher = service.courses().teachers().create(courseId, teacher).execute(); - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", - teacher.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); - } else { - throw e; - } - } - // [END addTeacher] - return teacher; - } - - public static Student enrollAsStudent(Classroom service, String _courseId, - String _enrollmentCode) throws IOException { - // [START enrollAsStudent] - String courseId = "123456"; - String enrollmentCode = "abcdef"; - // [START_EXCLUDE silent] - courseId = _courseId; - enrollmentCode = _enrollmentCode; - // [END_EXCLUDE] - Student student = new Student().setUserId("me"); - try { - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", - student.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.println("You are already a member of this course."); - } else { - throw e; - } - } - // [END enrollAsStudent] - return student; - } - - public static void batchAddStudents(Classroom service, String _courseId, - List _studentEmails) throws IOException{ - // [START batchAddStudents] - String courseId = "123456"; - List studentEmails = Arrays.asList("alice@example.edu", "bob@example.edu"); - // [START_EXCLUDE silent] - courseId = _courseId; - studentEmails = _studentEmails; - // [END_EXCLUDE] - BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } - - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) - throws IOException { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; - for (String studentEmail : studentEmails) { - Student student = new Student().setUserId(studentEmail); - service.courses().students().create(courseId, student).queue(batch, callback); - } - batch.execute(); - // [END batchAddStudents] - } -} diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java index d1bca2d4..ce33dd4d 100644 --- a/classroom/snippets/src/main/java/CreateCourse.java +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -14,6 +14,7 @@ // [START classroom_create_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,53 +30,53 @@ /* Class to demonstrate the use of Classroom Create Course API */ public class CreateCourse { - /** - * Creates a course - * - * @return newly created course - * @throws IOException - if credentials file not found. - */ - public static Course createCourse() throws IOException { + /** + * Creates a course + * + * @return newly created course + * @throws IOException - if credentials file not found. + */ + public static Course createCourse() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - // Adding a new course with description - course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); - course = service.courses().create(course).execute(); - // Prints the new created course Id and name - System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.err.println("Unable to create course, ownerId not specified.\n"); - } else { - throw e; - } - } - return course; + Course course = null; + try { + // Adding a new course with description + course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + // Prints the new created course Id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.err.println("Unable to create course, ownerId not specified.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_create_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java index ff20a729..7955f1da 100644 --- a/classroom/snippets/src/main/java/GetCourse.java +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -14,6 +14,7 @@ // [START classroom_get_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,43 +30,43 @@ /* Class to demonstrate the use of Classroom Get Course API */ public class GetCourse { - /** - * Retrieve a single course's metadata. - * - * @param courseId - Id of the course to return. - * @return a course - * @throws IOException - if credentials file not found. - */ - public static Course getCourse(String courseId) throws IOException { + /** + * Retrieve a single course's metadata. + * + * @param courseId - Id of the course to return. + * @return a course + * @throws IOException - if credentials file not found. + */ + public static Course getCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - course = service.courses().get(courseId).execute(); - System.out.printf("Course '%s' found.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Course with ID '%s' not found.\n", courseId); - } else { - throw e; - } - } - return course; + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } } + return course; + } } // [END classroom_get_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index 71101eb1..171f4fa6 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -14,6 +14,7 @@ // [START classroom_list_aliases] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -32,62 +33,62 @@ /* Class to demonstrate the use of Classroom List Alias API */ public class ListCourseAliases { - /** - * Retrieve the aliases for a course. - * - * @param courseId - id of the course. - * @return list of course aliases - * @throws IOException - if credentials file not found. - */ - public static List listCourseAliases(String courseId) - throws IOException { + /** + * Retrieve the aliases for a course. + * + * @param courseId - id of the course. + * @return list of course aliases + * @throws IOException - if credentials file not found. + */ + public static List listCourseAliases(String courseId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - String pageToken = null; - List courseAliases = new ArrayList<>(); + String pageToken = null; + List courseAliases = new ArrayList<>(); - try { - // List of aliases of specified course - do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courseAliases.addAll(response.getAliases()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); + try { + // List of aliases of specified course + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); - if (courseAliases.isEmpty()) { - System.out.println("No aliases found."); - } else { - System.out.println("Aliases:"); - for (CourseAlias courseAlias : courseAliases) { - System.out.println(courseAlias.getAlias()); - } - } - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); } - return courseAliases; + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return courseAliases; + } } // [END classroom_list_aliases] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java index 65a2be80..5b7bd58f 100644 --- a/classroom/snippets/src/main/java/ListCourses.java +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -14,6 +14,7 @@ // [START classroom_list_courses] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -31,54 +32,54 @@ /* Class to demonstrate the use of Classroom List Course API */ public class ListCourses { - /** - * Retrieves all courses with metadata - * - * @return list of courses with its metadata - * @throws IOException - if credentials file not found. - */ - public static List listCourses() throws IOException { + /** + * Retrieves all courses with metadata + * + * @return list of courses with its metadata + * @throws IOException - if credentials file not found. + */ + public static List listCourses() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - String pageToken = null; - List courses = new ArrayList<>(); + String pageToken = null; + List courses = new ArrayList<>(); - try { - do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courses.addAll(response.getCourses()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); + try { + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); - if (courses.isEmpty()) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s (%s)\n", course.getName(), course.getId()); - } - } - } catch (NullPointerException ne) { - // TODO(developer) - handle error appropriately - System.err.println("No courses found.\n"); + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); } - return courses; + } + } catch (NullPointerException ne) { + // TODO(developer) - handle error appropriately + System.err.println("No courses found.\n"); } + return courses; + } } // [END classroom_list_courses] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java index fd0f8e5b..e8c5d31b 100644 --- a/classroom/snippets/src/main/java/PatchCourse.java +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -14,6 +14,7 @@ // [START classroom_patch_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,47 +30,47 @@ /* Class to demonstrate the use of Classroom Patch Course API */ public class PatchCourse { - /** - * Updates one or more fields in a course. - * - * @param courseId - Id of the course to update. - * @return updated course - * @throws IOException - if credentials file not found. - */ - public static Course patchCourse(String courseId) throws IOException { + /** + * Updates one or more fields in a course. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course patchCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); - Course course = null; - try { - course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } - } - return course; + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + Course course = null; + try { + course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_patch_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java index bdd577cf..9e0d63ed 100644 --- a/classroom/snippets/src/main/java/UpdateCourse.java +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -14,6 +14,7 @@ // [START classroom_update_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,48 +30,48 @@ /* Class to demonstrate the use of Classroom Update Course API */ public class UpdateCourse { - /** - * Updates a course's metadata. - * - * @param courseId - Id of the course to update. - * @return updated course - * @throws IOException - if credentials file not found. - */ - public static Course updateCourse(String courseId) throws IOException { + /** + * Updates a course's metadata. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course updateCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - // Updating the section and room in a course - course = service.courses().get(courseId).execute(); - course.setSection("Period 3"); - course.setRoom("302"); - course = service.courses().update(courseId, course).execute(); - // Prints the updated course - System.out.printf("Course '%s' updated.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } - } - return course; + Course course = null; + try { + // Updating the section and room in a course + course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + // Prints the updated course + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_update_course] \ No newline at end of file diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 4b69228f..c1e46717 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -29,57 +29,57 @@ import java.io.IOException; import java.util.UUID; - // Base class for integration tests. +// Base class for integration tests. public class BaseTest { - protected Classroom service; - protected Course testCourse; + protected Classroom service; + protected Course testCourse; - /** - * Creates a default authorization Classroom client service. - * - * @return an authorized Classroom client service - * @throws IOException - if credentials file not found. - */ - protected Classroom buildService() throws IOException { + /** + * Creates a default authorization Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException - if credentials file not found. + */ + protected Classroom buildService() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom Snippets") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom Snippets") + .build(); - return service; - } + return service; + } - @Before - public void setup() throws IOException{ - this.service = buildService(); - this.testCourse = CreateCourse.createCourse(); - createAlias(this.testCourse.getId()); - } + @Before + public void setup() throws IOException { + this.service = buildService(); + this.testCourse = CreateCourse.createCourse(); + createAlias(this.testCourse.getId()); + } - @After - public void tearDown() throws IOException{ - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } - public CourseAlias createAlias(String courseId) throws IOException { - String alias = "p:" + UUID.randomUUID(); - CourseAlias courseAlias = new CourseAlias().setAlias(alias); - courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); - return courseAlias; - } + public CourseAlias createAlias(String courseId) throws IOException { + String alias = "p:" + UUID.randomUUID(); + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); + return courseAlias; + } - public void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } + public void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java index 858d4540..81b6de6e 100644 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -34,109 +34,109 @@ * Tests for the courses snippets. */ public class CoursesTest extends BaseTest { - private Classroom service; - private Course testCourse; - private String otherUser = "erics@homeroomacademy.com"; - - public CoursesTest() throws IOException { - this.service = this.getService(); - } - - @Before - public void setUp() throws IOException { - this.testCourse = createTestCourse("me"); - } - - @After - public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } - - @Test - public void testCreateCourse() throws IOException { - Course course = Courses.createCourse(this.service); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } - - @Test - public void testGetCourse() throws IOException { - Course course = Courses.getCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testListCourses() throws IOException { - List courses = Courses.listCourses(this.service); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } - - @Test - public void testUpdateCourse() throws IOException { - Course course = Courses.updateCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testPatchCourse() throws IOException { - Course course = Courses.patchCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testCreateCourseAlias() throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - CourseAlias courseAlias = - Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); - Assert.assertNotNull("Course alias not returned.", courseAlias); - Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); - } - - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = - Courses.listCourseAliases(this.service, this.testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } - - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), - teacher.getCourseId()); - } - - @Test - public void testEnrollAsStudent() throws IOException { - Course course = this.createTestCourse(this.otherUser); - Student student = - Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); - this.deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } - - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = - Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); - Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); - } - - private Course createTestCourse(String ownerId) throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - Course course = new Course().setId(alias).setName("Test Course").setSection("Section") - .setOwnerId(ownerId); - return this.service.courses().create(course).execute(); - } - - private void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } + private Classroom service; + private Course testCourse; + private String otherUser = "erics@homeroomacademy.com"; + + public CoursesTest() throws IOException { + this.service = this.getService(); + } + + @Before + public void setUp() throws IOException { + this.testCourse = createTestCourse("me"); + } + + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } + + @Test + public void testCreateCourse() throws IOException { + Course course = Courses.createCourse(this.service); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } + + @Test + public void testGetCourse() throws IOException { + Course course = Courses.getCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testListCourses() throws IOException { + List courses = Courses.listCourses(this.service); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } + + @Test + public void testUpdateCourse() throws IOException { + Course course = Courses.updateCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testPatchCourse() throws IOException { + Course course = Courses.patchCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testCreateCourseAlias() throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + CourseAlias courseAlias = + Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); + } + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = + Courses.listCourseAliases(this.service, this.testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), + teacher.getCourseId()); + } + + @Test + public void testEnrollAsStudent() throws IOException { + Course course = this.createTestCourse(this.otherUser); + Student student = + Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); + this.deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = + Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); + Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); + } + + private Course createTestCourse(String ownerId) throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + Course course = new Course().setId(alias).setName("Test Course").setSection("Section") + .setOwnerId(ownerId); + return this.service.courses().create(course).execute(); + } + + private void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java index 8d6a9bb9..f023989a 100644 --- a/classroom/snippets/src/test/java/TestAddStudent.java +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -19,15 +19,15 @@ import java.io.IOException; // Unit test class for Add Student classroom snippet -public class TestAddStudent extends BaseTest{ +public class TestAddStudent extends BaseTest { - @Test - public void testAddStudent() throws IOException { - Course course = CreateCourse.createCourse(); - Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); - deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } + @Test + public void testAddStudent() throws IOException { + Course course = CreateCourse.createCourse(); + Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); + deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java index f66ce0bd..f2846ddf 100644 --- a/classroom/snippets/src/test/java/TestAddTeacher.java +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -18,14 +18,14 @@ import java.io.IOException; // Unit test class for Add Teacher classroom snippet -public class TestAddTeacher extends BaseTest{ - private String otherUser = "gduser1@workspacesamples.dev"; +public class TestAddTeacher extends BaseTest { + private String otherUser = "gduser1@workspacesamples.dev"; - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), - teacher.getCourseId()); - } + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), + teacher.getCourseId()); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java index c21eb3f2..04ee930e 100644 --- a/classroom/snippets/src/test/java/TestBatchAddStudents.java +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -20,10 +20,10 @@ // Unit test class for Batch Add Students classroom snippet public class TestBatchAddStudents extends BaseTest { - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", - "gduser3@workpsacesamples.dev"); - BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); - } + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", + "gduser3@workpsacesamples.dev"); + BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java index caa70281..381f2c2c 100644 --- a/classroom/snippets/src/test/java/TestCreateCourse.java +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Create Course classroom snippet -public class TestCreateCourse extends BaseTest{ +public class TestCreateCourse extends BaseTest { - @Test - public void testCreateCourse() throws IOException{ - Course course = CreateCourse.createCourse(); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } + @Test + public void testCreateCourse() throws IOException { + Course course = CreateCourse.createCourse(); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java index a17cf197..c43059f7 100644 --- a/classroom/snippets/src/test/java/TestGetCourse.java +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Get Course classroom snippet -public class TestGetCourse extends BaseTest{ +public class TestGetCourse extends BaseTest { - @Test - public void testGetCourse() throws IOException { - Course course = GetCourse.getCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testGetCourse() throws IOException { + Course course = GetCourse.getCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java index b7396361..f18c1cce 100644 --- a/classroom/snippets/src/test/java/TestListCourseAliases.java +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -19,11 +19,11 @@ import java.util.List; // Unit test class for List Course Aliases classroom snippet -public class TestListCourseAliases extends BaseTest{ +public class TestListCourseAliases extends BaseTest { - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java index 55a3a1fc..fe254b76 100644 --- a/classroom/snippets/src/test/java/TestListCourses.java +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -21,9 +21,9 @@ // Unit test class for List Course classroom snippet public class TestListCourses { - @Test - public void testListCourses() throws IOException { - List courses = ListCourses.listCourses(); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } + @Test + public void testListCourses() throws IOException { + List courses = ListCourses.listCourses(); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } } diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java index 3cf341c8..51e05a43 100644 --- a/classroom/snippets/src/test/java/TestPatchCourse.java +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Patch Course classroom snippet -public class TestPatchCourse extends BaseTest{ +public class TestPatchCourse extends BaseTest { - @Test - public void testPatchCourse() throws IOException { - Course course = PatchCourse.patchCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testPatchCourse() throws IOException { + Course course = PatchCourse.patchCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java index 3926443e..f5e0080d 100644 --- a/classroom/snippets/src/test/java/TestUpdateCourse.java +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Update Course classroom snippet -public class TestUpdateCourse extends BaseTest{ +public class TestUpdateCourse extends BaseTest { - @Test - public void testUpdateCourse() throws IOException { - Course course = UpdateCourse.updateCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testUpdateCourse() throws IOException { + Course course = UpdateCourse.updateCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java index 84e41f4e..e7ad0715 100644 --- a/docs/outputJSON/src/main/java/OutputJSON.java +++ b/docs/outputJSON/src/main/java/OutputJSON.java @@ -35,59 +35,60 @@ import java.util.List; // [START docs_output_json] + /** * OutputJSON prints the JSON representation of a Google Doc. */ public class OutputJSON { - private static final String APPLICATION_NAME = "Google Docs API Document Contents"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; + private static final String APPLICATION_NAME = "Google Docs API Document Contents"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; - /** - * Global instance of the scopes required by this sample. If modifying these scopes, delete - * your previously saved tokens/ folder. - */ - private static final List SCOPES = - Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + /** + * Global instance of the scopes required by this sample. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) - throws IOException { - // Load client secrets. - InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - GoogleClientSecrets credentials = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + GoogleClientSecrets credentials = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs docsService = - new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs docsService = + new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - Document response = docsService.documents().get(DOCUMENT_ID).execute(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - System.out.println(gson.toJson(response)); - } + Document response = docsService.documents().get(DOCUMENT_ID).execute(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(response)); + } } // [END docs_output_json] diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index f8321a67..431c8394 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START docs_quickstart] + 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; @@ -37,60 +38,70 @@ /* class to demonstarte use of Docs get documents API */ public class DocsQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - // Prints the title of the requested doc: - // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit - Document response = service.documents().get(DOCUMENT_ID).execute(); - String title = response.getTitle(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - System.out.printf("The title of the doc is: %s\n", title); - } + // Prints the title of the requested doc: + // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit + Document response = service.documents().get(DOCUMENT_ID).execute(); + String title = response.getTitle(); + + System.out.printf("The title of the doc is: %s\n", title); + } } // [END docs_quickstart] diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index db0b7c36..6e2c9b16 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_activity_v2_quickstart] + 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; @@ -36,182 +37,205 @@ import java.util.stream.Collectors; public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** - * Global instance of the scopes required by this quickstart. - * - *

If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = - Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } - } - - /** - * Creates an authorized Credential object. - * - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = - new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) - .authorize("user"); - System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; + + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } - - /** - * Build and return an authorized Drive Activity client service. - * - * @return an authorized DriveActivity client service - * @throws IOException - */ - public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() - throws IOException { - Credential credential = authorize(); - com.google.api.services.driveactivity.v2.DriveActivity service = new com.google.api.services.driveactivity.v2.DriveActivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - return service; + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } - - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); - - // Print the recent activity in your Google Drive. - QueryDriveActivityResponse result = - service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (DriveActivity activity : activities) { - String time = getTimeInfo(activity); - String action = getActionInfo(activity.getPrimaryActionDetail()); - List actors = - activity.getActors().stream() - .map(DriveActivityQuickstart::getActorInfo) - .collect(Collectors.toList()); - List targets = - activity.getTargets().stream() - .map(DriveActivityQuickstart::getTargetInfo) - .collect(Collectors.toList()); - System.out.printf( - "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); - } - } - } - - /** Returns a string representation of the first elements in a list. */ - private static String truncated(List array) { - return truncatedTo(array, 2); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } + + /** + * Build and return an authorized Drive Activity client service. + * + * @return an authorized DriveActivity client service + * @throws IOException + */ + public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() + throws IOException { + Credential credential = authorize(); + com.google.api.services.driveactivity.v2.DriveActivity service = + new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + return service; + } + + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); + + // Print the recent activity in your Google Drive. + QueryDriveActivityResponse result = + service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (DriveActivity activity : activities) { + String time = getTimeInfo(activity); + String action = getActionInfo(activity.getPrimaryActionDetail()); + List actors = + activity.getActors().stream() + .map(DriveActivityQuickstart::getActorInfo) + .collect(Collectors.toList()); + List targets = + activity.getTargets().stream() + .map(DriveActivityQuickstart::getTargetInfo) + .collect(Collectors.toList()); + System.out.printf( + "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); + } } - - /** Returns a string representation of the first elements in a list. */ - private static String truncatedTo(List array, int limit) { - String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); - String more = array.size() > limit ? ", ..." : ""; - return "[" + contents + more + "]"; + } + + /** + * Returns a string representation of the first elements in a list. + */ + private static String truncated(List array) { + return truncatedTo(array, 2); + } + + /** + * Returns a string representation of the first elements in a list. + */ + private static String truncatedTo(List array, int limit) { + String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); + String more = array.size() > limit ? ", ..." : ""; + return "[" + contents + more + "]"; + } + + /** + * Returns the name of a set property in an object, or else "unknown". + */ + private static String getOneOf(AbstractMap obj) { + Iterator iterator = obj.keySet().iterator(); + return iterator.hasNext() ? iterator.next() : "unknown"; + } + + /** + * Returns a time associated with an activity. + */ + private static String getTimeInfo(DriveActivity activity) { + if (activity.getTimestamp() != null) { + return activity.getTimestamp(); } - - /** Returns the name of a set property in an object, or else "unknown". */ - private static String getOneOf(AbstractMap obj) { - Iterator iterator = obj.keySet().iterator(); - return iterator.hasNext() ? iterator.next() : "unknown"; + if (activity.getTimeRange() != null) { + return activity.getTimeRange().getEndTime(); } - - /** Returns a time associated with an activity. */ - private static String getTimeInfo(DriveActivity activity) { - if (activity.getTimestamp() != null) { - return activity.getTimestamp(); - } - if (activity.getTimeRange() != null) { - return activity.getTimeRange().getEndTime(); - } - return "unknown"; + return "unknown"; + } + + /** + * Returns the type of action. + */ + private static String getActionInfo(ActionDetail actionDetail) { + return getOneOf(actionDetail); + } + + /** + * Returns user information, or the type of user if not a known user. + */ + private static String getUserInfo(User user) { + if (user.getKnownUser() != null) { + KnownUser knownUser = user.getKnownUser(); + Boolean isMe = knownUser.getIsCurrentUser(); + return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); } - - /** Returns the type of action. */ - private static String getActionInfo(ActionDetail actionDetail) { - return getOneOf(actionDetail); + return getOneOf(user); + } + + /** + * Returns actor information, or the type of actor if not a user. + */ + private static String getActorInfo(Actor actor) { + if (actor.getUser() != null) { + return getUserInfo(actor.getUser()); } - - /** Returns user information, or the type of user if not a known user. */ - private static String getUserInfo(User user) { - if (user.getKnownUser() != null) { - KnownUser knownUser = user.getKnownUser(); - Boolean isMe = knownUser.getIsCurrentUser(); - return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); - } - return getOneOf(user); + return getOneOf(actor); + } + + /** + * Returns the type of a target and an associated title. + */ + private static String getTargetInfo(Target target) { + if (target.getDriveItem() != null) { + return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; } - - /** Returns actor information, or the type of actor if not a user. */ - private static String getActorInfo(Actor actor) { - if (actor.getUser() != null) { - return getUserInfo(actor.getUser()); - } - return getOneOf(actor); + if (target.getDrive() != null) { + return "drive:\"" + target.getDrive().getTitle() + "\""; } - - /** Returns the type of a target and an associated title. */ - private static String getTargetInfo(Target target) { - if (target.getDriveItem() != null) { - return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; - } - if (target.getDrive() != null) { - return "drive:\"" + target.getDrive().getTitle() + "\""; - } - if (target.getFileComment() != null) { - DriveItem parent = target.getFileComment().getParent(); - if (parent != null) { - return "fileComment:\"" + parent.getTitle() + "\""; - } - return "fileComment:unknown"; - } - return getOneOf(target); + if (target.getFileComment() != null) { + DriveItem parent = target.getFileComment().getParent(); + if (parent != null) { + return "fileComment:\"" + parent.getTitle() + "\""; + } + return "fileComment:unknown"; } + return getOneOf(target); + } } // [END drive_activity_v2_quickstart] diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index c28cdd13..e72a2c24 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_activity_quickstart] + 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; @@ -20,14 +21,12 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; - +import com.google.api.services.appsactivity.Appsactivity; import com.google.api.services.appsactivity.AppsactivityScopes; import com.google.api.services.appsactivity.model.*; -import com.google.api.services.appsactivity.Appsactivity; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,116 +36,125 @@ /* class to demonstarte use of Drive Activity list API */ public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = - "Drive Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Drive Activity API Java Quickstart"; - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = + GsonFactory.getDefaultInstance(); + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = - GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** Global instance of the scopes required by this quickstart. - * - *

If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } + } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = - DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = new AuthorizationCodeInstalledApp( - flow, new LocalServerReceiver()).authorize("user"); - System.out.println( - "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - /** - * Build and return an authorized Apps Activity client service. - * @return an authorized Appsactivity client service - * @throws IOException - */ - public static Appsactivity getAppsactivityService() throws IOException { - Credential credential = authorize(); - Appsactivity service = new Appsactivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - return service; - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + //returns an authorized Credential object. + return credential; + } + + /** + * Build and return an authorized Apps Activity client service. + * + * @return an authorized Appsactivity client service + * @throws IOException + */ + public static Appsactivity getAppsactivityService() throws IOException { + Credential credential = authorize(); + Appsactivity service = new Appsactivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + return service; + } - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Appsactivity service = getAppsactivityService(); + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Appsactivity service = getAppsactivityService(); - // Print the recent activity in your Google Drive. - ListActivitiesResponse result = service.activities().list() - .setSource("drive.google.com") - .setDriveAncestorId("root") - .setPageSize(10) - .execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (Activity activity : activities) { - Event event = activity.getCombinedEvent(); - User user = event.getUser(); - Target target = event.getTarget(); - if (user == null || target == null ) { - continue; - } - String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") - .format(new java.util.Date(event.getEventTimeMillis().longValue())); - System.out.printf("%s: %s, %s, %s (%s)\n", - date, - user.getName(), - event.getPrimaryEventType(), - target.getName(), - target.getMimeType()); - } + // Print the recent activity in your Google Drive. + ListActivitiesResponse result = service.activities().list() + .setSource("drive.google.com") + .setDriveAncestorId("root") + .setPageSize(10) + .execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (Activity activity : activities) { + Event event = activity.getCombinedEvent(); + User user = event.getUser(); + Target target = event.getTarget(); + if (user == null || target == null) { + continue; } + String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") + .format(new java.util.Date(event.getEventTimeMillis().longValue())); + System.out.printf("%s: %s, %s, %s (%s)\n", + date, + user.getName(), + event.getPrimaryEventType(), + target.getName(), + target.getMimeType()); + } } + } } // [END drive_activity_quickstart] diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index b9df6ab6..c88f9063 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_quickstart] + 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; @@ -27,7 +28,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -38,67 +38,77 @@ /* class to demonstarte use of Drive files list API */ public class DriveQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the names and IDs for up to 10 files. - FileList result = service.files().list() - .setPageSize(10) - .setFields("nextPageToken, files(id, name)") - .execute(); - List files = result.getFiles(); - if (files == null || files.isEmpty()) { - System.out.println("No files found."); - } else { - System.out.println("Files:"); - for (File file : files) { - System.out.printf("%s (%s)\n", file.getName(), file.getId()); - } - } + // Print the names and IDs for up to 10 files. + FileList result = service.files().list() + .setPageSize(10) + .setFields("nextPageToken, files(id, name)") + .execute(); + List files = result.getFiles(); + if (files == null || files.isEmpty()) { + System.out.println("No files found."); + } else { + System.out.println("Files:"); + for (File file : files) { + System.out.printf("%s (%s)\n", file.getName(), file.getId()); + } } + } } // [END drive_quickstart] diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json index 3d2519ed..b42f309e 100644 --- a/drive/snippets/drive_v2/files/config.json +++ b/drive/snippets/drive_v2/files/config.json @@ -1,3 +1,3 @@ { - "foo" : "bar" + "foo": "bar" } \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java index cee70b57..6d13d7a4 100644 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -19,7 +19,6 @@ import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import com.google.api.services.drive.model.ParentReference; - import java.io.IOException; import java.util.Collections; diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java index ae8d4558..b3999d88 100644 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; - import java.io.IOException; public class ChangeSnippets { diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index 70da1fe3..31265b2e 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -17,12 +17,10 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -30,42 +28,45 @@ /* class to demonstrate use-case of Drive's create drive. */ public class CreateDrive { - /** - * Create a drive. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createDrive() throws IOException { + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - try { - Drive drive = service.drives().insert(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().insert(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); - return drive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create drive: " + e.getDetails()); - throw e; - } + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_drive] diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java index 169c796d..ed909ecf 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -29,39 +29,41 @@ public class CreateFolder { - /** - * Create new folder. - * @return Inserted folder id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String createFolder() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("Test"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - try { - File file = service.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - } catch (IOException e) { - System.out.println("An error occurred: " + e); - return null; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; } + } } // [END drive_create_folder] diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java index 35393483..0e4b817c 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -23,46 +23,47 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's create shortcut use-case */ public class CreateShortcut { - /** - * Creates shortcut for file. - * @throws IOException if service account credentials file not found. - */ - public static String createShortcut() throws IOException{ + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Create Shortcut for file. - File fileMetadata = new File(); - fileMetadata.setTitle("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - File file = service.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create shortcut: " + e.getDetails()); - throw e; - } + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; } + } } // [END drive_create_shortcut] diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java index 8dad2711..dff70011 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -17,12 +17,10 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.TeamDrive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -30,39 +28,42 @@ /* class to demonstrate use-case of Drive's create team drive. */ public class CreateTeamDrive { - /** - * Create a drive for team. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createTeamDrive() throws IOException { + /** + * Create a drive for team. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createTeamDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - return teamDrive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create team drive: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + return teamDrive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create team drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_team_drive] diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java index 0931acc5..2098d1a9 100644 --- a/drive/snippets/drive_v2/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,39 +30,41 @@ /* Class to demonstrate use-case of drive's download file. */ public class DownloadFile { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - try { - OutputStream outputStream = new ByteArrayOutputStream(); + try { + OutputStream outputStream = new ByteArrayOutputStream(); - service.files().get(realFileId) - .executeMediaAndDownloadTo(outputStream); + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_download_file] diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java index 8c70c3da..a40483bc 100644 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -17,7 +17,6 @@ import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; - import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -37,14 +36,14 @@ public String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); Drive drive = driveService.drives().insert(requestId, driveMetadata) - .execute(); + .execute(); System.out.println("Drive ID: " + drive.getId()); // [END createDrive] return drive.getId(); } public List recoverDrives(String realUser) - throws IOException { + throws IOException { com.google.api.services.drive.Drive driveService = this.service; List drives = new ArrayList(); // [START recoverDrives] @@ -57,33 +56,33 @@ public List recoverDrives(String realUser) // organizer is assigned. String pageToken = null; Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); // [START_EXCLUDE silent] newOrganizerPermission.setValue(realUser); // [END_EXCLUDE] do { DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); for (Drive drive : result.getItems()) { System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); + drive.getName(), drive.getId()); // Note: For improved efficiency, consider batching // permission insert requests Permission permissionResult = driveService.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + permissionResult.getId()); } // [START_EXCLUDE silent] diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java index 16d86539..789e232a 100644 --- a/drive/snippets/drive_v2/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,38 +30,40 @@ /* Class to demonstrate use-case of drive's export pdf. */ public class ExportPdf { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - OutputStream outputStream = new ByteArrayOutputStream(); - try { - service.files().export(realFileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to export file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; } + } } // [END drive_export_pdf] diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index c402a18a..16c27b6f 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -14,61 +14,59 @@ // [START drive_fetch_appdata_folder] import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Arrays; -import java.util.Collections; -/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ public class FetchAppDataFolder { - /** - * Fetches appDataFolder and prints it's folder id. - * @return Application data folder's ID. - */ - public static String fetchAppDataFolder() throws IOException { + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - File file = service.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch appdata folder: " + e.getDetails()); - throw e; - } + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index 3ff6e584..d2154eaa 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -20,60 +20,60 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch changes in file. */ public class FetchChanges { - /** - * Retrieve the list of changes for the currently authenticated user. - * @param savedStartPageToken Last saved start token for this user. - * @return Saved token after last page. - * @throws IOException if file is not found - */ - public static String fetchChanges(String savedStartPageToken) throws IOException { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = service.changes().list().setPageToken(pageToken) - .execute(); - for (com.google.api.services.drive.model.Change change : changes.getItems()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - return savedStartPageToken; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch changes: " + e.getDetails()); - throw e; + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list().setPageToken(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getItems()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_changes] diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java index c77419a6..a3445c7a 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -19,49 +19,49 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; -import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch start page token */ public class FetchStartPageToken { - /** - * Retrieve the start page token for the first time. - * @return Start page token as String. - * @throws IOException if file is not found - */ - public static String fetchStartPageToken() throws IOException { + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - StartPageToken response = service.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); - return response.getStartPageToken(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch start page token: " + e.getDetails()); - throw e; - } + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 7ed0782e..1628c42b 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -14,7 +14,6 @@ // [START drive_list_appdata] import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -22,59 +21,59 @@ import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Arrays; -import java.util.Collections; -/** Class to demonstrate use-case of list 10 files in the application data folder. */ +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ public class ListAppData { - /** - * list down files in the application data folder. - * @return list of 10 files. - */ - public static FileList listAppData() throws IOException { + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - FileList files = service.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, items(id, title)") - .setMaxResults(10) - .execute(); - for (File file : files.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } - return files; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to list files: " + e.getDetails()); - throw e; - } + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; } + } } // [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index c45ba0e2..15dcf2b9 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -16,7 +16,6 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -26,65 +25,64 @@ import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; /* Class to demonstrate use case for moving file to folder.*/ public class MoveFileToFolder { - /** - * @param fileId Id of file to be moved. - * @param folderId Id of folder where the fill will be moved. - * @return list of parent ids for the file. - * */ - public static List moveFileToFolder(String fileId, String folderId) - throws IOException { + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // Retrieve the existing parents to remove - File file = service.files().get(fileId) - .setFields("parents") - .execute(); - List parentIds = file.getParents() - .stream() - .map(ParentReference::getId) - .collect(Collectors.toList()); - String previousParents = String.join(",", parentIds); - try { - // Move the file to the new folder - file = service.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents) - .setFields("id, parents") - .execute(); + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + List parentIds = file.getParents() + .stream() + .map(ParentReference::getId) + .collect(Collectors.toList()); + String previousParents = String.join(",", parentIds); + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents) + .setFields("id, parents") + .execute(); - List parents = new ArrayList<>(); - for (ParentReference parent : file.getParents()) { - parents.add(parent.getId()); - } - return parents; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + List parents = new ArrayList<>(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index 038f1a57..d00de913 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -17,14 +17,12 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -33,74 +31,77 @@ /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - /** - * Find all shared drives without an organizer and add one. - * @param realUser User's email id. - * @return All shared drives without an organizer. - * @throws IOException if shared drive not found. - */ - public static List recoverDrives(String realUser) - throws IOException { + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List drives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); - newOrganizerPermission.setValue(realUser); + newOrganizerPermission.setValue(realUser); - do { - DriveList result = service.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getItems()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); - } - drives.addAll(result.getItems()); + } + drives.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return drives; - } + return drives; + } } // [END drive_recover_drives] diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java index a11d4a24..84705826 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -17,14 +17,12 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.TeamDrive; import com.google.api.services.drive.model.TeamDriveList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -33,77 +31,80 @@ /* class to demonstrate use-case of Drive's recover all team drives without an organizer. */ public class RecoverTeamDrive { - /** - * Finds all Team Drives without an organizer and add one. - * @param realUser User ID for the new organizer. - * @return All team drives without an organizer. - * @throws IOException if service account credentials file not found. - */ - public static List recoverTeamDrives(String realUser) throws IOException { + /** + * Finds all Team Drives without an organizer and add one. + * + * @param realUser User ID for the new organizer. + * @return All team drives without an organizer. + * @throws IOException if service account credentials file not found. + */ + public static List recoverTeamDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List teamDrives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List teamDrives = new ArrayList(); - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); - newOrganizerPermission.setValue(realUser); - try { - do { - TeamDriveList result = service.teamdrives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getItems()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .insert(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - } + newOrganizerPermission.setValue(realUser); + try { + do { + TeamDriveList result = service.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + } - teamDrives.addAll(result.getItems()); + teamDrives.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return teamDrives; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to recover team drive: " + e.getDetails()); - throw e; - } + return teamDrives; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to recover team drive: " + e.getDetails()); + throw e; } + } } // [END drive_recover_team_drives] diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java index 242c575b..f6543292 100644 --- a/drive/snippets/drive_v2/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,47 +31,49 @@ /* Class to demonstrate use-case of search files. */ public class SearchFile { - /** - * Search for specific set of files. - * @return search result list. - * @throws IOException if service account credentials file not found. - */ - public static List searchFile() throws IOException{ + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - List files = new ArrayList(); + List files = new ArrayList(); - String pageToken = null; - do { - FileList result = service.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } - files.addAll(result.getItems()); + files.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return files; - } + return files; + } } // [END drive_search_files] diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java index 1b423722..ecbd3bf1 100644 --- a/drive/snippets/drive_v2/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -27,7 +27,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -36,80 +35,83 @@ /* Class to demonstrate use-case of modify permissions. */ public class ShareFile { - /** - * Batch permission modification. - * realFileId file Id. - * realUser User Id. - * realDomain Domain of the user ID. - * @return list of modified permissions if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - - final List ids = new ArrayList(); - - - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - - ids.add(permission.getId()); - - } - }; - BatchRequest batch = service.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer"); - - userPermission.setValue(realUser); - try { - service.permissions().insert(realFileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader"); - - domainPermission.setValue(realDomain); - - service.permissions().insert(realFileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - - return ids; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to modify permission: " + e.getDetails()); - throw e; - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setValue(realUser); + try { + service.permissions().insert(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setValue(realDomain); + + service.permissions().insert(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; } + } } // [END drive_share_file] diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java index 31ee8f82..6875d862 100644 --- a/drive/snippets/drive_v2/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -32,47 +31,48 @@ public class TouchFile { - /** - * @param realFileId Id of file to be modified. - * @param realTimestamp Timestamp in miliseconds. - * @return long file's latest modification date value. - * @throws IOException if service account credentials file not found. - * */ - public static long touchFile(String realFileId, long realTimestamp) - throws IOException { + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); - fileId = realFileId; - fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); - try { - File file = service.files().update(fileId, fileMetadata) - .setSetModifiedDate(true) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedDate()); - return file.getModifiedDate().getValue(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + try { + File file = service.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + return file.getModifiedDate().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_touch_file] diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java index 7731be4e..2bd4f557 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -21,62 +21,64 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; -/** Class to demonstrate use-case of create file in the application data folder. */ +/** + * Class to demonstrate use-case of create file in the application data folder. + */ public class UploadAppData { - /** - * Creates a file in the application data folder. - * @return Created file's Id. - */ - public static String uploadAppData() throws IOException { + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("config.json"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId("appDataFolder"))); - java.io.File filePath = new java.io.File("files/config.json"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("application/json", filePath); - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create file: " + e.getDetails()); - throw e; - } + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java index dc99bb5b..374f240b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -23,49 +23,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use of Drive insert file API */ public class UploadBasic { - /** - * Upload new file. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadBasic() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // Upload file photo.jpg on drive. - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - // File's content. - java.io.File filePath = new java.io.File("files/photo.jpg"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (IOException e) { - System.out.println("An error occurred: " + e); - return null; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; } + } } // [END drive_upload_basic] diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java index c9fccd93..460abe3b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -24,49 +24,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of drive's upload revision */ public class UploadRevision { - /** - * Replace the old file with new one on same file ID. - * @param realFileId ID of the file to be replaced. - * @return Inserted file ID if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadRevision(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_revision] diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java index ac0f156d..fead5537 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -32,45 +32,47 @@ /* Class to demonstrate Drive's upload to folder use-case. */ public class UploadToFolder { - /** - * Upload a file to the specified folder. - * @param realFolderId Id of the folder. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static File uploadToFolder(String realFolderId) throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId(realFolderId))); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - return file; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(realFolderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java index 36602e10..da62bf44 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -22,54 +22,54 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate Drive's upload with conversion use-case. */ public class UploadWithConversion { - /** - * Upload file with conversion. - * @return Inserted file id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadWithConversion() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java index b4237983..31726d4e 100644 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -14,15 +14,13 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertNotNull; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class AppDataSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index 1bbf6e2e..1bf73c68 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -14,26 +14,27 @@ * limitations under the License. */ -import com.google.api.client.http.HttpRequestInitializer; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import org.junit.After; -import org.junit.Before; - +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; public class BaseTest { static { @@ -69,7 +70,8 @@ public void publish(LogRecord record) { public GoogleCredentials getCredential() throws IOException { return GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); } /** @@ -84,14 +86,14 @@ protected Drive buildService() throws IOException { guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = getCredential(); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + credentials); // Create the classroom API client Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive Snippets") - .build(); + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); return service; } diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java index 4323cc7d..7ad14676 100644 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -14,14 +14,13 @@ * limitations under the License. */ -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; + public class ChangeSnippetsTest extends BaseTest { private ChangeSnippets snippets; diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java index 42bbaf53..ebe24d24 100644 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class DriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java index 1efd149b..7703c464 100644 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -14,17 +14,18 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class FileSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java index bfed9e79..a0f53e9c 100644 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import com.google.api.services.drive.model.TeamDrive; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - +import com.google.api.services.drive.model.TeamDrive; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class TeamDriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java index 4db53c7b..9bd04c2c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateDrive extends BaseTest{ - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = CreateDrive.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java index 0c7a25af..1c4cffb7 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -14,17 +14,16 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestCreateFolder { - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = CreateFolder.createFolder(); - assertNotNull(id); - } + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java index 1853773d..ab3e0f2f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateShortcut extends BaseTest{ - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = CreateShortcut.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java index 72695b33..daccae50 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateTeamDrive extends BaseTest{ - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = CreateTeamDrive.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } +public class TestCreateTeamDrive extends BaseTest { + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = CreateTeamDrive.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java index ce285417..526dea94 100644 --- a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestDownloadFile extends BaseTest{ - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = DownloadFile.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java index fc6deabb..16ede7b4 100644 --- a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestExportPdf extends BaseTest{ - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = ExportPdf.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java index f53dcd75..8a2ed14b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java @@ -12,18 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for testing of FetchAppDataFolder snippet public class TestFetchAppdataFolder { - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = FetchAppDataFolder.fetchAppDataFolder(); - assertNotNull(id); - } + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java index 751c47ec..353d1186 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -public class TestFetchChanges extends BaseTest{ - @Test - public void fetchChanges() throws IOException { - String startPageToken = FetchStartPageToken.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = FetchChanges.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } +import java.io.IOException; +import org.junit.Test; + +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java index 270d09a1..ec781a28 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -14,16 +14,15 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestFetchStartPageToken extends BaseTest{ - @Test - public void fetchStartPageToken() throws IOException { - String token = FetchStartPageToken.fetchStartPageToken(); - assertNotNull(token); - } +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java index fe137a43..3aa6558b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -13,20 +13,17 @@ // limitations under the License. import com.google.api.services.drive.model.FileList; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotEquals; +import org.junit.Test; // Unit test class for testing of ListAppData snippet -public class TestListAppdata extends BaseTest{ - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = ListAppData.listAppData(); - assertNotEquals(0, files.getItems().size()); - } +public class TestListAppdata extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getItems().size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java index 7ad8f1bf..7e914647 100644 --- a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -14,25 +14,24 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class TestMoveFileToFolder extends BaseTest{ - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); - assertEquals(1, parents.size()); - assertTrue(parents.contains(folderId)); - } +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java index c214234e..731f3f18 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -14,36 +14,35 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Test; - import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestRecoverDrives extends BaseTest{ - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = RecoverDrive.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } - private String createOrphanedDrive() throws IOException { - String driveId = CreateDrive.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); } + return driveId; + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java index 9b1a7892..c9b9a07f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -14,35 +14,35 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; import com.google.api.services.drive.model.TeamDrive; -import org.junit.Test; - import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; +public class TestRecoverTeamDrives extends BaseTest { + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = RecoverTeamDrive.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } -public class TestRecoverTeamDrives extends BaseTest{ - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = RecoverTeamDrive.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = CreateTeamDrive.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = CreateTeamDrive.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); } + return teamDriveId; + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java index 6772cb40..280c6b9c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestSearchFiles extends BaseTest{ - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = SearchFile.searchFile(); - assertNotEquals(0, files.size()); - } +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java index c47ec72c..167a7ec7 100644 --- a/drive/snippets/drive_v2/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestShareFile extends BaseTest{ - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = ShareFile.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java index aecfabf4..9d7d80b8 100644 --- a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestTouchFile extends BaseTest{ - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = TouchFile.touchFile(id, now); - assertEquals(now, modifiedTime); - } +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java index d5cd5e9e..c9c13961 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java @@ -12,20 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for testing of UploadAppData snippet -public class TestUploadAppdata extends BaseTest{ - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java index 79617d8d..f083eb65 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestUploadBasic { - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - } + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java index de932e4f..ea7e7eea 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class TestUploadRevision extends BaseTest{ - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = UploadRevision.uploadRevision(id); - assertEquals(id, id2); - } +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java index 815982d9..fcec0691 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertTrue; +import org.junit.Test; public class TestUploadToFolder extends BaseTest { - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - File file = UploadToFolder.uploadToFolder(folderId); - assertTrue(file.getParents().get(0).getId().equals(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java index ae3a889c..11b5f2f9 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadWithConversion extends BaseTest{ - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = UploadWithConversion.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java index 975aafb6..5f75f5c4 100644 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; - import java.io.IOException; import java.util.Collections; diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java index 5710478b..141991bc 100644 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; - import java.io.IOException; public class ChangeSnippets { diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java index be69cbec..ceb53f9b 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -21,7 +21,6 @@ import com.google.api.services.drive.model.Drive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -29,42 +28,45 @@ /* class to demonstrate use-case of Drive's create drive. */ public class CreateDrive { - /** - * Create a drive. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createDrive() throws IOException { + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - try { - Drive drive = service.drives().create(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); - return drive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create drive: " + e.getDetails()); - throw e; - } + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_drive] diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java index c9ee24b8..e907cb7d 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -31,40 +30,42 @@ public class CreateFolder { - /** - * Create new folder. - * @return Inserted folder id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String createFolder() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("Test"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - try { - File file = service.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create folder: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create folder: " + e.getDetails()); + throw e; } + } } // [END drive_create_folder] diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java index d75f104e..12acc6e7 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -23,46 +23,47 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's create shortcut use-case */ public class CreateShortcut { - /** - * Creates shortcut for file. - * @throws IOException if service account credentials file not found. - */ - public static String createShortcut() throws IOException{ + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Create Shortcut for file. - File fileMetadata = new File(); - fileMetadata.setName("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - File file = service.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create shortcut: " + e.getDetails()); - throw e; - } + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; } + } } // [END drive_create_shortcut] diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java index 0931acc5..2098d1a9 100644 --- a/drive/snippets/drive_v3/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,39 +30,41 @@ /* Class to demonstrate use-case of drive's download file. */ public class DownloadFile { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - try { - OutputStream outputStream = new ByteArrayOutputStream(); + try { + OutputStream outputStream = new ByteArrayOutputStream(); - service.files().get(realFileId) - .executeMediaAndDownloadTo(outputStream); + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_download_file] diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java index 3bedd15e..9fa22647 100644 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -14,12 +14,9 @@ * limitations under the License. */ -import com.google.api.client.http.FileContent; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; - import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -39,7 +36,7 @@ public String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); Drive drive = driveService.drives().create(requestId, - driveMetadata) + driveMetadata) .execute(); System.out.println("Drive ID: " + drive.getId()); // [END createDrive] diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java index 16d86539..789e232a 100644 --- a/drive/snippets/drive_v3/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,38 +30,40 @@ /* Class to demonstrate use-case of drive's export pdf. */ public class ExportPdf { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - OutputStream outputStream = new ByteArrayOutputStream(); - try { - service.files().export(realFileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to export file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; } + } } // [END drive_export_pdf] diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java index dd00bdf4..d80db884 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -22,47 +22,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; -/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ public class FetchAppDataFolder { - /** - * Fetches appDataFolder and prints it's folder id. - * @return Application data folder's ID. - */ - public static String fetchAppDataFolder() throws IOException { + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - File file = service.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch appdata folder: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java index aa921837..49a2319e 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -22,57 +22,58 @@ import com.google.api.services.drive.model.ChangeList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch changes in file. */ public class FetchChanges { - /** - * Retrieve the list of changes for the currently authenticated user. - * @param savedStartPageToken Last saved start token for this user. - * @return Saved token after last page. - * @throws IOException if file is not found - */ - public static String fetchChanges(String savedStartPageToken) throws IOException { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = service.changes().list(pageToken) - .execute(); - for (com.google.api.services.drive.model.Change change : changes.getChanges()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - return savedStartPageToken; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch changes: " + e.getDetails()); - throw e; + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_changes] diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java index de8a2da3..a3445c7a 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -22,45 +22,46 @@ import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch start page token */ public class FetchStartPageToken { - /** - * Retrieve the start page token for the first time. - * @return Start page token as String. - * @throws IOException if file is not found - */ - public static String fetchStartPageToken() throws IOException { + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - StartPageToken response = service.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); - return response.getStartPageToken(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch start page token: " + e.getDetails()); - throw e; - } + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java index 1f611d3c..96192020 100644 --- a/drive/snippets/drive_v3/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -23,54 +23,57 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; -/** Class to demonstrate use-case of list 10 files in the application data folder. */ +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ public class ListAppData { - /** - * list down files in the application data folder. - * @return list of 10 files. - */ - public static FileList listAppData() throws IOException { + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - FileList files = service.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, files(id, name)") - .setPageSize(10) - .execute(); - for (File file : files.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } - return files; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to list files: " + e.getDetails()); - throw e; - } + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; } + } } // [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java index 4b5603e8..bba31a82 100644 --- a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -33,49 +32,50 @@ public class MoveFileToFolder { - /** - * @param fileId Id of file to be moved. - * @param folderId Id of folder where the fill will be moved. - * @return list of parent ids for the file. - * */ - public static List moveFileToFolder(String fileId, String folderId) - throws IOException { + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // Retrieve the existing parents to remove - File file = service.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (String parent : file.getParents()) { - previousParents.append(parent); - previousParents.append(','); - } - try{ - // Move the file to the new folder - file = service.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); - return file.getParents(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return file.getParents(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java index adf8162e..87fd32a8 100644 --- a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,74 +31,77 @@ /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - /** - * Find all shared drives without an organizer and add one. - * @param realUser User's email id. - * @return All shared drives without an organizer. - * @throws IOException if shared drive not found. - */ - public static List recoverDrives(String realUser) - throws IOException { + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List drives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer"); + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer"); - newOrganizerPermission.setEmailAddress(realUser); + newOrganizerPermission.setEmailAddress(realUser); - do { - DriveList result = service.drives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, drives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getDrives()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .create(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); - } + } - drives.addAll(result.getDrives()); + drives.addAll(result.getDrives()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return drives; - } + return drives; + } } // [END drive_recover_drives] diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 632bf4ae..08f574b1 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,47 +31,49 @@ /* Class to demonstrate use-case of search files. */ public class SearchFile { - /** - * Search for specific set of files. - * @return search result list. - * @throws IOException if service account credentials file not found. - */ - public static List searchFile() throws IOException{ + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - List files = new ArrayList(); + List files = new ArrayList(); - String pageToken = null; - do { - FileList result = service.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } - files.addAll(result.getFiles()); + files.addAll(result.getFiles()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return files; - } + return files; + } } // [END drive_search_files] diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java index 899edfef..438440df 100644 --- a/drive/snippets/drive_v3/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -27,7 +27,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -36,80 +35,83 @@ /* Class to demonstrate use-case of modify permissions. */ public class ShareFile { - /** - * Batch permission modification. - * realFileId file Id. - * realUser User Id. - * realDomain Domain of the user ID. - * @return list of modified permissions if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - - final List ids = new ArrayList(); - - - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - - ids.add(permission.getId()); - - } - }; - BatchRequest batch = service.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer"); - - userPermission.setEmailAddress(realUser); - try { - service.permissions().create(realFileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader"); - - domainPermission.setDomain(realDomain); - - service.permissions().create(realFileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - - return ids; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to modify permission: " + e.getDetails()); - throw e; - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setEmailAddress(realUser); + try { + service.permissions().create(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setDomain(realDomain); + + service.permissions().create(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; } + } } // [END drive_share_file] diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java index 2729133c..138a7e18 100644 --- a/drive/snippets/drive_v3/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -32,46 +31,47 @@ public class TouchFile { - /** - * @param realFileId Id of file to be modified. - * @param realTimestamp Timestamp in miliseconds. - * @return long file's latest modification date value. - * @throws IOException if service account credentials file not found. - * */ - public static long touchFile(String realFileId, long realTimestamp) - throws IOException { + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); - fileId = realFileId; - fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); - try { - File file = service.files().update(fileId, fileMetadata) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedTime()); - return file.getModifiedTime().getValue(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + try { + File file = service.files().update(fileId, fileMetadata) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + return file.getModifiedTime().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_touch_file] diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java index 8192f009..4ed8e934 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -23,55 +23,58 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; -/** Class to demonstrate use-case of create file in the application data folder. */ +/** + * Class to demonstrate use-case of create file in the application data folder. + */ public class UploadAppData { - /** - * Creates a file in the application data folder. - * @return Created file's Id. - */ - public static String uploadAppData() throws IOException { + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("config.json"); - fileMetadata.setParents(Collections.singletonList("appDataFolder")); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create file: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java index 65b30ad3..a39a696c 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -24,50 +24,51 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use of Drive insert file API */ public class UploadBasic { - /** - * Upload new file. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadBasic() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // Upload file photo.jpg on drive. - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - // File's content. - java.io.File filePath = new java.io.File("files/photo.jpg"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_basic] diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java index 93e1c4f5..7ed2acac 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -24,49 +24,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of drive's upload revision */ public class UploadRevision { - /** - * Replace the old file with new one on same file ID. - * @param realFileId ID of the file to be replaced. - * @return Inserted file ID if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadRevision(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload new file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload new file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_revision] diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java index db2be62f..b6bd86ad 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -32,44 +31,46 @@ /* Class to demonstrate Drive's upload to folder use-case. */ public class UploadToFolder { - /** - * Upload a file to the specified folder. - * @param realFolderId Id of the folder. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static File uploadToFolder(String realFolderId) throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - fileMetadata.setParents(Collections.singletonList(realFolderId)); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - return file; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(realFolderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java index 21d871b5..114e1b94 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -24,51 +24,52 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's upload with conversion use-case. */ public class UploadWithConversion { - /** - * Upload file with conversion. - * @return Inserted file id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadWithConversion() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java index cab4ed28..446af287 100644 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -14,15 +14,14 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class AppDataSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index 75e636f3..7e4252fb 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -17,7 +17,6 @@ import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; -import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; @@ -25,16 +24,17 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.After; -import org.junit.Before; - import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; public class BaseTest { static { @@ -70,7 +70,8 @@ public void publish(LogRecord record) { public GoogleCredentials getCredential() throws IOException { return GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); } /** @@ -85,14 +86,14 @@ protected Drive buildService() throws IOException { guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = getCredential(); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + credentials); // Create the classroom API client Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive Snippets") - .build(); + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); return service; } diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java index 4323cc7d..7ad14676 100644 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -14,14 +14,13 @@ * limitations under the License. */ -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; + public class ChangeSnippetsTest extends BaseTest { private ChangeSnippets snippets; diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java index 71ec6b25..e32dc904 100644 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class DriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java index a9641861..383a7935 100644 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -14,17 +14,18 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class FileSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java index 43447b4d..b59b235a 100644 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import com.google.api.services.drive.model.TeamDrive; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - +import com.google.api.services.drive.model.TeamDrive; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class TeamDriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java index c8937fa4..37e3b23f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java @@ -12,19 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for create-drive Drive snippet -public class TestCreateDrive extends BaseTest{ - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = CreateDrive.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java index 9c12f12f..d8492a08 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateFolder extends BaseTest{ - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = CreateFolder.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateFolder extends BaseTest { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java index 1853773d..ab3e0f2f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateShortcut extends BaseTest{ - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = CreateShortcut.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java index ce285417..526dea94 100644 --- a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestDownloadFile extends BaseTest{ - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = DownloadFile.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java index fc6deabb..16ede7b4 100644 --- a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestExportPdf extends BaseTest{ - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = ExportPdf.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java index 95c69b6c..791e0480 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -14,17 +14,16 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestFetchAppDataFolder { - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = FetchAppDataFolder.fetchAppDataFolder(); - assertNotNull(id); - } + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java index 7df7821a..aed15304 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java @@ -12,21 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Test; + // Unit test class for fetchChanges change snippet -public class TestFetchChanges extends BaseTest{ - @Test - public void fetchChanges() throws IOException { - String startPageToken = FetchStartPageToken.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = FetchChanges.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java index fd4be2ad..1d334a1e 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java @@ -12,17 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for fetchStartPageToken change snippet -public class TestFetchStartPageToken extends BaseTest{ - @Test - public void fetchStartPageToken() throws IOException { - String token = FetchStartPageToken.fetchStartPageToken(); - assertNotNull(token); - } +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java index fe67a1f2..c747f7ee 100644 --- a/drive/snippets/drive_v3/src/test/java/TestListAppData.java +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import com.google.api.services.drive.model.FileList; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestListAppData extends BaseTest{ - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = ListAppData.listAppData(); - assertNotEquals(0, files.getFiles().size()); - } +public class TestListAppData extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java index 7e4b2b8d..2c5aa74c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -14,25 +14,23 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import javax.annotation.CheckReturnValue; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class TestMoveFileToFolder extends BaseTest{ - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); - assertTrue(parents.contains(folderId)); - assertEquals(1, parents.size()); - } +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java index a638f0e6..28e92433 100644 --- a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java @@ -12,37 +12,36 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Test; - import java.io.IOException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; +import org.junit.Test; // Unit test class for recover-drives Drive snippet -public class TestRecoverDrives extends BaseTest{ - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = RecoverDrive.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } - private String createOrphanedDrive() throws IOException { - String driveId = CreateDrive.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); } + return driveId; + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java index 6772cb40..280c6b9c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestSearchFiles extends BaseTest{ - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = SearchFile.searchFile(); - assertNotEquals(0, files.size()); - } +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java index c47ec72c..167a7ec7 100644 --- a/drive/snippets/drive_v3/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestShareFile extends BaseTest{ - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = ShareFile.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java index aecfabf4..9d7d80b8 100644 --- a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestTouchFile extends BaseTest{ - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = TouchFile.touchFile(id, now); - assertEquals(now, modifiedTime); - } +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java index a8dbd5be..69608a87 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadAppdata extends BaseTest{ - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java index b33b7866..fa53f4ff 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadBasic extends BaseTest{ - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadBasic extends BaseTest { + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java index de932e4f..ea7e7eea 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class TestUploadRevision extends BaseTest{ - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = UploadRevision.uploadRevision(id); - assertEquals(id, id2); - } +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java index c328994e..feee6a6a 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertTrue; - -public class TestUploadToFolder extends BaseTest{ - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - File file = UploadToFolder.uploadToFolder(folderId); - assertTrue(file.getParents().contains(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java index ae3a889c..11b5f2f9 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadWithConversion extends BaseTest{ - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = UploadWithConversion.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 650ba0b7..56ebd1dd 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START gmail_quickstart] + 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; @@ -27,7 +28,6 @@ import com.google.api.services.gmail.GmailScopes; import com.google.api.services.gmail.model.Label; import com.google.api.services.gmail.model.ListLabelsResponse; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -38,65 +38,74 @@ /* class to demonstrate use of Gmail list labels API */ public class GmailQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the labels in the user's account. - String user = "me"; - ListLabelsResponse listResponse = service.users().labels().list(user).execute(); - List

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param csvFilename Name of the CSV file. - */ - public static void insertCertFromCsv(String csvFilename) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, - certPassword); - if (smimeInfo != null) { - InsertSmimeInfo.insertSmimeInfo(userId, - userId, - smimeInfo); - } else { - System.err.printf("Unable to read certificate file for userId: %s\n", userId); - } - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + if (smimeInfo != null) { + InsertSmimeInfo.insertSmimeInfo(userId, + userId, + smimeInfo); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); } + } } // [END gmail_insert_cert_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java index e686126d..25af7f83 100644 --- a/gmail/snippets/src/main/java/InsertSmimeInfo.java +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -14,8 +14,7 @@ // [START gmail_insert_smime_info] -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -24,54 +23,52 @@ import com.google.api.services.gmail.model.SmimeInfo; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.util.Collections; /* Class to demonstrate the use of Gmail Insert Smime Certificate API*/ public class InsertSmimeInfo { - /** - * Upload an S/MIME certificate for the user. - * - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. - * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static SmimeInfo insertSmimeInfo(String userId, - String sendAsEmail, - SmimeInfo smimeInfo) - throws IOException { + /** + * Upload an S/MIME certificate for the user. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static SmimeInfo insertSmimeInfo(String userId, + String sendAsEmail, + SmimeInfo smimeInfo) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - if (sendAsEmail == null) { - sendAsEmail = userId; - } + if (sendAsEmail == null) { + sendAsEmail = userId; + } - try { - SmimeInfo results = service.users().settings().sendAs().smimeInfo() - .insert(userId, sendAsEmail, smimeInfo) - .execute(); - System.out.printf("Inserted certificate, id: %s\n", results.getId()); - return results; - } catch (IOException e) { - System.err.printf("An error occured: %s", e); - } - return null; + try { + SmimeInfo results = service.users().settings().sendAs().smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); } + return null; + } } // [END gmail_insert_smime_info] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java deleted file mode 100644 index 9b671f32..00000000 --- a/gmail/snippets/src/main/java/SendEmail.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.gmail.Gmail; -import com.google.api.services.gmail.model.Draft; -import com.google.api.services.gmail.model.Message; -import org.apache.commons.codec.binary.Base64; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.activation.FileDataSource; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.Session; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; - -// ... - -public class SendEmail { - - // ... - - // [START create_draft] - /** - * Create draft email. - * - * @param service an authorized Gmail API instance - * @param userId user's email address. The special value "me" - * can be used to indicate the authenticated user - * @param emailContent the MimeMessage used as email within the draft - * @return the created draft - * @throws MessagingException - * @throws IOException - */ - public static Draft createDraft(Gmail service, - String userId, - MimeMessage emailContent) - throws MessagingException, IOException { - Message message = createMessageWithEmail(emailContent); - Draft draft = new Draft(); - draft.setMessage(message); - draft = service.users().drafts().create(userId, draft).execute(); - - System.out.println("Draft id: " + draft.getId()); - System.out.println(draft.toPrettyString()); - return draft; - } - // [END create_draft] - - - // [START send_email] - /** - * Send an email from the user's mailbox to its recipient. - * - * @param service Authorized Gmail API instance. - * @param userId User's email address. The special value "me" - * can be used to indicate the authenticated user. - * @param emailContent Email to be sent. - * @return The sent message - * @throws MessagingException - * @throws IOException - */ - public static Message sendMessage(Gmail service, - String userId, - MimeMessage emailContent) - throws MessagingException, IOException { - Message message = createMessageWithEmail(emailContent); - message = service.users().messages().send(userId, message).execute(); - - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } - // [END send_email] - - - // [START create_message] - /** - * Create a message from an email. - * - * @param emailContent Email to be set to raw of message - * @return a message containing a base64url encoded email - * @throws IOException - * @throws MessagingException - */ - public static Message createMessageWithEmail(MimeMessage emailContent) - throws MessagingException, IOException { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - emailContent.writeTo(buffer); - byte[] bytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(bytes); - Message message = new Message(); - message.setRaw(encodedEmail); - return message; - } - // [END create_message] - - // [START create_email] - /** - * Create a MimeMessage using the parameters provided. - * - * @param to email address of the receiver - * @param from email address of the sender, the mailbox account - * @param subject subject of the email - * @param bodyText body text of the email - * @return the MimeMessage to be used to send email - * @throws MessagingException - */ - public static MimeMessage createEmail(String to, - String from, - String subject, - String bodyText) - throws MessagingException { - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - - MimeMessage email = new MimeMessage(session); - - email.setFrom(new InternetAddress(from)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(to)); - email.setSubject(subject); - email.setText(bodyText); - return email; - } - // [END create_email] - - - // [START create_email_attachment] - /** - * Create a MimeMessage using the parameters provided. - * - * @param to Email address of the receiver. - * @param from Email address of the sender, the mailbox account. - * @param subject Subject of the email. - * @param bodyText Body text of the email. - * @param file Path to the file to be attached. - * @return MimeMessage to be used to send email. - * @throws MessagingException - */ - public static MimeMessage createEmailWithAttachment(String to, - String from, - String subject, - String bodyText, - File file) - throws MessagingException, IOException { - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - - MimeMessage email = new MimeMessage(session); - - email.setFrom(new InternetAddress(from)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(to)); - email.setSubject(subject); - - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - mimeBodyPart.setContent(bodyText, "text/plain"); - - Multipart multipart = new MimeMultipart(); - multipart.addBodyPart(mimeBodyPart); - - mimeBodyPart = new MimeBodyPart(); - DataSource source = new FileDataSource(file); - - mimeBodyPart.setDataHandler(new DataHandler(source)); - mimeBodyPart.setFileName(file.getName()); - - multipart.addBodyPart(mimeBodyPart); - email.setContent(multipart); - - return email; - } - // [END create_email_attachment] - - // ... - -} diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 9e0ec4b7..de989866 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -14,94 +14,92 @@ // [START gmail_send_message] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.apache.commons.codec.binary.Base64; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.Message; - import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Collections; import java.util.Properties; - import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; +import org.apache.commons.codec.binary.Base64; /* Class to demonstrate the use of Gmail Send Message API */ public class SendMessage { - /** - * Send an email from the user's mailbox to its recipient. - * - * @param fromEmailAddress - Email address to appear in the from: header - * @param toEmailAddress - Email address of the recipient - * @return the sent message, {@code null} otherwise. - * @throws MessagingException - if a wrongly formatted address is encountered. - * @throws IOException - if service account credentials file not found. - */ - public static Message sendEmail(String fromEmailAddress, - String toEmailAddress) - throws MessagingException, IOException { + /** + * Send an email from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmail(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SEND); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - // Create the email content - String messageSubject = "Test message"; - String bodyText = "lorem ipsum."; + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; - // Encode as MIME message - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - MimeMessage email = new MimeMessage(session); - email.setFrom(new InternetAddress(fromEmailAddress)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(toEmailAddress)); - email.setSubject(messageSubject); - email.setText(bodyText); + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); - // Encode and wrap the MIME message into a gmail message - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - email.writeTo(buffer); - byte[] rawMessageBytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); - Message message = new Message(); - message.setRaw(encodedEmail); + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); - try { - // Create send message - message = service.users().messages().send("me", message).execute(); - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to send message: " + e.getDetails()); - } else { - throw e; - } - } - return null; + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_send_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 29c28ec4..2a9903f0 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -14,23 +14,21 @@ // [START gmail_send_message_with_attachment] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.apache.commons.codec.binary.Base64; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.Message; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Properties; - import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; @@ -41,85 +39,86 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import org.apache.commons.codec.binary.Base64; /* Class to demonstrate the use of Gmail Send Message with attachment API */ -public class SendMessageWithAttachment{ - /** - * Send an email with attachment from the user's mailbox to its recipient. - * - * @param fromEmailAddress - Email address to appear in the from: header. - * @param toEmailAddress - Email address of the recipient. - * @param file - Path to the file to be attached. - * @return the sent message, {@code null} otherwise. - * @throws MessagingException - if a wrongly formatted address is encountered. - * @throws IOException - if service account credentials file not found. - */ - public static Message sendEmailWithAttachment(String fromEmailAddress, - String toEmailAddress, - File file) - throws MessagingException, IOException { +public class SendMessageWithAttachment { + /** + * Send an email with attachment from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmailWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SEND); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - // Create the email content - String messageSubject = "Test message"; - String bodyText = "lorem ipsum."; + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; - // Encode as MIME message - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - MimeMessage email = new MimeMessage(session); - email.setFrom(new InternetAddress(fromEmailAddress)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(toEmailAddress)); - email.setSubject(messageSubject); + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - mimeBodyPart.setContent(bodyText, "text/plain"); - Multipart multipart = new MimeMultipart(); - multipart.addBodyPart(mimeBodyPart); - mimeBodyPart = new MimeBodyPart(); - DataSource source = new FileDataSource(file); - mimeBodyPart.setDataHandler(new DataHandler(source)); - mimeBodyPart.setFileName(file.getName()); - multipart.addBodyPart(mimeBodyPart); - email.setContent(multipart); + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); - // Encode and wrap the MIME message into a gmail message - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - email.writeTo(buffer); - byte[] rawMessageBytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); - Message message = new Message(); - message.setRaw(encodedEmail); + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); - try { - // Create send message - message = service.users().messages().send("me", message).execute(); - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to send message: " + e.getDetails()); - } else { - throw e; - } - } - return null; + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_send_message_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index ca21e77e..3f5bf92e 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -14,6 +14,7 @@ // [START gmail_update_signature] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,64 +22,64 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; -import com.google.api.services.gmail.model.SendAs; import com.google.api.services.gmail.model.ListSendAsResponse; +import com.google.api.services.gmail.model.SendAs; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; /* Class to demonstrate the use of Gmail Update Signature API */ public class UpdateSignature { - /** - * Update the gmail signature. - * - * @return the updated signature id , {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static String updateGmailSignature() throws IOException { + /** + * Update the gmail signature. + * + * @return the updated signature id , {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static String updateGmailSignature() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - try { - SendAs primaryAlias = null; - ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); - for (SendAs alias : aliases.getSendAs()) { - if (alias.getIsPrimary()) { - primaryAlias = alias; - break; - } - } - // Updating a new signature - SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); - SendAs result = service.users().settings().sendAs().patch( - "me", - primaryAlias.getSendAsEmail(), - aliasSettings) - .execute(); - //Prints the updated signature - System.out.println("Updated signature - " + result.getSignature()); - return result.getSignature(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to update signature: " + e.getDetails()); - } else { - throw e; - } + try { + SendAs primaryAlias = null; + ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); + for (SendAs alias : aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; } - return null; + } + // Updating a new signature + SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); + SendAs result = service.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + //Prints the updated signature + System.out.println("Updated signature - " + result.getSignature()); + return result.getSignature(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to update signature: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_update_signature] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java index cd9ccb2c..0a92ce8a 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeCerts.java +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -14,6 +14,7 @@ // [START gmail_update_smime_certs] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -23,121 +24,121 @@ import com.google.api.services.gmail.model.SmimeInfo; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.Collections; /* Class to demonstrate the use of Gmail Update Smime Certificate API*/ public class UpdateSmimeCerts { - /** - * Update S/MIME certificates for the user. - * - *

First performs a lookup of all certificates for a user. If there are no certificates, or - * they all expire before the specified date/time, uploads the certificate in the specified file. - * If the default certificate is expired or there was no default set, chooses the certificate with - * the expiration furthest into the future and sets it as default. - * - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. - * @param certFilename Name of the file containing the S/MIME certificate. - * @param certPassword Password for the certificate file, or None if the file is not - * password-protected. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certificate, {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static String updateSmimeCerts(String userId, - String sendAsEmail, - String certFilename, - String certPassword, - LocalDateTime expireTime) - throws IOException { + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static String updateSmimeCerts(String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - if (sendAsEmail == null) { - sendAsEmail = userId; - } + if (sendAsEmail == null) { + sendAsEmail = userId; + } - ListSmimeInfoResponse listResults; - try { - listResults = service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); - } catch (IOException e) { - System.err.printf("An error occurred during list: %s\n", e); - return null; - } + ListSmimeInfoResponse listResults; + try { + listResults = + service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } - String defaultCertId = null; - String bestCertId = null; - LocalDateTime bestCertExpire = LocalDateTime.MIN; + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; - if (expireTime == null) { - expireTime = LocalDateTime.now(); - } - if (listResults != null && listResults.getSmimeInfo() != null) { - for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { - String certId = smimeInfo.getId(); - boolean isDefaultCert = smimeInfo.getIsDefault(); - if (isDefaultCert) { - defaultCertId = certId; - } - LocalDateTime exp = - LocalDateTime.ofInstant( - Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); - if (exp.isAfter(expireTime)) { - if (exp.isAfter(bestCertExpire)) { - bestCertId = certId; - bestCertExpire = exp; - } - } else { - if (isDefaultCert) { - defaultCertId = null; - } - } - } + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; } - if (defaultCertId == null) { - String defaultId = bestCertId; - if (defaultId == null && certFilename != null) { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, - certPassword); - SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, - sendAsEmail, - smimeInfo); - if (insertResults != null) { - defaultId = insertResults.getId(); - } - } - - if (defaultId != null) { - try { - service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId).execute(); - return defaultId; - } catch (IOException e) { - System.err.printf("An error occured during setDefault: %s", e); - } - } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } } else { - return defaultCertId; + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, + sendAsEmail, + smimeInfo); + if (insertResults != null) { + defaultId = insertResults.getId(); } + } - return null; + if (defaultId != null) { + try { + service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId) + .execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; } + + return null; + } } // [END gmail_update_smime_certs] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java index efe3052b..70932b7a 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -14,44 +14,44 @@ // [START gmail_update_smime_from_csv] -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; import java.io.File; import java.time.LocalDateTime; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; /* Class to demonstrate the use of Gmail Update Certificate from CSV File */ public class UpdateSmimeFromCsv { - /** - * Update S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param csvFilename Name of the CSV file. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. - */ - public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = CSVParser.parse( csvFile, - java.nio.charset.StandardCharsets.UTF_8, - CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - UpdateSmimeCerts.updateSmimeCerts(userId, - userId, - certFilename, - certPassword, - expireTime); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = CSVParser.parse(csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + UpdateSmimeCerts.updateSmimeCerts(userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); } + } } // [END gmail_update_smime_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 3fc90c8b..fbba7f1c 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -21,45 +21,45 @@ import com.google.api.services.gmail.GmailScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.Before; import java.io.IOException; +import org.junit.Before; public class BaseTest { - public static final String TEST_USER = "ci-test01@workspacesamples.dev"; - public static final String RECIPIENT = "gduser1@workspacesamples.dev"; - public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; + public static final String TEST_USER = "ci-test01@workspacesamples.dev"; + public static final String RECIPIENT = "gduser1@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; - protected Gmail service; + protected Gmail service; - /** - * Create a default authorization Gmail client service. - * - * @return an authorized Gmail client service - * @throws IOException - if credentials file not found. - */ - public Gmail buildService() throws IOException { + /** + * Create a default authorization Gmail client service. + * + * @return an authorized Gmail client service + * @throws IOException - if credentials file not found. + */ + public Gmail buildService() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, - GmailScopes.GMAIL_COMPOSE, - GmailScopes.GMAIL_SETTINGS_SHARING, - GmailScopes.GMAIL_LABELS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the Gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail API Snippets") - .build(); - return service; - } + // Create the Gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail API Snippets") + .build(); + return service; + } - @Before - public void setupService() throws IOException { - this.service = buildService(); - } + @Before + public void setupService() throws IOException { + this.service = buildService(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java index e3eb2fb2..71e56eb9 100644 --- a/gmail/snippets/src/test/java/TestCreateDraft.java +++ b/gmail/snippets/src/test/java/TestCreateDraft.java @@ -13,19 +13,20 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Draft; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail create draft snippet -public class TestCreateDraft extends BaseTest{ +public class TestCreateDraft extends BaseTest { - @Test - public void testCreateDraft() throws MessagingException, IOException { - Draft draft = CreateDraft.createDraftMessage(RECIPIENT,TEST_USER); - assertNotNull(draft); - this.service.users().drafts().delete("me", draft.getId()).execute(); - } + @Test + public void testCreateDraft() throws MessagingException, IOException { + Draft draft = CreateDraft.createDraftMessage(RECIPIENT, TEST_USER); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java index d0031682..065c64c6 100644 --- a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java +++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java @@ -13,21 +13,22 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Draft; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail create draft with attachment snippet -public class TestCreateDraftWithAttachment extends BaseTest{ +public class TestCreateDraftWithAttachment extends BaseTest { - @Test - public void testCreateDraftWithAttachment() throws MessagingException, IOException { - Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, - TEST_USER, - new java.io.File("files/photo.jpg")); - assertNotNull(draft); - this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); - } + @Test + public void testCreateDraftWithAttachment() throws MessagingException, IOException { + Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, + TEST_USER, + new java.io.File("files/photo.jpg")); + assertNotNull(draft); + this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateEmail.java b/gmail/snippets/src/test/java/TestCreateEmail.java index 1248aa35..043397a0 100644 --- a/gmail/snippets/src/test/java/TestCreateEmail.java +++ b/gmail/snippets/src/test/java/TestCreateEmail.java @@ -13,25 +13,26 @@ // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import java.io.IOException; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for gmail create email snippet -public class TestCreateEmail extends BaseTest{ +public class TestCreateEmail extends BaseTest { - @Test - public void createEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - assertEquals("test", mimeMessage.getSubject()); - assertEquals("Hello!", mimeMessage.getContent()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } } diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index b345afa1..fbf72c2b 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -13,48 +13,49 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Label; import com.google.api.services.gmail.model.ListLabelsResponse; +import java.io.IOException; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; // Unit testcase for gmail create filter snippet public class TestCreateFilter extends BaseTest { - private Label testLabel = null; - - @Before - public void createLabel() throws IOException { - ListLabelsResponse response = this.service.users().labels().list("me").execute(); - for (Label l : response.getLabels()) { - if (l.getName().equals("testLabel")) { - testLabel = l; - } - } - if (testLabel == null) { - Label label = new Label() - .setName("testLabel") - .setLabelListVisibility("labelShow") - .setMessageListVisibility("show"); - testLabel = this.service.users().labels().create("me", label).execute(); - } - } + private Label testLabel = null; - @After - public void deleteLabel() throws IOException { - if (testLabel != null) { - this.service.users().labels().delete("me", testLabel.getId()).execute(); - testLabel = null; - } + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } - @Test - public void testCreateNewFilter() throws IOException { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; } + } + + @Test + public void testCreateNewFilter() throws IOException { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateMessage.java b/gmail/snippets/src/test/java/TestCreateMessage.java index 775e7c1f..d31bd75e 100644 --- a/gmail/snippets/src/test/java/TestCreateMessage.java +++ b/gmail/snippets/src/test/java/TestCreateMessage.java @@ -12,24 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for gmail create message snippet -public class TestCreateMessage extends BaseTest{ +public class TestCreateMessage extends BaseTest { - @Test - public void testCreateMessageWithEmail() throws MessagingException, - IOException { - MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); + @Test + public void testCreateMessageWithEmail() throws MessagingException, + IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); - com.google.api.services.gmail.model.Message message = CreateMessage.createMessageWithEmail(mimeMessage); - assertNotNull(message.getRaw()); // Weak assertion... - } + com.google.api.services.gmail.model.Message message = + CreateMessage.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } } diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 5357536e..6e304814 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -13,54 +13,54 @@ // limitations under the License. -import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Test; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Test; + // Unit testcase for gmail create smime info snippet public class TestCreateSmimeInfo { - @Test - public void testCreateSmimeInfo() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/cert.p12", - null /* password */); + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + null /* password */); - assertNotNull(smimeInfo); - assertNull(smimeInfo.getEncryptedKeyPassword()); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } - @Test - public void testCreateSmimeInfoWithPassword() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/cert.p12", - "certpass"); + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + "certpass"); - assertNotNull(smimeInfo); - assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } - @Test - public void testCreateSmimeInfoFileNotFound() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/notfound.p12", - null /* password */); - assertNull(smimeInfo); - } + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/notfound.p12", + null /* password */); + assertNull(smimeInfo); + } } diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index c961b734..829e4c6d 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.VacationSettings; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for gmail enable auto reply snippet public class TestEnableAutoReply extends BaseTest { - @Test - public void testAutoReply() throws IOException { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); - } + @Test + public void testAutoReply() throws IOException { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 6250c13c..b7719fc3 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -13,30 +13,32 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.AutoForwarding; +import java.io.IOException; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; // Unit testcase for gmail enable forwarding snippet public class TestEnableForwarding extends BaseTest { - @Test - public void TestEnableAutoForwarding() throws IOException { - AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - } + @Test + public void TestEnableAutoForwarding() throws IOException { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + } - @Before - public void cleanup() { - try { - AutoForwarding forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); - } catch (Exception e) { - // Ignore -- resources might not exist - e.printStackTrace(); - } + @Before + public void cleanup() { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS) + .execute(); + } catch (Exception e) { + // Ignore -- resources might not exist + e.printStackTrace(); } + } } diff --git a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java index 2853cc2e..2a1ccc60 100644 --- a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java +++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java @@ -12,91 +12,100 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.io.IOException; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; // Unit testcase for gmail insert cert from csv snippet -public class TestInsertCertFromCsv extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; - public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; - - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - @Test - public void testInsertSmimeFromCsv() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); - verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); - verify(mockInsert, times(2)).execute(); - } - - @Test - public void testInsertSmimeFromCsvFails() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } +public class TestInsertCertFromCsv extends BaseTest { + + public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; + public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); + verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java index 3c70b89a..360174e7 100644 --- a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java @@ -12,106 +12,115 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; -import static org.mockito.Mockito.times; // Unit testcase for gmail insert smime info snippet -public class TestInsertSmimeInfo extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - - @Mock private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - @Test - public void testInsertSmimeInfo() throws IOException { - SmimeInfo insertResult = makeFakeInsertResult(); - when(mockInsert.execute()).thenReturn(insertResult); - - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", - null /* password */); - SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, - TEST_USER, - smimeInfo); - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertEquals(insertResult, result); - } - - @Test - public void testInsertSmimeInfoError() throws IOException { - when(mockInsert.execute()).thenThrow(IOException.class); - - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", - null /* password */); - SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, - TEST_USER, smimeInfo); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertNull(result); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } +public class TestInsertSmimeInfo extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, + smimeInfo); + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestSendMessage.java b/gmail/snippets/src/test/java/TestSendMessage.java index 2bde312c..e915a244 100644 --- a/gmail/snippets/src/test/java/TestSendMessage.java +++ b/gmail/snippets/src/test/java/TestSendMessage.java @@ -12,19 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Message; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail send email snippet -public class TestSendMessage extends BaseTest{ +public class TestSendMessage extends BaseTest { - @Test - public void testSendEmail() throws MessagingException, IOException { - Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); - assertNotNull(message); - this.service.users().messages().delete("me", message.getId()).execute(); - } + @Test + public void testSendEmail() throws MessagingException, IOException { + Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java index 56161969..8c428982 100644 --- a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java +++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java @@ -12,23 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Message; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.File; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail send email with attachment snippet -public class TestSendMessageWithAttachment extends BaseTest{ +public class TestSendMessageWithAttachment extends BaseTest { - @Test - public void testSendEmailWithAttachment() throws MessagingException, - IOException{ - Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, - TEST_USER, - new File("files/photo.jpg")); - assertNotNull(message); - this.service.users().messages().delete("me", message.getId()).execute(); - } + @Test + public void testSendEmailWithAttachment() throws MessagingException, + IOException { + Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, + TEST_USER, + new File("files/photo.jpg")); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index 43f0559e..809da2a8 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -13,16 +13,17 @@ // limitations under the License. -import org.junit.Test; -import java.io.IOException; import static org.junit.Assert.assertEquals; +import java.io.IOException; +import org.junit.Test; + // Unit testcase for gmail update signature snippet public class TestUpdateSignature extends BaseTest { - @Test - public void testUpdateGmailSignature() throws IOException { - String signature = UpdateSignature.updateGmailSignature(); - assertEquals("Automated Signature", signature); - } + @Test + public void testUpdateGmailSignature() throws IOException { + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java index c66ebb57..0808062b 100644 --- a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java +++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java @@ -12,16 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListSmimeInfoResponse; import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; @@ -29,242 +30,250 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; // Unit testcase for gmail update smime certs snippet -public class TestUpdateSmimeCerts extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); +public class TestUpdateSmimeCerts extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; } - @Test - public void testUpdateSmimeCertsNoCerts() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - null /* certFilename */, - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); + assertEquals(isDefault.size(), expiration.size()); - assertNull(defaultCertId); + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); } + listResponse.setSmimeInfo(smimeInfoList); - @Test - public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertEquals(defaultCertId, "existing_certificate_id0"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { - LocalDateTime expireTime = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - expireTime); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id1"); - } - - @Test - public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(false, false, false, false), - Arrays.asList( - CURRENT_TIME_MS + 2, - CURRENT_TIME_MS + 1, - CURRENT_TIME_MS + 4, - CURRENT_TIME_MS + 3)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id2"); - } + return listResponse; + } - @Test - public void testUpdateSmimeCertsError() throws IOException { - when(mockList.execute()).thenThrow(IOException.class); + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } - String defaultCertId = - UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); + return insertResult; + } - assertNull(defaultCertId); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } - - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java index 35bcee1e..6b89e455 100644 --- a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java +++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java @@ -12,129 +12,137 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListSmimeInfoResponse; import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; // Unit testcase for gmail update smime from csv snippet -public class TestUpdateSmimeFromCsv extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); +public class TestUpdateSmimeFromCsv extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(6); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo) + .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList, times(2)).execute(); + verify(mockInsert, times(2)).execute(); + verify(mockSetDefault, times(2)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; } - @Test - public void testUpdateSmimeFromCsv() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); - - verifySmimeApiCalled(6); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo) - .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList, times(2)).execute(); - verify(mockInsert, times(2)).execute(); - verify(mockSetDefault, times(2)).execute(); - } + assertEquals(isDefault.size(), expiration.size()); - @Test - public void testUpdateSmimeFromCsvFails() { - InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); - // tearDown() verifies that there were no interactions with the API. + List smimeInfoList = new ArrayList<>(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); } + listResponse.setSmimeInfo(smimeInfoList); - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } + return listResponse; + } - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList<>(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); + return insertResult; + } - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index a0301f2d..dcbc81f9 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START people_quickstart] + 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; @@ -38,70 +39,74 @@ import java.util.List; public class PeopleQuickstart { - private static final String APPLICATION_NAME = "Google People API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google People API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + PeopleService service = + new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Request 10 connections. - ListConnectionsResponse response = service.people().connections() - .list("people/me") - .setPageSize(10) - .setPersonFields("names,emailAddresses") - .execute(); + // Request 10 connections. + ListConnectionsResponse response = service.people().connections() + .list("people/me") + .setPageSize(10) + .setPersonFields("names,emailAddresses") + .execute(); - // Print display name of connections if available. - List connections = response.getConnections(); - if (connections != null && connections.size() > 0) { - for (Person person : connections) { - List names = person.getNames(); - if (names != null && names.size() > 0) { - System.out.println("Name: " + person.getNames().get(0) - .getDisplayName()); - } else { - System.out.println("No names available for connection."); - } - } + // Print display name of connections if available. + List connections = response.getConnections(); + if (connections != null && connections.size() > 0) { + for (Person person : connections) { + List names = person.getNames(); + if (names != null && names.size() > 0) { + System.out.println("Name: " + person.getNames().get(0) + .getDisplayName()); } else { - System.out.println("No connections found."); + System.out.println("No names available for connection."); } + } + } else { + System.out.println("No connections found."); } + } } // [END people_quickstart] diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index e7d04d4c..10eef669 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START sheets_quickstart] + 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; @@ -26,7 +27,6 @@ import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.ValueRange; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -36,66 +36,71 @@ import java.util.List; public class SheetsQuickstart { - private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - /** - * Prints the names and majors of students in a sample spreadsheet: - * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit - */ - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; - final String range = "Class Data!A2:E"; - Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - ValueRange response = service.spreadsheets().values() - .get(spreadsheetId, range) - .execute(); - List> values = response.getValues(); - if (values == null || values.isEmpty()) { - System.out.println("No data found."); - } else { - System.out.println("Name, Major"); - for (List row : values) { - // Print columns A and E, which correspond to indices 0 and 4. - System.out.printf("%s, %s\n", row.get(0), row.get(4)); - } - } + /** + * Prints the names and majors of students in a sample spreadsheet: + * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit + */ + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; + final String range = "Class Data!A2:E"; + Sheets service = + new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + ValueRange response = service.spreadsheets().values() + .get(spreadsheetId, range) + .execute(); + List> values = response.getValues(); + if (values == null || values.isEmpty()) { + System.out.println("No data found."); + } else { + System.out.println("Name, Major"); + for (List row : values) { + // Print columns A and E, which correspond to indices 0 and 4. + System.out.printf("%s, %s\n", row.get(0), row.get(4)); + } } + } } // [END sheets_quickstart] diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java index c5d023a0..5da38dd1 100644 --- a/sheets/snippets/src/main/java/AppendValues.java +++ b/sheets/snippets/src/main/java/AppendValues.java @@ -14,6 +14,7 @@ // [START sheets_append_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -25,63 +26,62 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Append Values API */ public class AppendValues { - /** - * Appends values to a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - list of rows of values to input. - * @return spreadsheet with appended values - * @throws IOException - if credentials file not found. - */ - public static AppendValuesResponse appendValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Appends values to a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with appended values + * @throws IOException - if credentials file not found. + */ + public static AppendValuesResponse appendValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - AppendValuesResponse result = null; - try { - // Append values to the specified range. - ValueRange body = new ValueRange() - .setValues(values); - result = service.spreadsheets().values().append(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - // Prints the spreadsheet with appended values. - System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + AppendValuesResponse result = null; + try { + // Append values to the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + // Prints the spreadsheet with appended values. + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_append_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchGetValues.java b/sheets/snippets/src/main/java/BatchGetValues.java index 21da22d9..1a79a213 100644 --- a/sheets/snippets/src/main/java/BatchGetValues.java +++ b/sheets/snippets/src/main/java/BatchGetValues.java @@ -14,6 +14,7 @@ // [START sheets_batch_get_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -24,55 +25,54 @@ import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Batch Get Values API */ public class BatchGetValues { - /** - * Returns one or more ranges of values from a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param ranges - Range of cells of the spreadsheet. - * @return Values in the range - * @throws IOException - if credentials file not found. - */ - public static BatchGetValuesResponse batchGetValues(String spreadsheetId, - List ranges) - throws IOException { + /** + * Returns one or more ranges of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param ranges - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static BatchGetValuesResponse batchGetValues(String spreadsheetId, + List ranges) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - BatchGetValuesResponse result = null; - try { - // Gets the values of the cells in the specified range. - result = service.spreadsheets().values().batchGet(spreadsheetId) - .setRanges(ranges).execute() ; - System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchGetValuesResponse result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute(); + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_batch_get_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java index 6e8ac069..5c742500 100644 --- a/sheets/snippets/src/main/java/BatchUpdate.java +++ b/sheets/snippets/src/main/java/BatchUpdate.java @@ -14,6 +14,7 @@ // [START sheets_batch_update] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,8 +22,8 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; -import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.FindReplaceRequest; import com.google.api.services.sheets.v4.model.FindReplaceResponse; import com.google.api.services.sheets.v4.model.Request; @@ -30,7 +31,6 @@ import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -38,68 +38,68 @@ /* Class to demonstrate the use of Spreadsheet Batch Update API */ public class BatchUpdate { - /** - * Updates spreadsheet's title and cell values. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param title - New title of the spreadsheet. - * @param find - Find cell values - * @param replacement - Replaced cell values - * @return response metadata - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, - String title, - String find, - String replacement) - throws IOException { + /** + * Updates spreadsheet's title and cell values. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param title - New title of the spreadsheet. + * @param find - Find cell values + * @param replacement - Replaced cell values + * @return response metadata + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, + String title, + String find, + String replacement) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List requests = new ArrayList<>(); - BatchUpdateSpreadsheetResponse response = null; - try { - // Change the spreadsheet's title. - requests.add(new Request() - .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() - .setProperties(new SpreadsheetProperties() - .setTitle(title)) - .setFields("title"))); - // Find and replace text. - requests.add(new Request() - .setFindReplace(new FindReplaceRequest() - .setFind(find) - .setReplacement(replacement) - .setAllSheets(true))); + List requests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse response = null; + try { + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(requests); - response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); - FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); - System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return response; + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return response; + } } // [END sheets_batch_update] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java index a2a1759c..7ce0306a 100644 --- a/sheets/snippets/src/main/java/BatchUpdateValues.java +++ b/sheets/snippets/src/main/java/BatchUpdateValues.java @@ -14,6 +14,7 @@ // [START sheets_batch_update_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -26,7 +27,6 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -34,59 +34,59 @@ /* Class to demonstrate the use of Spreadsheet Batch Update Values API */ public class BatchUpdateValues { - /** - * Set values in one or more ranges of spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - list of rows of values to input. - * @return spreadsheet with updated values - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Set values in one or more ranges of spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List data = new ArrayList<>(); - data.add(new ValueRange() - .setRange(range) - .setValues(values)); + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); - BatchUpdateValuesResponse result = null; - try { - // Updates the values in the specified range. - BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() - .setValueInputOption(valueInputOption) - .setData(data); - result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); - System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchUpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_batch_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java index bae8ef3b..4cecfc76 100644 --- a/sheets/snippets/src/main/java/ConditionalFormatting.java +++ b/sheets/snippets/src/main/java/ConditionalFormatting.java @@ -14,6 +14,7 @@ // [START sheets_conditional_formatting] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,10 +22,20 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; -import com.google.api.services.sheets.v4.model.*; +import com.google.api.services.sheets.v4.model.AddConditionalFormatRuleRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.BooleanCondition; +import com.google.api.services.sheets.v4.model.BooleanRule; +import com.google.api.services.sheets.v4.model.CellFormat; +import com.google.api.services.sheets.v4.model.Color; +import com.google.api.services.sheets.v4.model.ConditionValue; +import com.google.api.services.sheets.v4.model.ConditionalFormatRule; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.TextFormat; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -32,97 +43,97 @@ /* Class to demonstrate the use of Spreadsheet Conditional Formatting API */ public class ConditionalFormatting { - /** - * Create conditional formatting. - * - * @param spreadsheetId - Id of the spreadsheet. - * @return updated changes count. - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) - throws IOException { + /** + * Create conditional formatting. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return updated changes count. + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor( - new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) ) - ); + ) + .setIndex(0) + ) + ); - BatchUpdateSpreadsheetResponse result = null; - try { - // Execute the requests. - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - System.out.printf("%d cells updated.", result.getReplies().size()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchUpdateSpreadsheetResponse result = null; + try { + // Execute the requests. + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_conditional_formatting] diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java index bf4e0c6b..4d66e78c 100644 --- a/sheets/snippets/src/main/java/Create.java +++ b/sheets/snippets/src/main/java/Create.java @@ -14,6 +14,7 @@ // [START sheets_create] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -23,45 +24,44 @@ import com.google.api.services.sheets.v4.model.SpreadsheetProperties; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; /* Class to demonstrate the use of Spreadsheet Create API */ public class Create { - /** - * Create a new spreadsheet. - * - * @param title - the name of the sheet to be created. - * @return newly created spreadsheet id - * @throws IOException - if credentials file not found. - */ - public static String createSpreadsheet(String title) throws IOException { + /** + * Create a new spreadsheet. + * + * @param title - the name of the sheet to be created. + * @return newly created spreadsheet id + * @throws IOException - if credentials file not found. + */ + public static String createSpreadsheet(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - // Create new spreadsheet with a title - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle(title)); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - // Prints the new spreadsheet id - System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - return spreadsheet.getSpreadsheetId(); - } + // Create new spreadsheet with a title + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + // Prints the new spreadsheet id + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + return spreadsheet.getSpreadsheetId(); + } } // [END sheets_create] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java index 620e0577..157d6cdf 100644 --- a/sheets/snippets/src/main/java/GetValues.java +++ b/sheets/snippets/src/main/java/GetValues.java @@ -14,6 +14,7 @@ // [START sheets_get_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -24,52 +25,51 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; /* Class to demonstrate the use of Spreadsheet Get Values API */ public class GetValues { - /** - * Returns a range of values from a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @return Values in the range - * @throws IOException - if credentials file not found. - */ - public static ValueRange getValues(String spreadsheetId, String range) throws IOException { + /** + * Returns a range of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static ValueRange getValues(String spreadsheetId, String range) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - ValueRange result = null; - try { - // Gets the values of the cells in the specified range. - result = service.spreadsheets().values().get(spreadsheetId, range).execute(); - int numRows = result.getValues() != null ? result.getValues().size() : 0; - System.out.printf("%d rows retrieved.", numRows); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + ValueRange result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_get_values] diff --git a/sheets/snippets/src/main/java/PivotTables.java b/sheets/snippets/src/main/java/PivotTables.java index a6de919b..8b56a058 100644 --- a/sheets/snippets/src/main/java/PivotTables.java +++ b/sheets/snippets/src/main/java/PivotTables.java @@ -14,6 +14,7 @@ // [START sheets_pivot_tables] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -36,7 +37,6 @@ import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -44,101 +44,102 @@ /* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */ public class PivotTables { - /** - * Create pivot table. - * - * @param spreadsheetId - Id of the spreadsheet. - * @return pivot table's spreadsheet - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { + /** + * Create pivot table. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return pivot table's spreadsheet + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - // Create two sheets for our pivot table. - List sheetsRequests = new ArrayList<>(); - BatchUpdateSpreadsheetResponse result = null; - try { - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse result = null; + try { + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(sheetsRequests); - BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() - .batchUpdate(spreadsheetId, createSheetsBody).execute(); - int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() - .getSheetId(); - int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() - .getSheetId(); + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); - PivotTable pivotTable = new PivotTable() - .setSource( - new GridRange() - .setSheetId(sourceSheetId) - .setStartRowIndex(0) - .setStartColumnIndex(0) - .setEndRowIndex(20) - .setEndColumnIndex(7) - ) - .setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(1) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(4) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(4) - )); - List requests = Lists.newArrayList(); - Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() - .setFields("*") - .setRows(Collections.singletonList( - new RowData().setValues( - Collections.singletonList( - new CellData().setPivotTable(pivotTable)) - ) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) - )); + )); - requests.add(updateCellsRequest); - BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_pivot_tables] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java index 9183f752..21e23308 100644 --- a/sheets/snippets/src/main/java/UpdateValues.java +++ b/sheets/snippets/src/main/java/UpdateValues.java @@ -14,6 +14,7 @@ // [START sheets_update_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -25,62 +26,61 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Update Values API */ public class UpdateValues { - /** - * Sets values in a range of a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - List of rows of values to input. - * @return spreadsheet with updated values - * @throws IOException - if credentials file not found. - */ - public static UpdateValuesResponse updateValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Sets values in a range of a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - List of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static UpdateValuesResponse updateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - UpdateValuesResponse result =null; - try { - // Updates the values in the specified range. - ValueRange body = new ValueRange() - .setValues(values); - result = service.spreadsheets().values().update(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells updated.", result.getUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + UpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index b1f27a1a..6e815050 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -25,12 +25,11 @@ import com.google.api.services.sheets.v4.model.GridRange; import com.google.api.services.sheets.v4.model.RepeatCellRequest; import com.google.api.services.sheets.v4.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.ArrayList; import java.util.List; - -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; public class BaseTest { @@ -42,11 +41,11 @@ public GoogleCredentials getCredential() throws IOException { TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE); + .createScoped(SheetsScopes.SPREADSHEETS, SheetsScopes.DRIVE); return credentials; } - public Sheets buildService(GoogleCredentials credentials){ + public Sheets buildService(GoogleCredentials credentials) { return new Sheets.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance(), diff --git a/sheets/snippets/src/test/java/TestAppendValues.java b/sheets/snippets/src/test/java/TestAppendValues.java index 489218f8..b0dd9551 100644 --- a/sheets/snippets/src/test/java/TestAppendValues.java +++ b/sheets/snippets/src/test/java/TestAppendValues.java @@ -12,31 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.AppendValuesResponse; import com.google.api.services.sheets.v4.model.UpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet append values snippet -public class TestAppendValues extends BaseTest{ +public class TestAppendValues extends BaseTest { - @Test - public void testAppendValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", - values); - assertEquals("Sheet1!A1:J10", result.getTableRange()); - UpdateValuesResponse updates = result.getUpdates(); - assertEquals(2, updates.getUpdatedRows().intValue()); - assertEquals(2, updates.getUpdatedColumns().intValue()); - assertEquals(4, updates.getUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchGetValues.java b/sheets/snippets/src/test/java/TestBatchGetValues.java index d23e5582..9833ddc4 100644 --- a/sheets/snippets/src/test/java/TestBatchGetValues.java +++ b/sheets/snippets/src/test/java/TestBatchGetValues.java @@ -12,28 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; import com.google.api.services.sheets.v4.model.ValueRange; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch get values snippet -public class TestBatchGetValues extends BaseTest{ +public class TestBatchGetValues extends BaseTest { - @Test - public void testBatchGetValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - List ranges = Arrays.asList("A1:A3", "B1:C1"); - BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, - ranges); - List valueRanges = result.getValueRanges(); - assertEquals(2, valueRanges.size()); - List> values = valueRanges.get(0).getValues(); - assertEquals(3, values.size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, + ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchUpdate.java b/sheets/snippets/src/test/java/TestBatchUpdate.java index 5dc5799f..24d78ca0 100644 --- a/sheets/snippets/src/test/java/TestBatchUpdate.java +++ b/sheets/snippets/src/test/java/TestBatchUpdate.java @@ -12,26 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.FindReplaceResponse; import com.google.api.services.sheets.v4.model.Response; -import org.junit.Test; import java.io.IOException; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch update snippet -public class TestBatchUpdate extends BaseTest{ +public class TestBatchUpdate extends BaseTest { - @Test - public void testBatchUpdate() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - BatchUpdateSpreadsheetResponse response = BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); - List replies = response.getReplies(); - assertEquals(2, replies.size()); - FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); - assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchUpdateValues.java b/sheets/snippets/src/test/java/TestBatchUpdateValues.java index e17646d2..21560d94 100644 --- a/sheets/snippets/src/test/java/TestBatchUpdateValues.java +++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java @@ -12,29 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch update values snippet public class TestBatchUpdateValues extends BaseTest { - @Test - public void testBatchUpdateValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - BatchUpdateValuesResponse result = - BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", - values); - assertEquals(1, result.getResponses().size()); - assertEquals(2, result.getTotalUpdatedRows().intValue()); - assertEquals(2, result.getTotalUpdatedColumns().intValue()); - assertEquals(4, result.getTotalUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java index 5d094165..22173381 100644 --- a/sheets/snippets/src/test/java/TestConditionalFormatting.java +++ b/sheets/snippets/src/test/java/TestConditionalFormatting.java @@ -12,22 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet conditional formatting snippet public class TestConditionalFormatting extends BaseTest { - @Test - public void testConditionalFormat() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithNumbers(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - ConditionalFormatting.conditionalFormat(spreadsheetId); - assertEquals(spreadsheetId, response.getSpreadsheetId()); - assertEquals(2, response.getReplies().size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + ConditionalFormatting.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java index c75f0f4f..2fe55351 100644 --- a/sheets/snippets/src/test/java/TestCreate.java +++ b/sheets/snippets/src/test/java/TestCreate.java @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; -import java.io.IOException; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Test; + // Unit testcase for create spreadsheet snippet -public class TestCreate extends BaseTest{ +public class TestCreate extends BaseTest { - @Test - public void testCreate() throws IOException { - String id = Create.createSpreadsheet("Test Spreadsheet"); - assertNotNull(id); - deleteFileOnCleanup(id); - } + @Test + public void testCreate() throws IOException { + String id = Create.createSpreadsheet("Test Spreadsheet"); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/sheets/snippets/src/test/java/TestGetValues.java b/sheets/snippets/src/test/java/TestGetValues.java index ed640bfb..13bee226 100644 --- a/sheets/snippets/src/test/java/TestGetValues.java +++ b/sheets/snippets/src/test/java/TestGetValues.java @@ -12,23 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.ValueRange; -import org.junit.Test; import java.io.IOException; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet get values snippet -public class TestGetValues extends BaseTest{ +public class TestGetValues extends BaseTest { - @Test - public void testGetValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); - List> values = result.getValues(); - assertEquals(2, values.size()); - assertEquals(3, values.get(0).size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java index 83d26883..91bd4f48 100644 --- a/sheets/snippets/src/test/java/TestPivotTable.java +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -14,19 +14,20 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotNull; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for spreadsheet pivot table snippet -public class TestPivotTable extends BaseTest{ +public class TestPivotTable extends BaseTest { - @Test - public void testPivotTable() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); - assertNotNull(result); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); + assertNotNull(result); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestUpdateValues.java b/sheets/snippets/src/test/java/TestUpdateValues.java index 133cb48d..8c8355a7 100644 --- a/sheets/snippets/src/test/java/TestUpdateValues.java +++ b/sheets/snippets/src/test/java/TestUpdateValues.java @@ -12,27 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.UpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet update values snippet -public class TestUpdateValues extends BaseTest{ +public class TestUpdateValues extends BaseTest { - @Test - public void testUpdateValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, - "A1:B2", "USER_ENTERED", values); - assertEquals(2, result.getUpdatedRows().intValue()); - assertEquals(2, result.getUpdatedColumns().intValue()); - assertEquals(4, result.getUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, + "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index dc776391..b404b3cb 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START slides_quickstart] + 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; @@ -27,7 +28,6 @@ import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.Page; import com.google.api.services.slides.v1.model.Presentation; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,58 +37,64 @@ import java.util.List; public class SlidesQuickstart { - private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Slides service = new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Slides service = + new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Prints the number of slides and elements in a sample presentation: - // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit - String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; - Presentation response = service.presentations().get(presentationId).execute(); - List slides = response.getSlides(); + // Prints the number of slides and elements in a sample presentation: + // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit + String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; + Presentation response = service.presentations().get(presentationId).execute(); + List slides = response.getSlides(); - System.out.printf("The presentation contains %s slides:\n", slides.size()); - for (int i = 0; i < slides.size(); ++i) { - System.out.printf("- Slide #%s contains %s elements.\n", i + 1, slides.get(i).getPageElements().size()); - } + System.out.printf("The presentation contains %s slides:\n", slides.size()); + for (int i = 0; i < slides.size(); ++i) { + System.out.printf("- Slide #%s contains %s elements.\n", i + 1, + slides.get(i).getPageElements().size()); } + } } // [END slides_quickstart] diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java index b6534cde..6b1def55 100644 --- a/slides/snippets/src/main/java/CopyPresentation.java +++ b/slides/snippets/src/main/java/CopyPresentation.java @@ -14,6 +14,7 @@ // [START slides_copy_presentation] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -30,49 +31,50 @@ /* Class to demonstrate the use of Slides Copy Presentation API */ public class CopyPresentation { - /** - * Copy an existing presentation. - * - * @param presentationId - id of the presentation. - * @param copyTitle - New title of the presentation. - * @return presentation id - * @throws IOException - if credentials file not found. - */ - public static String copyPresentation(String presentationId, String copyTitle) throws IOException { + /** + * Copy an existing presentation. + * + * @param presentationId - id of the presentation. + * @param copyTitle - New title of the presentation. + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String copyPresentation(String presentationId, String copyTitle) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - String presentationCopyId = null; - try { - // Copies an existing presentation using specified presentation title. - File copyMetadata = new File().setName(copyTitle); - File presentationCopyFile = - driveService.files().copy(presentationId, copyMetadata).execute(); - presentationCopyId = presentationCopyFile.getId(); - // Prints the new copied presentation id. - System.out.println("New copied presentation id "+presentationCopyId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } else { - throw e; - } - } - return presentationCopyId; + String presentationCopyId = null; + try { + // Copies an existing presentation using specified presentation title. + File copyMetadata = new File().setName(copyTitle); + File presentationCopyFile = + driveService.files().copy(presentationId, copyMetadata).execute(); + presentationCopyId = presentationCopyFile.getId(); + // Prints the new copied presentation id. + System.out.println("New copied presentation id " + presentationCopyId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return presentationCopyId; + } } // [END slides_copy_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java index 412ed14b..89202f6a 100644 --- a/slides/snippets/src/main/java/CreateBulletedText.java +++ b/slides/snippets/src/main/java/CreateBulletedText.java @@ -14,6 +14,7 @@ // [START slides_create_bulleted_text] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -36,60 +37,60 @@ /* Class to demonstrate the use of Slide Create Bulleted Text API */ public class CreateBulletedText { - /** - * Add arrow-diamond-disc bullets to all text in the shape. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @return response - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createBulletedText(String presentationId, - String shapeId) throws IOException { + /** + * Add arrow-diamond-disc bullets to all text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createBulletedText(String presentationId, + String shapeId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Add arrow-diamond-disc bullets to all text in the shape. - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateParagraphBullets(new CreateParagraphBulletsRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")) - .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); + // Add arrow-diamond-disc bullets to all text in the shape. + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateParagraphBullets(new CreateParagraphBulletsRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")) + .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); - BatchUpdatePresentationResponse response =null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added bullets to text in shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added bullets to text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_bulleted_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java index 132b3493..55ec3534 100644 --- a/slides/snippets/src/main/java/CreateImage.java +++ b/slides/snippets/src/main/java/CreateImage.java @@ -14,6 +14,7 @@ // [START slides_create_image] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -40,75 +41,74 @@ /* Class to demonstrate the use of Slides Create Image API */ public class CreateImage { - /** - * Create a new image, using the supplied object ID, with content - * downloaded from imageUrl. - * - * @param presentationId - id of the presentation. - * @param slideId - id of the shape. - * @param imageUrl - Url of the image. - * @return image id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createImage(String presentationId, - String slideId, - String imageUrl) - throws IOException { + /** + * Create a new image, using the supplied object ID, with content + * downloaded from imageUrl. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the shape. + * @param imageUrl - Url of the image. + * @return image id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createImage(String presentationId, + String slideId, + String imageUrl) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create a new image, using the supplied object ID, with content downloaded from imageUrl. - List requests = new ArrayList<>(); - String imageId = "MyImageId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - requests.add(new Request() - .setCreateImage(new CreateImageRequest() - .setObjectId(imageId) - .setUrl(imageUrl) - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. + List requests = new ArrayList<>(); + String imageId = "MyImageId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + requests.add(new Request() + .setCreateImage(new CreateImageRequest() + .setObjectId(imageId) + .setUrl(imageUrl) + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); - // Prints the created image id. - System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); + // Prints the created image id. + System.out.println("Created image with ID: " + createImageResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_image] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java index 966362b2..f7d7d96b 100644 --- a/slides/snippets/src/main/java/CreatePresentation.java +++ b/slides/snippets/src/main/java/CreatePresentation.java @@ -14,6 +14,7 @@ // [START slides_create_presentation] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -28,38 +29,38 @@ /* Class to demonstrate the use of Slides Create Presentation API */ public class CreatePresentation { - /** - * Creates a new presentation. - * - * @param title - the name of the presentation to be created - * @return presentation id - * @throws IOException - if credentials file not found. - */ - public static String createPresentation(String title) throws IOException { + /** + * Creates a new presentation. + * + * @param title - the name of the presentation to be created + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String createPresentation(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Creates a blank presentation with a specified title. - Presentation presentation = new Presentation() - .setTitle(title); - presentation = service.presentations().create(presentation) - .setFields("presentationId") - .execute(); - // Prints the newly created presentation id. - System.out.println("Created presentation with ID: " + presentation.getPresentationId()); - return presentation.getPresentationId(); - } + // Creates a blank presentation with a specified title. + Presentation presentation = new Presentation() + .setTitle(title); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + // Prints the newly created presentation id. + System.out.println("Created presentation with ID: " + presentation.getPresentationId()); + return presentation.getPresentationId(); + } } // [END slides_create_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java index d866007e..3f3d3e9b 100644 --- a/slides/snippets/src/main/java/CreateSheetsChart.java +++ b/slides/snippets/src/main/java/CreateSheetsChart.java @@ -14,6 +14,7 @@ // [START slides_create_sheets_chart] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -39,76 +40,75 @@ /* Class to demonstrate the use of Slides Create Chart API */ public class CreateSheetsChart { - /** - * Adds chart from spreadsheet to slides as linked. - * - * @param presentationId - id of the presentation. - * @param pageId - id of the page. - * @param spreadsheetId - id of the spreadsheet. - * @param sheetChartId - id of the chart in sheets. - * @return presentation chart id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createSheetsChart( - String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) - throws IOException { + /** + * Adds chart from spreadsheet to slides as linked. + * + * @param presentationId - id of the presentation. + * @param pageId - id of the page. + * @param spreadsheetId - id of the spreadsheet. + * @param sheetChartId - id of the chart in sheets. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSheetsChart( + String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto - // a page in the presentation. Setting the linking mode as "LINKED" allows the - // chart to be refreshed if the Sheets version is updated. - List requests = new ArrayList<>(); - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - String presentationChartId = "MyEmbeddedChart"; - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); + // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto + // a page in the presentation. Setting the linking mode as "LINKED" allows the + // chart to be refreshed if the Sheets version is updated. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + String presentationChartId = "MyEmbeddedChart"; + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added a linked Sheets chart with ID " + presentationChartId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java index 9a809264..1ef009ab 100644 --- a/slides/snippets/src/main/java/CreateSlide.java +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -14,6 +14,7 @@ // [START slides_create_slide] + import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.HttpRequestInitializer; @@ -37,64 +38,65 @@ /* Class to demonstrate the use of Create Slides API */ public class CreateSlide { - /** - * Creates a new slide. - * - * @param presentationId - id of the presentation. - * @return slide id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { + /** + * Creates a new slide. + * + * @param presentationId - id of the presentation. + * @return slide id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSlide(String presentationId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout - List requests = new ArrayList<>(); - String slideId = "MyNewSlide_001"; - BatchUpdatePresentationResponse response = null; - try { - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId(slideId) - .setInsertionIndex(1) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); + // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout + List requests = new ArrayList<>(); + String slideId = "MyNewSlide_001"; + BatchUpdatePresentationResponse response = null; + try { + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId(slideId) + .setInsertionIndex(1) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); - // If you wish to populate the slide with elements, add create requests here, - // using the slide ID specified above. + // If you wish to populate the slide with elements, add create requests here, + // using the slide ID specified above. - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); - // Prints the slide id. - System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", presentationId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); + // Prints the slide id. + System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", + presentationId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_slide] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java index bb7df571..797be99e 100644 --- a/slides/snippets/src/main/java/CreateTextboxWithText.java +++ b/slides/snippets/src/main/java/CreateTextboxWithText.java @@ -14,6 +14,7 @@ // [START slides_create_textbox_with_text] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -41,76 +42,76 @@ /* Class to demonstrate the use of Slides Create Textbox API */ public class CreateTextboxWithText { - /** - * Create a new square textbox, using the specified id. - * - * @param presentationId - id of the presentation. - * @param slideId - id of the slide. - * @param textBoxId - id for the textbox. - * @return textbox id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createTextBoxWithText( - String presentationId, String slideId, String textBoxId) throws IOException { + /** + * Create a new square textbox, using the specified id. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the slide. + * @param textBoxId - id for the textbox. + * @return textbox id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createTextBoxWithText( + String presentationId, String slideId, String textBoxId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create a new square text box, using a supplied object ID. - List requests = new ArrayList<>(); - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); + // Create a new square text box, using a supplied object ID. + List requests = new ArrayList<>(); + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); - // Insert text into the box, using the object ID given to it. - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - BatchUpdatePresentationResponse response = null; + // Insert text into the box, using the object ID given to it. + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); - System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } else { - throw e; - } - } - return response; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); + System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_textbox_with_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java index 3b616aee..a45b9ad8 100644 --- a/slides/snippets/src/main/java/ImageMerging.java +++ b/slides/snippets/src/main/java/ImageMerging.java @@ -14,6 +14,7 @@ // [START slides_image_merging] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -37,78 +38,79 @@ /* Class to demonstrate the use of Slides Image Merging API */ public class ImageMerging { - /** - * Changes specified texts into images. - * - * @param templatePresentationId - id of the presentation. - * @param imageUrl - Url of the image. - * @param customerName - Name of the customer. - * @return merged presentation id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, - String imageUrl, - String customerName) throws IOException { + /** + * Changes specified texts into images. + * + * @param templatePresentationId - id of the presentation. + * @param imageUrl - Url of the image. + * @param customerName - Name of the customer. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, + String imageUrl, + String customerName) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, - SlidesScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); - // Create the image merge (replaceAllShapesWithImage) requests. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(imageUrl) - .setImageReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{company-logo}}") - .setMatchCase(true)))); + // Create the image merge (replaceAllShapesWithImage) requests. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() + .setImageUrl(imageUrl) + .setImageReplaceMethod("CENTER_INSIDE") + .setContainsText(new SubstringMatchCriteria() + .setText("{{company-logo}}") + .setMatchCase(true)))); - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); - int numReplacements = 0; - try { - // Count total number of replacements made. - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } + int numReplacements = 0; + try { + // Count total number of replacements made. + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } - // Prints the merged presentation id and count of replacements. - System.out.println("Created merged presentation with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " shapes instances with images."); - } catch (NullPointerException ne) { - System.out.println("Text not found to replace with image."); - } - return response; + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " shapes instances with images."); + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); } + return response; + } } // [END slides_image_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java index 30230a5a..7ff9df97 100644 --- a/slides/snippets/src/main/java/RefreshSheetsChart.java +++ b/slides/snippets/src/main/java/RefreshSheetsChart.java @@ -14,6 +14,7 @@ // [START slides_refresh_sheets_chart] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -35,58 +36,57 @@ /* Class to demonstrate the use of Slides Refresh Chart API */ public class RefreshSheetsChart { - /** - * Refresh the sheets charts. - * - * @param presentationId - id of the presentation. - * @param presentationChartId - id of the presentation chart. - * @return presentation chart id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse refreshSheetsChart( - String presentationId, String presentationChartId) throws IOException { + /** + * Refresh the sheets charts. + * + * @param presentationId - id of the presentation. + * @param presentationChartId - id of the presentation chart. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse refreshSheetsChart( + String presentationId, String presentationChartId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - List requests = new ArrayList<>(); + List requests = new ArrayList<>(); - // Refresh an existing linked Sheets chart embedded a presentation. - requests.add(new Request() - .setRefreshSheetsChart(new RefreshSheetsChartRequest() - .setObjectId(presentationChartId))); + // Refresh an existing linked Sheets chart embedded a presentation. + requests.add(new Request() + .setRefreshSheetsChart(new RefreshSheetsChartRequest() + .setObjectId(presentationChartId))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_refresh_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java index 060215c1..0e23a303 100644 --- a/slides/snippets/src/main/java/SimpleTextReplace.java +++ b/slides/snippets/src/main/java/SimpleTextReplace.java @@ -14,6 +14,7 @@ // [START slides_simple_text_replace] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -37,65 +38,64 @@ /* Class to demonstrate the use of Slides Replace Text API */ public class SimpleTextReplace { - /** - * Remove existing text in the shape, then insert new text. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @param replacementText - New replacement text. - * @return response - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse simpleTextReplace( - String presentationId, String shapeId, String replacementText) throws IOException { + /** + * Remove existing text in the shape, then insert new text. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @param replacementText - New replacement text. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse simpleTextReplace( + String presentationId, String shapeId, String replacementText) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Remove existing text in the shape, then insert the new text. - List requests = new ArrayList<>(); - requests.add(new Request() - .setDeleteText(new DeleteTextRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")))); - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(shapeId) - .setInsertionIndex(0) - .setText(replacementText))); + // Remove existing text in the shape, then insert the new text. + List requests = new ArrayList<>(); + requests.add(new Request() + .setDeleteText(new DeleteTextRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")))); + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(shapeId) + .setInsertionIndex(0) + .setText(replacementText))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Replaced text in shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Replaced text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_simple_text_replace] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java index c58b8658..67f96955 100644 --- a/slides/snippets/src/main/java/TextMerging.java +++ b/slides/snippets/src/main/java/TextMerging.java @@ -14,6 +14,7 @@ // [START slides_text_merging] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -41,115 +42,116 @@ /* Class to demonstrate the use of Slides Text Merging API */ public class TextMerging { - /** - * Changes specified texts with data from spreadsheet. - * - * @param templatePresentationId - id of the presentation. - * @param dataSpreadsheetId - id of the spreadsheet containing data. - * @return merged presentation id - * @throws IOException - if credentials file not found. - */ - public static List textMerging( - String templatePresentationId, String dataSpreadsheetId) throws IOException { + /** + * Changes specified texts with data from spreadsheet. + * + * @param templatePresentationId - id of the presentation. + * @param dataSpreadsheetId - id of the spreadsheet containing data. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static List textMerging( + String templatePresentationId, String dataSpreadsheetId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, - SlidesScopes.DRIVE,SlidesScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE, SlidesScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the sheets API client - Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the sheets API client + Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - List responses = new ArrayList<>(5); - // Use the Sheets API to load data, one record per row. - String dataRangeNotation = "Customers!A2:M6"; - ValueRange sheetsResponse = sheetsService.spreadsheets().values() - .get(dataSpreadsheetId, dataRangeNotation).execute(); - List> values = sheetsResponse.getValues(); + List responses = new ArrayList<>(5); + // Use the Sheets API to load data, one record per row. + String dataRangeNotation = "Customers!A2:M6"; + ValueRange sheetsResponse = sheetsService.spreadsheets().values() + .get(dataSpreadsheetId, dataRangeNotation).execute(); + List> values = sheetsResponse.getValues(); - try { - // For each record, create a new merged presentation. - for (List row : values) { - String customerName = row.get(2).toString(); // name in column 3 - String caseDescription = row.get(5).toString(); // case description in column 6 - String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 + try { + // For each record, create a new merged presentation. + for (List row : values) { + String customerName = row.get(2).toString(); // name in column 3 + String caseDescription = row.get(5).toString(); // case description in column 6 + String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); - // Create the text merge (replaceAllText) requests for this presentation. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-name}}") - .setMatchCase(true)) - .setReplaceText(customerName))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{case-description}}") - .setMatchCase(true)) - .setReplaceText(caseDescription))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{total-portfolio}}") - .setMatchCase(true)) - .setReplaceText(totalPortfolio))); + // Create the text merge (replaceAllText) requests for this presentation. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{customer-name}}") + .setMatchCase(true)) + .setReplaceText(customerName))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{case-description}}") + .setMatchCase(true)) + .setReplaceText(caseDescription))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{total-portfolio}}") + .setMatchCase(true)) + .setReplaceText(totalPortfolio))); - // Execute the requests for this presentation. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = service.presentations().batchUpdate(presentationId, body).execute(); + // Execute the requests for this presentation. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); - // Count total number of replacements made. - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - // Prints the merged presentation id and count of replacements. - System.out.println("Created merged presentation for " + - customerName + " with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " text instances."); - } - }catch (NullPointerException ne) { - System.out.println("Text not found to replace with image."); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); - } else { - throw e; - } + // Count total number of replacements made. + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); } - return responses; + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation for " + + customerName + " with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " text instances."); + } + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); + } else { + throw e; + } } + return responses; + } } // [END slides_text_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java index 6b59a81c..86b694d0 100644 --- a/slides/snippets/src/main/java/TextStyleUpdate.java +++ b/slides/snippets/src/main/java/TextStyleUpdate.java @@ -14,6 +14,7 @@ // [START slides_text_style_update] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -42,97 +43,97 @@ /* Class to demonstrate the use of Slide Text Structure and Styling API */ public class TextStyleUpdate { - /** - * Styles text in the shape. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @return shape id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) - throws IOException { + /** + * Styles text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return shape id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, + String shapeId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Update the text style so that the first 5 characters are bolded - // and italicized, and the next 5 are displayed in blue 14 pt Times - // New Roman font, and the next five are hyperlinked. - List requests = new ArrayList<>(); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(0) - .setEndIndex(5)) - .setStyle(new TextStyle() - .setBold(true) - .setItalic(true)) - .setFields("bold,italic"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(5) - .setEndIndex(10)) - .setStyle(new TextStyle() - .setFontFamily("Times New Roman") - .setFontSize(new Dimension() - .setMagnitude(14.0) - .setUnit("PT")) - .setForegroundColor(new OptionalColor() - .setOpaqueColor(new OpaqueColor() - .setRgbColor(new RgbColor() - .setBlue(1.0F) - .setGreen(0.0F) - .setRed(0.0F))))) - .setFields("foregroundColor,fontFamily,fontSize"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(10) - .setEndIndex(15)) - .setStyle(new TextStyle() - .setLink(new Link() - .setUrl("www.example.com"))) - .setFields("link"))); + // Update the text style so that the first 5 characters are bolded + // and italicized, and the next 5 are displayed in blue 14 pt Times + // New Roman font, and the next five are hyperlinked. + List requests = new ArrayList<>(); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(0) + .setEndIndex(5)) + .setStyle(new TextStyle() + .setBold(true) + .setItalic(true)) + .setFields("bold,italic"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(5) + .setEndIndex(10)) + .setStyle(new TextStyle() + .setFontFamily("Times New Roman") + .setFontSize(new Dimension() + .setMagnitude(14.0) + .setUnit("PT")) + .setForegroundColor(new OptionalColor() + .setOpaqueColor(new OpaqueColor() + .setRgbColor(new RgbColor() + .setBlue(1.0F) + .setGreen(0.0F) + .setRed(0.0F))))) + .setFields("foregroundColor,fontFamily,fontSize"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(10) + .setEndIndex(15)) + .setStyle(new TextStyle() + .setLink(new Link() + .setUrl("www.example.com"))) + .setFields("link"))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Updated text style for shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Updated text style for shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_text_style_update] \ No newline at end of file diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index f28c5117..d6f52d6b 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -32,145 +32,145 @@ import org.junit.After; public class BaseTest { - protected Slides service; - protected Drive driveService; - protected Sheets sheetsService; + protected Slides service; + protected Drive driveService; + protected Sheets sheetsService; - public GoogleCredentials getCredential() throws IOException { + public GoogleCredentials getCredential() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); - return credentials; - } - - public Slides buildService(GoogleCredentials credential) { - return new Slides.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Drive buildDriveService(GoogleCredentials credential) { - return new Drive.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Sheets buildSheetsService(GoogleCredentials credential) { - return new Sheets.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - @Before - public void setup() throws IOException { - GoogleCredentials credential = getCredential(); - this.service = buildService(credential); - this.driveService = buildDriveService(credential); - this.sheetsService = buildSheetsService(credential); - } - - protected void deleteFileOnCleanup(String id) throws IOException { - this.driveService.files().delete(id).execute(); - } - - protected String createTestPresentation() throws IOException { - Presentation presentation = new Presentation() - .setTitle("Test Presentation"); - presentation = service.presentations().create(presentation) - .setFields("presentationId") - .execute(); - return presentation.getPresentationId(); - } - - protected String createTestSlide(String presentationId) throws IOException { - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId("TestSlide") - .setInsertionIndex(0) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("BLANK")))); - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSlide().getObjectId(); - } - - protected String createTestTextBox(String presentationId, String pageId) throws IOException { - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateShape().getObjectId(); - } - - protected String createTestSheetsChart(String presentationId, - String pageId, - String spreadsheetId, - Integer sheetChartId) throws IOException { - String presentationChartId = "MyChartId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); + return credentials; + } + + public Slides buildService(GoogleCredentials credential) { + return new Slides.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Drive buildDriveService(GoogleCredentials credential) { + return new Drive.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Sheets buildSheetsService(GoogleCredentials credential) { + return new Sheets.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + @Before + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); + this.service = buildService(credential); + this.driveService = buildDriveService(credential); + this.sheetsService = buildSheetsService(credential); + } + + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); + } + + protected String createTestPresentation() throws IOException { + Presentation presentation = new Presentation() + .setTitle("Test Presentation"); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + return presentation.getPresentationId(); + } + + protected String createTestSlide(String presentationId) throws IOException { + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId("TestSlide") + .setInsertionIndex(0) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("BLANK")))); + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSlide().getObjectId(); + } + + protected String createTestTextBox(String presentationId, String pageId) throws IOException { + String textBoxId = "MyTextBox_01"; + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateShape().getObjectId(); + } + + protected String createTestSheetsChart(String presentationId, + String pageId, + String spreadsheetId, + Integer sheetChartId) throws IOException { + String presentationChartId = "MyChartId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + } } diff --git a/slides/snippets/src/test/java/TestCopyPresentation.java b/slides/snippets/src/test/java/TestCopyPresentation.java index a4772d09..ddbf8d3e 100644 --- a/slides/snippets/src/test/java/TestCopyPresentation.java +++ b/slides/snippets/src/test/java/TestCopyPresentation.java @@ -19,13 +19,13 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for copy presentation snippet -public class TestCopyPresentation extends BaseTest{ +public class TestCopyPresentation extends BaseTest { - @Test - public void testCopyPresentation() throws IOException { - String presentationId = createTestPresentation(); - String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); - assertNotNull(copyId); - deleteFileOnCleanup(copyId); - } + @Test + public void testCopyPresentation() throws IOException { + String presentationId = createTestPresentation(); + String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); + assertNotNull(copyId); + deleteFileOnCleanup(copyId); + } } diff --git a/slides/snippets/src/test/java/TestCreateBulletedText.java b/slides/snippets/src/test/java/TestCreateBulletedText.java index c6c00cf9..8d707000 100644 --- a/slides/snippets/src/test/java/TestCreateBulletedText.java +++ b/slides/snippets/src/test/java/TestCreateBulletedText.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for createBulletedText snippet -public class TestCreateBulletedText extends BaseTest{ +public class TestCreateBulletedText extends BaseTest { - @Test - public void testCreateBulletText() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - String boxId = createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - CreateBulletedText.createBulletedText(presentationId, boxId); - assertEquals(1, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateBulletText() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + CreateBulletedText.createBulletedText(presentationId, boxId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateImage.java b/slides/snippets/src/test/java/TestCreateImage.java index f2493670..d4d51840 100644 --- a/slides/snippets/src/test/java/TestCreateImage.java +++ b/slides/snippets/src/test/java/TestCreateImage.java @@ -23,17 +23,17 @@ // Unit testcase for createImage snippet public class TestCreateImage extends BaseTest { - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - @Test - public void testCreateImage() throws IOException { - String presentationId = createTestPresentation(); - String slideId = createTestSlide(presentationId); - BatchUpdatePresentationResponse response = CreateImage.createImage( - presentationId, slideId, IMAGE_URL); - assertEquals(1, response.getReplies().size()); - String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); - assertNotNull(imageId); - } + @Test + public void testCreateImage() throws IOException { + String presentationId = createTestPresentation(); + String slideId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = CreateImage.createImage( + presentationId, slideId, IMAGE_URL); + assertEquals(1, response.getReplies().size()); + String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); + assertNotNull(imageId); + } } diff --git a/slides/snippets/src/test/java/TestCreatePresentation.java b/slides/snippets/src/test/java/TestCreatePresentation.java index 8a44c76c..06bdd053 100644 --- a/slides/snippets/src/test/java/TestCreatePresentation.java +++ b/slides/snippets/src/test/java/TestCreatePresentation.java @@ -19,12 +19,12 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createPresentation snippet -public class TestCreatePresentation extends BaseTest{ +public class TestCreatePresentation extends BaseTest { - @Test - public void testCreatePresentation() throws IOException { - String presentationId = CreatePresentation.createPresentation("Title"); - assertNotNull(presentationId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreatePresentation() throws IOException { + String presentationId = CreatePresentation.createPresentation("Title"); + assertNotNull(presentationId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateSheetsChart.java b/slides/snippets/src/test/java/TestCreateSheetsChart.java index c4905b83..7e7fa2c8 100644 --- a/slides/snippets/src/test/java/TestCreateSheetsChart.java +++ b/slides/snippets/src/test/java/TestCreateSheetsChart.java @@ -21,20 +21,21 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createSheetsChart snippet -public class TestCreateSheetsChart extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; - private final Integer CHART_ID = 1107320627; - @Test - public void testCreateSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - CreateSheetsChart.createSheetsChart( - presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - assertEquals(1, response.getReplies().size()); - String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - assertNotNull(chartId); - deleteFileOnCleanup(presentationId); - } +public class TestCreateSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testCreateSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateSheetsChart.createSheetsChart( + presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + assertEquals(1, response.getReplies().size()); + String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + assertNotNull(chartId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateSlide.java b/slides/snippets/src/test/java/TestCreateSlide.java index 84997780..506baa9d 100644 --- a/slides/snippets/src/test/java/TestCreateSlide.java +++ b/slides/snippets/src/test/java/TestCreateSlide.java @@ -21,17 +21,17 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createSlide snippet -public class TestCreateSlide extends BaseTest{ +public class TestCreateSlide extends BaseTest { - @Test - public void testCreateSlide() throws IOException { - String presentationId = createTestPresentation(); - BatchUpdatePresentationResponse response = - CreateSlide.createSlide(presentationId); - assertNotNull(response); - assertEquals(1, response.getReplies().size()); - String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); - assertNotNull(pageId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateSlide() throws IOException { + String presentationId = createTestPresentation(); + BatchUpdatePresentationResponse response = + CreateSlide.createSlide(presentationId); + assertNotNull(response); + assertEquals(1, response.getReplies().size()); + String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); + assertNotNull(pageId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateTextboxWithText.java b/slides/snippets/src/test/java/TestCreateTextboxWithText.java index 5fbf15bc..60dacb02 100644 --- a/slides/snippets/src/test/java/TestCreateTextboxWithText.java +++ b/slides/snippets/src/test/java/TestCreateTextboxWithText.java @@ -21,18 +21,18 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createTextboxWithText snippet -public class TestCreateTextboxWithText extends BaseTest{ +public class TestCreateTextboxWithText extends BaseTest { - @Test - public void testCreateTextBox() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - CreateTextboxWithText.createTextBoxWithText(presentationId, - pageId, "MyTextBox"); - assertEquals(2, response.getReplies().size()); - String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); - assertNotNull(boxId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateTextBox() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateTextboxWithText.createTextBoxWithText(presentationId, + pageId, "MyTextBox"); + assertEquals(2, response.getReplies().size()); + String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); + assertNotNull(boxId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestImageMerging.java b/slides/snippets/src/test/java/TestImageMerging.java index 73a16f90..43c6a4c4 100644 --- a/slides/snippets/src/test/java/TestImageMerging.java +++ b/slides/snippets/src/test/java/TestImageMerging.java @@ -22,24 +22,25 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for imageMerging snippet -public class TestImageMerging extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String CUSTOMER_NAME = "Fake Customer"; - @Test - public void testImageMerge() throws IOException { - BatchUpdatePresentationResponse response = - ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(2, response.getReplies().size()); - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - assertEquals(2, numReplacements); - deleteFileOnCleanup(presentationId); +public class TestImageMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String CUSTOMER_NAME = "Fake Customer"; + + @Test + public void testImageMerge() throws IOException { + BatchUpdatePresentationResponse response = + ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(2, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); } + assertEquals(2, numReplacements); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestRefreshSheetsChart.java b/slides/snippets/src/test/java/TestRefreshSheetsChart.java index b2c17928..6031f85b 100644 --- a/slides/snippets/src/test/java/TestRefreshSheetsChart.java +++ b/slides/snippets/src/test/java/TestRefreshSheetsChart.java @@ -20,19 +20,20 @@ import static org.junit.Assert.assertEquals; // Unit testcase for refreshSheetsChart snippet -public class TestRefreshSheetsChart extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - private final Integer CHART_ID = 1107320627; - @Test - public void testRefreshSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String chartId = - this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - BatchUpdatePresentationResponse response = - RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); - assertEquals(1, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } +public class TestRefreshSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testRefreshSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String chartId = + this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + BatchUpdatePresentationResponse response = + RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestSimpleTextReplace.java b/slides/snippets/src/test/java/TestSimpleTextReplace.java index 397a3263..67df2489 100644 --- a/slides/snippets/src/test/java/TestSimpleTextReplace.java +++ b/slides/snippets/src/test/java/TestSimpleTextReplace.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for simpleTextReplace snippet -public class TestSimpleTextReplace extends BaseTest{ +public class TestSimpleTextReplace extends BaseTest { - @Test - public void testSimpleTextReplace() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - String boxId = createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); - assertEquals(2, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testSimpleTextReplace() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestTextMerging.java b/slides/snippets/src/test/java/TestTextMerging.java index 35917aa3..873e89f5 100644 --- a/slides/snippets/src/test/java/TestTextMerging.java +++ b/slides/snippets/src/test/java/TestTextMerging.java @@ -23,24 +23,25 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for textMerging snippet -public class TestTextMerging extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - @Test - public void testTextMerge() throws IOException { - List responses = - TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); - for (BatchUpdatePresentationResponse response: responses) { - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(3, response.getReplies().size()); - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - assertEquals(4, numReplacements); - deleteFileOnCleanup(presentationId); - } +public class TestTextMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + + @Test + public void testTextMerge() throws IOException { + List responses = + TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); + for (BatchUpdatePresentationResponse response : responses) { + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(3, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + assertEquals(4, numReplacements); + deleteFileOnCleanup(presentationId); } + } } diff --git a/slides/snippets/src/test/java/TestTextStyleUpdate.java b/slides/snippets/src/test/java/TestTextStyleUpdate.java index 6bf13102..d751c217 100644 --- a/slides/snippets/src/test/java/TestTextStyleUpdate.java +++ b/slides/snippets/src/test/java/TestTextStyleUpdate.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for textStyleUpdate snippet -public class TestTextStyleUpdate extends BaseTest{ +public class TestTextStyleUpdate extends BaseTest { - @Test - public void testTextStyleUpdate() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - TextStyleUpdate.textStyleUpdate(presentationId, boxId); - assertEquals(3, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testTextStyleUpdate() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String boxId = this.createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + TextStyleUpdate.textStyleUpdate(presentationId, boxId); + assertEquals(3, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 8a522fdd..3e3f8346 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START tasks_quickstart] + 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; @@ -27,7 +28,6 @@ import com.google.api.services.tasks.TasksScopes; import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskLists; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,61 +37,64 @@ import java.util.List; public class TasksQuickstart { - private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the first 10 task lists. - TaskLists result = service.tasklists().list() - .setMaxResults(10) - .execute(); - List taskLists = result.getItems(); - if (taskLists == null || taskLists.isEmpty()) { - System.out.println("No task lists found."); - } else { - System.out.println("Task lists:"); - for (TaskList tasklist : taskLists) { - System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); - } - } + // Print the first 10 task lists. + TaskLists result = service.tasklists().list() + .setMaxResults(10) + .execute(); + List taskLists = result.getItems(); + if (taskLists == null || taskLists.isEmpty()) { + System.out.println("No task lists found."); + } else { + System.out.println("Task lists:"); + for (TaskList tasklist : taskLists) { + System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); + } } + } } // [END tasks_quickstart] diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 742b6184..66d99a64 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START vault_quickstart] + 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; @@ -35,101 +36,109 @@ import java.util.List; public class Quickstart { - /** Application name. */ - private static final String APPLICATION_NAME = - "Google Vault API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Google Vault API Java Quickstart"; - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + *

+ * If modifying these scopes, delete your previously saved credentials + * at ~/.credentials/vault.googleapis.com-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(VaultScopes.EDISCOVERY_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; - /** Global instance of the scopes required by this quickstart. - * - * If modifying these scopes, delete your previously saved credentials - * at ~/.credentials/vault.googleapis.com-java-quickstart - */ - private static final List SCOPES = - Arrays.asList(VaultScopes.EDISCOVERY_READONLY); - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } + } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = - Quickstart.class.getResourceAsStream("/credentials.json"); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = new AuthorizationCodeInstalledApp( - flow, new LocalServerReceiver()).authorize("user"); - System.out.println( - "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + Quickstart.class.getResourceAsStream("/credentials.json"); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - /** - * Build and return an authorized Vault client service. - * @return an authorized Vault client service - * @throws IOException - */ - public static Vault getVaultService() throws IOException { - Credential credential = authorize(); - return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Vault service = getVaultService(); + /** + * Build and return an authorized Vault client service. + * + * @return an authorized Vault client service + * @throws IOException + */ + public static Vault getVaultService() throws IOException { + Credential credential = authorize(); + return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } - // List the first 10 matters. - ListMattersResponse response = service.matters().list() - .setPageSize(10) - .execute(); - List matters = response.getMatters(); - if (matters == null || matters.size() == 0) { - System.out.println("No matters found."); - return; - } - System.out.println("Matters:"); - for (Matter matter: matters) { - System.out.printf("%s (%s)\n", matter.getName(), - matter.getMatterId()); - } + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Vault service = getVaultService(); + + // List the first 10 matters. + ListMattersResponse response = service.matters().list() + .setPageSize(10) + .execute(); + List matters = response.getMatters(); + if (matters == null || matters.size() == 0) { + System.out.println("No matters found."); + return; + } + System.out.println("Matters:"); + for (Matter matter : matters) { + System.out.printf("%s (%s)\n", matter.getName(), + matter.getMatterId()); } + } } // [END vault_quickstart] diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java index cf8ef242..25a06f0f 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java @@ -35,15 +35,14 @@ import org.apache.commons.csv.CSVRecord; public class DuplicateHold { - private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); - private static final String ERROR_DESCRIPTION = "Error Description"; public static final String HOLD_NAME_SUFFIX = "_hangoutsChat"; + private static final String ERROR_DESCRIPTION = "Error Description"; private static final int MAX_ACCOUNTS_FOR_HOLD = 100; - + private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); + Vault vaultService; private CSVParser csvParser; private boolean includeRooms; private CSVPrinter errorReport; - Vault vaultService; private int numberOfHolds = 0; public DuplicateHold( @@ -66,8 +65,8 @@ public int duplicateHolds() throws Exception { (accounts.equals("")) ? null : Arrays.stream(accounts.split(",")) - .map(account -> new HeldAccount().setAccountId(account)) - .collect(Collectors.toList()); + .map(account -> new HeldAccount().setAccountId(account)) + .collect(Collectors.toList()); boolean exceedsAccountLimit = false; Hold hold = new Hold().setName(name + HOLD_NAME_SUFFIX).setCorpus("HANGOUTS_CHAT"); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index b2bb1a07..b337cddf 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -31,8 +31,6 @@ public class HoldsReport { - private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); - public static final String MATTER_ID = "Matter Id"; public static final String MATTER_NAME = "Matter Name"; public static final String HOLD_ID = "Hold Id"; @@ -46,7 +44,7 @@ public class HoldsReport { public static final String TERMS = "Terms"; public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; - + private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); private Vault vaultService; private DirectoryService directoryService; private CSVPrinter printer; @@ -71,11 +69,11 @@ private void iterateMatters(String nextPageToken) throws Exception { ListMattersResponse response = RetryableTemplate.callWithRetry( vaultService - .matters() - .list() - .setState("OPEN") - .setPageSize(100) - .setPageToken(nextPageToken) + .matters() + .list() + .setState("OPEN") + .setPageSize(100) + .setPageToken(nextPageToken) ::execute); List matters = response.getMatters(); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index 2da593c3..e867ff63 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -43,44 +43,25 @@ public class MigrationHelper { - enum MigrationOptions { - GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), - DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), - REPORT_FILE("f", "reportfile", "Path to holds report file"), - ERROR_FILE("e", "errorfile", "Path to error report file"), - INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), - HELP("h", "help", "Options Help"); - - private final String option; - private final String longOpt; - private final String description; - - MigrationOptions(String opt, String longOpt, String description) { - this.option = opt; - this.longOpt = longOpt; - this.description = description; - } - - public String getOption() { - return option; - } - } - - /** Application name. */ + static final Option helpOption = + Option.builder(MigrationOptions.HELP.option) + .longOpt(MigrationOptions.HELP.longOpt) + .argName("help") + .desc(MigrationOptions.HELP.description) + .build(); + /** + * Application name. + */ private static final String APPLICATION_NAME = "Google Vault API Java Quickstart"; - /** Directory to store authorization tokens for this application. */ + /** + * Directory to store authorization tokens for this application. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ + /** + * Global instance of the JSON factory. + */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - /** * Global instance of the scopes required by this quickstart. * @@ -92,6 +73,14 @@ public String getOption() { VaultScopes.EDISCOVERY, DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; static { try { @@ -106,13 +95,6 @@ public String getOption() { } } - static final Option helpOption = - Option.builder(MigrationOptions.HELP.option) - .longOpt(MigrationOptions.HELP.longOpt) - .argName("help") - .desc(MigrationOptions.HELP.description) - .build(); - static Options buildOptions() { Options options = new Options(); @@ -214,4 +196,27 @@ public static Directory getDirectoryService() throws IOException { .build(); return service; } + + enum MigrationOptions { + GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), + DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), + REPORT_FILE("f", "reportfile", "Path to holds report file"), + ERROR_FILE("e", "errorfile", "Path to error report file"), + INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), + HELP("h", "help", "Options Help"); + + private final String option; + private final String longOpt; + private final String description; + + MigrationOptions(String opt, String longOpt, String description) { + this.option = opt; + this.longOpt = longOpt; + this.description = description; + } + + public String getOption() { + return option; + } + } } From d94b838de9f6e8d775c0fc7ddd4d37cefcd7ee5d Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 9 Aug 2022 17:01:01 -0600 Subject: [PATCH 119/254] chore: Synced file(s) with googleworkspace/.github (#259) * chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' * chore: Synced local '.github/linters/' with remote 'sync-files/defaults/.github/linters/' --- .github/linters/sun_checks.xml | 620 +++++++++++++++---------------- .github/workflows/automation.yml | 10 +- 2 files changed, 315 insertions(+), 315 deletions(-) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index de6c6cd4..76d0840d 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -13,8 +13,8 @@ --> + "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" + "https://checkstyle.org/dtds/configuration_1_3.dtd"> - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - + + + - - - - - + + + - - - + - - - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + - - - + - - - - + + + - - - - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index b01e9cf9..95f323bf 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -13,7 +13,7 @@ # limitations under the License. --- name: Automation -on: [push, pull_request, workflow_dispatch] +on: [ push, pull_request, workflow_dispatch ] jobs: dependabot: runs-on: ubuntu-latest @@ -41,13 +41,13 @@ jobs: - name: Set env run: | # set DEFAULT BRANCH - echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> $GITHUB_ENV; + echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> "$GITHUB_ENV"; # set HAS_MASTER_BRANCH - if [ ! -z "$(git ls-remote --heads origin master)" ]; then - echo "HAS_MASTER_BRANCH=true" >> $GITHUB_ENV + if [ -n "$(git ls-remote --heads origin master)" ]; then + echo "HAS_MASTER_BRANCH=true" >> "$GITHUB_ENV" else - echo "HAS_MASTER_BRANCH=false" >> $GITHUB_ENV + echo "HAS_MASTER_BRANCH=false" >> "$GITHUB_ENV" fi env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 7793559faf46d4c11f93399c180abb1498259a09 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Mon, 29 Aug 2022 12:10:25 -0600 Subject: [PATCH 120/254] fix: Update branch for rennovate --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index f45d8f11..f93f9542 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,6 @@ { "extends": [ - "config:base" + "config:base", + "baseBranches": ["main"] ] } From e0a895afcda7a3de65d4653ef18eb3109a874b3e Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 09:33:12 -0600 Subject: [PATCH 121/254] chore: Create initial dependabot config --- .github/dependabot.yml | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..c8c55cd4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,110 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/calendar/sync" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/calendar/sync" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/calendar/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/sheets/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/sheets/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/alertcenter" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/directory/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/reseller/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/groups-settings/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/reports/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/classroom/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/classroom/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/docs/outputJSON" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/docs/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/slides/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/slides/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/people/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/appsScript/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v2" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v3" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/activity/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/activity-v2/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/gmail/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/gmail/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/vault/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/vault/vault-hold-migration-api" + schedule: + interval: "weekly" From 39f5e7a3aab99c7d6b1a1d835f89d02872a0dd76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 15:33:34 +0000 Subject: [PATCH 122/254] Bump maven-compiler-plugin from 2.3.2 to 3.10.1 in /calendar/sync Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 2.3.2 to 3.10.1. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-2.3.2...maven-compiler-plugin-3.10.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 5c38dc4e..cfc48a4b 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -38,7 +38,7 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.10.1 1.6 1.6 From 459368bbbcc3021ea4d6a378f9b42b128bbc1209 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:45:26 -0600 Subject: [PATCH 123/254] Bump google-oauth-client-jetty in /adminSDK/directory/quickstart (#264) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 4ea5ca58..3504f0b0 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } From 723e95e437745700bd548947d8a4d5b99c6d36fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:45:50 -0600 Subject: [PATCH 124/254] Bump google-auth-library-oauth2-http in /sheets/snippets (#305) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 6988f011..e26101e4 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' From e253f091b9c26042bc721e1601d26a989bb280be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:47:25 -0600 Subject: [PATCH 125/254] Bump google-api-services-drive in /sheets/snippets (#302) Bumps google-api-services-drive from v3-rev20220508-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e26101e4..dc97d33a 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } From e8efd560d4fbc64a37f3fb70ace03109420fd339 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 09:51:11 -0600 Subject: [PATCH 126/254] Revert "Bump google-api-services-drive in /sheets/snippets (#302)" (#327) This reverts commit e253f091b9c26042bc721e1601d26a989bb280be. --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index dc97d33a..e26101e4 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } From aa8299e5d8e99d80c07bbf6280bf97ae9cb29cd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:51:39 -0600 Subject: [PATCH 127/254] Bump google-oauth-client-jetty in /appsScript/quickstart (#311) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 4990f03e..41dd51b6 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } From 52f1ea92012ee09ad5f00559edbcfc12d355eb78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:51:51 -0600 Subject: [PATCH 128/254] Bump google-oauth-client-jetty in /slides/quickstart (#312) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 36d3ef1d..d4eac491 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } From 3924b322468ca4c0892d2e319d0ccee6d479ce2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:16 -0600 Subject: [PATCH 129/254] Bump google-auth-library-oauth2-http in /drive/snippets/drive_v3 (#317) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 4327d404..0343fc54 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } From b3581e59e30cdd2e7b02ebb8341cb9eeb0defcde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:30 -0600 Subject: [PATCH 130/254] Bump google-oauth-client-jetty in /gmail/quickstart (#320) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 0dae0ebf..ce120ab6 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } From 8db9cc176bfc2859ce1166c4740d3b859020fb24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:54 -0600 Subject: [PATCH 131/254] Bump mockito-inline from 4.5.1 to 4.7.0 in /gmail/snippets (#321) Bumps [mockito-inline](https://github.com/mockito/mockito) from 4.5.1 to 4.7.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.5.1...v4.7.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-inline dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 85351fa9..5e89d634 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -10,5 +10,5 @@ dependencies { implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.5.1' + testImplementation 'org.mockito:mockito-inline:4.7.0' } From 852802a313111e3d53f7bb4de611d9621abb7e40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:53:14 -0600 Subject: [PATCH 132/254] Bump google-oauth-client-jetty in /vault/vault-hold-migration-api (#324) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 83db2baf..82e95410 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -13,7 +13,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' From eecc00323c0c60b4c7d23b96227f86e15554b719 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:53:34 -0600 Subject: [PATCH 133/254] Bump google-auth-library-oauth2-http in /slides/snippets (#326) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 1279246b..ea3403b8 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' From cb7ba0681710410b7ac2d3b988b2af0e8bae7131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:10 -0600 Subject: [PATCH 134/254] Bump google-oauth-client-jetty in /adminSDK/reseller/quickstart (#294) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 11603c02..8903a301 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } From 5148cb485ae821b08fa46aefaeed93bc2e993bc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:33 -0600 Subject: [PATCH 135/254] Bump google-oauth-client-jetty in /adminSDK/groups-settings/quickstart (#290) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index 34720176..c03cdd97 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' } From cdfdafa538a6cd5668eb069da2279ae4edec4b83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:45 -0600 Subject: [PATCH 136/254] Bump google-oauth-client-jetty in /sheets/quickstart (#288) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index d5b89b8c..dbf63a92 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } From ed883c8f816d8a223e0577881cbcd55a6f6159e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:55:26 -0600 Subject: [PATCH 137/254] Bump google-oauth-client-jetty in /adminSDK/reports/quickstart (#265) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 80e4d79b..f5ae3c7e 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } From fd6359c2cd8000340b938b726785968692b2a831 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:55:43 -0600 Subject: [PATCH 138/254] Bump google-oauth-client-jetty in /calendar/quickstart (#267) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 1c1455c3..deb17b9e 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } From c7643e9f39cc6bd71b0d5582e97672a81bc371ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:00 -0600 Subject: [PATCH 139/254] Bump google-oauth-client-jetty in /classroom/quickstart (#268) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index c3dd8ad2..663c1057 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } From 7d4d744f16b7dceef787374504e3d247a8d34931 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:12 -0600 Subject: [PATCH 140/254] Bump google-auth-library-oauth2-http in /classroom/snippets (#270) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index 1f4cdc7b..f9591fca 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.34.1' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' testImplementation 'junit:junit:4.13.2' } From 8045076a85329574aa2e68f817ed0b3f470bb64f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:29 -0600 Subject: [PATCH 141/254] Bump google-oauth-client-jetty from 1.32.1 to 1.34.1 in /docs/quickstart (#271) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 48c9c11a..6583c267 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } From a1094e4be0868062e19d5f73edf1db0f70afed6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:39 -0600 Subject: [PATCH 142/254] Bump google-oauth-client-jetty from 1.32.1 to 1.34.1 in /docs/outputJSON (#272) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 9a65d38a..7d9f8019 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -12,7 +12,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' } From 3677bb015f4273a1c389286dddfccea08ae7b51d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:56 -0600 Subject: [PATCH 143/254] Bump google-oauth-client-jetty in /people/quickstart (#274) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 6b72f13a..8592e052 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } From 92a97507f19ed251922a9f0138b5b6a134692e07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:12 -0600 Subject: [PATCH 144/254] Bump gson from 2.8.9 to 2.9.1 in /docs/outputJSON (#275) Bumps [gson](https://github.com/google/gson) from 2.8.9 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.8.9...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 7d9f8019..1a1343c3 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -14,5 +14,5 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' - implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' } From edb6ed7f72ef4da6de1841687054efc7332909df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:26 -0600 Subject: [PATCH 145/254] Bump google-oauth-client-jetty in /drive/quickstart (#277) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index b83619da..0cc1a504 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } From 047cc2e3d5e5a99bcf424c0960ef87dd4951dcca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:41 -0600 Subject: [PATCH 146/254] Bump google-oauth-client-jetty in /drive/activity-v2/quickstart (#279) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 7d0a08b6..8cc523f1 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } From b30dff3187f1a9f446e184daacd522dd8103d164 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:55 -0600 Subject: [PATCH 147/254] Bump google-oauth-client-jetty in /vault/quickstart (#281) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index c7428927..26e72d92 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } From c3286021e30dbaccf4d19cf0f152d4e794bd3436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:58:06 -0600 Subject: [PATCH 148/254] Bump google-oauth-client-jetty in /drive/activity/quickstart (#282) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 32e034a8..583730c7 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } From 1e7064a1480edfcfb1cc1a7707e89d54583cfba7 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 13:33:06 -0600 Subject: [PATCH 149/254] chore: disable rennovate --- renovate.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 renovate.json diff --git a/renovate.json b/renovate.json deleted file mode 100644 index f93f9542..00000000 --- a/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": [ - "config:base", - "baseBranches": ["main"] - ] -} From 6ba16c3c4ae46e2cb2e682eb997f4c390cbe126a Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 13:38:47 -0600 Subject: [PATCH 150/254] fix: FIx broken path + add commit message prefix --- .github/dependabot.yml | 54 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c8c55cd4..f8f45ff1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,62 +4,92 @@ updates: directory: "/calendar/sync" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" - directory: "/calendar/sync" + directory: "/tasks/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/calendar/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/sheets/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/sheets/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" - directory: "/adminSDK/alertcenter" + directory: "/adminSDK/alertcenter/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/directory/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/reseller/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/groups-settings/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/reports/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/classroom/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/classroom/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/docs/outputJSON" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/docs/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/slides/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/slides/quickstart" schedule: @@ -68,42 +98,62 @@ updates: directory: "/people/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/appsScript/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/snippets/drive_v2" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/snippets/drive_v3" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/activity/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/activity-v2/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/gmail/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/gmail/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/vault/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/vault/vault-hold-migration-api" schedule: From 462ee2a9792b76f74085904df6a428dedeb5ae49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:58:21 -0600 Subject: [PATCH 151/254] chore(deps): bump google-auth-library-oauth2-http (#348) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index 5cd6a28e..ddd97edc 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file From c80f847bc4d9e9c15d9a5154f61f5e8e57fad05c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:58:42 -0600 Subject: [PATCH 152/254] chore(deps): bump google-oauth-client-jetty in /tasks/quickstart (#350) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index d1d434d1..929d1afd 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file From a274c4379bb3c9f515644bcc2045346d93dcc2b7 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:09:44 -0600 Subject: [PATCH 153/254] fix: Remove obsolete files --- .../snippets/src/test/java/CoursesTest.java | 142 ------------------ .../src/main/java/AppDataSnippets.java | 78 ---------- .../src/main/java/ChangeSnippets.java | 64 -------- .../drive_v2/src/main/java/DriveSnippets.java | 96 ------------ .../src/test/java/AppDataSnippetsTest.java | 56 ------- .../src/test/java/ChangeSnippetsTest.java | 47 ------ .../src/test/java/DriveSnippetsTest.java | 66 -------- .../src/test/java/FileSnippetsTest.java | 137 ----------------- .../src/test/java/TeamDriveSnippetsTest.java | 66 -------- .../src/main/java/AppDataSnippets.java | 76 ---------- .../src/main/java/ChangeSnippets.java | 63 -------- .../drive_v3/src/main/java/DriveSnippets.java | 97 ------------ .../src/test/java/AppDataSnippetsTest.java | 57 ------- .../src/test/java/ChangeSnippetsTest.java | 47 ------ .../src/test/java/DriveSnippetsTest.java | 66 -------- .../src/test/java/FileSnippetsTest.java | 137 ----------------- .../src/test/java/TeamDriveSnippetsTest.java | 66 -------- 17 files changed, 1361 deletions(-) delete mode 100644 classroom/snippets/src/test/java/CoursesTest.java delete mode 100644 drive/snippets/drive_v2/src/main/java/AppDataSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/ChangeSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/DriveSnippets.java delete mode 100644 drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/main/java/AppDataSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/ChangeSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/DriveSnippets.java delete mode 100644 drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java deleted file mode 100644 index 81b6de6e..00000000 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.classroom.Classroom; -import com.google.api.services.classroom.model.Course; -import com.google.api.services.classroom.model.CourseAlias; -import com.google.api.services.classroom.model.Student; -import com.google.api.services.classroom.model.Teacher; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -/** - * Tests for the courses snippets. - */ -public class CoursesTest extends BaseTest { - private Classroom service; - private Course testCourse; - private String otherUser = "erics@homeroomacademy.com"; - - public CoursesTest() throws IOException { - this.service = this.getService(); - } - - @Before - public void setUp() throws IOException { - this.testCourse = createTestCourse("me"); - } - - @After - public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } - - @Test - public void testCreateCourse() throws IOException { - Course course = Courses.createCourse(this.service); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } - - @Test - public void testGetCourse() throws IOException { - Course course = Courses.getCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testListCourses() throws IOException { - List courses = Courses.listCourses(this.service); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } - - @Test - public void testUpdateCourse() throws IOException { - Course course = Courses.updateCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testPatchCourse() throws IOException { - Course course = Courses.patchCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testCreateCourseAlias() throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - CourseAlias courseAlias = - Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); - Assert.assertNotNull("Course alias not returned.", courseAlias); - Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); - } - - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = - Courses.listCourseAliases(this.service, this.testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } - - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), - teacher.getCourseId()); - } - - @Test - public void testEnrollAsStudent() throws IOException { - Course course = this.createTestCourse(this.otherUser); - Student student = - Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); - this.deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } - - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = - Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); - Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); - } - - private Course createTestCourse(String ownerId) throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - Course course = new Course().setId(alias).setName("Test Course").setSection("Section") - .setOwnerId(ownerId); - return this.service.courses().create(course).execute(); - } - - private void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } -} diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java deleted file mode 100644 index 6d13d7a4..00000000 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; -import java.io.IOException; -import java.util.Collections; - - -public class AppDataSnippets { - - private Drive service; - - public AppDataSnippets(Drive service) { - this.service = service; - } - - public String uploadAppData() throws IOException { - Drive driveService = this.service; - // [START uploadAppData] - File fileMetadata = new File(); - fileMetadata.setTitle("config.json"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId("appDataFolder"))); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadAppData] - return file.getId(); - } - - public FileList listAppData() throws IOException { - Drive driveService = this.service; - // [START listAppData] - FileList files = driveService.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, items(id, title)") - .setMaxResults(10) - .execute(); - for (File file : files.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } - // [END listAppData] - return files; - } - - public String fetchAppDataFolder() throws IOException { - Drive driveService = this.service; - // [START fetchAppDataFolder] - File file = driveService.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END fetchAppDataFolder] - return file.getId(); - } - -} diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java deleted file mode 100644 index b3999d88..00000000 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.drive.Drive; -import com.google.api.services.drive.model.Change; -import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; -import java.io.IOException; - -public class ChangeSnippets { - - private Drive service; - - public ChangeSnippets(Drive service) { - this.service = service; - } - - public String fetchStartPageToken() throws IOException { - Drive driveService = this.service; - // [START fetchStartPageToken] - StartPageToken response = driveService.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); - // [END fetchStartPageToken] - return response.getStartPageToken(); - } - - public String fetchChanges(String savedStartPageToken) throws IOException { - Drive driveService = this.service; - // [START fetchChanges] - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = driveService.changes().list() - .setPageToken(pageToken) - .execute(); - for (Change change : changes.getItems()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } - // [END fetchChanges] - return savedStartPageToken; - } -} diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java deleted file mode 100644 index a40483bc..00000000 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.drive.model.Drive; -import com.google.api.services.drive.model.DriveList; -import com.google.api.services.drive.model.Permission; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class DriveSnippets { - private com.google.api.services.drive.Drive service; - - public DriveSnippets(com.google.api.services.drive.Drive service) { - this.service = service; - } - - public String createDrive() throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - // [START createDrive] - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - Drive drive = driveService.drives().insert(requestId, driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); - // [END createDrive] - return drive.getId(); - } - - public List recoverDrives(String realUser) - throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - List drives = new ArrayList(); - // [START recoverDrives] - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] - - do { - DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getItems()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - drives.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverDrives] - return drives; - } -} diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java deleted file mode 100644 index 31726d4e..00000000 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import org.junit.Before; -import org.junit.Test; - -public class AppDataSnippetsTest extends BaseTest { - - private AppDataSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new AppDataSnippets(this.service); - } - - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.fetchAppDataFolder(); - assertNotNull(id); - } - - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = this.snippets.listAppData(); - assertNotEquals(0, files.getItems().size()); - } - -} diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java deleted file mode 100644 index 7ad14676..00000000 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import org.junit.Before; -import org.junit.Test; - -public class ChangeSnippetsTest extends BaseTest { - - private ChangeSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new ChangeSnippets(this.service); - } - - @Test - public void fetchStartPageToken() throws IOException { - String token = this.snippets.fetchStartPageToken(); - assertNotNull(token); - } - - @Test - public void fetchChanges() throws IOException { - String startPageToken = this.snippets.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = this.snippets.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } -} diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java deleted file mode 100644 index ebe24d24..00000000 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class DriveSnippetsTest extends BaseTest { - - private DriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new DriveSnippets(this.service); - } - - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } - - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = this.snippets.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } - - private String createOrphanedDrive() throws IOException { - String driveId = this.snippets.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; - } -} diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java deleted file mode 100644 index 7703c464..00000000 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.drive.model.File; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class FileSnippetsTest extends BaseTest { - - private FileSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new FileSnippets(this.service); - } - - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = this.snippets.uploadRevision(id); - assertEquals(id, id2); - } - - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - File file = this.snippets.uploadToFolder(folderId); - assertTrue(file.getParents().get(0).getId().equals(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } - - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = this.snippets.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } - - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = this.snippets.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } - - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = this.snippets.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = this.snippets.touchFile(id, now); - assertEquals(now, modifiedTime); - } - - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = this.snippets.moveFileToFolder(fileId, folderId); - assertEquals(1, parents.size()); - assertTrue(parents.contains(folderId)); - } - - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = this.snippets.searchFiles(); - assertNotEquals(0, files.size()); - } - - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = this.snippets.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } -} diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java deleted file mode 100644 index a0f53e9c..00000000 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import com.google.api.services.drive.model.TeamDrive; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class TeamDriveSnippetsTest extends BaseTest { - - private TeamDriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new TeamDriveSnippets(this.service); - } - - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } - - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = this.snippets.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = this.snippets.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java deleted file mode 100644 index 5f75f5c4..00000000 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.util.Collections; - - -public class AppDataSnippets { - - private Drive service; - - public AppDataSnippets(Drive service) { - this.service = service; - } - - public String uploadAppData() throws IOException { - Drive driveService = this.service; - // [START uploadAppData] - File fileMetadata = new File(); - fileMetadata.setName("config.json"); - fileMetadata.setParents(Collections.singletonList("appDataFolder")); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadAppData] - return file.getId(); - } - - public FileList listAppData() throws IOException { - Drive driveService = this.service; - // [START listAppData] - FileList files = driveService.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, files(id, name)") - .setPageSize(10) - .execute(); - for (File file : files.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } - // [END listAppData] - return files; - } - - public String fetchAppDataFolder() throws IOException { - Drive driveService = this.service; - // [START fetchAppDataFolder] - File file = driveService.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END fetchAppDataFolder] - return file.getId(); - } - -} diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java deleted file mode 100644 index 141991bc..00000000 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.drive.Drive; -import com.google.api.services.drive.model.Change; -import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; -import java.io.IOException; - -public class ChangeSnippets { - - private Drive service; - - public ChangeSnippets(Drive service) { - this.service = service; - } - - public String fetchStartPageToken() throws IOException { - Drive driveService = this.service; - // [START fetchStartPageToken] - StartPageToken response = driveService.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); - // [END fetchStartPageToken] - return response.getStartPageToken(); - } - - public String fetchChanges(String savedStartPageToken) throws IOException { - Drive driveService = this.service; - // [START fetchChanges] - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = driveService.changes().list(pageToken) - .execute(); - for (Change change : changes.getChanges()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } - // [END fetchChanges] - return savedStartPageToken; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java deleted file mode 100644 index 9fa22647..00000000 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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.services.drive.model.Drive; -import com.google.api.services.drive.model.DriveList; -import com.google.api.services.drive.model.Permission; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class DriveSnippets { - private com.google.api.services.drive.Drive service; - - public DriveSnippets(com.google.api.services.drive.Drive service) { - this.service = service; - } - - public String createDrive() throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - // [START createDrive] - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - Drive drive = driveService.drives().create(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); - // [END createDrive] - return drive.getId(); - } - - public List recoverDrives(String realUser) - throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - List drives = new ArrayList(); - // [START recoverDrives] - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - - do { - DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, drives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getDrives()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .create(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - drives.addAll(result.getDrives()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverDrives] - return drives; - } -} diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java deleted file mode 100644 index 446af287..00000000 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import org.junit.Before; -import org.junit.Test; - -public class AppDataSnippetsTest extends BaseTest { - - private AppDataSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new AppDataSnippets(this.service); - } - - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.fetchAppDataFolder(); - assertNotNull(id); - } - - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = this.snippets.listAppData(); - assertNotEquals(0, files.getFiles().size()); - } - -} diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java deleted file mode 100644 index 7ad14676..00000000 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import org.junit.Before; -import org.junit.Test; - -public class ChangeSnippetsTest extends BaseTest { - - private ChangeSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new ChangeSnippets(this.service); - } - - @Test - public void fetchStartPageToken() throws IOException { - String token = this.snippets.fetchStartPageToken(); - assertNotNull(token); - } - - @Test - public void fetchChanges() throws IOException { - String startPageToken = this.snippets.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = this.snippets.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } -} diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java deleted file mode 100644 index e32dc904..00000000 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class DriveSnippetsTest extends BaseTest { - - private DriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new DriveSnippets(this.service); - } - - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } - - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = this.snippets.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } - - private String createOrphanedDrive() throws IOException { - String driveId = this.snippets.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; - } -} diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java deleted file mode 100644 index 383a7935..00000000 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.drive.model.File; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class FileSnippetsTest extends BaseTest { - - private FileSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new FileSnippets(this.service); - } - - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = this.snippets.uploadRevision(id); - assertEquals(id, id2); - } - - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - File file = this.snippets.uploadToFolder(folderId); - assertTrue(file.getParents().contains(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } - - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = this.snippets.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } - - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = this.snippets.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } - - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = this.snippets.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = this.snippets.touchFile(id, now); - assertEquals(now, modifiedTime); - } - - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = this.snippets.moveFileToFolder(fileId, folderId); - assertTrue(parents.contains(folderId)); - assertEquals(1, parents.size()); - } - - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = this.snippets.searchFiles(); - assertNotEquals(0, files.size()); - } - - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = this.snippets.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } -} diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java deleted file mode 100644 index b59b235a..00000000 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * 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 static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import com.google.api.services.drive.model.TeamDrive; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class TeamDriveSnippetsTest extends BaseTest { - - private TeamDriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new TeamDriveSnippets(this.service); - } - - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } - - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = this.snippets.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = this.snippets.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; - } -} From 5877f2c40642f2b13a1e392cb0de961e1cc2d7b4 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:41:15 -0600 Subject: [PATCH 154/254] fix: Add missing hamcrest dependency --- gmail/snippets/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 5e89d634..2881c148 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -11,4 +11,5 @@ dependencies { implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'org.hamcrest:hamcrest:2.2' } From 4eec0616549ecd59bed4045048e0cd753c1b8f57 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:52:19 -0600 Subject: [PATCH 155/254] fix: Add missing import --- drive/snippets/drive_v2/src/test/java/TestListAppdata.java | 1 + 1 file changed, 1 insertion(+) diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java index 3aa6558b..a6baf68c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotEquals; import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; From 4d0174d516835e95fe732cb7f57da6896c57f86b Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 16:20:31 -0600 Subject: [PATCH 156/254] chore: update maven plugin --- calendar/sync/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index cfc48a4b..f788e4a1 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -30,7 +30,7 @@ TODO: Determine the final URL. 2014 - 2.0.9 + 3.0.0 @@ -40,8 +40,8 @@ maven-compiler-plugin 3.10.1 - 1.6 - 1.6 + 1.8 + 1.8 From 88165e8561c2d7b27e26b8e4feeaab5b1ebf023b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:21:43 -0600 Subject: [PATCH 157/254] Bump exec-maven-plugin from 1.1 to 3.1.0 in /calendar/sync (#285) Bumps [exec-maven-plugin](https://github.com/mojohaus/exec-maven-plugin) from 1.1 to 3.1.0. - [Release notes](https://github.com/mojohaus/exec-maven-plugin/releases) - [Commits](https://github.com/mojohaus/exec-maven-plugin/compare/exec-maven-plugin-1.1...exec-maven-plugin-3.1.0) --- updated-dependencies: - dependency-name: org.codehaus.mojo:exec-maven-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index f788e4a1..f35f8cc1 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -47,7 +47,7 @@ org.codehaus.mojo exec-maven-plugin - 1.1 + 3.1.0 From 5c5338b45862bdf25556260be32b4b449f69ae71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:04 -0600 Subject: [PATCH 158/254] Bump junit from 4.12 to 4.13.2 in /drive/snippets/drive_v3 (#342) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.2. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.2) --- updated-dependencies: - dependency-name: junit:junit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 0343fc54..ade01244 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' } test { From a795407379e070697d9bc7dee78508555cd12428 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:06 -0600 Subject: [PATCH 159/254] Bump junit from 4.12 to 4.13.2 in /drive/snippets/drive_v2 (#339) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.2. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.2) --- updated-dependencies: - dependency-name: junit:junit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index a9b22fb3..6a111d9a 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' } test { From 0dc73faedbfbbb8295ddc438a234a73cfcfd4b55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:08 -0600 Subject: [PATCH 160/254] Bump google-api-client from 1.33.0 to 2.0.0 in /vault/quickstart (#341) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 26e72d92..d60d73f4 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } From 38e5e3bcb26658c91ab7ec59f5162742c323f35f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:10 -0600 Subject: [PATCH 161/254] Bump google-api-client from 1.33.0 to 2.0.0 in /gmail/quickstart (#340) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index ce120ab6..9de1d325 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } From fc8277e1f68875efacf7629a82f5131e1d57310e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:13 -0600 Subject: [PATCH 162/254] Bump google-api-client from 1.33.0 to 2.0.0 in /docs/outputJSON (#314) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 1a1343c3..32220cf2 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' From e1eb9e47edf41c22f9f147cff11a12512542d668 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:15 -0600 Subject: [PATCH 163/254] Bump google-api-client from 1.33.0 to 2.0.0 in /slides/quickstart (#308) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index d4eac491..05916c6f 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } From f6db2027a9b0d9bb6de529c719e036a4d9081270 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:17 -0600 Subject: [PATCH 164/254] Bump google-api-client in /adminSDK/directory/quickstart (#295) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 3504f0b0..c2dfbf80 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } From ef296bc7c30fa487d55079f2561fca0596d8aa24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:19 -0600 Subject: [PATCH 165/254] Bump google-api-client from 1.33.0 to 2.0.0 in /appsScript/quickstart (#307) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 41dd51b6..f26ede54 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } From d38841c9295a5496a1402ef9ae87fdda7243cdf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:22 -0600 Subject: [PATCH 166/254] Bump google-api-client from 1.33.0 to 2.0.0 in /calendar/quickstart (#300) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index deb17b9e..923ec144 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } From 9a0422723e59cd272ec4283030ff932b8e198850 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:24 -0600 Subject: [PATCH 167/254] Bump google-api-client from 1.33.0 to 2.0.0 in /classroom/quickstart (#301) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 663c1057..7773fab2 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } From 52cd4e6021248f99faa3c27aa82cf2c82860a436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:26 -0600 Subject: [PATCH 168/254] Bump google-api-client in /adminSDK/reports/quickstart (#296) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index f5ae3c7e..450d681a 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } From 323089fdcbb60f8e6e876a28c45463e70294e88f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:28 -0600 Subject: [PATCH 169/254] Bump google-api-client from 1.34.1 to 2.0.0 in /classroom/snippets (#269) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.34.1 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.34.1...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index f9591fca..f1deeb31 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.34.1' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' testImplementation 'junit:junit:4.13.2' From 4eab80287bf95eb8d79fca7f38d4c740f736989b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:31 -0600 Subject: [PATCH 170/254] Bump google-api-client in /drive/activity/quickstart (#278) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 583730c7..de3ddb63 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } From b4b350cf6fed83665d0ba61bfdb22f7c429884bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:33 -0600 Subject: [PATCH 171/254] Bump google-api-client from 1.33.0 to 2.0.0 in /drive/quickstart (#280) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 0cc1a504..ba1f28b5 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } From fda3bf3992ac4e00bf50525f1a20ea01ba3bf262 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:35 -0600 Subject: [PATCH 172/254] Bump google-api-client from 1.33.0 to 2.0.0 in /people/quickstart (#276) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 8592e052..540e613c 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } From 5eb04cab3ad46e92bc0503b10817df4cbf64ee62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:38 -0600 Subject: [PATCH 173/254] Bump google-api-client from 1.33.0 to 2.0.0 in /docs/quickstart (#273) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 6583c267..1b5fed39 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } From 112b1d8312b8a7f144e3b863ca82715a9dd4e44f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:39 -0600 Subject: [PATCH 174/254] Bump google-api-client in /adminSDK/reseller/quickstart (#266) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 8903a301..20e39b10 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } From a2c2e4b9d46f33588768149986389807e63e8c31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:42 -0600 Subject: [PATCH 175/254] Bump google-api-client from 1.33.0 to 2.0.0 in /sheets/quickstart (#263) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index dbf63a92..4dff318c 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } From 653aa48009e8a0f0b9adfd8f7178c8e5afd635a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:46 -0600 Subject: [PATCH 176/254] Bump google-api-client from 1.33.0 to 2.0.0 in /calendar/sync (#262) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index f35f8cc1..01f4b039 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -77,7 +77,7 @@ com.google.api-client google-api-client - 1.33.0 + 2.0.0 com.google.http-client From 3fc1d73e79a277479d37af6ef91154a04f87ed64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:48 -0600 Subject: [PATCH 177/254] chore(deps): bump google-api-client in /adminSDK/alertcenter/quickstart (#346) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index ddd97edc..c5be324b 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file From 4cd8181cca329e63beaca759f8fc42a6bdd2ba89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:52 -0600 Subject: [PATCH 178/254] chore(deps): bump google-api-client in /tasks/quickstart (#344) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 929d1afd..c8f052b1 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file From 1d7f663c6765e26c9ce249c1f31d7a18181fa534 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:54 -0600 Subject: [PATCH 179/254] Bump google-api-client in /drive/activity-v2/quickstart (#343) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 8cc523f1..8663a975 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } From aa4c3cff0953c09fd2d789e8eb0a95f8301ae829 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:56 -0600 Subject: [PATCH 180/254] Bump google-auth-library-oauth2-http in /gmail/snippets (#337) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 2881c148..7df49f06 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' From c0eac2c66cacaab57b0e3793525943e206ff483d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:58 -0600 Subject: [PATCH 181/254] Bump google-api-services-vault in /vault/quickstart (#334) Bumps google-api-services-vault from v1-rev20211101-1.32.1 to v1-rev20220423-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-vault dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index d60d73f4..d3221860 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' } From 4ddb547838c9352cd2bc00b8b9a2e4cbc144e3ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:00 -0600 Subject: [PATCH 182/254] Bump google-auth-library-oauth2-http in /drive/snippets/drive_v2 (#332) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 6a111d9a..1c46fca4 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.13.2' From a2603ceac54b42006f290f6bf280298b6ad23368 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:03 -0600 Subject: [PATCH 183/254] Bump google-api-services-drive in /drive/quickstart (#328) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index ba1f28b5..bcc8c21a 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' } From 05deb03358e28dd4dedaf0630889f4f47ced6a2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:05 -0600 Subject: [PATCH 184/254] Bump google-api-services-sheets in /sheets/snippets (#338) Bumps google-api-services-sheets from v4-rev20220411-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e26101e4..e086836c 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' testImplementation 'junit:junit:4.13.2' } From 0ee109b81c133d71ab5e2484946a31adf6070982 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:08 -0600 Subject: [PATCH 185/254] Bump google-api-services-sheets in /slides/snippets (#336) Bumps google-api-services-sheets from v4-rev20210629-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index ea3403b8..73a6c2e1 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' testImplementation 'junit:junit:4.13.2' From 401ec9f4da5aa3c02f6a23cc91f5095cbf905c41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:10 -0600 Subject: [PATCH 186/254] Bump google-api-client in /vault/vault-hold-migration-api (#323) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 82e95410..1eaa2531 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' From a7aee284fe5a58c2b53590868ad87f276faddcc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:12 -0600 Subject: [PATCH 187/254] Bump google-api-client from 1.23.0 to 2.0.0 in /drive/snippets/drive_v3 (#322) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.23.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/1.23.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index ade01244..f1f21c4b 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.13.2' From a22a92de96285b393afc4006d9f520870c1a869e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:15 -0600 Subject: [PATCH 188/254] Bump google-api-client in /adminSDK/groups-settings/quickstart (#297) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index c03cdd97..8026c439 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' } From afe6dbee7829c1866267f9a2ff6d4188ba32dcb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:17 -0600 Subject: [PATCH 189/254] Bump google-api-services-script in /appsScript/quickstart (#303) Bumps google-api-services-script from v1-rev20210703-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-script dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index f26ede54..7ce6076f 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' + implementation 'com.google.apis:google-api-services-script:v1-rev20220323-2.0.0' } From 20cbee839086ca40576af3f06d0093df7e73d287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:20 -0600 Subject: [PATCH 190/254] Bump google-api-services-slides in /slides/quickstart (#304) Bumps google-api-services-slides from v1-rev20210820-1.32.1 to v1-rev20220722-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-slides dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 05916c6f..8350296e 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' } From 8b3665d51638bd00d34b5f62a07d9004afccce8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:22 -0600 Subject: [PATCH 191/254] Bump google-api-services-sheets in /sheets/quickstart (#284) Bumps google-api-services-sheets from v4-rev20210629-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 4dff318c..c12db6f3 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' } From 7b4903e3d1c0591e9992906e2e0e1d08f8a87d1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:24 -0600 Subject: [PATCH 192/254] Bump google-api-services-classroom in /classroom/snippets (#298) Bumps google-api-services-classroom from v1-rev20220323-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-classroom dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index f1deeb31..b0776149 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' } From 64e7c92db342bdc288ea03ef762743a5dd147822 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:26 -0600 Subject: [PATCH 193/254] Bump google-api-services-calendar in /calendar/quickstart (#292) Bumps google-api-services-calendar from v3-rev20211026-1.32.1 to v3-rev20220715-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-calendar dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 923ec144..6252ad03 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' + implementation 'com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0' } From 4405ee52951ab758386db772c3efeab6b3681557 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:29 -0600 Subject: [PATCH 194/254] Bump google-api-services-people in /people/quickstart (#310) Bumps google-api-services-people from v1-rev20210903-1.32.1 to v1-rev20220531-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-people dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 540e613c..8009371c 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -14,5 +14,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' + implementation 'com.google.apis:google-api-services-people:v1-rev20220531-2.0.0' } From da2bb7af850e4d4a4e6021400f25f0527631f221 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:30 -0600 Subject: [PATCH 195/254] Bump google-api-services-docs in /docs/outputJSON (#309) Bumps google-api-services-docs from v1-rev20210707-1.32.1 to v1-rev20220609-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-docs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 32220cf2..0e76e226 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' } From 3b3695cc679418fb8bc4f6ca360fe9f64bb7bf7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:33 -0600 Subject: [PATCH 196/254] Bump google-api-services-slides in /slides/snippets (#325) Bumps google-api-services-slides from v1-rev20210820-1.32.1 to v1-rev20220722-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-slides dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 73a6c2e1..415434c8 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' implementation fileTree(dir: 'lib', include: ['*.jar']) From c2c9c2de58423fb11f2990cf76437f33b41805e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:35 -0600 Subject: [PATCH 197/254] Bump google-api-services-gmail in /gmail/quickstart (#316) Bumps google-api-services-gmail from v1-rev20211108-1.32.1 to v1-rev20220404-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-gmail dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 9de1d325..ca113827 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' } From 0594e7fc829b3b9b4f9257ce3ec6beeef44696a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:37 -0600 Subject: [PATCH 198/254] Bump google-api-services-docs in /docs/quickstart (#306) Bumps google-api-services-docs from v1-rev20210707-1.32.1 to v1-rev20220609-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-docs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 1b5fed39..9f6c9fd7 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' } From bd1b219247a1a702f562fcbe156b1297eb908015 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:39 -0600 Subject: [PATCH 199/254] Bump google-api-services-gmail in /gmail/snippets (#313) Bumps google-api-services-gmail from v1-rev20220404-1.32.1 to v1-rev20220404-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-gmail dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 7df49f06..88a66631 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' From 32e412b5625831b6a477107eeb27704784a00792 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:41 -0600 Subject: [PATCH 200/254] Bump google-api-services-classroom in /classroom/quickstart (#293) Bumps google-api-services-classroom from v1-rev20211029-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-classroom dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 7773fab2..d69815f0 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' } From a9d9ce28f09fb27ae2e153b9a242ead3efa7701d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:43 -0600 Subject: [PATCH 201/254] Bump google-api-services-calendar in /calendar/sync (#283) Bumps google-api-services-calendar from v3-rev20211026-1.32.1 to v3-rev20220715-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-calendar dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 01f4b039..af98470c 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -72,7 +72,7 @@ com.google.apis google-api-services-calendar - v3-rev20211026-1.32.1 + v3-rev20220715-2.0.0 com.google.api-client From e9a78eaf65e17a30b3227057ca59a33250448d5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:45 -0600 Subject: [PATCH 202/254] chore(deps): bump google-api-services-alertcenter (#345) Bumps google-api-services-alertcenter from v1beta1-rev20211012-1.32.1 to v1beta1-rev20220718-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-alertcenter dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index c5be324b..b448253b 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -14,5 +14,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20220718-2.0.0' } \ No newline at end of file From 12afbc230c73f03d5f72881aa03e7ceaf3b11121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:47 -0600 Subject: [PATCH 203/254] chore(deps): bump google-api-services-tasks in /tasks/quickstart (#349) Bumps google-api-services-tasks from v1-rev20210709-1.32.1 to v1-rev20210709-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-tasks dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index c8f052b1..2ae5b7d2 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' + implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-2.0.0' } \ No newline at end of file From 0fa7379cdd8cfb4f49f485f80fa5a71f98cd6c81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:49 -0600 Subject: [PATCH 204/254] chore(deps): bump google-api-services-drive in /sheets/snippets (#347) Bumps google-api-services-drive from v3-rev20220508-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e086836c..8763dd63 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' testImplementation 'junit:junit:4.13.2' } From 4e7a24324de42d3ac88bfefe74a7cb3cfac56bec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:52 -0600 Subject: [PATCH 205/254] Bump google-api-services-vault in /vault/vault-hold-migration-api (#335) Bumps google-api-services-vault from v1-rev20211101-1.32.1 to v1-rev20220423-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-vault dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 1eaa2531..8b389d2a 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -14,7 +14,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' From 9f841ac51ff95d2feef41a7d446ea5b6b0f2b680 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:54 -0600 Subject: [PATCH 206/254] Bump google-api-services-drive in /drive/snippets/drive_v2 (#331) Bumps google-api-services-drive from v2-rev20211205-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 1c46fca4..96be2075 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' From a8969da96266b5fa7dae376a9af1ba1fba340697 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:56 -0600 Subject: [PATCH 207/254] Bump google-api-services-drive in /drive/snippets/drive_v3 (#315) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index f1f21c4b..a94160c8 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -4,7 +4,7 @@ repositories { mavenCentral() } dependencies { - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' From 21008d82696f073ccc122a1c2976ede6fd10d04c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:58 -0600 Subject: [PATCH 208/254] Bump google-api-services-driveactivity in /drive/activity-v2/quickstart (#319) Bumps google-api-services-driveactivity from v2-rev20210319-1.32.1 to v2-rev20210319-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-driveactivity dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 8663a975..0f90a6c1 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-2.0.0' } From 534ef4f9d9229577614cdcdf1208561b2f656e46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:00 -0600 Subject: [PATCH 209/254] Bump google-api-services-admin-reports in /adminSDK/reports/quickstart (#289) Bumps google-api-services-admin-reports from reports_v1-rev89-1.25.0 to reports_v1-rev20211207-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-reports dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 450d681a..9f9aff5d 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev20211207-2.0.0' } From e8656cfd86bd43b75ca4d88b6cad2e097a8cddde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:03 -0600 Subject: [PATCH 210/254] Bump google-api-services-reseller in /adminSDK/reseller/quickstart (#291) Bumps google-api-services-reseller from v1-rev20211106-1.32.1 to v1sandbox-rev60-1.22.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-reseller dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 20e39b10..3e382f87 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' + implementation 'com.google.apis:google-api-services-reseller:v1sandbox-rev60-1.22.0' } From 1a33fe3b9a25a7ada9437d73a2d041ff44a966ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:05 -0600 Subject: [PATCH 211/254] Bump google-api-services-groupssettings (#286) Bumps google-api-services-groupssettings from v1-rev20210624-1.32.1 to v1-rev20210624-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-groupssettings dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index 8026c439..26e5218e 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' + implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-2.0.0' } From 4c511910090a8484165fb08883604eb8353794a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:07 -0600 Subject: [PATCH 212/254] Bump google-api-services-admin-directory (#318) Bumps google-api-services-admin-directory from directory_v1-rev118-1.25.0 to directory_v1-rev20220816-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 8b389d2a..964a2c63 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -17,6 +17,6 @@ dependencies { implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 3e25cfd9bcc9dd0c6404cf1a494a681a466da987 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:09 -0600 Subject: [PATCH 213/254] Bump google-api-services-admin-directory (#287) Bumps google-api-services-admin-directory from directory_v1-rev118-1.25.0 to directory_v1-rev20220816-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index c2dfbf80..5cc56d2a 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' } From d4567a58806fbe35c5405dc2fb3d3e090a30e779 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:42 -0600 Subject: [PATCH 214/254] Bump gson from 2.4 to 2.9.1 in /drive/snippets/drive_v3 (#333) Bumps [gson](https://github.com/google/gson) from 2.4 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-2.4...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index a94160c8..b1196d59 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -7,7 +7,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.code.gson:gson:2.4' + implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 3315352dd6c0f413453a8da647f6b4c2220973ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:44 -0600 Subject: [PATCH 215/254] Bump gson from 2.4 to 2.9.1 in /drive/snippets/drive_v2 (#330) Bumps [gson](https://github.com/google/gson) from 2.4 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-2.4...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 96be2075..c3a4a34c 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' - implementation 'com.google.code.gson:gson:2.4' + implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 4280aec2a0310e3860879390d0d33e91486f865a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:48 -0600 Subject: [PATCH 216/254] Bump google-api-services-drive in /slides/snippets (#299) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 415434c8..48965f8c 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' From fb2ae2384e26a358d4ebd8fd8776d3cf97c60c5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:56:11 -0600 Subject: [PATCH 217/254] Bump google-oauth-client-jetty in /drive/snippets/drive_v2 (#329) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index c3a4a34c..9be525c6 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From ac95ef4c01f808b28a264c2125942ee3a0e4a9d0 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 17:47:20 -0600 Subject: [PATCH 218/254] fix: Update package names for new version of client lib --- .../src/main/java/AdminSDKDirectoryQuickstart.java | 8 ++++---- .../src/main/java/AdminSDKReportsQuickstart.java | 8 ++++---- drive/snippets/drive_v2/build.gradle | 2 +- gmail/snippets/src/test/java/TestCreateSmimeInfo.java | 1 + .../com/google/vault/chatmigration/DirectoryService.java | 8 ++++---- .../java/com/google/vault/chatmigration/HoldsReport.java | 2 +- .../com/google/vault/chatmigration/MigrationHelper.java | 4 ++-- .../java/com/google/vault/chatmigration/QuickStart.java | 2 +- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index f0573b6f..a5466fc3 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -24,10 +24,10 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; -import com.google.api.services.admin.directory.model.User; -import com.google.api.services.admin.directory.model.Users; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; +import com.google.api.services.directory.model.User; +import com.google.api.services.directory.model.Users; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index 3b5b6881..3b0d2d69 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -25,10 +25,10 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.reports.Reports; -import com.google.api.services.admin.reports.ReportsScopes; -import com.google.api.services.admin.reports.model.Activities; -import com.google.api.services.admin.reports.model.Activity; +import com.google.api.services.reports.Reports; +import com.google.api.services.reports.ReportsScopes; +import com.google.api.services.reports.model.Activities; +import com.google.api.services.reports.model.Activity; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 9be525c6..e3bfcd2b 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-drive:v2-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 6e304814..dcf90890 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -17,6 +17,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; import com.google.api.services.gmail.model.SmimeInfo; import org.junit.Test; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java index 24514a5e..4c36043a 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java @@ -17,10 +17,10 @@ package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.model.OrgUnit; -import com.google.api.services.admin.directory.model.OrgUnits; -import com.google.api.services.admin.directory.model.User; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnits; +import com.google.api.services.directory.model.User; import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index b337cddf..d42f608b 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -16,7 +16,7 @@ package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnit; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.model.Hold; import com.google.api.services.vault.v1.model.ListHoldsResponse; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index e867ff63..c18f697c 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -26,8 +26,8 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.VaultScopes; import java.io.IOException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java index 70e5943e..c94ccbfc 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java @@ -16,7 +16,7 @@ package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.Directory; +import com.google.api.services.directory.Directory; import com.google.api.services.vault.v1.Vault; import com.google.vault.chatmigration.MigrationHelper.MigrationOptions; import java.io.File; From 96f5406d37fa75436cc6d550f747181295df68e8 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 31 Aug 2022 16:23:25 -0600 Subject: [PATCH 219/254] fix: Enable drive tests + fix failing classrom one --- classroom/snippets/src/main/java/AddStudent.java | 2 +- drive/snippets/drive_v2/build.gradle | 4 ++-- drive/snippets/drive_v3/build.gradle | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index 142072a3..c04c38fb 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -55,7 +55,7 @@ public static Student addStudent(String courseId, String enrollmentCode) .setApplicationName("Classroom samples") .build(); - Student student = new Student().setUserId("me"); + Student student = new Student().setUserId("gduser1@workspacesamples.dev"); try { // Enrolling a student to a specified course student = service.courses().students().create(courseId, student) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index e3bfcd2b..13db3ac6 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -14,5 +14,5 @@ dependencies { } test { - useJUnitPlatform() -} \ No newline at end of file + testLogging.showStandardStreams = true +} diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index b1196d59..b7c50196 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -12,5 +12,5 @@ dependencies { } test { - useJUnitPlatform() -} \ No newline at end of file + testLogging.showStandardStreams = true +} From b75a5f9a5e180f2e904daea3cfcd89f2a60a5cc3 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 30 Sep 2022 08:56:12 -0600 Subject: [PATCH 220/254] chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' (#363) --- .github/sync-repo-settings.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 1e81cab7..fc025621 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -37,3 +37,5 @@ branchProtectionRules: permissionRules: - team: workspace-devrel-dpe permission: admin + - team: workspace-devrel + permission: write From 953c2c0472968fdc3ff476df36f86fcd1d856e00 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Mon, 3 Oct 2022 10:27:43 -0600 Subject: [PATCH 221/254] chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' (#365) --- .github/sync-repo-settings.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index fc025621..7b363bc4 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -38,4 +38,4 @@ permissionRules: - team: workspace-devrel-dpe permission: admin - team: workspace-devrel - permission: write + permission: push From 1c8b4497fa19bc4ac05c58501731a01d73105ab0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:19 -0600 Subject: [PATCH 222/254] chore(deps): bump google-api-services-sheets in /sheets/quickstart (#369) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index c12db6f3..e0c6f5a5 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' } From 95618d9ead845d53cc4057bb104394833f4047d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:34 -0600 Subject: [PATCH 223/254] chore(deps): bump google-api-services-sheets in /slides/snippets (#368) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 48965f8c..406a6b20 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' From 40c542d7ae8a5d28190d91172c8f5df0c461452c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:53 -0600 Subject: [PATCH 224/254] chore(deps): bump google-api-services-sheets in /sheets/snippets (#367) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 8763dd63..cda0250f 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' testImplementation 'junit:junit:4.13.2' } From 3a06524bf6183ffb7ca99f80afd58c104640400b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:09 -0600 Subject: [PATCH 225/254] chore(deps): bump google-api-services-driveactivity (#366) Bumps google-api-services-driveactivity from v2-rev20210319-2.0.0 to v2-rev20220926-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-driveactivity dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 0f90a6c1..86df8be7 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-2.0.0' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20220926-2.0.0' } From e97ff9e465bf76814ce0e5592b37d3522933d46f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:21 -0600 Subject: [PATCH 226/254] chore(deps): bump google-api-services-admin-directory (#361) Bumps google-api-services-admin-directory from directory_v1-rev20220816-2.0.0 to directory_v1-rev20220919-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 5cc56d2a..08a0538e 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' } From 264538d3a7c6ad51028455d23577a36f2e1101b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:39 -0600 Subject: [PATCH 227/254] chore(deps): bump google-api-services-admin-directory (#360) Bumps google-api-services-admin-directory from directory_v1-rev20220816-2.0.0 to directory_v1-rev20220919-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 964a2c63..16a5b2c2 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -17,6 +17,6 @@ dependencies { implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 3f9de3ed792e12ce48008b3dbd04ab8605c7c319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:53 -0600 Subject: [PATCH 228/254] chore(deps): bump mockito-inline from 4.7.0 to 4.8.0 in /gmail/snippets (#359) Bumps [mockito-inline](https://github.com/mockito/mockito) from 4.7.0 to 4.8.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.7.0...v4.8.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-inline dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 88a66631..0a4690d9 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -10,6 +10,6 @@ dependencies { implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'org.mockito:mockito-inline:4.8.0' testImplementation 'org.hamcrest:hamcrest:2.2' } From 18921fbb21c10b9c059f2a4fb032b0269edebe8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:06 -0600 Subject: [PATCH 229/254] chore(deps): bump google-auth-library-oauth2-http in /gmail/snippets (#358) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 0a4690d9..69378a2d 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' From 16ee39e8db1636b6c8207da2d051a5b87507a291 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:16 -0600 Subject: [PATCH 230/254] chore(deps): bump google-auth-library-oauth2-http in /slides/snippets (#357) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 406a6b20..0471dc29 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' From db010abcd83c6daac5dcabf19fcc8bcea700e38b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:34 -0600 Subject: [PATCH 231/254] chore(deps): bump google-auth-library-oauth2-http in /classroom/snippets (#356) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index b0776149..6971123c 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' } From 0c821edb4af057f96261c629228a4f6a6bdd6bea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:46 -0600 Subject: [PATCH 232/254] chore(deps): bump google-auth-library-oauth2-http in /sheets/snippets (#355) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index cda0250f..22610657 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' testImplementation 'junit:junit:4.13.2' From 3bf6700b91695e1e2c466aaa2d3d03ad9a279465 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:55:12 -0600 Subject: [PATCH 233/254] chore(deps): bump google-auth-library-oauth2-http (#354) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 13db3ac6..df0967a5 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' From def6803eb45d52a9d2e449302d4bb6d2b1a5f84c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:55:33 -0600 Subject: [PATCH 234/254] chore(deps): bump google-auth-library-oauth2-http (#353) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index b7c50196..9f0dc9f7 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 3d4bca36c298a7d229a97f20c8318a813d45864e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:56:02 -0600 Subject: [PATCH 235/254] chore(deps): bump google-auth-library-oauth2-http (#352) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index b448253b..2e7e184c 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20220718-2.0.0' } \ No newline at end of file From 2fa7089ab98faf6e959d472aa95495bf5201ea24 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:41:45 -0500 Subject: [PATCH 236/254] =?UTF-8?q?feat:=20added=20Java=20code=20snippets?= =?UTF-8?q?=20for=20Aliases,=20CourseWork,=20and=20Topics=C2=A0=20(#464)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java --- .../src/main/java/AddAliasToCourse.java | 85 ++++++++++++++ .../src/main/java/CreateCourseWithAlias.java | 89 +++++++++++++++ .../src/main/java/CreateCourseWork.java | 107 ++++++++++++++++++ .../snippets/src/main/java/CreateTopic.java | 81 +++++++++++++ .../snippets/src/main/java/DeleteTopic.java | 76 +++++++++++++ .../snippets/src/main/java/GetTopic.java | 80 +++++++++++++ .../snippets/src/main/java/ListTopics.java | 98 ++++++++++++++++ .../snippets/src/main/java/UpdateTopic.java | 89 +++++++++++++++ .../snippets/src/test/java/BaseTest.java | 4 + .../src/test/java/TestAddAliasToCourse.java | 34 ++++++ .../test/java/TestCreateCourseWithAlias.java | 36 ++++++ .../src/test/java/TestCreateCourseWork.java | 28 +++++ .../src/test/java/TestCreateTopic.java | 28 +++++ .../src/test/java/TestDeleteTopic.java | 29 +++++ .../snippets/src/test/java/TestGetTopic.java | 31 +++++ .../src/test/java/TestListTopics.java | 31 +++++ .../src/test/java/TestUpdateTopic.java | 28 +++++ 17 files changed, 954 insertions(+) create mode 100644 classroom/snippets/src/main/java/AddAliasToCourse.java create mode 100644 classroom/snippets/src/main/java/CreateCourseWithAlias.java create mode 100644 classroom/snippets/src/main/java/CreateCourseWork.java create mode 100644 classroom/snippets/src/main/java/CreateTopic.java create mode 100644 classroom/snippets/src/main/java/DeleteTopic.java create mode 100644 classroom/snippets/src/main/java/GetTopic.java create mode 100644 classroom/snippets/src/main/java/ListTopics.java create mode 100644 classroom/snippets/src/main/java/UpdateTopic.java create mode 100644 classroom/snippets/src/test/java/TestAddAliasToCourse.java create mode 100644 classroom/snippets/src/test/java/TestCreateCourseWithAlias.java create mode 100644 classroom/snippets/src/test/java/TestCreateCourseWork.java create mode 100644 classroom/snippets/src/test/java/TestCreateTopic.java create mode 100644 classroom/snippets/src/test/java/TestDeleteTopic.java create mode 100644 classroom/snippets/src/test/java/TestGetTopic.java create mode 100644 classroom/snippets/src/test/java/TestListTopics.java create mode 100644 classroom/snippets/src/test/java/TestUpdateTopic.java diff --git a/classroom/snippets/src/main/java/AddAliasToCourse.java b/classroom/snippets/src/main/java/AddAliasToCourse.java new file mode 100644 index 00000000..10434391 --- /dev/null +++ b/classroom/snippets/src/main/java/AddAliasToCourse.java @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_add_alias_to_course_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Create Alias API. */ +public class AddAliasToCourse { + /** + * Add an alias on an existing course. + * + * @param courseId - id of the course to add an alias to. + * @return - newly created course alias. + * @throws IOException - if credentials file not found. + */ + public static CourseAlias addAliasToCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_add_alias_to_course_code_snippet] + + /* Create a new CourseAlias object with a project-wide alias. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + CourseAlias content = new CourseAlias() + .setAlias("p:biology_10"); + CourseAlias courseAlias = null; + + try { + courseAlias = service.courses().aliases().create(courseId, content) + .execute(); + System.out.printf("Course alias created: %s \n", courseAlias.getAlias()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return courseAlias; + + // [END classroom_add_alias_to_course_code_snippet] + + } +} +// [END classroom_add_alias_to_course_class] diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java new file mode 100644 index 00000000..77a6521b --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.java @@ -0,0 +1,89 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_create_course_with_alias_class] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to create a course with an alias. */ +public class CreateCourseWithAlias { + /** + * Create a new course with an alias. Set the new course id to the desired alias. + * + * @return - newly created course. + * @throws IOException - if credentials file not found. + */ + public static Course createCourseWithAlias() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_course_with_alias_code_snippet] + + Course course = null; + + /* Create a new Course with the alias set as the id field. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + Course content = new Course() + .setId("p:history_4_2022") + .setName("9th Grade History") + .setSection("Period 4") + .setDescriptionHeading("Welcome to 9th Grade History.") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + + try { + course = service.courses().create(content).execute(); + // Prints the new created course id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content.getId()); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return course; + + // [END classroom_create_course_with_alias_code_snippet] + + } +} +// [END classroom_create_course_with_alias_class] diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java new file mode 100644 index 00000000..631ced38 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -0,0 +1,107 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_create_coursework_class] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseWork; +import com.google.api.services.classroom.model.Date; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.Material; +import com.google.api.services.classroom.model.TimeOfDay; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create CourseWork API. */ +public class CreateCourseWork { + /** + * Creates course work. + * + * @param courseId - id of the course to create coursework in. + * @return - newly created CourseWork object. + * @throws IOException - if credentials file not found. + */ + public static CourseWork createCourseWork(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_coursework_code_snippet] + + CourseWork courseWork = null; + try { + // Create a link to add as a material on course work. + Link articleLink = new Link() + .setTitle("SR-71 Blackbird") + .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); + + // Create a list of Materials to add to course work. + List materials = Arrays.asList(new Material().setLink(articleLink)); + + /* Create new CourseWork object with the material attached. + Set workType to `ASSIGNMENT`. Possible values of workType can be found here: + https://developers.google.com/classroom/reference/rest/v1/CourseWorkType + Set state to `PUBLISHED`. Possible values of state can be found here: + https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */ + CourseWork content = new CourseWork() + .setTitle("Supersonic aviation") + .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " + + "highest-flying manned aircraft, was built.") + .setMaterials(materials) + .setDueDate(new Date().setMonth(12).setDay(10).setYear(2022)) + .setDueTime(new TimeOfDay().setHours(15).setMinutes(0)) + .setWorkType("ASSIGNMENT") + .setState("PUBLISHED"); + + courseWork = service.courses().courseWork().create(courseId, content) + .execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + throw e; + } catch (Exception e) { + throw e; + } + return courseWork; + + // [END classroom_create_coursework_code_snippet] + } +} +// [END classroom_create_coursework_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/CreateTopic.java b/classroom/snippets/src/main/java/CreateTopic.java new file mode 100644 index 00000000..a46e573f --- /dev/null +++ b/classroom/snippets/src/main/java/CreateTopic.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_create_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to create a topic. */ +public class CreateTopic { + /** + * Create a new topic in a course. + * + * @param courseId - the id of the course to create a topic in. + * @return - newly created topic. + * @throws IOException - if credentials file not found. + */ + public static Topic createTopic(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_topic_code_snippet] + + Topic topic = null; + try { + // Create the new Topic. + Topic content = new Topic().setName("Semester 1"); + topic = service.courses().topics().create(courseId, content).execute(); + System.out.println("Topic id: " + topic.getTopicId() + "\n" + "Course id: " + courseId); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_create_topic_code_snippet] + + } +} +// [END classroom_create_topic_class] diff --git a/classroom/snippets/src/main/java/DeleteTopic.java b/classroom/snippets/src/main/java/DeleteTopic.java new file mode 100644 index 00000000..b8ee8f73 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteTopic.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_delete_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to delete a topic. */ +public class DeleteTopic { + /** + * Delete a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to delete. + * @return - updated topic. + * @throws IOException - if credentials file not found. + */ + public static void deleteTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_topic_code_snippet] + + try { + service.courses().topics().delete(courseId, topicId).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + + // [END classroom_delete_topic_code_snippet] + + } +} +// [END classroom_delete_topic_class] diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java new file mode 100644 index 00000000..5332bd5c --- /dev/null +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_get_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to get a topic. */ +public class GetTopic { + /** + * Get a topic in a course. + * + * @param courseId - the id of the course the topic belongs to. + * @param topicId - the id of the topic to retrieve. + * @return - the topic to retrieve. + * @throws IOException - if credentials file not found. + */ + public static Topic getTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_topic_code_snippet] + + Topic topic = null; + try { + // Get the topic. + topic = service.courses().topics().get(courseId, topicId).execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_get_topic_code_snippet] + + } +} +// [END classroom_get_topic_class] diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java new file mode 100644 index 00000000..61ea9b89 --- /dev/null +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_list_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListTopicResponse; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate how to list topics in a course. */ +public class ListTopics { + /** + * List topics in a course. + * + * @param courseId - the id of the course to retrieve topics for. + * @return - the list of topics in the course that the caller is permitted to view. + * @throws IOException - if credentials file not found. + */ + public static List listTopics(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_topic_code_snippet] + + List topics = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListTopicResponse response = service.courses().topics().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + topics.addAll(response.getTopic()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (topics.isEmpty()) { + System.out.println("No topics found."); + } else { + for (Topic topic : topics) { + System.out.printf("%s (%s)\n", topic.getName(), topic.getTopicId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topics; + + // [END classroom_list_topic_code_snippet] + + } +} +// [END classroom_list_topic_class] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java new file mode 100644 index 00000000..770bee30 --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -0,0 +1,89 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_update_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to update one or more fields in a topic. */ +public class UpdateTopic { + /** + * Update one or more fields in a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to update. + * @return - updated topic. + * @throws IOException - if credentials file not found. + */ + public static Topic updateTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_update_topic_code_snippet] + + Topic topic = null; + try { + // Retrieve the topic to update. + Topic topicToUpdate = service.courses().topics().get(courseId, topicId).execute(); + + // Update the name field for the topic retrieved. + topicToUpdate.setName("Semester 2"); + + /* Call the patch endpoint and set the updateMask query parameter to the field that needs to + be updated. */ + topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) + .set("updateMask", "name") + .execute(); + } catch(GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_update_topic_code_snippet] + + } +} +// [END classroom_update_topic_class] diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index c1e46717..cc3996de 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -80,6 +80,10 @@ public CourseAlias createAlias(String courseId) throws IOException { } public void deleteCourse(String courseId) throws IOException { + // updating the course state to be archived so the course can be deleted. + Course course = service.courses().get(courseId).execute(); + course.setCourseState("ARCHIVED"); + this.service.courses().update(courseId, course).execute(); this.service.courses().delete(courseId).execute(); } } diff --git a/classroom/snippets/src/test/java/TestAddAliasToCourse.java b/classroom/snippets/src/test/java/TestAddAliasToCourse.java new file mode 100644 index 00000000..c5b85777 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Add Alias classroom snippet +public class TestAddAliasToCourse extends BaseTest { + + @Test + public void testAddCourseAlias() throws IOException { + CourseAlias courseAlias = AddAliasToCourse.addAliasToCourse(testCourse.getId()); + List courseAliases = service.courses().aliases() + .list(testCourse.getId() + ).execute() + .getAliases(); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java new file mode 100644 index 00000000..5152b984 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Alias classroom snippet +public class TestCreateCourseWithAlias extends BaseTest { + + @Test + public void testCreateCourseWithAlias() throws IOException { + Course course = CreateCourseWithAlias.createCourseWithAlias(); + List courseAliases = service.courses().aliases() + .list(course.getId() + ).execute() + .getAliases(); + Assert.assertNotNull("Course not returned.", course); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + deleteCourse(course.getId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java new file mode 100644 index 00000000..e3a25b6b --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWork.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.CourseWork; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Coursework classroom snippet +public class TestCreateCourseWork extends BaseTest { + + @Test + public void testCreateCoursework() throws IOException { + CourseWork courseWork = CreateCourseWork.createCourseWork(testCourse.getId()); + Assert.assertNotNull("Coursework not returned.", courseWork); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateTopic.java b/classroom/snippets/src/test/java/TestCreateTopic.java new file mode 100644 index 00000000..e2d77586 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateTopic.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Topic classroom snippet +public class TestCreateTopic extends BaseTest { + + @Test + public void testCreateTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Assert.assertNotNull("Topic not returned.", topic); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteTopic.java b/classroom/snippets/src/test/java/TestDeleteTopic.java new file mode 100644 index 00000000..b093865c --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteTopic.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteTopic extends BaseTest { + @Test + public void testDeleteTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + DeleteTopic.deleteTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertThrows(GoogleJsonResponseException.class, + () -> GetTopic.getTopic(testCourse.getId(), topic.getTopicId())); + } +} diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java new file mode 100644 index 00000000..b7cb7840 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetTopic.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Get Topic classroom snippet +public class TestGetTopic extends BaseTest { + + @Test + public void testGetTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Topic getTopic = GetTopic.getTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotNull("Topic could not be created.", topic); + Assert.assertNotNull("Topic could not be retrieved.", getTopic); + Assert.assertEquals("Wrong topic was retrieved.", topic, getTopic); + } +} diff --git a/classroom/snippets/src/test/java/TestListTopics.java b/classroom/snippets/src/test/java/TestListTopics.java new file mode 100644 index 00000000..081be57b --- /dev/null +++ b/classroom/snippets/src/test/java/TestListTopics.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Topic; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Topics classroom snippet +public class TestListTopics extends BaseTest { + + @Test + public void testListTopics() throws IOException { + CreateTopic.createTopic(testCourse.getId()); + List listTopics = ListTopics.listTopics(testCourse.getId()); + Assert.assertNotNull("Topics could not be retrieved.", listTopics); + Assert.assertFalse("No topics were retrieved.", listTopics.size() == 0); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java new file mode 100644 index 00000000..5b1b9eec --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateTopic.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Update Topic classroom snippet +public class TestUpdateTopic extends BaseTest { + @Test + public void testUpdateTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + System.out.println("New topic created: " + topic.getName()); + Topic updatedTopic = UpdateTopic.updateTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotEquals("Topic name was not updated.", topic.getName(), updatedTopic.getName()); + } +} From e49fb413ed95f62a4c0d71dd7ecb20b755585cd7 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Mon, 19 Dec 2022 11:17:03 -0600 Subject: [PATCH 237/254] feat: added List, ModifyAttachments, Patch, Return methods for StudentSubmission resource (#467) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases --- .../src/main/java/CreateCourseWork.java | 5 +- .../snippets/src/main/java/GetTopic.java | 1 + .../src/main/java/ListCourseAliases.java | 8 +- .../src/main/java/ListStudentSubmissions.java | 105 ++++++++++++++++++ .../src/main/java/ListSubmissions.java | 102 +++++++++++++++++ .../snippets/src/main/java/ListTopics.java | 6 +- .../ModifyAttachmentsStudentSubmission.java | 100 +++++++++++++++++ .../src/main/java/PatchStudentSubmission.java | 98 ++++++++++++++++ .../main/java/ReturnStudentSubmission.java | 80 +++++++++++++ .../snippets/src/main/java/UpdateTopic.java | 5 +- .../src/test/java/TestListSubmissions.java | 31 ++++++ 11 files changed, 534 insertions(+), 7 deletions(-) create mode 100644 classroom/snippets/src/main/java/ListStudentSubmissions.java create mode 100644 classroom/snippets/src/main/java/ListSubmissions.java create mode 100644 classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java create mode 100644 classroom/snippets/src/main/java/PatchStudentSubmission.java create mode 100644 classroom/snippets/src/main/java/ReturnStudentSubmission.java create mode 100644 classroom/snippets/src/test/java/TestListSubmissions.java diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java index 631ced38..7f9973ca 100644 --- a/classroom/snippets/src/main/java/CreateCourseWork.java +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -80,13 +80,14 @@ public static CourseWork createCourseWork(String courseId) throws IOException { .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " + "highest-flying manned aircraft, was built.") .setMaterials(materials) - .setDueDate(new Date().setMonth(12).setDay(10).setYear(2022)) - .setDueTime(new TimeOfDay().setHours(15).setMinutes(0)) .setWorkType("ASSIGNMENT") .setState("PUBLISHED"); courseWork = service.courses().courseWork().create(courseId, content) .execute(); + + /* Prints the created courseWork. */ + System.out.printf("CourseWork created: %s\n", courseWork.getTitle()); } catch (GoogleJsonResponseException e) { //TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java index 5332bd5c..140a0407 100644 --- a/classroom/snippets/src/main/java/GetTopic.java +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -60,6 +60,7 @@ public static Topic getTopic(String courseId, String topicId) throws IOException try { // Get the topic. topic = service.courses().topics().get(courseId, topicId).execute(); + System.out.printf("Topic '%s' found.\n", topic.getName()); } catch (GoogleJsonResponseException e) { //TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index 171f4fa6..c3141cf1 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -13,7 +13,7 @@ // limitations under the License. -// [START classroom_list_aliases] +// [START classroom_list_aliases_class] import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; @@ -57,6 +57,8 @@ public static List listCourseAliases(String courseId) .setApplicationName("Classroom samples") .build(); + // [START classroom_list_aliases_code_snippet] + String pageToken = null; List courseAliases = new ArrayList<>(); @@ -89,6 +91,8 @@ public static List listCourseAliases(String courseId) } } return courseAliases; + + // [END classroom_list_aliases_code_snippet] } } -// [END classroom_list_aliases] \ No newline at end of file +// [END classroom_list_aliases_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java new file mode 100644 index 00000000..acc7b898 --- /dev/null +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_list_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListStudentSubmissions { + /** + * Retrieves a specific student's submissions for the specified course work. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param userId - identifier of the student whose work to return. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + */ + public static List listStudentSubmissions(String courseId, String courseWorkId, + String userId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_student_submissions_code_snippet] + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // Set the userId as a query parameter on the request. + ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() + .list(courseId, courseWorkId) + .set("userId", userId) + .execute(); + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf("Student submission: %s.\n", submission.getId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or userId (%s) does " + + "not exist.\n", courseId, courseWorkId, userId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + + // [END classroom_list_student_submissions_code_snippet] + + } +} +// [END classroom_list_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java new file mode 100644 index 00000000..ed5898de --- /dev/null +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_list_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListSubmissions { + /** + * Retrieves submissions for all students for the specified course work in a course. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + */ + public static List listSubmissions(String courseId, String courseWorkId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_submissions_code_snippet] + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() + .list(courseId, courseWorkId) + .execute(); + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf("Student id (%s), student submission id (%s)\n", submission.getUserId(), + submission.getId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, + courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + + // [END classroom_list_submissions_code_snippet] + + } +} +// [END classroom_list_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index 61ea9b89..e754f82b 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -67,8 +67,10 @@ public static List listTopics(String courseId) throws IOException { .setPageSize(100) .setPageToken(pageToken) .execute(); - topics.addAll(response.getTopic()); - pageToken = response.getNextPageToken(); + if (response.getTopic() != null) { + topics.addAll(response.getTopic()); + pageToken = response.getNextPageToken(); + } } while (pageToken != null); if (topics.isEmpty()) { diff --git a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java new file mode 100644 index 00000000..252f51f5 --- /dev/null +++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java @@ -0,0 +1,100 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_modify_attachments_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Attachment; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.ModifyAttachmentsRequest; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom ModifyAttachments StudentSubmissions API. */ +public class ModifyAttachmentsStudentSubmission { + /** + * Modify attachments on a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the modified student submission. + * @throws IOException - if credentials file not found. + */ + public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, String id) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_modify_attachments_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Create ModifyAttachmentRequest object that includes a new attachment with a link. + Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number"); + Attachment attachment = new Attachment().setLink(link); + ModifyAttachmentsRequest modifyAttachmentsRequest = new ModifyAttachmentsRequest() + .setAddAttachments(Arrays.asList(attachment)); + + // The modified studentSubmission object is returned with the new attachment added to it. + studentSubmission = service.courses().courseWork().studentSubmissions().modifyAttachments( + courseId, courseWorkId, id, modifyAttachmentsRequest) + .execute(); + + /* Prints the modified student submission. */ + System.out.printf("Modified student submission attachments: '%s'.\n", studentSubmission + .getAssignmentSubmission() + .getAttachments()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch(Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_modify_attachments_student_submissions_code_snippet] + + } +} +// [END classroom_modify_attachments_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java new file mode 100644 index 00000000..1690ef8e --- /dev/null +++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_patch_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Patch StudentSubmissions API. */ +public class PatchStudentSubmission { + /** + * Updates the draft grade and/or assigned grade of a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the updated student submission. + * @throws IOException - if credentials file not found. + */ + public static StudentSubmission patchStudentSubmission(String courseId, String courseWorkId, + String id) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_patch_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Updating the draftGrade and assignedGrade fields for the specific student submission. + StudentSubmission content = service.courses().courseWork().studentSubmissions() + .get(courseId, courseWorkId, id) + .execute(); + content.setAssignedGrade(90.00); + content.setDraftGrade(80.00); + + // The updated studentSubmission object is returned with the new draftGrade and assignedGrade. + studentSubmission = service.courses().courseWork().studentSubmissions() + .patch(courseId, courseWorkId, id, content) + .set("updateMask", "draftGrade,assignedGrade") + .execute(); + + /* Prints the updated student submission. */ + System.out.printf("Updated student submission draft grade (%s) and assigned grade (%s).\n", + studentSubmission.getDraftGrade(), + studentSubmission.getAssignedGrade()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_patch_student_submissions_code_snippet] + + } +} +// [END classroom_patch_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java new file mode 100644 index 00000000..6b40fc96 --- /dev/null +++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. + + +// [START classroom_return_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Return StudentSubmissions API. */ +public class ReturnStudentSubmission { + /** + * Return a student submission back to the student which updates the submission state to `RETURNED`. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @throws IOException - if credentials file not found. + */ + public static void returnSubmission(String courseId, String courseWorkId, String id) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_return_student_submissions_code_snippet] + + try { + service.courses().courseWork().studentSubmissions() + .classroomReturn(courseId, courseWorkId, id, null) + .execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + + // [END classroom_return_student_submissions_code_snippet] + + } +} +// [END classroom_return_student_submissions_class] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java index 770bee30..f45ffeca 100644 --- a/classroom/snippets/src/main/java/UpdateTopic.java +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -69,7 +69,10 @@ public static Topic updateTopic(String courseId, String topicId) throws IOExcept topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) .set("updateMask", "name") .execute(); - } catch(GoogleJsonResponseException e) { + + /* Prints the updated topic. */ + System.out.printf("Topic '%s' updated.\n", topic.getName()); + } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java new file mode 100644 index 00000000..148e9529 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListSubmissions.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for ListSubmissions classroom snippet +public class TestListSubmissions extends BaseTest { + + @Test + public void testListSubmissions() throws IOException { + List submissions = ListSubmissions.listSubmissions( + testCourse.getId(), + "-"); + Assert.assertNotNull("No submissions returned.", submissions); + } +} From 8718e29af586e50c912eb15aa48c57377fd1f2a6 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:44:14 -0500 Subject: [PATCH 238/254] feat: added Guardian and Guardian Invitation code snippets. (#528) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases * added class templates for guardians and guardianInvitations * guardian and guardian invitation implementation * tests for list guardians and list guardian invitations * adding tests for guardians and guardian invites. removing use of ADC for auth. * base test updates * updates based on team feedback * fixing BaseTest.java * updating copyright year to 2023 for new files * testing google-java-format plugin to fix lint errors * updated files after running google-java-format plugin * updated BaseTest * fixing copyright header for BaseTest --- classroom/snippets/build.gradle | 6 +- .../main/java/CancelGuardianInvitation.java | 97 +++++++++++++++++ .../src/main/java/ClassroomCredentials.java | 64 +++++++++++ .../main/java/CreateGuardianInvitation.java | 90 ++++++++++++++++ .../src/main/java/DeleteGuardian.java | 66 ++++++++++++ .../snippets/src/main/java/GetGuardian.java | 74 +++++++++++++ .../ListGuardianInvitationsByStudent.java | 102 ++++++++++++++++++ .../snippets/src/main/java/ListGuardians.java | 99 +++++++++++++++++ .../src/main/java/ListStudentSubmissions.java | 51 +++++---- .../src/main/java/ListSubmissions.java | 50 +++++---- .../snippets/src/main/java/ListTopics.java | 39 ++++--- .../snippets/src/test/java/BaseTest.java | 68 ++++++------ .../java/TestCancelGuardianInvitation.java | 37 +++++++ .../java/TestCreateGuardianInvitation.java | 31 ++++++ .../src/test/java/TestDeleteGuardian.java | 31 ++++++ .../TestListGuardianInvitationsByStudent.java | 31 ++++++ .../src/test/java/TestListGuardians.java | 30 ++++++ 17 files changed, 868 insertions(+), 98 deletions(-) create mode 100644 classroom/snippets/src/main/java/CancelGuardianInvitation.java create mode 100644 classroom/snippets/src/main/java/ClassroomCredentials.java create mode 100644 classroom/snippets/src/main/java/CreateGuardianInvitation.java create mode 100644 classroom/snippets/src/main/java/DeleteGuardian.java create mode 100644 classroom/snippets/src/main/java/GetGuardian.java create mode 100644 classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java create mode 100644 classroom/snippets/src/main/java/ListGuardians.java create mode 100644 classroom/snippets/src/test/java/TestCancelGuardianInvitation.java create mode 100644 classroom/snippets/src/test/java/TestCreateGuardianInvitation.java create mode 100644 classroom/snippets/src/test/java/TestDeleteGuardian.java create mode 100644 classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java create mode 100644 classroom/snippets/src/test/java/TestListGuardians.java diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index 6971123c..8def0b0f 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,9 +7,13 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' + + /** This will be removed once all the classes have been updated to use the + * ClassroomCredentials class. */ + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' } test { diff --git a/classroom/snippets/src/main/java/CancelGuardianInvitation.java b/classroom/snippets/src/main/java/CancelGuardianInvitation.java new file mode 100644 index 00000000..33585400 --- /dev/null +++ b/classroom/snippets/src/main/java/CancelGuardianInvitation.java @@ -0,0 +1,97 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_cancel_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Patch Guardian Invitation API. */ +public class CancelGuardianInvitation { + /** + * Cancel a guardian invitation by modifying the state of the invite. + * + * @param studentId - the id of the student. + * @param invitationId - the id of the guardian invitation to modify. + * @return - the modified guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation cancelGuardianInvitation(String studentId, String invitationId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_cancel_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + try { + /* Change the state of the GuardianInvitation from PENDING to COMPLETE. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + service.userProfiles().guardianInvitations().get(studentId, invitationId).execute(); + content.setState("COMPLETE"); + + guardianInvitation = + service + .userProfiles() + .guardianInvitations() + .patch(studentId, invitationId, content) + .set("updateMask", "state") + .execute(); + + System.out.printf( + "Invitation (%s) state set to %s\n.", + guardianInvitation.getInvitationId(), guardianInvitation.getState()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "There is no record of studentId (%s) or invitationId (%s).", studentId, invitationId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_cancel_guardian_invitation_code_snippet] + } +} +// [END classroom_cancel_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/ClassroomCredentials.java b/classroom/snippets/src/main/java/ClassroomCredentials.java new file mode 100644 index 00000000..70cd5d94 --- /dev/null +++ b/classroom/snippets/src/main/java/ClassroomCredentials.java @@ -0,0 +1,64 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; + +public class ClassroomCredentials { + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @param SCOPES The scopes required to make the API call. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT, Collection SCOPES) + throws IOException { + // Load client secrets. + InputStream in = ClassroomCredentials.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } +} diff --git a/classroom/snippets/src/main/java/CreateGuardianInvitation.java b/classroom/snippets/src/main/java/CreateGuardianInvitation.java new file mode 100644 index 00000000..cb3fe374 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateGuardianInvitation.java @@ -0,0 +1,90 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_create_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create Guardian Invitation API. */ +public class CreateGuardianInvitation { + /** + * Creates a guardian invitation by sending an email to the guardian for confirmation. + * + * @param studentId - the id of the student. + * @param guardianEmail - email to send the guardian invitation to. + * @return - the newly created guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation createGuardianInvitation(String studentId, String guardianEmail) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + /* Create a GuardianInvitation object with state set to PENDING. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + new GuardianInvitation() + .setStudentId(studentId) + .setInvitedEmailAddress(guardianEmail) + .setState("PENDING"); + try { + guardianInvitation = + service.userProfiles().guardianInvitations().create(studentId, content).execute(); + + System.out.printf("Invitation created: %s\n", guardianInvitation.getInvitationId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId: %s", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_create_guardian_invitation_code_snippet] + } +} +// [END classroom_create_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/DeleteGuardian.java b/classroom/snippets/src/main/java/DeleteGuardian.java new file mode 100644 index 00000000..7cc67a23 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteGuardian.java @@ -0,0 +1,66 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_delete_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Delete Guardian API. */ +public class DeleteGuardian { + /** + * Delete a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void deleteGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_guardian_code_snippet] + try { + service.userProfiles().guardians().delete(studentId, guardianId).execute(); + System.out.printf("The guardian with id %s was deleted.\n", guardianId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of guardianId (%s).", guardianId); + } + } + // [END classroom_delete_guardian_code_snippet] + } +} +// [END classroom_delete_guardian_class] diff --git a/classroom/snippets/src/main/java/GetGuardian.java b/classroom/snippets/src/main/java/GetGuardian.java new file mode 100644 index 00000000..781b6728 --- /dev/null +++ b/classroom/snippets/src/main/java/GetGuardian.java @@ -0,0 +1,74 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_get_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Get Guardian API. */ +public class GetGuardian { + /** + * Retrieve a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void getGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_guardian_code_snippet] + Guardian guardian = null; + + try { + guardian = service.userProfiles().guardians().get(studentId, guardianId).execute(); + System.out.printf("Guardian retrieved: %s", guardian.getInvitedEmailAddress()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.printf("There is no record of guardianId (%s).\n", guardianId); + throw e; + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + // [END classroom_get_guardian_code_snippet] + } +} +// [END classroom_get_guardian_class] diff --git a/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..b565f44d --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java @@ -0,0 +1,102 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_list_guardian_invitations_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import com.google.api.services.classroom.model.ListGuardianInvitationsResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardian Invitations API. */ +public class ListGuardianInvitationsByStudent { + /** + * Retrieves guardian invitations by student. + * + * @param studentId - the id of the student. + * @return a list of guardian invitations that were sent for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardianInvitationsByStudent(String studentId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardian_invitations_code_snippet] + + List guardianInvitations = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardianInvitationsResponse response = + service + .userProfiles() + .guardianInvitations() + .list(studentId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardianInvitations() != null) { + guardianInvitations.addAll(response.getGuardianInvitations()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardianInvitations.isEmpty()) { + System.out.println("No guardian invitations found."); + } else { + for (GuardianInvitation invitation : guardianInvitations) { + System.out.printf("Guardian invitation id: %s\n", invitation.getInvitationId()); + } + } + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitations; + + // [END classroom_list_guardian_invitations_code_snippet] + } +} +// [END classroom_list_guardian_invitations_class] diff --git a/classroom/snippets/src/main/java/ListGuardians.java b/classroom/snippets/src/main/java/ListGuardians.java new file mode 100644 index 00000000..1cb87014 --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardians.java @@ -0,0 +1,99 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_list_guardians_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import com.google.api.services.classroom.model.ListGuardiansResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardians API. */ +public class ListGuardians { + /** + * Retrieves active guardians for a specific student. + * + * @param studentId - the id of the student. + * @return a list of active guardians for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardians(String studentId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardians_code_snippet] + + List guardians = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardiansResponse response = + service.userProfiles().guardians().list(studentId).setPageToken(pageToken).execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardians() != null) { + guardians.addAll(response.getGuardians()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardians.isEmpty()) { + System.out.println("No guardians found."); + } else { + for (Guardian guardian : guardians) { + System.out.printf( + "Guardian name: %s, guardian id: %s, guardian email: %s\n", + guardian.getGuardianProfile().getName().getFullName(), + guardian.getGuardianId(), + guardian.getInvitedEmailAddress()); + } + } + + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardians; + + // [END classroom_list_guardians_code_snippet] + } +} +// [END classroom_list_guardians_class] diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java index acc7b898..c5d8b29f 100644 --- a/classroom/snippets/src/main/java/ListStudentSubmissions.java +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_student_submissions_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -42,22 +41,22 @@ public class ListStudentSubmissions { * @return - list of student submissions. * @throws IOException - if credentials file not found. */ - public static List listStudentSubmissions(String courseId, String courseWorkId, - String userId) throws IOException { + public static List listStudentSubmissions( + String courseId, String courseWorkId, String userId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_student_submissions_code_snippet] @@ -67,10 +66,17 @@ public static List listStudentSubmissions(String courseId, St try { do { // Set the userId as a query parameter on the request. - ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() - .list(courseId, courseWorkId) - .set("userId", userId) - .execute(); + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .set("userId", userId) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getStudentSubmissions() != null) { studentSubmissions.addAll(response.getStudentSubmissions()); pageToken = response.getNextPageToken(); @@ -85,11 +91,12 @@ public static List listStudentSubmissions(String courseId, St } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or userId (%s) does " - + "not exist.\n", courseId, courseWorkId, userId); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or userId (%s) does " + "not exist.\n", + courseId, courseWorkId, userId); } else { throw e; } @@ -102,4 +109,4 @@ public static List listStudentSubmissions(String courseId, St } } -// [END classroom_list_student_submissions_class] \ No newline at end of file +// [END classroom_list_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java index ed5898de..d5356d70 100644 --- a/classroom/snippets/src/main/java/ListSubmissions.java +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_submissions_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -44,19 +43,19 @@ public class ListSubmissions { public static List listSubmissions(String courseId, String courseWorkId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_submissions_code_snippet] @@ -65,11 +64,19 @@ public static List listSubmissions(String courseId, String co try { do { - ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() - .list(courseId, courseWorkId) - .execute(); + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getStudentSubmissions() != null) { studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); } } while (pageToken != null); @@ -77,16 +84,17 @@ public static List listSubmissions(String courseId, String co System.out.println("No student submission found."); } else { for (StudentSubmission submission : studentSubmissions) { - System.out.printf("Student id (%s), student submission id (%s)\n", submission.getUserId(), - submission.getId()); + System.out.printf( + "Student id (%s), student submission id (%s)\n", + submission.getUserId(), submission.getId()); } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, - courseWorkId); + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); } else { throw e; } @@ -99,4 +107,4 @@ public static List listSubmissions(String courseId, String co } } -// [END classroom_list_submissions_class] \ No newline at end of file +// [END classroom_list_submissions_class] diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index e754f82b..6412a1cb 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_topic_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -42,19 +41,19 @@ public class ListTopics { */ public static List listTopics(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_topic_code_snippet] @@ -63,10 +62,16 @@ public static List listTopics(String courseId) throws IOException { try { do { - ListTopicResponse response = service.courses().topics().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListTopicResponse response = + service + .courses() + .topics() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getTopic() != null) { topics.addAll(response.getTopic()); pageToken = response.getNextPageToken(); @@ -81,7 +86,7 @@ public static List listTopics(String courseId) throws IOException { } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index cc3996de..b0c5286e 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,28 +1,26 @@ -/* - * Copyright 2022 Google LLC - * - * 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. - */ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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.http.HttpRequestInitializer; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; +import java.util.Collections; +import java.util.List; import org.junit.After; import org.junit.Before; @@ -40,27 +38,24 @@ public class BaseTest { * @return an authorized Classroom client service * @throws IOException - if credentials file not found. */ - protected Classroom buildService() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + protected Classroom buildService() throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES); // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom Snippets") - .build(); - - return service; + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + return service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); } @Before - public void setup() throws IOException { + public void setup() throws Exception { this.service = buildService(); this.testCourse = CreateCourse.createCourse(); createAlias(this.testCourse.getId()); @@ -72,11 +67,10 @@ public void tearDown() throws IOException { this.testCourse = null; } - public CourseAlias createAlias(String courseId) throws IOException { + public void createAlias(String courseId) throws IOException { String alias = "p:" + UUID.randomUUID(); CourseAlias courseAlias = new CourseAlias().setAlias(alias); - courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); - return courseAlias; + this.service.courses().aliases().create(courseId, courseAlias).execute(); } public void deleteCourse(String courseId) throws IOException { diff --git a/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java new file mode 100644 index 00000000..d5ad35b4 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java @@ -0,0 +1,37 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Cancel Guardian Invitation classroom snippet +public class TestCancelGuardianInvitation { + + @Test + public void testCancelGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + + GuardianInvitation invitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + GuardianInvitation guardianInvitation = + CancelGuardianInvitation.cancelGuardianInvitation(studentId, invitation.getInvitationId()); + + Assert.assertTrue("Guardian invitation not canceled.", guardianInvitation != null); + Assert.assertTrue( + "Guardian invitation state not updated.", guardianInvitation.getState().equals("COMPLETE")); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java new file mode 100644 index 00000000..bc98e2b9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Guardian Invitation classroom snippet +public class TestCreateGuardianInvitation { + + @Test + public void testCreateGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + GuardianInvitation guardianInvitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + Assert.assertTrue("Guardian invitation not created.", guardianInvitation != null); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteGuardian.java b/classroom/snippets/src/test/java/TestDeleteGuardian.java new file mode 100644 index 00000000..fc70bd08 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteGuardian.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.googleapis.json.GoogleJsonResponseException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Delete Guardian classroom snippet +public class TestDeleteGuardian { + + @Test + public void testDeleteGuardian() throws Exception { + String studentId = "insert_student_id"; + String guardianId = "insert_guardian_id"; + DeleteGuardian.deleteGuardian(studentId, guardianId); + + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetGuardian.getGuardian(studentId, guardianId)); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..0ee3390f --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.services.classroom.model.GuardianInvitation; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardian Invitations classroom snippet +public class TestListGuardianInvitationsByStudent { + + @Test + public void testListGuardianInvitationsByStudent() throws Exception { + String studentId = "insert_student_id"; + List invitationList = + ListGuardianInvitationsByStudent.listGuardianInvitationsByStudent(studentId); + + Assert.assertTrue("No guardian invitations returned.", invitationList.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardians.java b/classroom/snippets/src/test/java/TestListGuardians.java new file mode 100644 index 00000000..b1b5eb03 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardians.java @@ -0,0 +1,30 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.services.classroom.model.Guardian; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardians classroom snippet +public class TestListGuardians { + + @Test + public void testListGuardians() throws Exception { + String studentId = "insert_student_id"; + List guardianList = ListGuardians.listGuardians(studentId); + + Assert.assertTrue("No guardians returned.", guardianList.size() > 0); + } +} From 079711b1913ae92f56764716b923a56e7c6b1cdd Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:38:30 -0500 Subject: [PATCH 239/254] feat: updating authorization flow & added invitation resource Classroom code snippets. (#601) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases * added class templates for guardians and guardianInvitations * guardian and guardian invitation implementation * tests for list guardians and list guardian invitations * adding tests for guardians and guardian invites. removing use of ADC for auth. * base test updates * updates based on team feedback * fixing BaseTest.java * updating copyright year to 2023 for new files * testing google-java-format plugin to fix lint errors * updated files after running google-java-format plugin * updated BaseTest * fixing copyright header for BaseTest * updated auth for AddAlias and CreateCourse classes * removing unused imports * Fixing comment. * specifying errors in method signatures * updated BaseTest and AddStudent * Adding annotation for GeneralSecurityException * updating AddStudent method signature and test * updated AddTeacher and AddStudent test * updated auth for BatchAddStudents * updated auth for CreateCourseWork * updated auth for Topic related classes and tests * added link to CourseState info and updated GetTopic error handling * updated auth for remaining classes * updated auth for CreateCourseWithAlias * CreateInvitation code snippet * accept, create, delete invitation classes * list invitations class * listAssignedGrades method in ListStudentSubmissions class * deleting ListInvitations classes until bug is fixed * team review updates * google java format for tests * google-java-format on classes * google java format DeleteTopic * added test cases to CreateInvitation and DeleteInvitation classes * additional comment in accept invitation test case * fixing java formatting * google java format fix --- .../src/main/java/AcceptInvitation.java | 72 ++++++++++++++ .../src/main/java/AddAliasToCourse.java | 46 ++++----- .../snippets/src/main/java/AddStudent.java | 61 ++++++------ .../snippets/src/main/java/AddTeacher.java | 47 ++++----- .../src/main/java/BatchAddStudents.java | 64 ++++++------ .../snippets/src/main/java/CreateCourse.java | 67 +++++++------ .../src/main/java/CreateCourseWithAlias.java | 56 ++++++----- .../src/main/java/CreateCourseWork.java | 70 ++++++------- .../src/main/java/CreateInvitation.java | 89 +++++++++++++++++ .../snippets/src/main/java/CreateTopic.java | 40 ++++---- .../src/main/java/DeleteInvitation.java | 72 ++++++++++++++ .../snippets/src/main/java/DeleteTopic.java | 47 +++++---- .../snippets/src/main/java/GetCourse.java | 42 ++++---- .../snippets/src/main/java/GetInvitation.java | 76 +++++++++++++++ .../snippets/src/main/java/GetTopic.java | 44 +++++---- .../src/main/java/ListCourseAliases.java | 53 +++++----- .../snippets/src/main/java/ListCourses.java | 48 +++++---- .../src/main/java/ListStudentSubmissions.java | 97 ++++++++++++++++--- .../src/main/java/ListSubmissions.java | 27 +++--- .../snippets/src/main/java/ListTopics.java | 29 +++--- .../ModifyAttachmentsStudentSubmission.java | 69 +++++++------ .../snippets/src/main/java/PatchCourse.java | 51 +++++----- .../src/main/java/PatchStudentSubmission.java | 78 ++++++++------- .../main/java/ReturnStudentSubmission.java | 53 +++++----- .../snippets/src/main/java/UpdateCourse.java | 41 ++++---- .../snippets/src/main/java/UpdateTopic.java | 52 +++++----- .../snippets/src/test/java/BaseTest.java | 22 ++--- .../src/test/java/TestAcceptInvitation.java | 39 ++++++++ .../src/test/java/TestAddAliasToCourse.java | 13 +-- .../src/test/java/TestAddStudent.java | 22 +++-- .../src/test/java/TestAddTeacher.java | 18 ++-- .../src/test/java/TestBatchAddStudents.java | 11 ++- .../src/test/java/TestCreateCourse.java | 7 +- .../test/java/TestCreateCourseWithAlias.java | 12 +-- .../src/test/java/TestCreateCourseWork.java | 5 +- .../src/test/java/TestCreateInvitation.java | 43 ++++++++ .../src/test/java/TestCreateTopic.java | 4 +- .../src/test/java/TestDeleteInvitation.java | 42 ++++++++ .../src/test/java/TestDeleteTopic.java | 8 +- .../snippets/src/test/java/TestGetCourse.java | 6 +- .../snippets/src/test/java/TestGetTopic.java | 4 +- .../src/test/java/TestListCourseAliases.java | 10 +- .../src/test/java/TestListCourses.java | 7 +- .../src/test/java/TestListSubmissions.java | 8 +- .../src/test/java/TestListTopics.java | 4 +- .../src/test/java/TestPatchCourse.java | 6 +- .../src/test/java/TestUpdateCourse.java | 6 +- .../src/test/java/TestUpdateTopic.java | 6 +- 48 files changed, 1200 insertions(+), 594 deletions(-) create mode 100644 classroom/snippets/src/main/java/AcceptInvitation.java create mode 100644 classroom/snippets/src/main/java/CreateInvitation.java create mode 100644 classroom/snippets/src/main/java/DeleteInvitation.java create mode 100644 classroom/snippets/src/main/java/GetInvitation.java create mode 100644 classroom/snippets/src/test/java/TestAcceptInvitation.java create mode 100644 classroom/snippets/src/test/java/TestCreateInvitation.java create mode 100644 classroom/snippets/src/test/java/TestDeleteInvitation.java diff --git a/classroom/snippets/src/main/java/AcceptInvitation.java b/classroom/snippets/src/main/java/AcceptInvitation.java new file mode 100644 index 00000000..137a23a0 --- /dev/null +++ b/classroom/snippets/src/main/java/AcceptInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_accept_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Accept Invitation API. */ +public class AcceptInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Accepts an invitation to a course. + * + * @param id - the identifier of the invitation to accept. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void acceptInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_accept_invitation_code_snippet] + try { + service.invitations().accept(id).execute(); + System.out.printf("Invitation (%s) was accepted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_accept_invitation_code_snippet] + } +} +// [END classroom_accept_invitation] diff --git a/classroom/snippets/src/main/java/AddAliasToCourse.java b/classroom/snippets/src/main/java/AddAliasToCourse.java index 10434391..720dccec 100644 --- a/classroom/snippets/src/main/java/AddAliasToCourse.java +++ b/classroom/snippets/src/main/java/AddAliasToCourse.java @@ -12,61 +12,61 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_alias_to_course_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseAlias; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Create Alias API. */ public class AddAliasToCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Add an alias on an existing course. * * @param courseId - id of the course to add an alias to. * @return - newly created course alias. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static CourseAlias addAliasToCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static CourseAlias addAliasToCourse(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_add_alias_to_course_code_snippet] /* Create a new CourseAlias object with a project-wide alias. Project-wide aliases use a prefix of "p:" and can only be seen and used by the application that created them. */ - CourseAlias content = new CourseAlias() - .setAlias("p:biology_10"); + CourseAlias content = new CourseAlias().setAlias("p:biology_10"); CourseAlias courseAlias = null; try { - courseAlias = service.courses().aliases().create(courseId, content) - .execute(); + courseAlias = service.courses().aliases().create(courseId, content).execute(); System.out.printf("Course alias created: %s \n", courseAlias.getAlias()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.printf("The course alias already exists: %s.\n", content); diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index c04c38fb..6331f3ed 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -12,57 +12,64 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_student] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Student; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Student API */ public class AddStudent { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add a student in a specified course. * - * @param courseId - Id of the course. + * @param courseId - Id of the course. * @param enrollmentCode - Code of the course to enroll. * @return newly added student * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Student addStudent(String courseId, String enrollmentCode) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Student addStudent(String courseId, String enrollmentCode, String studentId) + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); - Student student = new Student().setUserId("gduser1@workspacesamples.dev"); + Student student = new Student().setUserId(studentId); try { // Enrolling a student to a specified course - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); + student = + service + .courses() + .students() + .create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); // Prints the course id with the Student name - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + System.out.printf( + "User '%s' was enrolled as a student in the course with ID '%s'.\n", student.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -78,4 +85,4 @@ public static Student addStudent(String courseId, String enrollmentCode) return student; } } -// [END classroom_add_student] \ No newline at end of file +// [END classroom_add_student] diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java index 9f5652e3..4c843721 100644 --- a/classroom/snippets/src/main/java/AddTeacher.java +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -12,55 +12,58 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_teacher] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Teacher; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Teacher API */ public class AddTeacher { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add teacher to a specific course. * - * @param courseId - Id of the course. + * @param courseId - Id of the course. * @param teacherEmail - Email address of the teacher. * @return newly created teacher * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static Teacher addTeacher(String courseId, String teacherEmail) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Teacher teacher = new Teacher().setUserId(teacherEmail); try { // Add a teacher to a specified course teacher = service.courses().teachers().create(courseId, teacher).execute(); // Prints the course id with the teacher name - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + System.out.printf( + "User '%s' was added as a teacher to the course with ID '%s'.\n", teacher.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -76,4 +79,4 @@ public static Teacher addTeacher(String courseId, String teacherEmail) return teacher; } } -// [END classroom_add_teacher] \ No newline at end of file +// [END classroom_add_teacher] diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java index 9588ec3d..d4a54c2e 100644 --- a/classroom/snippets/src/main/java/BatchAddStudents.java +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -12,62 +12,66 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_batch_add_students] import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.HttpHeaders; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Student; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom Batch Add Students API */ public class BatchAddStudents { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add multiple students in a specified course. * - * @param courseId - Id of the course to add students. + * @param courseId - Id of the course to add students. * @param studentEmails - Email address of the students. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static void batchAddStudents(String courseId, List studentEmails) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback<>() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } + JsonBatchCallback callback = + new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf( + "User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; for (String studentEmail : studentEmails) { Student student = new Student().setUserId(studentEmail); service.courses().students().create(courseId, student).queue(batch, callback); @@ -75,4 +79,4 @@ public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { batch.execute(); } } -// [END classroom_batch_add_students] \ No newline at end of file +// [END classroom_batch_add_students] diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java index ce33dd4d..95f7353c 100644 --- a/classroom/snippets/src/main/java/CreateCourse.java +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -12,59 +12,64 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Create Course API */ public class CreateCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Creates a course * * @return newly created course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course createCourse() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course createCourse() throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { - // Adding a new course with description - course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); + // Adding a new course with description. Set CourseState to `ACTIVE`. Possible values of + // CourseState can be found here: + // https://developers.google.com/classroom/reference/rest/v1/courses#coursestate + course = + new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription( + "We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("ACTIVE"); course = service.courses().create(course).execute(); // Prints the new created course Id and name System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); @@ -79,4 +84,4 @@ public static Course createCourse() throws IOException { return course; } } -// [END classroom_create_course] \ No newline at end of file +// [END classroom_create_course] diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java index 77a6521b..c676b973 100644 --- a/classroom/snippets/src/main/java/CreateCourseWithAlias.java +++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.java @@ -12,44 +12,47 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_course_with_alias_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to create a course with an alias. */ public class CreateCourseWithAlias { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Create a new course with an alias. Set the new course id to the desired alias. * * @return - newly created course. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course createCourseWithAlias() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course createCourseWithAlias() throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_course_with_alias_code_snippet] @@ -57,20 +60,21 @@ public static Course createCourseWithAlias() throws IOException { /* Create a new Course with the alias set as the id field. Project-wide aliases use a prefix of "p:" and can only be seen and used by the application that created them. */ - Course content = new Course() - .setId("p:history_4_2022") - .setName("9th Grade History") - .setSection("Period 4") - .setDescriptionHeading("Welcome to 9th Grade History.") - .setOwnerId("me") - .setCourseState("PROVISIONED"); + Course content = + new Course() + .setId("p:history_4_2022") + .setName("9th Grade History") + .setSection("Period 4") + .setDescriptionHeading("Welcome to 9th Grade History.") + .setOwnerId("me") + .setCourseState("PROVISIONED"); try { course = service.courses().create(content).execute(); // Prints the new created course id and name System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.printf("The course alias already exists: %s.\n", content.getId()); diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java index 7f9973ca..5d6c948d 100644 --- a/classroom/snippets/src/main/java/CreateCourseWork.java +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -12,60 +12,61 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_coursework_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseWork; -import com.google.api.services.classroom.model.Date; import com.google.api.services.classroom.model.Link; import com.google.api.services.classroom.model.Material; -import com.google.api.services.classroom.model.TimeOfDay; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Classroom Create CourseWork API. */ public class CreateCourseWork { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Creates course work. * * @param courseId - id of the course to create coursework in. * @return - newly created CourseWork object. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static CourseWork createCourseWork(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static CourseWork createCourseWork(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_coursework_code_snippet] CourseWork courseWork = null; try { // Create a link to add as a material on course work. - Link articleLink = new Link() - .setTitle("SR-71 Blackbird") - .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); + Link articleLink = + new Link() + .setTitle("SR-71 Blackbird") + .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); // Create a list of Materials to add to course work. List materials = Arrays.asList(new Material().setLink(articleLink)); @@ -75,21 +76,22 @@ public static CourseWork createCourseWork(String courseId) throws IOException { https://developers.google.com/classroom/reference/rest/v1/CourseWorkType Set state to `PUBLISHED`. Possible values of state can be found here: https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */ - CourseWork content = new CourseWork() - .setTitle("Supersonic aviation") - .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " - + "highest-flying manned aircraft, was built.") - .setMaterials(materials) - .setWorkType("ASSIGNMENT") - .setState("PUBLISHED"); + CourseWork content = + new CourseWork() + .setTitle("Supersonic aviation") + .setDescription( + "Read about how the SR-71 Blackbird, the world’s fastest and " + + "highest-flying manned aircraft, was built.") + .setMaterials(materials) + .setWorkType("ASSIGNMENT") + .setState("PUBLISHED"); - courseWork = service.courses().courseWork().create(courseId, content) - .execute(); + courseWork = service.courses().courseWork().create(courseId, content).execute(); /* Prints the created courseWork. */ System.out.printf("CourseWork created: %s\n", courseWork.getTitle()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); @@ -105,4 +107,4 @@ public static CourseWork createCourseWork(String courseId) throws IOException { // [END classroom_create_coursework_code_snippet] } } -// [END classroom_create_coursework_class] \ No newline at end of file +// [END classroom_create_coursework_class] diff --git a/classroom/snippets/src/main/java/CreateInvitation.java b/classroom/snippets/src/main/java/CreateInvitation.java new file mode 100644 index 00000000..3e3d22ac --- /dev/null +++ b/classroom/snippets/src/main/java/CreateInvitation.java @@ -0,0 +1,89 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_create_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Create Invitation API. */ +public class CreateInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Create an invitation to allow a user to join a course. + * + * @param courseId - the course to invite the user to. + * @param userId - the user to be invited to the course. + * @return the created invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation createInvitation(String courseId, String userId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_invitation_code_snippet] + + Invitation invitation = null; + try { + /* Set the role the user is invited to have in the course. Possible values of CourseRole can be + found here: https://developers.google.com/classroom/reference/rest/v1/invitations#courserole.*/ + Invitation content = + new Invitation().setCourseId(courseId).setUserId(userId).setRole("TEACHER"); + + invitation = service.invitations().create(content).execute(); + + System.out.printf( + "User (%s) has been invited to course (%s).\n", + invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The course or user does not exist.\n"); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + + // [END classroom_create_invitation_code_snippet] + } +} +// [END classroom_create_invitation] diff --git a/classroom/snippets/src/main/java/CreateTopic.java b/classroom/snippets/src/main/java/CreateTopic.java index a46e573f..1be964a3 100644 --- a/classroom/snippets/src/main/java/CreateTopic.java +++ b/classroom/snippets/src/main/java/CreateTopic.java @@ -12,46 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to create a topic. */ public class CreateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Create a new topic in a course. * * @param courseId - the id of the course to create a topic in. * @return - newly created topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic createTopic(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Topic createTopic(String courseId) throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_topic_code_snippet] @@ -62,7 +64,7 @@ public static Topic createTopic(String courseId) throws IOException { topic = service.courses().topics().create(courseId, content).execute(); System.out.println("Topic id: " + topic.getTopicId() + "\n" + "Course id: " + courseId); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); diff --git a/classroom/snippets/src/main/java/DeleteInvitation.java b/classroom/snippets/src/main/java/DeleteInvitation.java new file mode 100644 index 00000000..eca59e92 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_delete_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Delete Invitation API. */ +public class DeleteInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Deletes an invitation. + * + * @param id - the identifier of the invitation to delete. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void deleteInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_invitation_code_snippet] + try { + service.invitations().delete(id).execute(); + System.out.printf("Invitation (%s) was deleted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_delete_invitation_code_snippet] + } +} +// [END classroom_delete_invitation] diff --git a/classroom/snippets/src/main/java/DeleteTopic.java b/classroom/snippets/src/main/java/DeleteTopic.java index b8ee8f73..15188de6 100644 --- a/classroom/snippets/src/main/java/DeleteTopic.java +++ b/classroom/snippets/src/main/java/DeleteTopic.java @@ -12,23 +12,27 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_delete_topic_class] -import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to delete a topic. */ public class DeleteTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Delete a topic in a course. * @@ -36,22 +40,20 @@ public class DeleteTopic { * @param topicId - the id of the topic to delete. * @return - updated topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static void deleteTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static void deleteTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_delete_topic_code_snippet] @@ -59,12 +61,7 @@ public static void deleteTopic(String courseId, String topicId) throws IOExcepti service.courses().topics().delete(courseId, topicId).execute(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); - } else { - throw e; - } + throw e; } catch (Exception e) { throw e; } diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java index 7955f1da..94d07f75 100644 --- a/classroom/snippets/src/main/java/GetCourse.java +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -12,46 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_get_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Get Course API */ public class GetCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieve a single course's metadata. * * @param courseId - Id of the course to return. * @return a course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course getCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course getCourse(String courseId) throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { @@ -69,4 +71,4 @@ public static Course getCourse(String courseId) throws IOException { return course; } } -// [END classroom_get_course] \ No newline at end of file +// [END classroom_get_course] diff --git a/classroom/snippets/src/main/java/GetInvitation.java b/classroom/snippets/src/main/java/GetInvitation.java new file mode 100644 index 00000000..77d0598f --- /dev/null +++ b/classroom/snippets/src/main/java/GetInvitation.java @@ -0,0 +1,76 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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. + +// [START classroom_get_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Get Invitation API. */ +public class GetInvitation { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Retrieves an invitation. + * + * @param id - the identifier of the invitation to retrieve. + * @return the specified invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation getInvitation(String id) throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_invitation_code_snippet] + Invitation invitation = null; + try { + invitation = service.invitations().get(id).execute(); + System.out.printf( + "Invitation (%s) for user (%s) in course (%s) retrieved.\n", + invitation.getId(), invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + // [END classroom_get_invitation_code_snippet] + } +} +// [END classroom_get_invitation] diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java index 140a0407..5fb42012 100644 --- a/classroom/snippets/src/main/java/GetTopic.java +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -12,24 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_get_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to get a topic. */ public class GetTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Get a topic in a course. * @@ -37,22 +42,20 @@ public class GetTopic { * @param topicId - the id of the topic to retrieve. * @return - the topic to retrieve. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic getTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Topic getTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_get_topic_code_snippet] @@ -62,13 +65,12 @@ public static Topic getTopic(String courseId, String topicId) throws IOException topic = service.courses().topics().get(courseId, topicId).execute(); System.out.printf("Topic '%s' found.\n", topic.getName()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); - } else { - throw e; } + throw e; } catch (Exception e) { throw e; } diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index c3141cf1..dbec2299 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -12,50 +12,51 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_aliases_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseAlias; import com.google.api.services.classroom.model.ListCourseAliasesResponse; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List Alias API */ public class ListCourseAliases { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieve the aliases for a course. * * @param courseId - id of the course. * @return list of course aliases * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listCourseAliases(String courseId) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_aliases_code_snippet] @@ -65,10 +66,14 @@ public static List listCourseAliases(String courseId) try { // List of aliases of specified course do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListCourseAliasesResponse response = + service + .courses() + .aliases() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); courseAliases.addAll(response.getAliases()); pageToken = response.getNextPageToken(); } while (pageToken != null); @@ -95,4 +100,4 @@ public static List listCourseAliases(String courseId) // [END classroom_list_aliases_code_snippet] } } -// [END classroom_list_aliases_class] \ No newline at end of file +// [END classroom_list_aliases_class] diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java index 5b7bd58f..c5a00b25 100644 --- a/classroom/snippets/src/main/java/ListCourses.java +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -12,57 +12,55 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_courses] -import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.ListCoursesResponse; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List Course API */ public class ListCourses { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieves all courses with metadata * * @return list of courses with its metadata * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static List listCourses() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static List listCourses() throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); String pageToken = null; List courses = new ArrayList<>(); try { do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListCoursesResponse response = + service.courses().list().setPageSize(100).setPageToken(pageToken).execute(); courses.addAll(response.getCourses()); pageToken = response.getNextPageToken(); } while (pageToken != null); @@ -82,4 +80,4 @@ public static List listCourses() throws IOException { return courses; } } -// [END classroom_list_courses] \ No newline at end of file +// [END classroom_list_courses] diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java index c5d8b29f..20e322a1 100644 --- a/classroom/snippets/src/main/java/ListStudentSubmissions.java +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -14,24 +14,29 @@ // [START classroom_list_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List StudentSubmissions API. */ public class ListStudentSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Retrieves a specific student's submissions for the specified course work. * @@ -40,26 +45,23 @@ public class ListStudentSubmissions { * @param userId - identifier of the student whose work to return. * @return - list of student submissions. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listStudentSubmissions( - String courseId, String courseWorkId, String userId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + String courseId, String courseWorkId, String userId) + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); // [START classroom_list_student_submissions_code_snippet] - List studentSubmissions = new ArrayList<>(); String pageToken = null; @@ -90,6 +92,7 @@ public static List listStudentSubmissions( System.out.printf("Student submission: %s.\n", submission.getId()); } } + // [END classroom_list_student_submissions_code_snippet] } catch (GoogleJsonResponseException e) { // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); @@ -104,9 +107,73 @@ public static List listStudentSubmissions( throw e; } return studentSubmissions; + } - // [END classroom_list_student_submissions_code_snippet] + /** + * Lists all assigned grades for a particular coursework item. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void listAssignedGrades(String courseId, String courseWorkId) + throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // [START classroom_list_assigned_grades_code_snippet] + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submissions found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf( + "User ID %s, Assigned grade: %s\n", + submission.getUserId(), submission.getAssignedGrade()); + } + } + // [END classroom_list_assigned_grades_code_snippet] + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } } } // [END classroom_list_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java index d5356d70..105c9b41 100644 --- a/classroom/snippets/src/main/java/ListSubmissions.java +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -14,24 +14,28 @@ // [START classroom_list_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List StudentSubmissions API. */ public class ListSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** * Retrieves submissions for all students for the specified course work in a course. * @@ -39,21 +43,18 @@ public class ListSubmissions { * @param courseWorkId - identifier of the course work. * @return - list of student submissions. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listSubmissions(String courseId, String courseWorkId) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index 6412a1cb..ea35cf90 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -14,44 +14,47 @@ // [START classroom_list_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListTopicResponse; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate how to list topics in a course. */ public class ListTopics { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * List topics in a course. * * @param courseId - the id of the course to retrieve topics for. * @return - the list of topics in the course that the caller is permitted to view. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static List listTopics(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + public static List listTopics(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); diff --git a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java index 252f51f5..d047ac2b 100644 --- a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java +++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java @@ -12,12 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_modify_attachments_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; @@ -26,14 +25,19 @@ import com.google.api.services.classroom.model.Link; import com.google.api.services.classroom.model.ModifyAttachmentsRequest; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate the use of Classroom ModifyAttachments StudentSubmissions API. */ public class ModifyAttachmentsStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Modify attachments on a student submission. * @@ -42,23 +46,20 @@ public class ModifyAttachmentsStudentSubmission { * @param id - identifier of the student submission. * @return - the modified student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, String id) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_modify_attachments_student_submissions_code_snippet] @@ -67,28 +68,34 @@ public static StudentSubmission modifyAttachments(String courseId, String course // Create ModifyAttachmentRequest object that includes a new attachment with a link. Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number"); Attachment attachment = new Attachment().setLink(link); - ModifyAttachmentsRequest modifyAttachmentsRequest = new ModifyAttachmentsRequest() - .setAddAttachments(Arrays.asList(attachment)); + ModifyAttachmentsRequest modifyAttachmentsRequest = + new ModifyAttachmentsRequest().setAddAttachments(Arrays.asList(attachment)); // The modified studentSubmission object is returned with the new attachment added to it. - studentSubmission = service.courses().courseWork().studentSubmissions().modifyAttachments( - courseId, courseWorkId, id, modifyAttachmentsRequest) - .execute(); + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .modifyAttachments(courseId, courseWorkId, id, modifyAttachmentsRequest) + .execute(); /* Prints the modified student submission. */ - System.out.printf("Modified student submission attachments: '%s'.\n", studentSubmission - .getAssignmentSubmission() - .getAttachments()); + System.out.printf( + "Modified student submission attachments: '%s'.\n", + studentSubmission.getAssignmentSubmission().getAttachments()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } - } catch(Exception e) { + } catch (Exception e) { throw e; } return studentSubmission; @@ -97,4 +104,4 @@ public static StudentSubmission modifyAttachments(String courseId, String course } } -// [END classroom_modify_attachments_student_submissions_class] \ No newline at end of file +// [END classroom_modify_attachments_student_submissions_class] diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java index e8c5d31b..05bc71ac 100644 --- a/classroom/snippets/src/main/java/PatchCourse.java +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -12,54 +12,53 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_patch_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Patch Course API */ public class PatchCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Updates one or more fields in a course. * * @param courseId - Id of the course to update. * @return updated course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course patchCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course patchCourse(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); Course course = null; try { - course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); + course = new Course().setSection("Period 3").setRoom("302"); + course = service.courses().patch(courseId, course).setUpdateMask("section,room").execute(); System.out.printf("Course '%s' updated.\n", course.getName()); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -73,4 +72,4 @@ public static Course patchCourse(String courseId) throws IOException { return course; } } -// [END classroom_patch_course] \ No newline at end of file +// [END classroom_patch_course] diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java index 1690ef8e..33ed5165 100644 --- a/classroom/snippets/src/main/java/PatchStudentSubmission.java +++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java @@ -12,24 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_patch_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Patch StudentSubmissions API. */ public class PatchStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** * Updates the draft grade and/or assigned grade of a student submission. * @@ -38,51 +42,59 @@ public class PatchStudentSubmission { * @param id - identifier of the student submission. * @return - the updated student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static StudentSubmission patchStudentSubmission(String courseId, String courseWorkId, - String id) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static StudentSubmission patchStudentSubmission( + String courseId, String courseWorkId, String id) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_patch_student_submissions_code_snippet] StudentSubmission studentSubmission = null; try { // Updating the draftGrade and assignedGrade fields for the specific student submission. - StudentSubmission content = service.courses().courseWork().studentSubmissions() - .get(courseId, courseWorkId, id) - .execute(); + StudentSubmission content = + service + .courses() + .courseWork() + .studentSubmissions() + .get(courseId, courseWorkId, id) + .execute(); content.setAssignedGrade(90.00); content.setDraftGrade(80.00); // The updated studentSubmission object is returned with the new draftGrade and assignedGrade. - studentSubmission = service.courses().courseWork().studentSubmissions() - .patch(courseId, courseWorkId, id, content) - .set("updateMask", "draftGrade,assignedGrade") - .execute(); + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .patch(courseId, courseWorkId, id, content) + .set("updateMask", "draftGrade,assignedGrade") + .execute(); /* Prints the updated student submission. */ - System.out.printf("Updated student submission draft grade (%s) and assigned grade (%s).\n", - studentSubmission.getDraftGrade(), - studentSubmission.getAssignedGrade()); + System.out.printf( + "Updated student submission draft grade (%s) and assigned grade (%s).\n", + studentSubmission.getDraftGrade(), studentSubmission.getAssignedGrade()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } @@ -95,4 +107,4 @@ public static StudentSubmission patchStudentSubmission(String courseId, String c } } -// [END classroom_patch_student_submissions_class] \ No newline at end of file +// [END classroom_patch_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java index 6b40fc96..61c891a0 100644 --- a/classroom/snippets/src/main/java/ReturnStudentSubmission.java +++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.java @@ -12,60 +12,67 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_return_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Return StudentSubmissions API. */ public class ReturnStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** - * Return a student submission back to the student which updates the submission state to `RETURNED`. + * Return a student submission back to the student which updates the submission state to + * `RETURNED`. * * @param courseId - identifier of the course. * @param courseWorkId - identifier of the course work. * @param id - identifier of the student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static void returnSubmission(String courseId, String courseWorkId, String id) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_return_student_submissions_code_snippet] try { - service.courses().courseWork().studentSubmissions() + service + .courses() + .courseWork() + .studentSubmissions() .classroomReturn(courseId, courseWorkId, id, null) .execute(); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java index 9e0d63ed..fdfd6062 100644 --- a/classroom/snippets/src/main/java/UpdateCourse.java +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -12,46 +12,47 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_update_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Update Course API */ public class UpdateCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); /** * Updates a course's metadata. * * @param courseId - Id of the course to update. * @return updated course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course updateCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course updateCourse(String courseId) throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { @@ -74,4 +75,4 @@ public static Course updateCourse(String courseId) throws IOException { return course; } } -// [END classroom_update_course] \ No newline at end of file +// [END classroom_update_course] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java index f45ffeca..e45c3cc8 100644 --- a/classroom/snippets/src/main/java/UpdateTopic.java +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -12,24 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_update_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to update one or more fields in a topic. */ public class UpdateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Update one or more fields in a topic in a course. * @@ -37,22 +42,19 @@ public class UpdateTopic { * @param topicId - the id of the topic to update. * @return - updated topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic updateTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - + public static Topic updateTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_update_topic_code_snippet] @@ -65,10 +67,14 @@ public static Topic updateTopic(String courseId, String topicId) throws IOExcept topicToUpdate.setName("Semester 2"); /* Call the patch endpoint and set the updateMask query parameter to the field that needs to - be updated. */ - topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) - .set("updateMask", "name") - .execute(); + be updated. */ + topic = + service + .courses() + .topics() + .patch(courseId, topicId, topicToUpdate) + .set("updateMask", "name") + .execute(); /* Prints the updated topic. */ System.out.printf("Topic '%s' updated.\n", topic.getName()); diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index b0c5286e..1b2eb04d 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -19,13 +19,11 @@ import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; -import java.util.Collections; -import java.util.List; -import org.junit.After; -import org.junit.Before; - import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.UUID; +import org.junit.After; // Base class for integration tests. public class BaseTest { @@ -38,10 +36,11 @@ public class BaseTest { * @return an authorized Classroom client service * @throws IOException - if credentials file not found. */ - protected Classroom buildService() throws Exception { + protected Classroom buildService(ArrayList SCOPES) + throws GeneralSecurityException, IOException { /* Scopes required by this API call. If modifying these scopes, delete your previously saved tokens/ folder. */ - final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES); + SCOPES.add(ClassroomScopes.CLASSROOM_COURSES); // Create the classroom API client final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); @@ -54,16 +53,17 @@ protected Classroom buildService() throws Exception { .build(); } - @Before - public void setup() throws Exception { - this.service = buildService(); + public void setup(ArrayList scopes) throws GeneralSecurityException, IOException { + this.service = buildService(scopes); this.testCourse = CreateCourse.createCourse(); createAlias(this.testCourse.getId()); } @After public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); + if (this.testCourse != null) { + deleteCourse(this.testCourse.getId()); + } this.testCourse = null; } diff --git a/classroom/snippets/src/test/java/TestAcceptInvitation.java b/classroom/snippets/src/test/java/TestAcceptInvitation.java new file mode 100644 index 00000000..98a6fec3 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAcceptInvitation.java @@ -0,0 +1,39 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.googleapis.json.GoogleJsonResponseException; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestAcceptInvitation { + + private String invitationId = "insert_invitation_id"; + + @Test + public void testAcceptInvitation() throws GeneralSecurityException, IOException { + AcceptInvitation.acceptInvitation(invitationId); + /* Once an invitation is accepted, it is removed and the user is added to the course as a + teacher or a student. */ + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitationId)); + } + + @Test + public void testAcceptInvitationWithInvalidId() { + Assert.assertThrows( + GoogleJsonResponseException.class, () -> AcceptInvitation.acceptInvitation("invalid-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestAddAliasToCourse.java b/classroom/snippets/src/test/java/TestAddAliasToCourse.java index c5b85777..4eb659eb 100644 --- a/classroom/snippets/src/test/java/TestAddAliasToCourse.java +++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.CourseAlias; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,13 +23,13 @@ public class TestAddAliasToCourse extends BaseTest { @Test - public void testAddCourseAlias() throws IOException { + public void testAddCourseAlias() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddAliasToCourse.SCOPES); CourseAlias courseAlias = AddAliasToCourse.addAliasToCourse(testCourse.getId()); - List courseAliases = service.courses().aliases() - .list(testCourse.getId() - ).execute() - .getAliases(); + List courseAliases = + service.courses().aliases().list(testCourse.getId()).execute().getAliases(); Assert.assertNotNull("Course alias not returned.", courseAlias); Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java index f023989a..2b185c9a 100644 --- a/classroom/snippets/src/test/java/TestAddStudent.java +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -12,22 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.Student; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Add Student classroom snippet public class TestAddStudent extends BaseTest { + private String studentId = "insert_student_id"; + @Test - public void testAddStudent() throws IOException { - Course course = CreateCourse.createCourse(); - Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); - deleteCourse(course.getId()); + public void testAddStudent() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddStudent.SCOPES); + Student student = + AddStudent.addStudent(testCourse.getId(), testCourse.getEnrollmentCode(), this.studentId); Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); + Assert.assertNotNull("Course not returned.", student.getCourseId()); + Assert.assertEquals( + "Student added to wrong course.", testCourse.getId(), student.getCourseId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java index f2846ddf..58eaae57 100644 --- a/classroom/snippets/src/test/java/TestAddTeacher.java +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -13,19 +13,23 @@ // limitations under the License. import com.google.api.services.classroom.model.Teacher; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Add Teacher classroom snippet public class TestAddTeacher extends BaseTest { - private String otherUser = "gduser1@workspacesamples.dev"; + + private String teacherEmail = "insert_teacher_email"; @Test - public void testAddTeacher() throws IOException { - Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + public void testAddTeacher() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddTeacher.SCOPES); + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.teacherEmail); Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), - teacher.getCourseId()); + Assert.assertEquals( + "Teacher added to wrong course.", testCourse.getId(), teacher.getCourseId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java index 04ee930e..1f66874a 100644 --- a/classroom/snippets/src/test/java/TestBatchAddStudents.java +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -12,18 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.List; +import org.junit.Test; // Unit test class for Batch Add Students classroom snippet public class TestBatchAddStudents extends BaseTest { @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", - "gduser3@workpsacesamples.dev"); + public void testBatchAddStudents() throws GeneralSecurityException, IOException { + setup(BatchAddStudents.SCOPES); + List studentEmails = Arrays.asList("insert_student_1_email", "insert_student_2_email"); BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java index 381f2c2c..a251f15c 100644 --- a/classroom/snippets/src/test/java/TestCreateCourse.java +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -13,15 +13,18 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Create Course classroom snippet public class TestCreateCourse extends BaseTest { @Test - public void testCreateCourse() throws IOException { + public void testCreateCourse() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourse.SCOPES); Course course = CreateCourse.createCourse(); Assert.assertNotNull("Course not returned.", course); deleteCourse(course.getId()); diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java index 5152b984..2d906fbf 100644 --- a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java +++ b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java @@ -15,6 +15,7 @@ import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -23,14 +24,13 @@ public class TestCreateCourseWithAlias extends BaseTest { @Test - public void testCreateCourseWithAlias() throws IOException { + public void testCreateCourseWithAlias() throws GeneralSecurityException, IOException { + setup(CreateCourseWithAlias.SCOPES); Course course = CreateCourseWithAlias.createCourseWithAlias(); - List courseAliases = service.courses().aliases() - .list(course.getId() - ).execute() - .getAliases(); + List courseAliases = + service.courses().aliases().list(course.getId()).execute().getAliases(); Assert.assertNotNull("Course not returned.", course); Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); deleteCourse(course.getId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java index e3a25b6b..5a160af0 100644 --- a/classroom/snippets/src/test/java/TestCreateCourseWork.java +++ b/classroom/snippets/src/test/java/TestCreateCourseWork.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.CourseWork; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,9 @@ public class TestCreateCourseWork extends BaseTest { @Test - public void testCreateCoursework() throws IOException { + public void testCreateCoursework() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourseWork.SCOPES); CourseWork courseWork = CreateCourseWork.createCourseWork(testCourse.getId()); Assert.assertNotNull("Coursework not returned.", courseWork); } diff --git a/classroom/snippets/src/test/java/TestCreateInvitation.java b/classroom/snippets/src/test/java/TestCreateInvitation.java new file mode 100644 index 00000000..13095342 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateInvitation.java @@ -0,0 +1,43 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestCreateInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testCreateInvitation() throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + Assert.assertNotNull("Invitation not created", invitation); + Assert.assertEquals(invitation.getCourseId(), testCourse.getId()); + Assert.assertEquals(invitation.getUserId(), userId); + } + + @Test + public void testCreateInvitationWithInvalidCourseId() + throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> CreateInvitation.createInvitation("invalid-course-id", userId)); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateTopic.java b/classroom/snippets/src/test/java/TestCreateTopic.java index e2d77586..381921d9 100644 --- a/classroom/snippets/src/test/java/TestCreateTopic.java +++ b/classroom/snippets/src/test/java/TestCreateTopic.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,8 @@ public class TestCreateTopic extends BaseTest { @Test - public void testCreateTopic() throws IOException { + public void testCreateTopic() throws GeneralSecurityException, IOException { + setup(CreateTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); Assert.assertNotNull("Topic not returned.", topic); } diff --git a/classroom/snippets/src/test/java/TestDeleteInvitation.java b/classroom/snippets/src/test/java/TestDeleteInvitation.java new file mode 100644 index 00000000..84448189 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteInvitation.java @@ -0,0 +1,42 @@ +// Copyright 2023 Google LLC +// +// 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 +// +// https://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.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testDeleteInvitation() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + DeleteInvitation.deleteInvitation(invitation.getId()); + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitation.getId())); + } + + @Test + public void testDeleteInvitationWithInvalidId() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> DeleteInvitation.deleteInvitation("invalid-invitation-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteTopic.java b/classroom/snippets/src/test/java/TestDeleteTopic.java index b093865c..bffff20d 100644 --- a/classroom/snippets/src/test/java/TestDeleteTopic.java +++ b/classroom/snippets/src/test/java/TestDeleteTopic.java @@ -15,15 +15,19 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; public class TestDeleteTopic extends BaseTest { + @Test - public void testDeleteTopic() throws IOException { + public void testDeleteTopic() throws GeneralSecurityException, IOException { + setup(DeleteTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); DeleteTopic.deleteTopic(testCourse.getId(), topic.getTopicId()); - Assert.assertThrows(GoogleJsonResponseException.class, + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetTopic.getTopic(testCourse.getId(), topic.getTopicId())); } } diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java index c43059f7..ac95bda5 100644 --- a/classroom/snippets/src/test/java/TestGetCourse.java +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Get Course classroom snippet public class TestGetCourse extends BaseTest { @Test - public void testGetCourse() throws IOException { + public void testGetCourse() throws GeneralSecurityException, IOException { + setup(GetCourse.SCOPES); Course course = GetCourse.getCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java index b7cb7840..39775ff2 100644 --- a/classroom/snippets/src/test/java/TestGetTopic.java +++ b/classroom/snippets/src/test/java/TestGetTopic.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,8 @@ public class TestGetTopic extends BaseTest { @Test - public void testGetTopic() throws IOException { + public void testGetTopic() throws GeneralSecurityException, IOException { + setup(GetTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); Topic getTopic = GetTopic.getTopic(testCourse.getId(), topic.getTopicId()); Assert.assertNotNull("Topic could not be created.", topic); diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java index f18c1cce..d3e357b5 100644 --- a/classroom/snippets/src/test/java/TestListCourseAliases.java +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -13,17 +13,19 @@ // limitations under the License. import com.google.api.services.classroom.model.CourseAlias; -import org.junit.Assert; -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Assert; +import org.junit.Test; // Unit test class for List Course Aliases classroom snippet public class TestListCourseAliases extends BaseTest { @Test - public void testListCourseAliases() throws IOException { + public void testListCourseAliases() throws GeneralSecurityException, IOException { + setup(ListCourseAliases.SCOPES); List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java index fe254b76..7a4dd553 100644 --- a/classroom/snippets/src/test/java/TestListCourses.java +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -13,16 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; -import org.junit.Assert; -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Assert; +import org.junit.Test; // Unit test class for List Course classroom snippet public class TestListCourses { @Test - public void testListCourses() throws IOException { + public void testListCourses() throws GeneralSecurityException, IOException { List courses = ListCourses.listCourses(); Assert.assertTrue("No courses returned.", courses.size() > 0); } diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java index 148e9529..1649e926 100644 --- a/classroom/snippets/src/test/java/TestListSubmissions.java +++ b/classroom/snippets/src/test/java/TestListSubmissions.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.StudentSubmission; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,10 +23,9 @@ public class TestListSubmissions extends BaseTest { @Test - public void testListSubmissions() throws IOException { - List submissions = ListSubmissions.listSubmissions( - testCourse.getId(), - "-"); + public void testListSubmissions() throws GeneralSecurityException, IOException { + setup(ListSubmissions.SCOPES); + List submissions = ListSubmissions.listSubmissions(testCourse.getId(), "-"); Assert.assertNotNull("No submissions returned.", submissions); } } diff --git a/classroom/snippets/src/test/java/TestListTopics.java b/classroom/snippets/src/test/java/TestListTopics.java index 081be57b..f0b0bc85 100644 --- a/classroom/snippets/src/test/java/TestListTopics.java +++ b/classroom/snippets/src/test/java/TestListTopics.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,7 +23,8 @@ public class TestListTopics extends BaseTest { @Test - public void testListTopics() throws IOException { + public void testListTopics() throws GeneralSecurityException, IOException { + setup(ListTopics.SCOPES); CreateTopic.createTopic(testCourse.getId()); List listTopics = ListTopics.listTopics(testCourse.getId()); Assert.assertNotNull("Topics could not be retrieved.", listTopics); diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java index 51e05a43..a7d0d92f 100644 --- a/classroom/snippets/src/test/java/TestPatchCourse.java +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Patch Course classroom snippet public class TestPatchCourse extends BaseTest { @Test - public void testPatchCourse() throws IOException { + public void testPatchCourse() throws GeneralSecurityException, IOException { + setup(PatchCourse.SCOPES); Course course = PatchCourse.patchCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java index f5e0080d..3c7cbda2 100644 --- a/classroom/snippets/src/test/java/TestUpdateCourse.java +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Update Course classroom snippet public class TestUpdateCourse extends BaseTest { @Test - public void testUpdateCourse() throws IOException { + public void testUpdateCourse() throws GeneralSecurityException, IOException { + setup(UpdateCourse.SCOPES); Course course = UpdateCourse.updateCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java index 5b1b9eec..3144ff2d 100644 --- a/classroom/snippets/src/test/java/TestUpdateTopic.java +++ b/classroom/snippets/src/test/java/TestUpdateTopic.java @@ -11,15 +11,19 @@ // 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.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; // Unit test class for Update Topic classroom snippet public class TestUpdateTopic extends BaseTest { + @Test - public void testUpdateTopic() throws IOException { + public void testUpdateTopic() throws GeneralSecurityException, IOException { + setup(UpdateTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); System.out.println("New topic created: " + topic.getName()); Topic updatedTopic = UpdateTopic.updateTopic(testCourse.getId(), topic.getTopicId()); From e3102ab486f0c278d7d0fcc020f6dea02e286b3e Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Tue, 2 May 2023 11:06:51 -0600 Subject: [PATCH 240/254] fix: correct typo (#634) --- calendar/quickstart/src/main/java/CalendarQuickstart.java | 2 +- docs/quickstart/src/main/java/DocsQuickstart.java | 2 +- .../quickstart/src/main/java/DriveActivityQuickstart.java | 2 +- drive/quickstart/src/main/java/DriveQuickstart.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index 3eb09e6d..19a50114 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -38,7 +38,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Calendar events list API */ +/* class to demonstrate use of Calendar events list API */ public class CalendarQuickstart { /** * Application name. diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index 431c8394..531e044b 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Docs get documents API */ +/* class to demonstrate use of Docs get documents API */ public class DocsQuickstart { /** * Application name. diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index e72a2c24..4a5e4657 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -34,7 +34,7 @@ import java.util.Arrays; import java.util.List; -/* class to demonstarte use of Drive Activity list API */ +/* class to demonstrate use of Drive Activity list API */ public class DriveActivityQuickstart { /** * Application name. diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index c88f9063..62db72b8 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Drive files list API */ +/* class to demonstrate use of Drive files list API */ public class DriveQuickstart { /** * Application name. From d492e92baf7a23b54b54b36f6f7fc386a28dfd14 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Thu, 7 Mar 2024 12:02:45 -0700 Subject: [PATCH 241/254] Feat: Meet API quickstart --- meet/README.md | 1 + meet/quickstart/build.gradle | 17 ++ meet/quickstart/settings.gradle | 18 ++ .../src/main/java/MeetQuickstart.java | 174 ++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 meet/README.md create mode 100644 meet/quickstart/build.gradle create mode 100644 meet/quickstart/settings.gradle create mode 100644 meet/quickstart/src/main/java/MeetQuickstart.java diff --git a/meet/README.md b/meet/README.md new file mode 100644 index 00000000..edc158da --- /dev/null +++ b/meet/README.md @@ -0,0 +1 @@ +Additional samples can be found at https://github.com/googleapis/google-cloud-java/tree/main/java-meet/google-cloud-meet \ No newline at end of file diff --git a/meet/quickstart/build.gradle b/meet/quickstart/build.gradle new file mode 100644 index 00000000..fbb8bc29 --- /dev/null +++ b/meet/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'MeetQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.cloud:google-cloud-meet:0.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.19.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/meet/quickstart/settings.gradle b/meet/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/meet/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/meet/quickstart/src/main/java/MeetQuickstart.java b/meet/quickstart/src/main/java/MeetQuickstart.java new file mode 100644 index 00000000..cd8aec6b --- /dev/null +++ b/meet/quickstart/src/main/java/MeetQuickstart.java @@ -0,0 +1,174 @@ +// Copyright 2024 Google LLC +// +// 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. + +// [START meet_quickstart] + +import java.awt.Desktop; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; + +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.apps.meet.v2.CreateSpaceRequest; +import com.google.apps.meet.v2.Space; +import com.google.apps.meet.v2.SpacesServiceClient; +import com.google.apps.meet.v2.SpacesServiceSettings; +import com.google.auth.Credentials; +import com.google.auth.oauth2.ClientId; +import com.google.auth.oauth2.DefaultPKCEProvider; +import com.google.auth.oauth2.TokenStore; +import com.google.auth.oauth2.UserAuthorizer; + +/* class to demonstrate use of Drive files list API */ +public class MeetQuickstart { + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections + .singletonList("https://www.googleapis.com/auth/meetings.space.created"); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + private static final String USER = "default"; + + // Simple file-based token storage for storing oauth tokens + private static final TokenStore TOKEN_STORE = new TokenStore() { + private Path pathFor(String id) { + return Paths.get(".", TOKENS_DIRECTORY_PATH, id + ".json"); + } + + @Override + public String load(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return null; + } + return Files.readString(pathFor(id)); + } + + @Override + public void store(String id, String token) throws IOException { + Files.createDirectories(Paths.get(".", TOKENS_DIRECTORY_PATH)); + Files.writeString(pathFor(id), token); + } + + @Override + public void delete(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return; + } + Files.delete(pathFor(id)); + } + }; + + /** + * Initialize a UserAuthorizer for local authorization. + * + * @param callbackUri + * @return + */ + private static UserAuthorizer getAuthorizer(URI callbackUri) throws IOException { + // Load client secrets. + try (InputStream in = MeetQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH)) { + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + ClientId clientId = ClientId.fromStream(in); + + UserAuthorizer authorizer = UserAuthorizer.newBuilder() + .setClientId(clientId) + .setCallbackUri(callbackUri) + .setScopes(SCOPES) + .setPKCEProvider(new DefaultPKCEProvider() { + // Temporary fix for https://github.com/googleapis/google-auth-library-java/issues/1373 + @Override + public String getCodeChallenge() { + return super.getCodeChallenge().split("=")[0]; + } + }) + .setTokenStore(TOKEN_STORE).build(); + return authorizer; + } + } + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() + throws Exception { + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().build(); + try { + URI callbackUri = URI.create(receiver.getRedirectUri()); + UserAuthorizer authorizer = getAuthorizer(callbackUri); + + Credentials credentials = authorizer.getCredentials(USER); + if (credentials != null) { + return credentials; + } + + URL authorizationUrl = authorizer.getAuthorizationUrl(USER, "", null); + if (Desktop.isDesktopSupported() && + Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Desktop.getDesktop().browse(authorizationUrl.toURI()); + } else { + System.out.printf("Open the following URL to authorize access: %s\n", + authorizationUrl.toExternalForm()); + } + + String code = receiver.waitForCode(); + credentials = authorizer.getAndStoreCredentialsFromCode(USER, code, callbackUri); + return credentials; + } finally { + receiver.stop(); + } + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + SpacesServiceSettings settings = SpacesServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (SpacesServiceClient spacesServiceClient = SpacesServiceClient.create(settings)) { + CreateSpaceRequest request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder().build()) + .build(); + Space response = spacesServiceClient.createSpace(request); + System.out.printf("Space created: %s\n", response.getMeetingUri()); + } catch (IOException e) { + // TODO(developer): Handle errors + e.printStackTrace(); + } + } +} +// [END meet_quickstart] From 86d64446787b80185a0e900f6766e69acb974327 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 1 Aug 2024 14:42:33 -0400 Subject: [PATCH 242/254] feat: Add Google Chat API quickstart (#1061) * feat: Add Google Chat API quickstart * Fix Google Style --------- Co-authored-by: pierrick --- chat/quickstart/README.md | 12 ++ chat/quickstart/build.gradle | 20 +++ chat/quickstart/settings.gradle | 18 +++ .../src/main/java/ChatQuickstart.java | 130 ++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 chat/quickstart/README.md create mode 100644 chat/quickstart/build.gradle create mode 100644 chat/quickstart/settings.gradle create mode 100644 chat/quickstart/src/main/java/ChatQuickstart.java diff --git a/chat/quickstart/README.md b/chat/quickstart/README.md new file mode 100644 index 00000000..ccae2e71 --- /dev/null +++ b/chat/quickstart/README.md @@ -0,0 +1,12 @@ +# Google Chat Java Quickstart + +Complete the steps described in the [quickstart instructions]( +https://developers.google.com/workspace/chat/api/guides/quickstart/java), +and in about five minutes you'll have a simple Java command-line +application that makes requests to the Google Chat API. + +## Run + +After following the quickstart setup instructions, run the sample: + +`gradle run` diff --git a/chat/quickstart/build.gradle b/chat/quickstart/build.gradle new file mode 100644 index 00000000..a1a7d7ef --- /dev/null +++ b/chat/quickstart/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'ChatQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/quickstart/settings.gradle b/chat/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/chat/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/chat/quickstart/src/main/java/ChatQuickstart.java b/chat/quickstart/src/main/java/ChatQuickstart.java new file mode 100644 index 00000000..4956be1d --- /dev/null +++ b/chat/quickstart/src/main/java/ChatQuickstart.java @@ -0,0 +1,130 @@ +// Copyright 2024 Google LLC +// +// 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. + +// [START chat_quickstart] + +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.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.auth.Credentials; +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.UserCredentials; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.util.JsonFormat; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/* class to demonstrate use of Google Chat API spaces list API */ +public class ChatQuickstart { + /** Directory to store authorization tokens for this application. */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList("https://www.googleapis.com/auth/chat.spaces.readonly"); + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() throws Exception { + // Load client secrets. + InputStream credentialsFileInputStream = + ChatQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (credentialsFileInputStream == null) { + throw new FileNotFoundException("Credentials file resource not found."); + } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(credentialsFileInputStream)); + + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, clientSecrets, SCOPES) + // Set these two options to generate refresh token alongside access token. + .setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + // Authorize. + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + + // Build and return an authorized Credential object + AccessToken accessToken = + new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + return UserCredentials.newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (ChatServiceClient chatServiceClient = ChatServiceClient.create(chatServiceSettings)) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_quickstart] From b59745f664d959d3d39fdf1b935d812e67c01c13 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:24:09 -0400 Subject: [PATCH 243/254] feat: add Cloud Client library samples for Chat (#1078) * feat: add Cloud Client library samples for Chat * README improvements --------- Co-authored-by: pierrick --- chat/client-libraries/cloud/README.md | 28 ++++ chat/client-libraries/cloud/build.gradle | 20 +++ chat/client-libraries/cloud/pom.xml | 59 +++++++++ .../api/chat/samples/AuthenticationUtils.java | 121 ++++++++++++++++++ .../samples/CreateMembershipUserCred.java | 60 +++++++++ .../CreateMembershipUserCredForApp.java | 60 +++++++++ .../chat/samples/CreateMessageAppCred.java | 46 +++++++ .../CreateMessageAppCredAtMention.java | 50 ++++++++ .../CreateMessageAppCredWithCards.java | 66 ++++++++++ .../chat/samples/CreateMessageUserCred.java | 52 ++++++++ .../CreateMessageUserCredWithMessageId.java | 56 ++++++++ .../CreateMessageUserCredWithRequestId.java | 55 ++++++++ .../CreateMessageUserCredWithThreadKey.java | 61 +++++++++ .../CreateMessageUserCredWithThreadName.java | 62 +++++++++ .../chat/samples/DeleteMessageAppCred.java | 38 ++++++ .../chat/samples/DeleteMessageUserCred.java | 44 +++++++ .../chat/samples/GetMembershipAppCred.java | 42 ++++++ .../chat/samples/GetMembershipUserCred.java | 47 +++++++ .../api/chat/samples/GetMessageAppCred.java | 42 ++++++ .../api/chat/samples/GetMessageUserCred.java | 47 +++++++ .../api/chat/samples/GetSpaceAppCred.java | 42 ++++++ .../api/chat/samples/GetSpaceUserCred.java | 47 +++++++ .../chat/samples/ListMembershipsAppCred.java | 51 ++++++++ .../chat/samples/ListMembershipsUserCred.java | 56 ++++++++ .../chat/samples/ListMessagesUserCred.java | 53 ++++++++ .../api/chat/samples/ListSpacesAppCred.java | 49 +++++++ .../api/chat/samples/ListSpacesUserCred.java | 54 ++++++++ .../chat/samples/UpdateMessageAppCred.java | 51 ++++++++ .../chat/samples/UpdateMessageUserCred.java | 56 ++++++++ .../api/chat/samples/UpdateSpaceUserCred.java | 56 ++++++++ 30 files changed, 1571 insertions(+) create mode 100644 chat/client-libraries/cloud/README.md create mode 100644 chat/client-libraries/cloud/build.gradle create mode 100644 chat/client-libraries/cloud/pom.xml create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java diff --git a/chat/client-libraries/cloud/README.md b/chat/client-libraries/cloud/README.md new file mode 100644 index 00000000..7ec1fce9 --- /dev/null +++ b/chat/client-libraries/cloud/README.md @@ -0,0 +1,28 @@ +# Google Chat API - Cloud Client library samples + +## Set up + +Add `service_account.json` and/or `client_secrets.json` to the current +folder depending on the credentials used by the samples to run: + +1. `service_account.json` for + [app credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-app) + +1. `client_secrets.json` for + [user credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user) + +## Run with Maven + +Execute +`mvn exec:java -Dexec.mainClass="replace.with.the.sample.mainClass"` +wih the main class of the sample. + +For example, to run the sample `CreateMessageAppCred`, run +`mvn exec:java -Dexec.mainClass="com.google.workspace.api.chat.samples.CreateMessageAppCred"`. + +## Run with Gradle + +Execute `gradle run` after setting the main class of the sample in the `build.gradle` file. + +For example, to run the sample `CreateMessageAppCred`, use +`com.google.workspace.api.chat.samples.CreateMessageAppCred`. diff --git a/chat/client-libraries/cloud/build.gradle b/chat/client-libraries/cloud/build.gradle new file mode 100644 index 00000000..470b5e81 --- /dev/null +++ b/chat/client-libraries/cloud/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'com.google.workspace.api.chat.samples.CreateMessageAppCred' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.apis:google-api-services-chat:v1-rev20240509-2.0.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/client-libraries/cloud/pom.xml b/chat/client-libraries/cloud/pom.xml new file mode 100644 index 00000000..06af9826 --- /dev/null +++ b/chat/client-libraries/cloud/pom.xml @@ -0,0 +1,59 @@ + + 4.0.0 + + com.google.workspace.api.chat.samples + chat-api-samples + 0.0.1 + Google API Client Library Chat Samples For Java + + + + 21 + 1.8 + 1.8 + + + + + + + com.google.auth + google-auth-library-oauth2-http + 1.23.0 + + + com.google.oauth-client + google-oauth-client-jetty + 1.34.1 + + + + + + com.google.apis + google-api-services-chat + v1-rev20240509-2.0.0 + + + + + + com.google.api.grpc + proto-google-cloud-chat-v1 + 0.8.0 + + + com.google.api + gax + 2.48.1 + + + + com.google.cloud + google-cloud-chat + 0.1.0 + + + + + diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java new file mode 100644 index 00000000..5ffd2ff2 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java @@ -0,0 +1,121 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.google.auth.oauth2.UserCredentials; +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.json.gson.GsonFactory; +import com.google.api.client.json.JsonFactory; +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.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.common.collect.ImmutableList; + +import java.io.FileInputStream; +import java.io.FileReader; +import java.util.Collections; +import java.util.Date; + +public class AuthenticationUtils{ + + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String SERVICE_ACCOUNT_FILE = "service_account.json"; + private static final String CLIENT_SECRET_FILE = "client_secrets.json"; + private static final String APP_AUTH_OAUTH_SCOPE = + "https://www.googleapis.com/auth/chat.bot"; + + public static ChatServiceClient createClientWithAppCredentials() + throws Exception { + // For more information on service account authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-app + GoogleCredentials credential = ServiceAccountCredentials.fromStream( + new FileInputStream(SERVICE_ACCOUNT_FILE)) + .createScoped(ImmutableList.of(APP_AUTH_OAUTH_SCOPE)); + + // Create the ChatServiceSettings with the app credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(credential)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + public static ChatServiceClient createClientWithUserCredentials( + ImmutableList scopes) throws Exception { + // For more information on user authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-user + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( + JSON_FACTORY, new FileReader(CLIENT_SECRET_FILE)); + + Credential credential = authorize(scopes, clientSecrets); + + AccessToken accessToken = new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + UserCredentials googleCredentials = + UserCredentials + .newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings + .newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(googleCredentials)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + // Generate access token and refresh token using scopes and client secrets. + private static Credential authorize( + ImmutableList scopes, GoogleClientSecrets clientSecrets) + throws Exception { + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JSON_FACTORY, + clientSecrets, + scopes) + // Set these two options to generate refresh token alongside access token. + .setAccessType("offline") + .setApprovalPrompt("force") + .build(); + + // Authorize. + return new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + } +} diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java new file mode 100644 index 00000000..790a05eb --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMembershipUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for a human +// user. +public class CreateMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest request = + CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership( + Membership.newBuilder() + .setMember( + User.newBuilder() + // replace USER_NAME here + .setName("users/USER_NAME") + // user type for the membership + .setType(User.Type.HUMAN) + .build()) + .build()) + .build(); + Membership response = chatServiceClient.createMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMembershipUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java new file mode 100644 index 00000000..e751f20b --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMembershipUserCredForApp] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for the +// calling app. +public class CreateMembershipUserCredForApp { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.app"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest request = + CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership( + Membership.newBuilder() + .setMember( + User.newBuilder() + // member name for app membership, do not change this. + .setName("users/app") + // user type for the membership + .setType(User.Type.BOT) + .build()) + .build()) + .build(); + Membership response = chatServiceClient.createMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMembershipUserCredForApp] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java new file mode 100644 index 00000000..24b85bca --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -0,0 +1,46 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with app credential. +public class CreateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with app credentials!") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java new file mode 100644 index 00000000..b8fb8291 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java @@ -0,0 +1,50 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCredAtMention] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message that mentions a user with app +// credential. +public class CreateMessageAppCredAtMention { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + // The user with USER_NAME will be mentioned if they are in the + // space. + // Replace USER_NAME here + .setText("Hello !") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCredAtMention] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java new file mode 100644 index 00000000..c47e3169 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java @@ -0,0 +1,66 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCredWithCards] +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.apps.card.v1.Card.Section; +import com.google.apps.card.v1.TextParagraph; +import com.google.apps.card.v1.Widget; +import com.google.chat.v1.CardWithId; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with a card with app credential. +public class CreateMessageAppCredWithCards { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with app credentials!") + .addCardsV2( + CardWithId.newBuilder().setCard( + Card.newBuilder() + .addSections( + Section.newBuilder() + .addWidgets( + Widget.newBuilder() + .setTextParagraph( + TextParagraph.newBuilder().setText("Hello")) + .build()) + .build()) + .build() + ) + ) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCredWithCards] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java new file mode 100644 index 00000000..fe08c4b1 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with user credential. +public class CreateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message + .newBuilder() + .setText("Hello with user credentials!") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java new file mode 100644 index 00000000..0e37bbe3 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithMessageId] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with message id specified with user +// credential. +public class CreateMessageUserCredWithMessageId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + .build()) + // Message ID lets chat apps get, update or delete a message without + // needing to store the system assigned ID in the message's resource + // name. + .setMessageId("client-MESSAGE-ID") + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithMessageId] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java new file mode 100644 index 00000000..fe46232a --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java @@ -0,0 +1,55 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithRequestId] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with request id specified with user +// credential. +public class CreateMessageUserCredWithRequestId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + .build()) + // Specifying an existing request ID returns the message created with + // that ID instead of creating a new message. + .setRequestId("REQUEST_ID") + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithRequestId] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java new file mode 100644 index 00000000..40aa327f --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithThreadKey] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with a thread key with user +// credential. +public class CreateMessageUserCredWithThreadKey { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread_key. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + // Thread key specifies a thread and is unique to the chat app + // that sets it. + .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY").build()) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithThreadKey] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java new file mode 100644 index 00000000..3c8f10c5 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithThreadName] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with thread name specified with user +// credential. +public class CreateMessageUserCredWithThreadName { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread name. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + // Resource name of a thread that uniquely identify a thread. + .setThread(Thread.newBuilder().setName( + // replace SPACE_NAME and THREAD_NAME here + "spaces/SPACE_NAME/threads/THREAD_NAME").build()) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithThreadName] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java new file mode 100644 index 00000000..66e44af8 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -0,0 +1,38 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +// [START chat_DeleteMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; + +// This sample shows how to delete message with app credential. +public class DeleteMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + DeleteMessageRequest request = + DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .build(); + chatServiceClient.deleteMessage(request); + } + } +} +// [END chat_DeleteMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java new file mode 100644 index 00000000..43f7f713 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +// [START chat_DeleteMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; +import com.google.chat.v1.SpaceName; + +// This sample shows how to delete message with user credential. +public class DeleteMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + DeleteMessageRequest request = + DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .build(); + chatServiceClient.deleteMessage(request); + } + } +} +// [END chat_DeleteMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java new file mode 100644 index 00000000..fd5bb8ca --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMembershipAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with app credential. +public class GetMembershipAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMembershipRequest request = + GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") + .build(); + Membership response = chatServiceClient.getMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMembershipAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java new file mode 100644 index 00000000..d4cb18d5 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMembershipUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with user credential. +public class GetMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMembershipRequest request = + GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") + .build(); + Membership response = chatServiceClient.getMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMembershipUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java new file mode 100644 index 00000000..c505680e --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with app credential. +public class GetMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMessageRequest request = + GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") + .build(); + Message response = chatServiceClient.getMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java new file mode 100644 index 00000000..e58872d6 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with user credential. +public class GetMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMessageRequest request = + GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") + .build(); + Message response = chatServiceClient.getMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java new file mode 100644 index 00000000..df5da3d4 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetSpaceAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with app credential. +public class GetSpaceAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetSpaceRequest request = + GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME") + .build(); + Space response = chatServiceClient.getSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetSpaceAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java new file mode 100644 index 00000000..e9ed0a45 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetSpaceUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with user credential. +public class GetSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetSpaceRequest request = + GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME") + .build(); + Space response = chatServiceClient.getSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetSpaceUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java new file mode 100644 index 00000000..cae23771 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMembershipsAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with app credential. +public class ListMembershipsAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListMembershipsRequest request = + ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMembershipsAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java new file mode 100644 index 00000000..d60e2725 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMembershipsUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with user credential. +public class ListMembershipsUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMembershipsRequest request = + ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterating over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMembershipsUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java new file mode 100644 index 00000000..1a984607 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -0,0 +1,53 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMessagesUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMessagesRequest; +import com.google.chat.v1.ListMessagesResponse; +import com.google.chat.v1.Message; + +// This sample shows how to list messages with user credential. +public class ListMessagesUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMessagesRequest request = + ListMessagesRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Message response : + chatServiceClient.listMessages(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMessagesUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java new file mode 100644 index 00000000..00494729 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -0,0 +1,49 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_ListSpacesAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with app credential. +public class ListSpacesAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListSpacesAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java new file mode 100644 index 00000000..2d9410aa --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListSpacesUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with user credential. +public class ListSpacesUserCred{ + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListSpacesUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java new file mode 100644 index 00000000..5f946545 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with app credential. +public class UpdateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + UpdateMessageRequest request = + UpdateMessageRequest.newBuilder() + .setMessage( + Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with app credential!") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("text").build()) + .build(); + Message response = chatServiceClient.updateMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java new file mode 100644 index 00000000..9f2dd016 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with user credential. +public class UpdateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateMessageRequest request = + UpdateMessageRequest.newBuilder() + .setMessage( + Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with user credential!") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("text").build()) + .build(); + Message response = chatServiceClient.updateMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java new file mode 100644 index 00000000..cd5d67cd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateSpaceUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateSpaceRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.FieldMask; + +// This sample shows how to update space with user credential. +public class UpdateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateSpaceRequest request = + UpdateSpaceRequest.newBuilder() + .setSpace( + Space.newBuilder() + // Replace SPACE_NAME here. + .setName("spaces/SPACE_NAME") + .setDisplayName("New space display name") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("display_name").build()) + .build(); + Space response = chatServiceClient.updateSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateSpaceUserCred] From 22656cb15988abaf546e5606e0f4cc47ac6d8e18 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:45:07 -0400 Subject: [PATCH 244/254] feat: update GAPIC samples to be featured in create message guide (#1092) * feat: update GAPIC samples to be featured in create message guide * Fix style --------- Co-authored-by: pierrick --- .../chat/samples/CreateMessageAppCred.java | 60 ++++++++++++++--- .../CreateMessageAppCredWithCards.java | 66 ------------------- .../chat/samples/CreateMessageUserCred.java | 20 +++--- 3 files changed, 63 insertions(+), 83 deletions(-) delete mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java index 24b85bca..c17303f2 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -18,6 +18,19 @@ import com.google.protobuf.util.JsonFormat; // [START chat_CreateMessageAppCred] +import com.google.apps.card.v1.Button; +import com.google.apps.card.v1.ButtonList; +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Icon; +import com.google.apps.card.v1.MaterialIcon; +import com.google.apps.card.v1.OnClick; +import com.google.apps.card.v1.OpenLink; +import com.google.apps.card.v1.TextParagraph; +import com.google.apps.card.v1.Widget; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.apps.card.v1.Card.Section; +import com.google.chat.v1.AccessoryWidget; +import com.google.chat.v1.CardWithId; import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; @@ -28,16 +41,47 @@ public class CreateMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with app credentials!") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world! I created this message by calling " + + "the Chat API\'s `messages.create()` method.") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("About this message") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg")) + .addSections(Section.newBuilder() + .setHeader("Contents") + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔡 Text which can include " + + "hyperlinks 🔗, emojis 😄🎉, and @mentions 🗣️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🖼️ A card to display visual elements " + + "and request information such as text 🔤, " + + "dates and times 📅, and selections ☑️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "👉🔘 An accessory widget which adds " + + "a button to the bottom of a message.")))) + .addSections(Section.newBuilder() + .setHeader("What's next") + .setCollapsible(true) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "❤️ Add a reaction."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔄 Update " + + "or ❌ delete " + + "the message.")))))) + .addAccessoryWidgets(AccessoryWidget.newBuilder() + .setButtonList(ButtonList.newBuilder() + .addButtons(Button.newBuilder() + .setText("View documentation") + .setIcon(Icon.newBuilder() + .setMaterialIcon(MaterialIcon.newBuilder().setName("link"))) + .setOnClick(OnClick.newBuilder() + .setOpenLink(OpenLink.newBuilder() + .setUrl("https://developers.google.com/workspace/chat/create-messages"))))))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java deleted file mode 100644 index c47e3169..00000000 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2024 Google LLC - * - * 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 - * - * https://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. - */ - -package com.google.workspace.api.chat.samples; - -import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCredWithCards] -import com.google.apps.card.v1.Card; -import com.google.apps.card.v1.Card.CardHeader; -import com.google.apps.card.v1.Card.Section; -import com.google.apps.card.v1.TextParagraph; -import com.google.apps.card.v1.Widget; -import com.google.chat.v1.CardWithId; -import com.google.chat.v1.ChatServiceClient; -import com.google.chat.v1.CreateMessageRequest; -import com.google.chat.v1.Message; - -// This sample shows how to create message with a card with app credential. -public class CreateMessageAppCredWithCards { - - public static void main(String[] args) throws Exception { - try (ChatServiceClient chatServiceClient = - AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with app credentials!") - .addCardsV2( - CardWithId.newBuilder().setCard( - Card.newBuilder() - .addSections( - Section.newBuilder() - .addWidgets( - Widget.newBuilder() - .setTextParagraph( - TextParagraph.newBuilder().setText("Hello")) - .build()) - .build()) - .build() - ) - ) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); - - System.out.println(JsonFormat.printer().print(response)); - } - } -} -// [END chat_CreateMessageAppCredWithCards] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java index fe08c4b1..fa53ed57 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -33,17 +33,19 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message - .newBuilder() - .setText("Hello with user credentials!") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world!" + + "Text messages can contain things like:\n\n" + + "* Hyperlinks 🔗\n" + + "* Emojis 😄🎉\n" + + "* Mentions of other Chat users `@` \n\n" + + "For details, see the " + + ".")); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } From 9d94f3a5d98ae8544f6b6ac20b1e8d564735fb9d Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:24:44 -0400 Subject: [PATCH 245/254] feat: fix style for builders (#1093) Co-authored-by: pierrick --- .../samples/CreateMembershipUserCred.java | 26 +++++++------------ .../CreateMembershipUserCredForApp.java | 26 +++++++------------ .../CreateMessageAppCredAtMention.java | 18 +++++-------- .../CreateMessageUserCredWithMessageId.java | 14 ++++------ .../CreateMessageUserCredWithRequestId.java | 14 ++++------ .../CreateMessageUserCredWithThreadKey.java | 20 ++++++-------- .../CreateMessageUserCredWithThreadName.java | 22 +++++++--------- .../chat/samples/DeleteMessageAppCred.java | 10 +++---- .../chat/samples/DeleteMessageUserCred.java | 10 +++---- .../chat/samples/GetMembershipAppCred.java | 10 +++---- .../chat/samples/GetMembershipUserCred.java | 10 +++---- .../api/chat/samples/GetMessageAppCred.java | 10 +++---- .../api/chat/samples/GetMessageUserCred.java | 10 +++---- .../api/chat/samples/GetSpaceAppCred.java | 8 +++--- .../api/chat/samples/GetSpaceUserCred.java | 8 +++--- .../chat/samples/ListMembershipsAppCred.java | 20 +++++++------- .../chat/samples/ListMembershipsUserCred.java | 20 +++++++------- .../chat/samples/ListMessagesUserCred.java | 14 +++++----- .../api/chat/samples/ListSpacesAppCred.java | 16 +++++------- .../api/chat/samples/ListSpacesUserCred.java | 16 +++++------- .../chat/samples/UpdateMessageAppCred.java | 23 +++++++--------- .../chat/samples/UpdateMessageUserCred.java | 23 +++++++--------- .../api/chat/samples/UpdateSpaceUserCred.java | 23 +++++++--------- 23 files changed, 149 insertions(+), 222 deletions(-) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java index 790a05eb..c04b15fc 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -36,22 +36,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMembershipRequest request = - CreateMembershipRequest.newBuilder() - // replace SPACE_NAME here - .setParent("spaces/SPACE_NAME") - .setMembership( - Membership.newBuilder() - .setMember( - User.newBuilder() - // replace USER_NAME here - .setName("users/USER_NAME") - // user type for the membership - .setType(User.Type.HUMAN) - .build()) - .build()) - .build(); - Membership response = chatServiceClient.createMembership(request); + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // replace USER_NAME here + .setName("users/USER_NAME") + // user type for the membership + .setType(User.Type.HUMAN))); + Membership response = chatServiceClient.createMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java index e751f20b..3edb889d 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -36,22 +36,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMembershipRequest request = - CreateMembershipRequest.newBuilder() - // replace SPACE_NAME here - .setParent("spaces/SPACE_NAME") - .setMembership( - Membership.newBuilder() - .setMember( - User.newBuilder() - // member name for app membership, do not change this. - .setName("users/app") - // user type for the membership - .setType(User.Type.BOT) - .build()) - .build()) - .build(); - Membership response = chatServiceClient.createMembership(request); + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // member name for app membership, do not change this. + .setName("users/app") + // user type for the membership + .setType(User.Type.BOT))); + Membership response = chatServiceClient.createMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java index b8fb8291..5830de3c 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java @@ -29,19 +29,15 @@ public class CreateMessageAppCredAtMention { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - // The user with USER_NAME will be mentioned if they are in the - // space. - // Replace USER_NAME here - .setText("Hello !") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + // The user with USER_NAME will be mentioned if they are in the + // space. + // Replace USER_NAME here + .setText("Hello !")); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java index 0e37bbe3..d76475c7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java @@ -34,20 +34,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - .build()) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) // Message ID lets chat apps get, update or delete a message without // needing to store the system assigned ID in the message's resource // name. - .setMessageId("client-MESSAGE-ID") - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessageId("client-MESSAGE-ID"); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java index fe46232a..1d05d950 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java @@ -34,19 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - .build()) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) // Specifying an existing request ID returns the message created with // that ID instead of creating a new message. - .setRequestId("REQUEST_ID") - .build(); - Message response = chatServiceClient.createMessage(request); + .setRequestId("REQUEST_ID"); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java index 40aa327f..897df800 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java @@ -36,23 +36,19 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") // Creates the message as a reply to the thread specified by thread_key. // If it fails, the message starts a new thread instead. .setMessageReplyOption( - MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - // Thread key specifies a thread and is unique to the chat app - // that sets it. - .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY").build()) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Thread key specifies a thread and is unique to the chat app + // that sets it. + .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY"))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java index 3c8f10c5..69bfba1e 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java @@ -36,24 +36,20 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") // Creates the message as a reply to the thread specified by thread name. // If it fails, the message starts a new thread instead. .setMessageReplyOption( - MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - // Resource name of a thread that uniquely identify a thread. - .setThread(Thread.newBuilder().setName( - // replace SPACE_NAME and THREAD_NAME here - "spaces/SPACE_NAME/threads/THREAD_NAME").build()) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Resource name of a thread that uniquely identify a thread. + .setThread(Thread.newBuilder().setName( + // replace SPACE_NAME and THREAD_NAME here + "spaces/SPACE_NAME/threads/THREAD_NAME"))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java index 66e44af8..abda2ae1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -26,12 +26,10 @@ public class DeleteMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - DeleteMessageRequest request = - DeleteMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .build(); - chatServiceClient.deleteMessage(request); + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); } } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java index 43f7f713..491a3dd6 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -32,12 +32,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - DeleteMessageRequest request = - DeleteMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .build(); - chatServiceClient.deleteMessage(request); + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); } } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java index fd5bb8ca..fcd7ae69 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -28,12 +28,10 @@ public class GetMembershipAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetMembershipRequest request = - GetMembershipRequest.newBuilder() - // replace SPACE_NAME and MEMBERSHIP_NAME here - .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") - .build(); - Membership response = chatServiceClient.getMembership(request); + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java index d4cb18d5..f54b8633 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetMembershipRequest request = - GetMembershipRequest.newBuilder() - // replace SPACE_NAME and MEMBERSHIP_NAME here - .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") - .build(); - Membership response = chatServiceClient.getMembership(request); + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java index c505680e..b80a28e9 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -28,12 +28,10 @@ public class GetMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetMessageRequest request = - GetMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") - .build(); - Message response = chatServiceClient.getMessage(request); + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java index e58872d6..7db70657 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetMessageRequest request = - GetMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") - .build(); - Message response = chatServiceClient.getMessage(request); + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java index df5da3d4..a01027a1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -28,12 +28,10 @@ public class GetSpaceAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetSpaceRequest request = - GetSpaceRequest.newBuilder() + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() // Replace SPACE_NAME here - .setName("spaces/SPACE_NAME") - .build(); - Space response = chatServiceClient.getSpace(request); + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java index e9ed0a45..c84cce81 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetSpaceRequest request = - GetSpaceRequest.newBuilder() + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() // Replace SPACE_NAME here - .setName("spaces/SPACE_NAME") - .build(); - Space response = chatServiceClient.getSpace(request); + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java index cae23771..7618ce43 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -29,20 +29,18 @@ public class ListMembershipsAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - ListMembershipsRequest request = - ListMembershipsRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Filter membership by type (HUMAN or BOT) or role - // (ROLE_MEMBER or ROLE_MANAGER). - .setFilter("member.type = \"HUMAN\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Membership response : - chatServiceClient.listMemberships(request).iterateAll()) { + chatServiceClient.listMemberships(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java index d60e2725..08f772de 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -34,20 +34,18 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListMembershipsRequest request = - ListMembershipsRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Filter membership by type (HUMAN or BOT) or role - // (ROLE_MEMBER or ROLE_MANAGER). - .setFilter("member.type = \"HUMAN\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterating over results and resolve additional pages automatically. for (Membership response : - chatServiceClient.listMemberships(request).iterateAll()) { + chatServiceClient.listMemberships(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java index 1a984607..b99b0abf 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -34,17 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListMessagesRequest request = - ListMessagesRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMessagesRequest.Builder request = ListMessagesRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Message response : - chatServiceClient.listMessages(request).iterateAll()) { + chatServiceClient.listMessages(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java index 00494729..cb35a5b0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -29,18 +29,16 @@ public class ListSpacesAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - ListSpacesRequest request = - ListSpacesRequest.newBuilder() - // Filter spaces by space type (SPACE or GROUP_CHAT or - // DIRECT_MESSAGE). - .setFilter("spaceType = \"SPACE\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Space response : - chatServiceClient.listSpaces(request).iterateAll()) { + chatServiceClient.listSpaces(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java index 2d9410aa..ea3af6f9 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -34,18 +34,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListSpacesRequest request = - ListSpacesRequest.newBuilder() - // Filter spaces by space type (SPACE or GROUP_CHAT or - // DIRECT_MESSAGE). - .setFilter("spaceType = \"SPACE\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Space response : - chatServiceClient.listSpaces(request).iterateAll()) { + chatServiceClient.listSpaces(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index 5f946545..fc62c5c0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -29,20 +29,15 @@ public class UpdateMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - UpdateMessageRequest request = - UpdateMessageRequest.newBuilder() - .setMessage( - Message.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with app credential!") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("text").build()) - .build(); - Message response = chatServiceClient.updateMessage(request); + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with app credential!")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("text")); + Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java index 9f2dd016..5d0b4908 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -34,20 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - UpdateMessageRequest request = - UpdateMessageRequest.newBuilder() - .setMessage( - Message.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with user credential!") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("text").build()) - .build(); - Message response = chatServiceClient.updateMessage(request); + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with user credential!")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("text")); + Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java index cd5d67cd..8b009703 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -34,20 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - UpdateSpaceRequest request = - UpdateSpaceRequest.newBuilder() - .setSpace( - Space.newBuilder() - // Replace SPACE_NAME here. - .setName("spaces/SPACE_NAME") - .setDisplayName("New space display name") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("display_name").build()) - .build(); - Space response = chatServiceClient.updateSpace(request); + UpdateSpaceRequest.Builder request = UpdateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + // Replace SPACE_NAME here. + .setName("spaces/SPACE_NAME") + .setDisplayName("New space display name")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("display_name")); + Space response = chatServiceClient.updateSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } From 67f9f30c878b6fe16d9a3febf974e29afdcabb0a Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:39:44 -0400 Subject: [PATCH 246/254] feat: fix class names and region tags for consistency (#1094) Co-authored-by: pierrick --- .../chat/samples/CreateMembershipUserCred.java | 4 ++-- .../samples/CreateMembershipUserCredForApp.java | 4 ++-- .../api/chat/samples/CreateMessageAppCred.java | 4 ++-- .../api/chat/samples/CreateMessageUserCred.java | 4 ++-- ...java => CreateMessageUserCredAtMention.java} | 17 +++++++++++------ ...java => CreateMessageUserCredMessageId.java} | 6 +++--- ...java => CreateMessageUserCredRequestId.java} | 6 +++--- ...java => CreateMessageUserCredThreadKey.java} | 6 +++--- ...ava => CreateMessageUserCredThreadName.java} | 6 +++--- .../api/chat/samples/DeleteMessageAppCred.java | 4 ++-- .../api/chat/samples/DeleteMessageUserCred.java | 4 ++-- .../api/chat/samples/GetMembershipAppCred.java | 4 ++-- .../api/chat/samples/GetMembershipUserCred.java | 4 ++-- .../api/chat/samples/GetMessageAppCred.java | 4 ++-- .../api/chat/samples/GetMessageUserCred.java | 4 ++-- .../api/chat/samples/GetSpaceAppCred.java | 4 ++-- .../api/chat/samples/GetSpaceUserCred.java | 4 ++-- .../chat/samples/ListMembershipsAppCred.java | 4 ++-- .../chat/samples/ListMembershipsUserCred.java | 4 ++-- .../api/chat/samples/ListMessagesUserCred.java | 4 ++-- .../api/chat/samples/ListSpacesAppCred.java | 4 ++-- .../api/chat/samples/ListSpacesUserCred.java | 4 ++-- .../api/chat/samples/UpdateMessageAppCred.java | 4 ++-- .../api/chat/samples/UpdateMessageUserCred.java | 4 ++-- .../api/chat/samples/UpdateSpaceUserCred.java | 4 ++-- 25 files changed, 63 insertions(+), 58 deletions(-) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageAppCredAtMention.java => CreateMessageUserCredAtMention.java} (75%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithMessageId.java => CreateMessageUserCredMessageId.java} (92%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithRequestId.java => CreateMessageUserCredRequestId.java} (92%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithThreadKey.java => CreateMessageUserCredThreadKey.java} (93%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithThreadName.java => CreateMessageUserCredThreadName.java} (93%) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java index c04b15fc..c10605bd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMembershipUserCred] +// [START chat_create_membership_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMembershipRequest; import com.google.chat.v1.Membership; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMembershipUserCred] +// [END chat_create_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java index 3edb889d..1572da40 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMembershipUserCredForApp] +// [START chat_create_membership_user_cred_for_app] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMembershipRequest; import com.google.chat.v1.Membership; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMembershipUserCredForApp] +// [END chat_create_membership_user_cred_for_app] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java index c17303f2..b32bd8dd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCred] +// [START chat_create_message_app_cred] import com.google.apps.card.v1.Button; import com.google.apps.card.v1.ButtonList; import com.google.apps.card.v1.Card; @@ -87,4 +87,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageAppCred] +// [END chat_create_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java index fa53ed57..cef822a1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCred] +// [START chat_create_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCred] +// [END chat_create_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java similarity index 75% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java index 5830de3c..a52874bd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java @@ -16,19 +16,24 @@ package com.google.workspace.api.chat.samples; +import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCredAtMention] +// [START chat_create_message_user_cred_at_mention] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; -// This sample shows how to create message that mentions a user with app -// credential. -public class CreateMessageAppCredAtMention { +// This sample shows how to create message with user credential with a user +// mention. +public class CreateMessageUserCredAtMention { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = - AuthenticationUtils.createClientWithAppCredentials()) { + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") @@ -43,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageAppCredAtMention] +// [END chat_create_message_user_cred_at_mention] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java similarity index 92% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java index d76475c7..0312ce07 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java @@ -18,14 +18,14 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithMessageId] +// [START chat_create_message_user_cred_message_id] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; // This sample shows how to create message with message id specified with user // credential. -public class CreateMessageUserCredWithMessageId { +public class CreateMessageUserCredMessageId { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -49,4 +49,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithMessageId] +// [END chat_create_message_user_cred_message_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java similarity index 92% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java index 1d05d950..c9acce76 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java @@ -18,14 +18,14 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithRequestId] +// [START chat_create_message_user_cred_request_id] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; // This sample shows how to create message with request id specified with user // credential. -public class CreateMessageUserCredWithRequestId { +public class CreateMessageUserCredRequestId { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithRequestId] +// [END chat_create_message_user_cred_request_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java similarity index 93% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java index 897df800..8fa51135 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithThreadKey] +// [START chat_create_message_user_cred_thread_key] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; @@ -27,7 +27,7 @@ // This sample shows how to create message with a thread key with user // credential. -public class CreateMessageUserCredWithThreadKey { +public class CreateMessageUserCredThreadKey { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -54,4 +54,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithThreadKey] +// [END chat_create_message_user_cred_thread_key] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java similarity index 93% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java index 69bfba1e..e27387fb 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithThreadName] +// [START chat_create_message_user_cred_thread_name] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; @@ -27,7 +27,7 @@ // This sample shows how to create message with thread name specified with user // credential. -public class CreateMessageUserCredWithThreadName { +public class CreateMessageUserCredThreadName { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -55,4 +55,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithThreadName] +// [END chat_create_message_user_cred_thread_name] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java index abda2ae1..f0fea33b 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -16,7 +16,7 @@ package com.google.workspace.api.chat.samples; -// [START chat_DeleteMessageAppCred] +// [START chat_delete_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.DeleteMessageRequest; @@ -33,4 +33,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_DeleteMessageAppCred] +// [END chat_delete_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java index 491a3dd6..34d5adc2 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.common.collect.ImmutableList; -// [START chat_DeleteMessageUserCred] +// [START chat_delete_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.DeleteMessageRequest; import com.google.chat.v1.SpaceName; @@ -39,4 +39,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_DeleteMessageUserCred] +// [END chat_delete_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java index fcd7ae69..52c2e86f 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMembershipAppCred] +// [START chat_get_membership_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMembershipRequest; import com.google.chat.v1.Membership; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMembershipAppCred] +// [END chat_get_membership_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java index f54b8633..55637384 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMembershipUserCred] +// [START chat_get_membership_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMembershipRequest; import com.google.chat.v1.Membership; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMembershipUserCred] +// [END chat_get_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java index b80a28e9..f79e8a79 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMessageAppCred] +// [START chat_get_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMessageRequest; import com.google.chat.v1.Message; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMessageAppCred] +// [END chat_get_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java index 7db70657..f8a99a70 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMessageUserCred] +// [START chat_get_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMessageRequest; import com.google.chat.v1.Message; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMessageUserCred] +// [END chat_get_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java index a01027a1..4b76c13d 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetSpaceAppCred] +// [START chat_get_space_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetSpaceRequest; import com.google.chat.v1.Space; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetSpaceAppCred] +// [END chat_get_space_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java index c84cce81..ab85d9ce 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetSpaceUserCred] +// [START chat_get_space_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetSpaceRequest; import com.google.chat.v1.Space; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetSpaceUserCred] +// [END chat_get_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java index 7618ce43..8a4a56f0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMembershipsAppCred] +// [START chat_list_memberships_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMembershipsRequest; import com.google.chat.v1.ListMembershipsResponse; @@ -46,4 +46,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMembershipsAppCred] +// [END chat_list_memberships_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java index 08f772de..8ddeb7dd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMembershipsUserCred] +// [START chat_list_memberships_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMembershipsRequest; import com.google.chat.v1.ListMembershipsResponse; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMembershipsUserCred] +// [END chat_list_memberships_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java index b99b0abf..d9081b24 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMessagesUserCred] +// [START chat_list_messages_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMessagesRequest; import com.google.chat.v1.ListMessagesResponse; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMessagesUserCred] +// [END chat_list_messages_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java index cb35a5b0..8fd15cc3 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_ListSpacesAppCred] +// [START chat_list_spaces_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListSpacesRequest; import com.google.chat.v1.ListSpacesResponse; @@ -44,4 +44,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListSpacesAppCred] +// [END chat_list_spaces_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java index ea3af6f9..bffdf6cb 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListSpacesUserCred] +// [START chat_list_spaces_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListSpacesRequest; import com.google.chat.v1.ListSpacesResponse; @@ -49,4 +49,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListSpacesUserCred] +// [END chat_list_spaces_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index fc62c5c0..8eaf3dd7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateMessageAppCred] +// [START chat_update_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -43,4 +43,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateMessageAppCred] +// [END chat_update_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java index 5d0b4908..abda65c7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateMessageUserCred] +// [START chat_update_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateMessageUserCred] +// [END chat_update_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java index 8b009703..73b5cec3 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateSpaceUserCred] +// [START chat_update_space_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateSpaceRequest; import com.google.chat.v1.Space; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateSpaceUserCred] +// [END chat_update_space_user_cred] From b2f6faef4fb7b1cf2d9b35dfb5206736e1e0bb11 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 2 Oct 2024 20:52:19 -0400 Subject: [PATCH 247/254] feat: add create membership for group code sample (#1164) Co-authored-by: pierrick --- .../CreateMembershipUserCredForGroup.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java new file mode 100644 index 00000000..43e20ac0 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_membership_user_cred_for_group] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.Group; + +// This sample shows how to create membership with user credential for a group. +public class CreateMembershipUserCredForGroup { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setGroupMember(Group.newBuilder() + // replace GROUP_NAME here + .setName("groups/GROUP_NAME"))); + Membership response = chatServiceClient.createMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_membership_user_cred_for_group] From cfb3a31befe7e5c90bbcd3dd5ef4cb7d9548378d Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 3 Oct 2024 10:11:01 -0400 Subject: [PATCH 248/254] feat: add create and set up space code samples (#1165) * feat: add create and set up space code samples * Change for immutable list --------- Co-authored-by: pierrick --- .../api/chat/samples/CreateSpaceUserCred.java | 47 ++++++++++++++++ .../api/chat/samples/SetUpSpaceUserCred.java | 56 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java new file mode 100644 index 00000000..713f64a9 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to create space with user credential. +public class CreateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateSpaceRequest.Builder request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")); + Space response = chatServiceClient.createSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java new file mode 100644 index 00000000..d39b6192 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * 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 + * + * https://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. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; + +// [START chat_set_up_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SetUpSpaceRequest; +import com.google.chat.v1.Space; +import com.google.chat.v1.User; + +// This sample shows how to set up a named space with one initial member with +// user credential. +public class SetUpSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + SetUpSpaceRequest.Builder request = SetUpSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")) + .addAllMemberships(ImmutableList.of(Membership.newBuilder() + .setMember(User.newBuilder() + // Replace USER_NAME here. + .setName("users/USER_NAME") + .setType(User.Type.HUMAN)).build())); + Space response = chatServiceClient.setUpSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_set_up_space_user_cred] From 26cb124371d51cb5cb8e6c4a3db6422bbef586fb Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:49:43 -0400 Subject: [PATCH 249/254] feat: update message with app creds (#1166) Co-authored-by: pierrick --- .../api/chat/samples/UpdateMessageAppCred.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index 8eaf3dd7..559ad13f 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -17,7 +17,13 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; + +import java.util.List; + // [START chat_update_message_app_cred] +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.chat.v1.CardWithId; import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -33,10 +39,14 @@ public static void main(String[] args) throws Exception { .setMessage(Message.newBuilder() // replace SPACE_NAME and MESSAGE_NAME here .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with app credential!")) + .setText("Text updated with app credential!") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("Card updated with app credential!") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg"))))) .setUpdateMask(FieldMask.newBuilder() // The field paths to update. - .addPaths("text")); + .addAllPaths(List.of("text", "cards_v2"))); Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); From b30298095f654ff9952a691333f0aa5862ab935c Mon Sep 17 00:00:00 2001 From: sce-taid Date: Thu, 11 Sep 2025 01:06:16 +0200 Subject: [PATCH 250/254] fix: updating FileList query field name (#1473) renaming `items` (v2) to `files` (v3) --- drive/snippets/drive_v3/src/main/java/SearchFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 08f574b1..2e5e7f01 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -60,7 +60,7 @@ public static List searchFile() throws IOException { FileList result = service.files().list() .setQ("mimeType='image/jpeg'") .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") + .setFields("nextPageToken, files(id, title)") .setPageToken(pageToken) .execute(); for (File file : result.getFiles()) { From d219a446eaace9ce6d53fd58ca764d1b63bf2a16 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:43:28 -0700 Subject: [PATCH 251/254] chore: Created local '.gemini/' from remote 'sync-files/defaults/.gemini/' (#1692) --- .gemini/GEMINI.md | 12 ++++++++++++ .gemini/config.yaml | 12 ++++++++++++ .gemini/settings.json | 8 ++++++++ 3 files changed, 32 insertions(+) create mode 100644 .gemini/GEMINI.md create mode 100644 .gemini/config.yaml create mode 100644 .gemini/settings.json diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md new file mode 100644 index 00000000..0f175c59 --- /dev/null +++ b/.gemini/GEMINI.md @@ -0,0 +1,12 @@ +# Overview + +This codebase is part of the Google Workspace GitHub organization, https://github.com/googleworkspace. + +## Style Guide + +Use open source best practices for code style and formatting with a preference for Google's style guides. + +## Tools + +- Verify against Google Workspace documentation with the `workspace-developer` MCP server tools. +- Use `gh` for GitHub interactions. diff --git a/.gemini/config.yaml b/.gemini/config.yaml new file mode 100644 index 00000000..a4814a5f --- /dev/null +++ b/.gemini/config.yaml @@ -0,0 +1,12 @@ +# Config for the Gemini Pull Request Review Bot. +# https://github.com/marketplace/gemini-code-assist +have_fun: false +code_review: + disable: false + comment_severity_threshold: "HIGH" + max_review_comments: -1 + pull_request_opened: + help: false + summary: true + code_review: true +ignore_patterns: [] diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 00000000..ec3565d5 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "workspace-developer": { + "httpUrl": "https://workspace-developer.goog/mcp", + "trust": true + } + } +} \ No newline at end of file From 43971ae6e90c0ac95dea1842d432eccc916a5a48 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:47:46 -0700 Subject: [PATCH 252/254] chore: Synced file(s) with googleworkspace/.github --- .vscode/extensions.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..4a9deaa4 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "google-workspace.google-workspace-developer-tools" + ] +} \ No newline at end of file From e8ba9fd71688ee75119f4e13c175239ca88291ff Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Mon, 8 Dec 2025 23:43:33 -0500 Subject: [PATCH 253/254] feat: add webhook chat app (#1715) Co-authored-by: pierrick --- solutions/webhook-chat-app/README.md | 4 ++ solutions/webhook-chat-app/pom.xml | 52 +++++++++++++++++++ .../java/com/google/chat/webhook/App.java | 45 ++++++++++++++++ .../com/google/chat/webhook/AppThread.java | 48 +++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 solutions/webhook-chat-app/README.md create mode 100644 solutions/webhook-chat-app/pom.xml create mode 100644 solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java create mode 100644 solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java diff --git a/solutions/webhook-chat-app/README.md b/solutions/webhook-chat-app/README.md new file mode 100644 index 00000000..59643860 --- /dev/null +++ b/solutions/webhook-chat-app/README.md @@ -0,0 +1,4 @@ +# Google Chat App Webhook + +Please see related guide on how to +[send messages to Google Chat with incoming webhooks](https://developers.google.com/workspace/chat/quickstart/webhooks). diff --git a/solutions/webhook-chat-app/pom.xml b/solutions/webhook-chat-app/pom.xml new file mode 100644 index 00000000..be47addd --- /dev/null +++ b/solutions/webhook-chat-app/pom.xml @@ -0,0 +1,52 @@ + + + + + + 4.0.0 + + com.google.chat.webhook + webhook-app + 0.1.0 + webhook-app + + + 11 + 11 + + + + + com.google.code.gson + gson + 2.9.1 + + + + + + + + maven-compiler-plugin + 3.8.0 + + + + + + diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java new file mode 100644 index 00000000..3f9f4032 --- /dev/null +++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java @@ -0,0 +1,45 @@ +/** + * Copyright 2022 Google LLC. + * + * 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. + */ +package com.google.chat.webhook; + +// [START chat_webhook] +import com.google.gson.Gson; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Map; +import java.net.URI; + +public class App { + private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN"; + private static final Gson gson = new Gson(); + private static final HttpClient client = HttpClient.newHttpClient(); + + public static void main(String[] args) throws Exception { + String message = gson.toJson(Map.of( + "text", "Hello from Java!" + )); + + HttpRequest request = HttpRequest.newBuilder(URI.create(URL)) + .header("accept", "application/json; charset=UTF-8") + .POST(HttpRequest.BodyPublishers.ofString(message)).build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + } +} +// [END chat_webhook] diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java new file mode 100644 index 00000000..d5c5fb52 --- /dev/null +++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java @@ -0,0 +1,48 @@ +/** + * Copyright 2025 Google LLC. + * + * 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. + */ +package com.google.chat.webhook; + +// [START chat_webhook_thread] +import com.google.gson.Gson; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Map; +import java.net.URI; + +public class App { + private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"; + private static final Gson gson = new Gson(); + private static final HttpClient client = HttpClient.newHttpClient(); + + public static void main(String[] args) throws Exception { + String message = gson.toJson(Map.of( + "text", "Hello from Java!", + "thread", Map.of( + "threadKey", "THREAD_KEY_VALUE" + ) + )); + + HttpRequest request = HttpRequest.newBuilder(URI.create(URL)) + .header("accept", "application/json; charset=UTF-8") + .POST(HttpRequest.BodyPublishers.ofString(message)).build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + } +} +// [END chat_webhook_thread] From 19db17de8d3d018de067c5c8bbe50753b9f2055c Mon Sep 17 00:00:00 2001 From: Ken Cenerelli Date: Tue, 17 Feb 2026 11:54:57 -0800 Subject: [PATCH 254/254] docs: add SheetsFilterViews Java sample (#1747) * docs: add SheetsFilterViews Java sample Adds Java sample for filter views. Based on the `sheets_filter_views` sample from Python. * Fix comment formatting in SheetsFilterViews.java * Implement error handling for filter view operations Added error handling for Add and Duplicate Filter View requests to ensure valid responses. * Update copyright year in SheetsFilterViews.java Updated copyright year from 2022 to 2026. --- .../src/main/java/SheetsFilterViews.java | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 sheets/snippets/src/main/java/SheetsFilterViews.java diff --git a/sheets/snippets/src/main/java/SheetsFilterViews.java b/sheets/snippets/src/main/java/SheetsFilterViews.java new file mode 100644 index 00000000..06a1f939 --- /dev/null +++ b/sheets/snippets/src/main/java/SheetsFilterViews.java @@ -0,0 +1,175 @@ +/ * +Copyright 2026 Google LLC + +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. +* / + +// [START sheets_filter_views] + +/* + * Dependencies (Maven): + * com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0 + * com.google.auth:google-auth-library-oauth2-http:1.19.0 + */ + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.*; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; + +public class SheetsFilterViews { + + public static void main(String... args) { + filterViews("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k"); + } + + public static void filterViews(String spreadsheetId) { + try { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + + Sheets service = new Sheets.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) + .setApplicationName("Sheets Filter Views Sample") + .build(); + + // --- Step 1: Add Filter View --- + GridRange myRange = new GridRange() + .setSheetId(0) + .setStartRowIndex(0) + .setStartColumnIndex(0); + + // Construct Criteria for Column 0 (Hidden Values) + FilterCriteria criteria0 = new FilterCriteria() + .setHiddenValues(Collections.singletonList("Panel")); + + // Construct Criteria for Column 6 (Date Condition) + ConditionValue dateValue = new ConditionValue().setUserEnteredValue("4/30/2016"); + BooleanCondition dateCondition = new BooleanCondition() + .setType("DATE_BEFORE") + .setValues(Collections.singletonList(dateValue)); + FilterCriteria criteria6 = new FilterCriteria().setCondition(dateCondition); + + // Map criteria to column indices (Note: keys are Strings in Java map) + Map criteriaMap = new HashMap<>(); + criteriaMap.put("0", criteria0); + criteriaMap.put("6", criteria6); + + FilterView filterView = new FilterView() + .setTitle("Sample Filter") + .setRange(myRange) + .setSortSpecs(Collections.singletonList( + new SortSpec().setDimensionIndex(3).setSortOrder("DESCENDING") + )) + .setCriteria(criteriaMap); + + // --- Step 1: Add Filter View --- + // (Request construction remains the same) + // ... + AddFilterViewRequest addFilterViewRequest = new AddFilterViewRequest().setFilter(filterView); + + BatchUpdateSpreadsheetRequest batchRequest1 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setAddFilterView(addFilterViewRequest))); + + BatchUpdateSpreadsheetResponse response1 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest1) + .execute(); + + if (response1.getReplies() == null || response1.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from AddFilterView request."); + return; + } + + Response reply1 = response1.getReplies().get(0); + if (reply1.getAddFilterView() == null || reply1.getAddFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain AddFilterView data."); + return; + } + + int filterId = reply1.getAddFilterView().getFilter().getFilterViewId(); + + // --- Step 2: Duplicate Filter View --- + DuplicateFilterViewRequest duplicateRequest = new DuplicateFilterViewRequest() + .setFilterId(filterId); + + BatchUpdateSpreadsheetRequest batchRequest2 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setDuplicateFilterView(duplicateRequest))); + + BatchUpdateSpreadsheetResponse response2 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest2) + .execute(); + + if (response2.getReplies() == null || response2.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from DuplicateFilterView request."); + return; + } + + Response reply2 = response2.getReplies().get(0); + if (reply2.getDuplicateFilterView() == null || reply2.getDuplicateFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain DuplicateFilterView data."); + return; + } + + int newFilterId = reply2.getDuplicateFilterView().getFilter().getFilterViewId(); + + // --- Step 3: Update Filter View --- + // Extract the new ID from the duplicate response + int newFilterId = response2.getReplies().get(0) + .getDuplicateFilterView().getFilter().getFilterViewId(); + + // Create update criteria + Map updateCriteriaMap = new HashMap<>(); + updateCriteriaMap.put("0", new FilterCriteria()); // Empty criteria + + ConditionValue numValue = new ConditionValue().setUserEnteredValue("5"); + BooleanCondition numCondition = new BooleanCondition() + .setType("NUMBER_GREATER") + .setValues(Collections.singletonList(numValue)); + updateCriteriaMap.put("3", new FilterCriteria().setCondition(numCondition)); + + FilterView updateFilterView = new FilterView() + .setFilterViewId(newFilterId) + .setTitle("Updated Filter") + .setCriteria(updateCriteriaMap); + + UpdateFilterViewRequest updateRequest = new UpdateFilterViewRequest() + .setFilter(updateFilterView) + .setFields("criteria,title"); + + BatchUpdateSpreadsheetRequest batchRequest3 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setUpdateFilterView(updateRequest))); + + BatchUpdateSpreadsheetResponse response3 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest3) + .execute(); + + System.out.println(response3.toPrettyString()); + + } catch (IOException | GeneralSecurityException e) { + System.err.println("An error occurred: " + e); + } + } +} + +// [END sheets_filter_views]