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();
}
+ }
}
// [END admin_sdk_reseller_quickstart]
diff --git a/appsScript/execute/src/main/java/Execute.java b/appsScript/execute/src/main/java/Execute.java
index 8f42f898..ce4ef2c6 100644
--- a/appsScript/execute/src/main/java/Execute.java
+++ b/appsScript/execute/src/main/java/Execute.java
@@ -1,13 +1,12 @@
/**
- * @license
- * Copyright Google Inc.
- *
+ * @license Copyright Google Inc.
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
+ *
+ * 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.
@@ -15,127 +14,128 @@
* limitations under the License.
*/
public class Execute {
- // [START apps_script_api_execute]
- /**
- * Create a HttpRequestInitializer from the given one, except set
- * the HTTP read timeout to be longer than the default (to allow
- * called scripts time to execute).
- *
- * @param {HttpRequestInitializer} requestInitializer the initializer
- * to copy and adjust; typically a Credential object.
- * @return an initializer with an extended read timeout.
- */
- private static HttpRequestInitializer setHttpTimeout(
- final HttpRequestInitializer requestInitializer) {
- return new HttpRequestInitializer() {
- @Override
- public void initialize(HttpRequest httpRequest) throws IOException {
- requestInitializer.initialize(httpRequest);
- // This allows the API to call (and avoid timing out on)
- // functions that take up to 6 minutes to complete (the maximum
- // allowed script run time), plus a little overhead.
- httpRequest.setReadTimeout(380000);
- }
- };
- }
+ // [START apps_script_api_execute]
- /**
- * Build and return an authorized Script client service.
- *
- * @param {Credential} credential an authorized Credential object
- * @return an authorized Script client service
- */
- public static Script getScriptService() throws IOException {
- Credential credential = authorize();
- return new Script.Builder(
- HTTP_TRANSPORT, JSON_FACTORY, setHttpTimeout(credential))
- .setApplicationName(APPLICATION_NAME)
- .build();
- }
+ /**
+ * Create a HttpRequestInitializer from the given one, except set
+ * the HTTP read timeout to be longer than the default (to allow
+ * called scripts time to execute).
+ *
+ * @param {HttpRequestInitializer} requestInitializer the initializer
+ * to copy and adjust; typically a Credential object.
+ * @return an initializer with an extended read timeout.
+ */
+ private static HttpRequestInitializer setHttpTimeout(
+ final HttpRequestInitializer requestInitializer) {
+ return new HttpRequestInitializer() {
+ @Override
+ public void initialize(HttpRequest httpRequest) throws IOException {
+ requestInitializer.initialize(httpRequest);
+ // This allows the API to call (and avoid timing out on)
+ // functions that take up to 6 minutes to complete (the maximum
+ // allowed script run time), plus a little overhead.
+ httpRequest.setReadTimeout(380000);
+ }
+ };
+ }
- /**
- * Interpret an error response returned by the API and return a String
- * summary.
- *
- * @param {Operation} op the Operation returning an error response
- * @return summary of error response, or null if Operation returned no
- * error
- */
- public static String getScriptError(Operation op) {
- if (op.getError() == null) {
- return null;
- }
+ /**
+ * Build and return an authorized Script client service.
+ *
+ * @param {Credential} credential an authorized Credential object
+ * @return an authorized Script client service
+ */
+ public static Script getScriptService() throws IOException {
+ Credential credential = authorize();
+ return new Script.Builder(
+ HTTP_TRANSPORT, JSON_FACTORY, setHttpTimeout(credential))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
+ }
- // Extract the first (and only) set of error details and cast as a Map.
- // The values of this map are the script's 'errorMessage' and
- // 'errorType', and an array of stack trace elements (which also need to
- // be cast as Maps).
- Map detail = op.getError().getDetails().get(0);
- List> stacktrace =
- (List>)detail.get("scriptStackTraceElements");
+ /**
+ * Interpret an error response returned by the API and return a String
+ * summary.
+ *
+ * @param {Operation} op the Operation returning an error response
+ * @return summary of error response, or null if Operation returned no
+ * error
+ */
+ public static String getScriptError(Operation op) {
+ if (op.getError() == null) {
+ return null;
+ }
- java.lang.StringBuilder sb =
- new StringBuilder("\nScript error message: ");
- sb.append(detail.get("errorMessage"));
- sb.append("\nScript error type: ");
- sb.append(detail.get("errorType"));
+ // Extract the first (and only) set of error details and cast as a Map.
+ // The values of this map are the script's 'errorMessage' and
+ // 'errorType', and an array of stack trace elements (which also need to
+ // be cast as Maps).
+ Map detail = op.getError().getDetails().get(0);
+ List> stacktrace =
+ (List>) detail.get("scriptStackTraceElements");
- if (stacktrace != null) {
- // There may not be a stacktrace if the script didn't start
- // executing.
- sb.append("\nScript error stacktrace:");
- for (Map elem : stacktrace) {
- sb.append("\n ");
- sb.append(elem.get("function"));
- sb.append(":");
- sb.append(elem.get("lineNumber"));
- }
- }
- sb.append("\n");
- return sb.toString();
+ java.lang.StringBuilder sb =
+ new StringBuilder("\nScript error message: ");
+ sb.append(detail.get("errorMessage"));
+ sb.append("\nScript error type: ");
+ sb.append(detail.get("errorType"));
+
+ if (stacktrace != null) {
+ // There may not be a stacktrace if the script didn't start
+ // executing.
+ sb.append("\nScript error stacktrace:");
+ for (Map elem : stacktrace) {
+ sb.append("\n ");
+ sb.append(elem.get("function"));
+ sb.append(":");
+ sb.append(elem.get("lineNumber"));
+ }
}
+ sb.append("\n");
+ return sb.toString();
+ }
- public static void main(String[] args) throws IOException {
- // ID of the script to call. Acquire this from the Apps Script editor,
- // under Publish > Deploy as API executable.
- String scriptId = "ENTER_YOUR_SCRIPT_ID_HERE";
- Script service = getScriptService();
+ public static void main(String[] args) throws IOException {
+ // ID of the script to call. Acquire this from the Apps Script editor,
+ // under Publish > Deploy as API executable.
+ String scriptId = "ENTER_YOUR_SCRIPT_ID_HERE";
+ Script service = getScriptService();
- // Create an execution request object.
- ExecutionRequest request = new ExecutionRequest()
- .setFunction("getFoldersUnderRoot");
+ // Create an execution request object.
+ ExecutionRequest request = new ExecutionRequest()
+ .setFunction("getFoldersUnderRoot");
- try {
- // Make the API request.
- Operation op =
- service.scripts().run(scriptId, request).execute();
+ try {
+ // Make the API request.
+ Operation op =
+ service.scripts().run(scriptId, request).execute();
- // Print results of request.
- if (op.getError() != null) {
- // The API executed, but the script returned an error.
- System.out.println(getScriptError(op));
- } else {
- // The result provided by the API needs to be cast into
- // the correct type, based upon what types the Apps
- // Script function returns. Here, the function returns
- // an Apps Script Object with String keys and values,
- // so must be cast into a Java Map (folderSet).
- Map folderSet =
- (Map)(op.getResponse().get("result"));
- if (folderSet.size() == 0) {
- System.out.println("No folders returned!");
- } else {
- System.out.println("Folders under your root folder:");
- for (String id: folderSet.keySet()) {
- System.out.printf(
- "\t%s (%s)\n", folderSet.get(id), id);
- }
- }
- }
- } catch (GoogleJsonResponseException e) {
- // The API encountered a problem before the script was called.
- e.printStackTrace(System.out);
+ // Print results of request.
+ if (op.getError() != null) {
+ // The API executed, but the script returned an error.
+ System.out.println(getScriptError(op));
+ } else {
+ // The result provided by the API needs to be cast into
+ // the correct type, based upon what types the Apps
+ // Script function returns. Here, the function returns
+ // an Apps Script Object with String keys and values,
+ // so must be cast into a Java Map (folderSet).
+ Map folderSet =
+ (Map) (op.getResponse().get("result"));
+ if (folderSet.size() == 0) {
+ System.out.println("No folders returned!");
+ } else {
+ System.out.println("Folders under your root folder:");
+ for (String id : folderSet.keySet()) {
+ System.out.printf(
+ "\t%s (%s)\n", folderSet.get(id), id);
+ }
}
+ }
+ } catch (GoogleJsonResponseException e) {
+ // The API encountered a problem before the script was called.
+ e.printStackTrace(System.out);
}
- // [END apps_script_api_execute]
+ }
+ // [END apps_script_api_execute]
}
diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle
index dfa909d7..7ce6076f 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-script:v1-rev20220323-2.0.0'
}
diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java
index c7f4679a..ba42d201 100644
--- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java
+++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java
@@ -13,6 +13,7 @@
// limitations under the License.
// [START apps_script_api_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;
@@ -21,14 +22,13 @@
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.script.Script;
import com.google.api.services.script.model.Content;
import com.google.api.services.script.model.CreateProjectRequest;
import com.google.api.services.script.model.File;
import com.google.api.services.script.model.Project;
-
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
@@ -39,66 +39,71 @@
import java.util.List;
public class AppsScriptQuickstart {
- private static final String APPLICATION_NAME = "Apps Script API Java Quickstart";
- private static final JsonFactory JSON_FACTORY = JacksonFactory.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 credentials folder at /secret.
- */
- private static final List SCOPES = Collections.singletonList("https://www.googleapis.com/auth/script.projects");
- private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
+ private static final String APPLICATION_NAME = "Apps Script 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 = AppsScriptQuickstart.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 credentials folder at /secret.
+ */
+ private static final List SCOPES =
+ Collections.singletonList("https://www.googleapis.com/auth/script.projects");
+ 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 = AppsScriptQuickstart.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();
- Script service = new Script.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
- .setApplicationName(APPLICATION_NAME)
- .build();
- Script.Projects projects = service.projects();
+ // 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 a new script project.
- Project createOp = projects.create(new CreateProjectRequest().setTitle("My Script")).execute();
+ public static void main(String... args) throws IOException, GeneralSecurityException {
+ // Build a new authorized API client service.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Script service =
+ new Script.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
+ Script.Projects projects = service.projects();
- // Uploads two files to the project.
- File file1 = new File()
- .setName("hello")
- .setType("SERVER_JS")
- .setSource("function helloWorld() {\n console.log(\"Hello, world!\");\n}");
- File file2 = new File()
- .setName("appsscript")
- .setType("JSON")
- .setSource("{\"timeZone\":\"America/New_York\",\"exceptionLogging\":\"CLOUD\"}");
- Content content = new Content().setFiles(Arrays.asList(file1, file2));
- Content updatedContent = projects.updateContent(createOp.getScriptId(), content).execute();
+ // Creates a new script project.
+ Project createOp = projects.create(new CreateProjectRequest().setTitle("My Script")).execute();
- // Logs the project URL.
- System.out.printf("https://script.google.com/d/%s/edit\n", updatedContent.getScriptId());
- }
+ // Uploads two files to the project.
+ File file1 = new File()
+ .setName("hello")
+ .setType("SERVER_JS")
+ .setSource("function helloWorld() {\n console.log(\"Hello, world!\");\n}");
+ File file2 = new File()
+ .setName("appsscript")
+ .setType("JSON")
+ .setSource("{\"timeZone\":\"America/New_York\",\"exceptionLogging\":\"CLOUD\"}");
+ Content content = new Content().setFiles(Arrays.asList(file1, file2));
+ Content updatedContent = projects.updateContent(createOp.getScriptId(), content).execute();
+
+ // Logs the project URL.
+ System.out.printf("https://script.google.com/d/%s/edit\n", updatedContent.getScriptId());
+ }
}
// [END apps_script_api_quickstart]
diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle
index 2e580223..6252ad03 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0'
}
diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java
index f173a632..19a50114 100644
--- a/calendar/quickstart/src/main/java/CalendarQuickstart.java
+++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java
@@ -13,6 +13,7 @@
// limitations under the License.
// [START calendar_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;
@@ -21,7 +22,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,70 +38,87 @@
import java.util.Collections;
import java.util.List;
+/* class to demonstrate use of Calendar events list API */
public class CalendarQuickstart {
- private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
- private static final JsonFactory JSON_FACTORY = JacksonFactory.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(CalendarScopes.CALENDAR_READONLY);
- private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
+ /**
+ * Application name.
+ */
+ private static final String APPLICATION_NAME = "Google Calendar 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";
- /**
- * 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 = CalendarQuickstart.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(CalendarScopes.CALENDAR_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 = CalendarQuickstart.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();
- Calendar service = new Calendar.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();
+ Calendar service =
+ new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
- // List the next 10 events from the primary calendar.
- DateTime now = new DateTime(System.currentTimeMillis());
- Events events = service.events().list("primary")
- .setMaxResults(10)
- .setTimeMin(now)
- .setOrderBy("startTime")
- .setSingleEvents(true)
- .execute();
- List items = events.getItems();
- if (items.isEmpty()) {
- System.out.println("No upcoming events found.");
- } else {
- System.out.println("Upcoming events");
- for (Event event : items) {
- DateTime start = event.getStart().getDateTime();
- if (start == null) {
- start = event.getStart().getDate();
- }
- System.out.printf("%s (%s)\n", event.getSummary(), start);
- }
+ // List the next 10 events from the primary calendar.
+ DateTime now = new DateTime(System.currentTimeMillis());
+ Events events = service.events().list("primary")
+ .setMaxResults(10)
+ .setTimeMin(now)
+ .setOrderBy("startTime")
+ .setSingleEvents(true)
+ .execute();
+ List items = events.getItems();
+ if (items.isEmpty()) {
+ System.out.println("No upcoming events found.");
+ } else {
+ System.out.println("Upcoming events");
+ for (Event event : items) {
+ DateTime start = event.getStart().getDateTime();
+ if (start == null) {
+ start = event.getStart().getDate();
}
+ System.out.printf("%s (%s)\n", event.getSummary(), start);
+ }
}
+ }
}
// [END calendar_quickstart]
diff --git a/calendar/sync/README.md b/calendar/sync/README.md
index b675e51d..2aeb82e6 100644
--- a/calendar/sync/README.md
+++ b/calendar/sync/README.md
@@ -29,9 +29,9 @@ Setup your Java environment:
using the [Google Developers Console](https://console.developers.google.com).
1. Run `mvn compile` to build the project.
1. Run one of the three samples:
- * Sync Token Sample:
- `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.SyncTokenSample"`
- * Conditional Modification Sample:
- `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalModificationSample"`
- * Conditional Retrieval Sample:
- `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalRetrievalSample"`
+ * Sync Token Sample:
+ `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.SyncTokenSample"`
+ * Conditional Modification Sample:
+ `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalModificationSample"`
+ * Conditional Retrieval Sample:
+ `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalRetrievalSample"`
diff --git a/calendar/sync/packaging.yaml b/calendar/sync/packaging.yaml
index 4a6cb239..c00ac9f6 100644
--- a/calendar/sync/packaging.yaml
+++ b/calendar/sync/packaging.yaml
@@ -1,15 +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
+#
+# 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.
# End users may safely ignore this file. It has no relevance to other systems.
---
-status: PUBLISHED
-technologies: [Google Apps]
-categories: [Web Services]
-languages: [Java]
-solutions: [Enterprise]
-github: googlesamples/calendar-sync
-difficulty: INTERMEDIATE
-api_refs: [ws:calendar.events]
-dev_console_apis: [calendar]
-license: apache2
+status: PUBLISHED
+technologies: [ Google Apps ]
+categories: [ Web Services ]
+languages: [ Java ]
+solutions: [ Enterprise ]
+github: googlesamples/calendar-sync
+difficulty: INTERMEDIATE
+api_refs: [ ws:calendar.events ]
+dev_console_apis: [ calendar ]
+license: apache2
diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml
index 115ab428..af98470c 100644
--- a/calendar/sync/pom.xml
+++ b/calendar/sync/pom.xml
@@ -1,88 +1,104 @@
-
-
- 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
+
+ 3.0.0
+
-
-
-
- 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
+ 3.10.1
+
+ 1.8
+ 1.8
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.1.0
+
+
+
+ java
+
+
+
+
+
+
+ java.util.logging.config.file
+ logging.properties
+
+
+
+
+
+ ${project.artifactId}-${project.version}
+
-
-
- com.google.apis
- google-api-services-calendar
- v3-rev81-1.18.0-rc
-
-
- com.google.api-client
- google-api-client
- 1.18.0-rc
-
-
- 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-rev20220715-2.0.0
+
+
+ com.google.api-client
+ google-api-client
+ 2.0.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.18.0-rc
- 1.18.0-rc
- 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/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..c10605bd
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.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_create_membership_user_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..1572da40
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.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_create_membership_user_cred_for_app]
+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.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));
+ }
+ }
+}
+// [END chat_create_membership_user_cred_for_app]
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]
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..b32bd8dd
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java
@@ -0,0 +1,90 @@
+/*
+ * 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_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;
+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;
+
+// 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.Builder request = CreateMessageRequest.newBuilder()
+ // Replace SPACE_NAME here.
+ .setParent("spaces/SPACE_NAME")
+ .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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..cef822a1
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.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_create_message_user_cred]
+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.Builder request = CreateMessageRequest.newBuilder()
+ // Replace SPACE_NAME here.
+ .setParent("spaces/SPACE_NAME")
+ .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));
+ }
+ }
+}
+// [END chat_create_message_user_cred]
diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java
new file mode 100644
index 00000000..a52874bd
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.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_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 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.createClientWithUserCredentials(
+ ImmutableList.of(SCOPE))) {
+ 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 !"));
+ Message response = chatServiceClient.createMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [END chat_create_message_user_cred_at_mention]
diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java
new file mode 100644
index 00000000..0312ce07
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.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_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 CreateMessageUserCredMessageId {
+
+ 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.Builder request = CreateMessageRequest.newBuilder()
+ // Replace SPACE_NAME here.
+ .setParent("spaces/SPACE_NAME")
+ .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");
+ Message response = chatServiceClient.createMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [END chat_create_message_user_cred_message_id]
diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java
new file mode 100644
index 00000000..c9acce76
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.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_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 CreateMessageUserCredRequestId {
+
+ 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.Builder request = CreateMessageRequest.newBuilder()
+ // Replace SPACE_NAME here.
+ .setParent("spaces/SPACE_NAME")
+ .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");
+ Message response = chatServiceClient.createMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [END chat_create_message_user_cred_request_id]
diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java
new file mode 100644
index 00000000..8fa51135
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java
@@ -0,0 +1,57 @@
+/*
+ * 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_message_user_cred_thread_key]
+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 CreateMessageUserCredThreadKey {
+
+ 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.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")));
+ Message response = chatServiceClient.createMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [END chat_create_message_user_cred_thread_key]
diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java
new file mode 100644
index 00000000..e27387fb
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java
@@ -0,0 +1,58 @@
+/*
+ * 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_message_user_cred_thread_name]
+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 CreateMessageUserCredThreadName {
+
+ 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.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")));
+ Message response = chatServiceClient.createMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [END chat_create_message_user_cred_thread_name]
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/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java
new file mode 100644
index 00000000..f0fea33b
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java
@@ -0,0 +1,36 @@
+/*
+ * 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_delete_message_app_cred]
+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.Builder request = DeleteMessageRequest.newBuilder()
+ // replace SPACE_NAME and MESSAGE_NAME here
+ .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME");
+ chatServiceClient.deleteMessage(request.build());
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..34d5adc2
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.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.common.collect.ImmutableList;
+// [START chat_delete_message_user_cred]
+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.Builder request = DeleteMessageRequest.newBuilder()
+ // replace SPACE_NAME and MESSAGE_NAME here
+ .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME");
+ chatServiceClient.deleteMessage(request.build());
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..52c2e86f
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java
@@ -0,0 +1,40 @@
+/*
+ * 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_get_membership_app_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..55637384
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java
@@ -0,0 +1,45 @@
+/*
+ * 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_get_membership_user_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..f79e8a79
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java
@@ -0,0 +1,40 @@
+/*
+ * 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_get_message_app_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..f8a99a70
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java
@@ -0,0 +1,45 @@
+/*
+ * 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_get_message_user_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..4b76c13d
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java
@@ -0,0 +1,40 @@
+/*
+ * 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_get_space_app_cred]
+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.Builder request = GetSpaceRequest.newBuilder()
+ // Replace SPACE_NAME here
+ .setName("spaces/SPACE_NAME");
+ Space response = chatServiceClient.getSpace(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..ab85d9ce
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java
@@ -0,0 +1,45 @@
+/*
+ * 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_get_space_user_cred]
+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.Builder request = GetSpaceRequest.newBuilder()
+ // Replace SPACE_NAME here
+ .setName("spaces/SPACE_NAME");
+ Space response = chatServiceClient.getSpace(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..8a4a56f0
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.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_list_memberships_app_cred]
+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.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.build()).iterateAll()) {
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..8ddeb7dd
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.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_list_memberships_user_cred]
+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.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.build()).iterateAll()) {
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..d9081b24
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.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_list_messages_user_cred]
+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.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.build()).iterateAll()) {
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..8fd15cc3
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.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.protobuf.util.JsonFormat;
+// [START chat_list_spaces_app_cred]
+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.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.build()).iterateAll()) {
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..bffdf6cb
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.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_list_spaces_user_cred]
+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.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.build()).iterateAll()) {
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+ }
+}
+// [END chat_list_spaces_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]
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..559ad13f
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.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.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;
+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.Builder request = UpdateMessageRequest.newBuilder()
+ .setMessage(Message.newBuilder()
+ // replace SPACE_NAME and MESSAGE_NAME here
+ .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME")
+ .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.
+ .addAllPaths(List.of("text", "cards_v2")));
+ Message response = chatServiceClient.updateMessage(request.build());
+
+ System.out.println(JsonFormat.printer().print(response));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..abda65c7
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.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_update_message_user_cred]
+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.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));
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..73b5cec3
--- /dev/null
+++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.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_update_space_user_cred]
+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.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));
+ }
+ }
+}
+// [END chat_update_space_user_cred]
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]
diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle
index 517a3543..d69815f0 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:2.0.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'
}
diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java
index e95381da..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;
@@ -21,7 +22,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.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.*;
@@ -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 = JacksonFactory.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/.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..8def0b0f
--- /dev/null
+++ b/classroom/snippets/build.gradle
@@ -0,0 +1,21 @@
+apply plugin: 'java'
+
+repositories {
+ // Use 'jcenter' for resolving your dependencies.
+ mavenCentral()
+}
+
+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-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 {
+ 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/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
new file mode 100644
index 00000000..720dccec
--- /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.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.CourseAlias;
+import java.io.IOException;
+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 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_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/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java
new file mode 100644
index 00000000..6331f3ed
--- /dev/null
+++ b/classroom/snippets/src/main/java/AddStudent.java
@@ -0,0 +1,88 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.Student;
+import java.io.IOException;
+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 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, String studentId)
+ 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();
+
+ Student student = new Student().setUserId(studentId);
+ 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]
diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java
new file mode 100644
index 00000000..4c843721
--- /dev/null
+++ b/classroom/snippets/src/main/java/AddTeacher.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
+//
+// 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.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.Teacher;
+import java.io.IOException;
+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 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 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();
+
+ 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]
diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java
new file mode 100644
index 00000000..d4a54c2e
--- /dev/null
+++ b/classroom/snippets/src/main/java/BatchAddStudents.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
+//
+// 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.javanet.GoogleNetHttpTransport;
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.http.HttpHeaders;
+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 java.io.IOException;
+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 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 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();
+
+ 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]
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/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java
new file mode 100644
index 00000000..95f7353c
--- /dev/null
+++ b/classroom/snippets/src/main/java/CreateCourse.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 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.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 java.io.IOException;
+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 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();
+
+ Course course = null;
+ try {
+ // 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());
+ } 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]
diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java
new file mode 100644
index 00000000..c676b973
--- /dev/null
+++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.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_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.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 java.io.IOException;
+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 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_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..5d6c948d
--- /dev/null
+++ b/classroom/snippets/src/main/java/CreateCourseWork.java
@@ -0,0 +1,110 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.CourseWork;
+import com.google.api.services.classroom.model.Link;
+import com.google.api.services.classroom.model.Material;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
+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 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_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)
+ .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();
+ 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]
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/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
new file mode 100644
index 00000000..1be964a3
--- /dev/null
+++ b/classroom/snippets/src/main/java/CreateTopic.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.Topic;
+import java.io.IOException;
+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 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_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/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/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
new file mode 100644
index 00000000..15188de6
--- /dev/null
+++ b/classroom/snippets/src/main/java/DeleteTopic.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
+//
+// 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.javanet.GoogleNetHttpTransport;
+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 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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static void deleteTopic(String courseId, String topicId)
+ 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_topic_code_snippet]
+
+ try {
+ service.courses().topics().delete(courseId, topicId).execute();
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ 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/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java
new file mode 100644
index 00000000..94d07f75
--- /dev/null
+++ b/classroom/snippets/src/main/java/GetCourse.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
+//
+// 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.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.Course;
+import java.io.IOException;
+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 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();
+
+ 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]
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/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
new file mode 100644
index 00000000..5fb42012
--- /dev/null
+++ b/classroom/snippets/src/main/java/GetTopic.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.Topic;
+import java.io.IOException;
+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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static Topic getTopic(String courseId, String topicId)
+ 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_topic_code_snippet]
+
+ Topic topic = null;
+ 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();
+ if (error.getCode() == 404) {
+ System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId);
+ }
+ 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/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java
new file mode 100644
index 00000000..dbec2299
--- /dev/null
+++ b/classroom/snippets/src/main/java/ListCourseAliases.java
@@ -0,0 +1,103 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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_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.CourseAlias;
+import com.google.api.services.classroom.model.ListCourseAliasesResponse;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+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 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_list_aliases_code_snippet]
+
+ 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_code_snippet]
+ }
+}
+// [END classroom_list_aliases_class]
diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java
new file mode 100644
index 00000000..c5a00b25
--- /dev/null
+++ b/classroom/snippets/src/main/java/ListCourses.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+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 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();
+
+ 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]
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
new file mode 100644
index 00000000..20e322a1
--- /dev/null
+++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java
@@ -0,0 +1,179 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.ListStudentSubmissionsResponse;
+import com.google.api.services.classroom.model.StudentSubmission;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static List listStudentSubmissions(
+ 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(
+ 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;
+
+ try {
+ do {
+ // Set the userId as a query parameter on the request.
+ 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();
+ }
+ } 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());
+ }
+ }
+ // [END classroom_list_student_submissions_code_snippet]
+ } 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;
+ }
+
+ /**
+ * 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
new file mode 100644
index 00000000..105c9b41
--- /dev/null
+++ b/classroom/snippets/src/main/java/ListSubmissions.java
@@ -0,0 +1,111 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.ListStudentSubmissionsResponse;
+import com.google.api.services.classroom.model.StudentSubmission;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static List listSubmissions(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();
+
+ // [START classroom_list_submissions_code_snippet]
+
+ List studentSubmissions = new ArrayList<>();
+ String pageToken = null;
+
+ try {
+ do {
+ 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 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]
diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java
new file mode 100644
index 00000000..ea35cf90
--- /dev/null
+++ b/classroom/snippets/src/main/java/ListTopics.java
@@ -0,0 +1,108 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.ListTopicResponse;
+import com.google.api.services.classroom.model.Topic;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+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 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_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();
+
+ /* 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();
+ }
+ } 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/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java
new file mode 100644
index 00000000..d047ac2b
--- /dev/null
+++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.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_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.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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/* 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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, 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_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]
diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java
new file mode 100644
index 00000000..05bc71ac
--- /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.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.Course;
+import java.io.IOException;
+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 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();
+
+ 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]
diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java
new file mode 100644
index 00000000..33ed5165
--- /dev/null
+++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java
@@ -0,0 +1,110 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.StudentSubmission;
+import java.io.IOException;
+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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static StudentSubmission patchStudentSubmission(
+ String courseId, String courseWorkId, 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_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]
diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java
new file mode 100644
index 00000000..61c891a0
--- /dev/null
+++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.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 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.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 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`.
+ *
+ * @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 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_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/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java
new file mode 100644
index 00000000..fdfd6062
--- /dev/null
+++ b/classroom/snippets/src/main/java/UpdateCourse.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_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.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 java.io.IOException;
+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 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();
+
+ 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]
diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java
new file mode 100644
index 00000000..e45c3cc8
--- /dev/null
+++ b/classroom/snippets/src/main/java/UpdateTopic.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_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.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 java.io.IOException;
+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.
+ *
+ * @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.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
+ */
+ public static Topic updateTopic(String courseId, String topicId)
+ 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_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();
+
+ /* 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) {
+ 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
new file mode 100644
index 00000000..1b2eb04d
--- /dev/null
+++ b/classroom/snippets/src/test/java/BaseTest.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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 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 {
+ 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(ArrayList SCOPES)
+ throws GeneralSecurityException, IOException {
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ SCOPES.add(ClassroomScopes.CLASSROOM_COURSES);
+
+ // Create the classroom API client
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ return service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
+ }
+
+ 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 {
+ if (this.testCourse != null) {
+ deleteCourse(this.testCourse.getId());
+ }
+ this.testCourse = null;
+ }
+
+ public void createAlias(String courseId) throws IOException {
+ String alias = "p:" + UUID.randomUUID();
+ CourseAlias courseAlias = new CourseAlias().setAlias(alias);
+ this.service.courses().aliases().create(courseId, courseAlias).execute();
+ }
+
+ 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/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
new file mode 100644
index 00000000..4eb659eb
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.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.classroom.model.CourseAlias;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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 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();
+ Assert.assertNotNull("Course alias not returned.", courseAlias);
+ Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0);
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java
new file mode 100644
index 00000000..2b185c9a
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestAddStudent.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.classroom.model.Student;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Add Student classroom snippet
+public class TestAddStudent extends BaseTest {
+
+ private String studentId = "insert_student_id";
+
+ @Test
+ 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.assertNotNull("Course not returned.", student.getCourseId());
+ Assert.assertEquals(
+ "Student added to wrong course.", testCourse.getId(), student.getCourseId());
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java
new file mode 100644
index 00000000..58eaae57
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestAddTeacher.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.classroom.model.Teacher;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Add Teacher classroom snippet
+public class TestAddTeacher extends BaseTest {
+
+ private String teacherEmail = "insert_teacher_email";
+
+ @Test
+ 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());
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java
new file mode 100644
index 00000000..1f66874a
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestBatchAddStudents.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 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 GeneralSecurityException, IOException {
+ setup(BatchAddStudents.SCOPES);
+ List studentEmails = Arrays.asList("insert_student_1_email", "insert_student_2_email");
+ BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails);
+ }
+}
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/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java
new file mode 100644
index 00000000..a251f15c
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestCreateCourse.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.classroom.model.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Create Course classroom snippet
+public class TestCreateCourse extends BaseTest {
+
+ @Test
+ 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
new file mode 100644
index 00000000..2d906fbf
--- /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.security.GeneralSecurityException;
+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 GeneralSecurityException, IOException {
+ setup(CreateCourseWithAlias.SCOPES);
+ 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());
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java
new file mode 100644
index 00000000..5a160af0
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestCreateCourseWork.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.CourseWork;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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 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/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/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
new file mode 100644
index 00000000..381921d9
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestCreateTopic.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.classroom.model.Topic;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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 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/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/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
new file mode 100644
index 00000000..bffff20d
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestDeleteTopic.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.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 GeneralSecurityException, IOException {
+ setup(DeleteTopic.SCOPES);
+ 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/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java
new file mode 100644
index 00000000..ac95bda5
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestGetCourse.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.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Get Course classroom snippet
+public class TestGetCourse extends BaseTest {
+
+ @Test
+ 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
new file mode 100644
index 00000000..39775ff2
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestGetTopic.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.Topic;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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 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);
+ Assert.assertNotNull("Topic could not be retrieved.", getTopic);
+ Assert.assertEquals("Wrong topic was retrieved.", topic, getTopic);
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java
new file mode 100644
index 00000000..d3e357b5
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestListCourseAliases.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.CourseAlias;
+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 GeneralSecurityException, IOException {
+ setup(ListCourseAliases.SCOPES);
+ List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId());
+ Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1);
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java
new file mode 100644
index 00000000..7a4dd553
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestListCourses.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.classroom.model.Course;
+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 GeneralSecurityException, IOException {
+ List courses = ListCourses.listCourses();
+ Assert.assertTrue("No courses returned.", courses.size() > 0);
+ }
+}
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);
+ }
+}
diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java
new file mode 100644
index 00000000..1649e926
--- /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.security.GeneralSecurityException;
+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 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
new file mode 100644
index 00000000..f0b0bc85
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestListTopics.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.Topic;
+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 Topics classroom snippet
+public class TestListTopics extends BaseTest {
+
+ @Test
+ 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);
+ Assert.assertFalse("No topics were retrieved.", listTopics.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..a7d0d92f
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestPatchCourse.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.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Patch Course classroom snippet
+public class TestPatchCourse extends BaseTest {
+
+ @Test
+ 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
new file mode 100644
index 00000000..3c7cbda2
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestUpdateCourse.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.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Unit test class for Update Course classroom snippet
+public class TestUpdateCourse extends BaseTest {
+
+ @Test
+ 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
new file mode 100644
index 00000000..3144ff2d
--- /dev/null
+++ b/classroom/snippets/src/test/java/TestUpdateTopic.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.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 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());
+ Assert.assertNotEquals("Topic name was not updated.", topic.getName(), updatedTopic.getName());
+ }
+}
diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle
index 401c8edd..0e76e226 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.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'
}
diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java
index d64769ad..e7ad0715 100644
--- a/docs/outputJSON/src/main/java/OutputJSON.java
+++ b/docs/outputJSON/src/main/java/OutputJSON.java
@@ -20,7 +20,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,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 = JacksonFactory.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/build.gradle b/docs/quickstart/build.gradle
index cded13f2..9f6c9fd7 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0'
}
diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java
index cfc3900b..531e044b 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;
@@ -21,7 +22,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,56 +36,72 @@
import java.util.Collections;
import java.util.List;
+/* class to demonstrate use of Docs get documents API */
public class DocsQuickstart {
- private static final String APPLICATION_NAME = "Google Docs API Java Quickstart";
- private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
- 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();
- 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 = 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/build.gradle b/drive/activity-v2/quickstart/build.gradle
index 1c756882..86df8be7 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20220926-2.0.0'
}
diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java
index 30f9d1cb..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;
@@ -21,7 +22,7 @@
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.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.driveactivity.v2.DriveActivityScopes;
import com.google.api.services.driveactivity.v2.model.*;
@@ -36,181 +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 = JacksonFactory.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();
- return new com.google.api.services.driveactivity.v2.DriveActivity.Builder(
- HTTP_TRANSPORT, JSON_FACTORY, credential)
- .setApplicationName(APPLICATION_NAME)
- .build();
+ }
+
+ /**
+ * 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/build.gradle b/drive/activity/quickstart/build.gradle
index d031b8ac..de3ddb63 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: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'
}
diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java
index ea0f22bf..4a5e4657 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.jackson2.JacksonFactory;
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;
@@ -35,116 +34,127 @@
import java.util.Arrays;
import java.util.List;
-
+/* class to demonstrate 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");
-
- /** 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.
- *
- * 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);
- }
- }
-
- /**
- * 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(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;
+
+ 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 Apps Activity client service.
- * @return an authorized Appsactivity client service
- * @throws IOException
- */
- public static Appsactivity getAppsactivityService() throws IOException {
- Credential credential = authorize();
- return new Appsactivity.Builder(
- HTTP_TRANSPORT, JSON_FACTORY, credential)
- .setApplicationName(APPLICATION_NAME)
- .build();
+ }
+
+ /**
+ * 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.
- 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());
- }
+ 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;
+ }
+
+ /**
+ * 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();
+
+ // 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/build.gradle b/drive/quickstart/build.gradle
index 1a6964bc..bcc8c21a 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0'
}
diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java
index 33b6ae9e..62db72b8 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;
@@ -21,13 +22,12 @@
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;
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;
@@ -36,63 +36,79 @@
import java.util.Collections;
import java.util.List;
+/* class to demonstrate use of Drive files list API */
public class DriveQuickstart {
- private static final String APPLICATION_NAME = "Google Drive API Java Quickstart";
- private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
- 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();
- 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 = 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/build.gradle b/drive/snippets/drive_v2/build.gradle
new file mode 100644
index 00000000..df0967a5
--- /dev/null
+++ b/drive/snippets/drive_v2/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+
+repositories {
+ mavenCentral()
+}
+
+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.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'
+}
+
+test {
+ testLogging.showStandardStreams = true
+}
diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json
new file mode 100644
index 00000000..b42f309e
--- /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/files/document.txt b/drive/snippets/drive_v2/files/document.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/drive/snippets/drive_v2/files/photo.jpg b/drive/snippets/drive_v2/files/photo.jpg
new file mode 100644
index 00000000..98b05d35
Binary files /dev/null and b/drive/snippets/drive_v2/files/photo.jpg differ
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/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/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java
new file mode 100644
index 00000000..31265b2e
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.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_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.
+ */
+ 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);
+
+ // 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());
+
+ 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
new file mode 100644
index 00000000..ed909ecf
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java
@@ -0,0 +1,69 @@
+// 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.
+ */
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..0e4b817c
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java
@@ -0,0 +1,69 @@
+// 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.
+ */
+ 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");
+
+ 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
new file mode 100644
index 00000000..dff70011
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.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_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.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.
+ */
+ 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);
+
+ // 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
new file mode 100644
index 00000000..2098d1a9
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.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_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.
+ */
+ 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);
+
+ // 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_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java
new file mode 100644
index 00000000..789e232a
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.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_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.
+ */
+ 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();
+
+ 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/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java
new file mode 100644
index 00000000..16c27b6f
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.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_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 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);
+
+ // 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_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java
new file mode 100644
index 00000000..d2154eaa
--- /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.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 {
+
+ /*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();
+ }
+
+ 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..a3445c7a
--- /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.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 {
+ /*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]
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..1628c42b
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/ListAppData.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_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 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);
+
+ // 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;
+ }
+ }
+
+}
+// [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
new file mode 100644
index 00000000..15dcf2b9
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java
@@ -0,0 +1,88 @@
+// 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.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;
+import java.util.stream.Collectors;
+
+/* 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 {
+ /* 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();
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..d00de913
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.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
+//
+// 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.
+ */
+ 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);
+
+ // 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");
+
+ 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());
+
+ }
+ drives.addAll(result.getItems());
+
+ pageToken = result.getNextPageToken();
+ } while (pageToken != null);
+
+ 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
new file mode 100644
index 00000000..84705826
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java
@@ -0,0 +1,110 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.
+ */
+ 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);
+
+ // 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]
+
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..f6543292
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/SearchFile.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_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.
+ */
+ 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);
+
+ // 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]
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..ecbd3bf1
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/ShareFile.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
+
+ 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.
+ */
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..6875d862
--- /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.
+ */
+ 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);
+
+ // 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]
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..2bd4f557
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.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
+//
+// 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.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.
+ */
+ 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);
+
+ // 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
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..374f240b
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java
@@ -0,0 +1,72 @@
+// 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.
+ */
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..460abe3b
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.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_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.
+ */
+ 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();
+
+
+ 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
new file mode 100644
index 00000000..fead5537
--- /dev/null
+++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.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_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.
+ */
+ 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();
+
+ // 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..da62bf44
--- /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.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);
+
+ // 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]
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..1bf73c68
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.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;
+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.security.GeneralSecurityException;
+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 {
+ 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 GoogleCredentials getCredential() throws IOException {
+ return GoogleCredentials.getApplicationDefault()
+ .createScoped(
+ Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE));
+ }
+
+ /**
+ * 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(),
+ requestInitializer)
+ .setApplicationName("Drive Snippets")
+ .build();
+
+ return service;
+ }
+
+ @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/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java
new file mode 100644
index 00000000..9bd04c2c
--- /dev/null
+++ b/drive/snippets/drive_v2/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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..1c4cffb7
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java
new file mode 100644
index 00000000..ab3e0f2f
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..daccae50
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..526dea94
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.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
+ *
+ * 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 java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..16ede7b4
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.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
+ *
+ * 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 java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..8a2ed14b
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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);
+ }
+}
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..353d1186
--- /dev/null
+++ b/drive/snippets/drive_v2/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
+ *
+ * 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.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
new file mode 100644
index 00000000..ec781a28
--- /dev/null
+++ b/drive/snippets/drive_v2/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
+ *
+ * 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 java.io.IOException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..a6baf68c
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.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 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;
+
+// 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/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java
new file mode 100644
index 00000000..7e914647
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.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
+ *
+ * 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.assertTrue;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..731f3f18
--- /dev/null
+++ b/drive/snippets/drive_v2/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
+ *
+ * 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 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.util.List;
+import org.junit.Test;
+
+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;
+ }
+}
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..c9b9a07f
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.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
+ *
+ * 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 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.util.List;
+import org.junit.Test;
+
+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;
+ }
+}
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..280c6b9c
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.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
+ *
+ * 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 com.google.api.services.drive.model.File;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import org.junit.Test;
+
+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..167a7ec7
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.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
+ *
+ * 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 java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..9d7d80b8
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..c9c13961
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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);
+ }
+}
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..f083eb65
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+public class TestUploadBasic {
+
+ @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
new file mode 100644
index 00000000..ea7e7eea
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.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
+ *
+ * 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.assertNotNull;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..fcec0691
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.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
+ *
+ * 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.assertTrue;
+
+import com.google.api.services.drive.model.File;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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);
+ }
+}
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..11b5f2f9
--- /dev/null
+++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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/.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..9f0dc9f7
--- /dev/null
+++ b/drive/snippets/drive_v3/build.gradle
@@ -0,0 +1,16 @@
+apply plugin: 'java'
+repositories {
+ // Use 'jcenter' for resolving your dependencies.
+ mavenCentral()
+}
+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.11.0'
+ implementation 'com.google.code.gson:gson:2.9.1'
+ testImplementation 'junit:junit:4.13.2'
+}
+
+test {
+ testLogging.showStandardStreams = true
+}
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/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java
new file mode 100644
index 00000000..ceb53f9b
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.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_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.
+ */
+ 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);
+
+ // 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/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java
new file mode 100644
index 00000000..e907cb7d
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.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_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.
+ */
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..12acc6e7
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java
@@ -0,0 +1,69 @@
+// 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.
+ */
+ 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");
+
+ 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
new file mode 100644
index 00000000..2098d1a9
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.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_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.
+ */
+ 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);
+
+ // 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..789e232a
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.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_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.
+ */
+ 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();
+
+ 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/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java
new file mode 100644
index 00000000..d80db884
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.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_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 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);
+
+ // 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
new file mode 100644
index 00000000..49a2319e
--- /dev/null
+++ b/drive/snippets/drive_v3/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.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 {
+
+ /*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..a3445c7a
--- /dev/null
+++ b/drive/snippets/drive_v3/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.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 {
+ /*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]
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..96192020
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/ListAppData.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_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 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);
+
+ // 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/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java
new file mode 100644
index 00000000..bba31a82
--- /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.
+ */
+ 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();
+
+ // 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]
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..87fd32a8
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.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
+//
+// 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.
+ */
+ 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);
+
+ // 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]
+
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..2e5e7f01
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/SearchFile.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_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.
+ */
+ 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);
+
+ // 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, files(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..438440df
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/ShareFile.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
+
+ 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.
+ */
+ 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;
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..138a7e18
--- /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.
+ */
+ 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);
+
+ // 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]
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..4ed8e934
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.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_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.
+ */
+ 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);
+
+ // 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
new file mode 100644
index 00000000..a39a696c
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.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_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.
+ */
+ 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;
+ }
+ }
+}
+// [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..7ed2acac
--- /dev/null
+++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.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_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.
+ */
+ 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();
+
+
+ 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
new file mode 100644
index 00000000..b6bd86ad
--- /dev/null
+++ b/drive/snippets/drive_v3/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.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.
+ */
+ 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();
+
+ // 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..114e1b94
--- /dev/null
+++ b/drive/snippets/drive_v3/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.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);
+
+ // 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]
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..7e4252fb
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.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;
+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.security.GeneralSecurityException;
+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 {
+ 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 GoogleCredentials getCredential() throws IOException {
+ return GoogleCredentials.getApplicationDefault()
+ .createScoped(
+ Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE));
+ }
+
+ /**
+ * 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(),
+ requestInitializer)
+ .setApplicationName("Drive Snippets")
+ .build();
+
+ return service;
+ }
+
+ @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/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java
new file mode 100644
index 00000000..37e3b23f
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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);
+ }
+}
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..d8492a08
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..ab3e0f2f
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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..526dea94
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.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
+ *
+ * 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 java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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..16ede7b4
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.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
+ *
+ * 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 java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..791e0480
--- /dev/null
+++ b/drive/snippets/drive_v3/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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java
new file mode 100644
index 00000000..aed15304
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.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 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);
+ }
+}
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..1d334a1e
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+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);
+ }
+}
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..c747f7ee
--- /dev/null
+++ b/drive/snippets/drive_v3/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
+ *
+ * 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 com.google.api.services.drive.model.FileList;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..2c5aa74c
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.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
+ *
+ * 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.assertTrue;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..28e92433
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java
@@ -0,0 +1,47 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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 java.io.IOException;
+import java.util.List;
+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();
+ }
+
+ 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
new file mode 100644
index 00000000..280c6b9c
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.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
+ *
+ * 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 com.google.api.services.drive.model.File;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import org.junit.Test;
+
+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..167a7ec7
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.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
+ *
+ * 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 java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..9d7d80b8
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..69608a87
--- /dev/null
+++ b/drive/snippets/drive_v3/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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..fa53f4ff
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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..ea7e7eea
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.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
+ *
+ * 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.assertNotNull;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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
new file mode 100644
index 00000000..feee6a6a
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.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
+ *
+ * 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.assertTrue;
+
+import com.google.api.services.drive.model.File;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+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().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..11b5f2f9
--- /dev/null
+++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.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
+ *
+ * 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 java.io.IOException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+
+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/build.gradle b/gmail/quickstart/build.gradle
index e073c032..ca113827 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0'
}
diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java
index 4aee4cfc..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;
@@ -21,13 +22,12 @@
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;
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;
@@ -36,61 +36,76 @@
import java.util.Collections;
import java.util.List;
+/* class to demonstrate use of Gmail list labels API */
public class GmailQuickstart {
- private static final String APPLICATION_NAME = "Gmail API Java Quickstart";
- private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
- 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();
- 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 = 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 labels = listResponse.getLabels();
- if (labels.isEmpty()) {
- System.out.println("No labels found.");
- } else {
- System.out.println("Labels:");
- for (Label label : labels) {
- System.out.printf("- %s\n", label.getName());
- }
- }
+ // Print the labels in the user's account.
+ String user = "me";
+ ListLabelsResponse listResponse = service.users().labels().list(user).execute();
+ List labels = listResponse.getLabels();
+ if (labels.isEmpty()) {
+ System.out.println("No labels found.");
+ } else {
+ System.out.println("Labels:");
+ for (Label label : labels) {
+ System.out.printf("- %s\n", label.getName());
+ }
}
+ }
}
// [END gmail_quickstart]
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..69378a2d
--- /dev/null
+++ b/gmail/snippets/build.gradle
@@ -0,0 +1,15 @@
+apply plugin: 'java'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ 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'
+ testImplementation 'junit:junit:4.13.2'
+ testImplementation 'org.mockito:mockito-inline:4.8.0'
+ testImplementation 'org.hamcrest:hamcrest:2.2'
+}
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/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/files/photo.jpg b/gmail/snippets/files/photo.jpg
new file mode 100644
index 00000000..98b05d35
Binary files /dev/null and b/gmail/snippets/files/photo.jpg differ
diff --git a/gmail/snippets/gradle/wrapper/gradle-wrapper.jar b/gmail/snippets/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..7454180f
Binary files /dev/null and b/gmail/snippets/gradle/wrapper/gradle-wrapper.jar differ
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/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java
new file mode 100644
index 00000000..db65871e
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateDraft.java
@@ -0,0 +1,108 @@
+// 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.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.Draft;
+import com.google.api.services.gmail.model.Message;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+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 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, {@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.*/
+ 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(),
+ 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
+ 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
new file mode 100644
index 00000000..93bfcad3
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java
@@ -0,0 +1,127 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.Draft;
+import com.google.api.services.gmail.model.Message;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+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;
+import org.apache.commons.codec.binary.Base64;
+
+/* Class to demonstrate the use of Gmail Create Draft with attachment API */
+public class CreateDraftWithAttachment {
+ /**
+ * 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, {@code null} otherwise.
+ * @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(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
+ 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..b4f5e15a
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateEmail.java
@@ -0,0 +1,54 @@
+// 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 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 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
new file mode 100644
index 00000000..6a6b9cbd
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateFilter.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.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;
+
+/* Class to demonstrate the use of Gmail Create Filter API */
+public class CreateFilter {
+ /**
+ * Create a new filter.
+ *
+ * @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 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);
+ 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 {
+ // Filter the mail from sender and archive them(skip the inbox)
+ Filter filter = new Filter()
+ .setCriteria(new FilterCriteria()
+ .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
+ 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..e867cbb5
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateMessage.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.
+
+// [START gmail_create_message]
+
+import com.google.api.services.gmail.model.Message;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import org.apache.commons.codec.binary.Base64;
+
+/* 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/CreateSmimeInfo.java b/gmail/snippets/src/main/java/CreateSmimeInfo.java
new file mode 100644
index 00000000..2c2acdcb
--- /dev/null
+++ b/gmail/snippets/src/main/java/CreateSmimeInfo.java
@@ -0,0 +1,64 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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
diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java
new file mode 100644
index 00000000..aa5e0aaf
--- /dev/null
+++ b/gmail/snippets/src/main/java/EnableAutoReply.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 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;
+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;
+
+/* Class to demonstrate the use of Gmail Enable Auto Reply API*/
+public class EnableAutoReply {
+ /**
+ * Enables the auto reply
+ *
+ * @return the reply message and response metadata.
+ * @throws IOException - if service account credentials file not found.
+ */
+ public static VacationSettings 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(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());
+ return response;
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ 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
new file mode 100644
index 00000000..13471335
--- /dev/null
+++ b/gmail/snippets/src/main/java/EnableForwarding.java
@@ -0,0 +1,83 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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.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;
+
+/* 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(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
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 403) {
+ System.err.println("Unable to enable forwarding: " + e.getDetails());
+ } else {
+ throw e;
+ }
+ }
+ return null;
+ }
+}
+// [END gmail_enable_forwarding]
diff --git a/gmail/snippets/src/main/java/InsertCertFromCsv.java b/gmail/snippets/src/main/java/InsertCertFromCsv.java
new file mode 100644
index 00000000..b08b4e16
--- /dev/null
+++ b/gmail/snippets/src/main/java/InsertCertFromCsv.java
@@ -0,0 +1,58 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 java.io.File;
+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 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(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
new file mode 100644
index 00000000..25af7f83
--- /dev/null
+++ b/gmail/snippets/src/main/java/InsertSmimeInfo.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
+//
+// 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;
+
+/* 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 {
+ /* 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);
+
+ // 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 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/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java
new file mode 100644
index 00000000..de989866
--- /dev/null
+++ b/gmail/snippets/src/main/java/SendMessage.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 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 java.io.ByteArrayOutputStream;
+import java.io.IOException;
+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 {
+ /* 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);
+
+ // 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
+ 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
new file mode 100644
index 00000000..2a9903f0
--- /dev/null
+++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java
@@ -0,0 +1,124 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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 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;
+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 {
+ /* 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);
+
+ // 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
+ 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
new file mode 100644
index 00000000..3f5bf92e
--- /dev/null
+++ b/gmail/snippets/src/main/java/UpdateSignature.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 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;
+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.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 {
+ /* 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);
+
+ // 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;
+ }
+ }
+ 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
new file mode 100644
index 00000000..0a92ce8a
--- /dev/null
+++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.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 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;
+
+/* 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 {
+ /* 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);
+
+ // 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 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);
+ }
+ }
+ } 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..70932b7a
--- /dev/null
+++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java
@@ -0,0 +1,57 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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);
+ }
+ }
+}
+// [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
new file mode 100644
index 00000000..fbba7f1c
--- /dev/null
+++ b/gmail/snippets/src/test/java/BaseTest.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
+ *
+ * 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;
+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 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";
+
+ 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 {
+ /* 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();
+ }
+}
diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java
new file mode 100644
index 00000000..71e56eb9
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateDraft.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 static org.junit.Assert.assertNotNull;
+
+import com.google.api.services.gmail.model.Draft;
+import java.io.IOException;
+import javax.mail.MessagingException;
+import org.junit.Test;
+
+// 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..065c64c6
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.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 static org.junit.Assert.assertNotNull;
+
+import com.google.api.services.gmail.model.Draft;
+import java.io.IOException;
+import javax.mail.MessagingException;
+import org.junit.Test;
+
+// 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..043397a0
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateEmail.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 static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import org.junit.Test;
+
+// 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
new file mode 100644
index 00000000..fbf72c2b
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateFilter.java
@@ -0,0 +1,61 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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;
+
+// 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();
+ }
+ }
+
+ @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
new file mode 100644
index 00000000..d31bd75e
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateMessage.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import org.junit.Test;
+
+// 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
new file mode 100644
index 00000000..dcf90890
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.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.
+
+
+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 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 */);
+
+ 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);
+ }
+}
diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java
new file mode 100644
index 00000000..829e4c6d
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestEnableAutoReply.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 static org.junit.Assert.assertNotNull;
+
+import com.google.api.services.gmail.model.VacationSettings;
+import java.io.IOException;
+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);
+ }
+}
\ No newline at end of file
diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java
new file mode 100644
index 00000000..b7719fc3
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestEnableForwarding.java
@@ -0,0 +1,44 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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;
+
+// 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);
+ }
+
+ @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
new file mode 100644
index 00000000..2a1ccc60
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java
@@ -0,0 +1,111 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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;
+
+// Unit testcase for gmail insert cert from csv snippet
+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
new file mode 100644
index 00000000..360174e7
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java
@@ -0,0 +1,126 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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;
+
+// Unit testcase for gmail insert smime info snippet
+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
new file mode 100644
index 00000000..e915a244
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestSendMessage.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 static org.junit.Assert.assertNotNull;
+
+import com.google.api.services.gmail.model.Message;
+import java.io.IOException;
+import javax.mail.MessagingException;
+import org.junit.Test;
+
+// 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..8c428982
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.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 static org.junit.Assert.assertNotNull;
+
+import com.google.api.services.gmail.model.Message;
+import java.io.File;
+import java.io.IOException;
+import javax.mail.MessagingException;
+import org.junit.Test;
+
+// 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
new file mode 100644
index 00000000..809da2a8
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestUpdateSignature.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 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);
+ }
+}
\ 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..0808062b
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java
@@ -0,0 +1,279 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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 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.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());
+ @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;
+ }
+
+ 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..6b89e455
--- /dev/null
+++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java
@@ -0,0 +1,148 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 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 java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.List;
+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());
+ @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;
+ }
+
+ 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/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]
diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle
index 69a500f6..8009371c 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-people:v1-rev20220531-2.0.0'
}
diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java
index c50f86a0..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;
@@ -21,7 +22,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.people.v1.PeopleService;
import com.google.api.services.people.v1.PeopleServiceScopes;
@@ -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 = JacksonFactory.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/renovate.json b/renovate.json
deleted file mode 100644
index f45d8f11..00000000
--- a/renovate.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "extends": [
- "config:base"
- ]
-}
diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle
index 731bc7c9..e0c6f5a5 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0'
}
diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java
index b0eddd07..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;
@@ -21,12 +22,11 @@
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.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 = JacksonFactory.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/build.gradle b/sheets/snippets/build.gradle
index 5e599ff9..22610657 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 {
- 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.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'
}
test {
diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java
new file mode 100644
index 00000000..5da38dd1
--- /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..1a79a213
--- /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/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java
new file mode 100644
index 00000000..5c742500
--- /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.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;
+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/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java
new file mode 100644
index 00000000..7ce0306a
--- /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/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java
new file mode 100644
index 00000000..4cecfc76
--- /dev/null
+++ b/sheets/snippets/src/main/java/ConditionalFormatting.java
@@ -0,0 +1,139 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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.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;
+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..4d66e78c
--- /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 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);
+
+ // 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
diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java
new file mode 100644
index 00000000..157d6cdf
--- /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..8b56a058
--- /dev/null
+++ b/sheets/snippets/src/main/java/PivotTables.java
@@ -0,0 +1,145 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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/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]
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/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java
new file mode 100644
index 00000000..21e23308
--- /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
diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java
index 34ff8dad..6e815050 100644
--- a/sheets/snippets/src/test/java/BaseTest.java
+++ b/sheets/snippets/src/test/java/BaseTest.java
@@ -1,120 +1,77 @@
-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;
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.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;
-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 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.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 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..b0dd9551
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestAppendValues.java
@@ -0,0 +1,43 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.AppendValuesResponse;
+import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+
+// 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..9833ddc4
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestBatchGetValues.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.BatchGetValuesResponse;
+import com.google.api.services.sheets.v4.model.ValueRange;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+
+// 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..24d78ca0
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestBatchUpdate.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 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 java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+// 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..21560d94
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java
@@ -0,0 +1,41 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+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);
+ }
+}
diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java
new file mode 100644
index 00000000..22173381
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestConditionalFormatting.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse;
+import java.io.IOException;
+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);
+ }
+}
diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java
new file mode 100644
index 00000000..2fe55351
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestCreate.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 static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import org.junit.Test;
+
+// 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..13bee226
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestGetValues.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.ValueRange;
+import java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+// 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..91bd4f48
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestPivotTable.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
+ *
+ * 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.sheets.v4.model.BatchUpdateSpreadsheetResponse;
+import java.io.IOException;
+import org.junit.Test;
+
+// 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..8c8355a7
--- /dev/null
+++ b/sheets/snippets/src/test/java/TestUpdateValues.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 static org.junit.Assert.assertEquals;
+
+import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+
+// 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);
+ }
+}
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/quickstart/build.gradle b/slides/quickstart/build.gradle
index 8d86e30b..8350296e 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:2.0.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
+ implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0'
}
diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java
index 63c06d47..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;
@@ -21,13 +22,12 @@
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.slides.v1.Slides;
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 = JacksonFactory.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