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 67149cba..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_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_execute]
+ }
+ // [END apps_script_api_execute]
}
diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle
index 7d89965d..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.7
-targetCompatibility = 1.7
+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 eb335490..ba42d201 100644
--- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java
+++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java
@@ -12,7 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-// [START apps_script_quickstart]
+// [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,14 @@
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;
import java.io.InputStreamReader;
@@ -38,62 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
-
- /**
- * 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 CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = AppsScriptQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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_quickstart]
+// [END apps_script_api_quickstart]
diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle
index 180a680c..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.7
-targetCompatibility = 1.7
+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 e34b79fc..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;
@@ -29,6 +30,7 @@
import com.google.api.services.calendar.model.Event;
import com.google.api.services.calendar.model.Events;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -36,66 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
-
- /**
- * Global instance of the scopes required by this quickstart.
- * If modifying these scopes, delete your previously saved credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(CalendarScopes.CALENDAR_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = CalendarQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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/logging.properties b/calendar/sync/logging.properties
deleted file mode 100644
index c831eebb..00000000
--- a/calendar/sync/logging.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-# Properties file which configures the operation of the JDK logging facility.
-# The system will look for this config file to be specified as a system property:
-# -Djava.util.logging.config.file=${project_loc:calendar-cmd-line-sample}/logging.properties
-
-# Set up the console handler (uncomment "level" to show more fine-grained messages)
-handlers = java.util.logging.ConsoleHandler
-#java.util.logging.ConsoleHandler.level = CONFIG
-
-# Set up logging of HTTP requests and responses (uncomment "level" to show)
-#com.google.api.client.http.level = CONFIG
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 c8863331..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,22 +93,27 @@ 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);
}
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport,
JSON_FACTORY, clientSecrets, scopes).setDataStoreFactory(dataStoreFactory).build();
// Authorize.
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
+ LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
+ 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);
@@ -115,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 c2023996..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.7
-targetCompatibility = 1.7
+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 dd5da8e6..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,12 +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.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.*;
import com.google.api.services.classroom.Classroom;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -35,57 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
-
- /**
- * Global instance of the scopes required by this quickstart.
- * If modifying these scopes, delete your previously saved credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = ClassroomQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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
new file mode 100644
index 00000000..0e76e226
--- /dev/null
+++ b/docs/outputJSON/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+apply plugin: 'application'
+
+mainClassName = 'OutputJSON'
+sourceCompatibility = 11
+targetCompatibility = 11
+version = '1.0'
+
+repositories {
+ 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-docs:v1-rev20220609-2.0.0'
+ implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1'
+}
diff --git a/docs/outputJSON/settings.gradle b/docs/outputJSON/settings.gradle
new file mode 100644
index 00000000..53938545
--- /dev/null
+++ b/docs/outputJSON/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'outputJSON'
diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java
new file mode 100644
index 00000000..e7ad0715
--- /dev/null
+++ b/docs/outputJSON/src/main/java/OutputJSON.java
@@ -0,0 +1,94 @@
+// 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.
+
+import com.google.api.client.auth.oauth2.Credential;
+import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
+import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
+import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
+import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.client.util.store.FileDataStoreFactory;
+import com.google.api.services.docs.v1.Docs;
+import com.google.api.services.docs.v1.DocsScopes;
+import com.google.api.services.docs.v1.model.Document;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.List;
+
+// [START docs_output_json]
+
+/**
+ * OutputJSON prints the JSON representation of a Google Doc.
+ */
+public class OutputJSON {
+ private static final String APPLICATION_NAME = "Google Docs API Document Contents";
+ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
+ private static final String TOKENS_DIRECTORY_PATH = "tokens";
+ private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID";
+
+ /**
+ * 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";
+
+ /**
+ * 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");
+ }
+
+ 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));
+ }
+}
+// [END docs_output_json]
diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle
new file mode 100644
index 00000000..9f6c9fd7
--- /dev/null
+++ b/docs/quickstart/build.gradle
@@ -0,0 +1,17 @@
+apply plugin: 'java'
+apply plugin: 'application'
+
+mainClassName = 'DocsQuickstart'
+sourceCompatibility = 11
+targetCompatibility = 11
+version = '1.0'
+
+repositories {
+ 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-docs:v1-rev20220609-2.0.0'
+}
diff --git a/docs/quickstart/settings.gradle b/docs/quickstart/settings.gradle
new file mode 100644
index 00000000..7bcc727d
--- /dev/null
+++ b/docs/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/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java
new file mode 100644
index 00000000..531e044b
--- /dev/null
+++ b/docs/quickstart/src/main/java/DocsQuickstart.java
@@ -0,0 +1,107 @@
+// 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 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;
+import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
+import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.client.util.store.FileDataStoreFactory;
+import com.google.api.services.docs.v1.Docs;
+import com.google.api.services.docs.v1.DocsScopes;
+import com.google.api.services.docs.v1.model.Document;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.List;
+
+/* class to demonstrate use of Docs get documents API */
+public class DocsQuickstart {
+ /**
+ * Application name.
+ */
+ private static final String APPLICATION_NAME = "Google Docs API Java Quickstart";
+ /**
+ * Global instance of the JSON factory.
+ */
+ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
+ /**
+ * Directory to store authorization tokens for this application.
+ */
+ private static final String TOKENS_DIRECTORY_PATH = "tokens";
+ private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE";
+
+ /**
+ * Global instance of the scopes required by this quickstart.
+ * If modifying these scopes, delete your previously saved tokens/ folder.
+ */
+ private static final List SCOPES =
+ Collections.singletonList(DocsScopes.DOCUMENTS_READONLY);
+ private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
+
+ /**
+ * 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));
+
+ // 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();
+ Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
+
+ // 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
new file mode 100644
index 00000000..86df8be7
--- /dev/null
+++ b/drive/activity-v2/quickstart/build.gradle
@@ -0,0 +1,17 @@
+apply plugin: 'java'
+apply plugin: 'application'
+
+mainClassName = 'DriveActivityQuickstart'
+sourceCompatibility = 11
+targetCompatibility = 11
+version = '1.0'
+
+repositories {
+ 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-driveactivity:v2-rev20220926-2.0.0'
+}
diff --git a/drive/activity-v2/quickstart/settings.gradle b/drive/activity-v2/quickstart/settings.gradle
new file mode 100644
index 00000000..7bcc727d
--- /dev/null
+++ b/drive/activity-v2/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/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java
new file mode 100644
index 00000000..6e2c9b16
--- /dev/null
+++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java
@@ -0,0 +1,241 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.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_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;
+import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
+import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.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.*;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.AbstractMap;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+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 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);
+ }
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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 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();
+ }
+ if (activity.getTimeRange() != null) {
+ return activity.getTimeRange().getEndTime();
+ }
+ 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();
+ }
+ 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());
+ }
+ 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() + "\"";
+ }
+ 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);
+ }
+}
+// [END drive_activity_v2_quickstart]
diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle
index 38665724..de3ddb63 100644
--- a/drive/activity/quickstart/build.gradle
+++ b/drive/activity/quickstart/build.gradle
@@ -1,9 +1,9 @@
apply plugin: 'java'
apply plugin: 'application'
-mainClassName = 'ActivityQuickstart'
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
+mainClassName = 'DriveActivityQuickstart'
+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 102799a2..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,130 +21,140 @@
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;
import java.io.InputStreamReader;
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 =
- "G Suite Activity API Java Quickstart";
-
- /** Directory to store user credentials for this application. */
- private static final java.io.File DATA_STORE_DIR = new java.io.File(
- System.getProperty("user.home"), ".credentials/appsactivity-java-quickstart");
-
- /** 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 credentials
- * at ~/.credentials/appsactivity-java-quickstart
- */
- private static final List SCOPES =
- Arrays.asList(AppsactivityScopes.ACTIVITY,
- AppsactivityScopes.DRIVE_METADATA_READONLY);
-
- static {
- try {
- HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
- DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
- } catch (Throwable t) {
- t.printStackTrace();
- System.exit(1);
- }
+ /**
+ * 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);
}
-
- /**
- * 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("/client_secret.json");
- GoogleClientSecrets clientSecrets =
- GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
-
- // Build flow and trigger user authorization request.
- GoogleAuthorizationCodeFlow flow =
- new GoogleAuthorizationCodeFlow.Builder(
- HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
- .setDataStoreFactory(DATA_STORE_FACTORY)
- .setAccessType("offline")
- .build();
- Credential credential = new AuthorizationCodeInstalledApp(
- flow, new LocalServerReceiver()).authorize("user");
- System.out.println(
- "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
- return credential;
+ }
+
+ /**
+ * Creates an authorized Credential object.
+ *
+ * @return an authorized Credential object.
+ * @throws IOException
+ */
+ public static Credential authorize() throws IOException {
+ // Load client secrets.
+ InputStream in =
+ DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
+ if (in == null) {
+ throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
-
- /**
- * 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();
- }
-
- 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 b4cdf6f2..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.7
-targetCompatibility = 1.7
+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 1c25f771..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,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.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;
import java.io.InputStreamReader;
@@ -35,59 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
+ /**
+ * 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 credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = DriveQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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 c61e4733..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.7
-targetCompatibility = 1.7
+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 56ab0004..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,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.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;
import java.io.InputStreamReader;
@@ -35,57 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
+ /**
+ * 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 credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = GmailQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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]
\ No newline at end of file
+// [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 117dcb26..8009371c 100644
--- a/people/quickstart/build.gradle
+++ b/people/quickstart/build.gradle
@@ -2,8 +2,9 @@ apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'PeopleQuickstart'
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
+sourceCompatibility = 11
+targetCompatibility = 11
+
version = '1.0'
repositories {
@@ -11,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 573fd08c..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,81 +22,91 @@
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;
import com.google.api.services.people.v1.model.ListConnectionsResponse;
+import com.google.api.services.people.v1.model.Name;
import com.google.api.services.people.v1.model.Person;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
-import java.util.Collections;
import java.util.Arrays;
+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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
-
- /**
- * Global instance of the scopes required by this quickstart.
- * If modifying these scopes, delete your previously saved credentials/ folder.
- */
- private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = PeopleQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
+ /**
+ * Creates an authorized Credential object.
+ *
+ * @param HTTP_TRANSPORT The network HTTP Transport.
+ * @return An authorized Credential object.
+ * @throws IOException If the credentials.json file cannot be found.
+ */
+ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT)
+ throws IOException {
+ // Load client secrets.
+ InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
+ if (in == null) {
+ throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
+ GoogleClientSecrets clientSecrets =
+ GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
+
+ // Build flow and trigger user authorization request.
+ GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
+ HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
+ .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
+ .setAccessType("offline")
+ .build();
+ LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
+ return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
+ }
- public static void main(String... args) throws IOException, GeneralSecurityException {
- // Build a new authorized API client service.
- final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
- PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
- .setApplicationName(APPLICATION_NAME)
- .build();
+ public static void main(String... args) throws IOException, GeneralSecurityException {
+ // Build a new authorized API client service.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ PeopleService service =
+ new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
- // Request 10 connections.
- ListConnectionsResponse response = service.people().connections()
- .list("people/me")
- .setPageSize(10)
- .setPersonFields("names,emailAddresses")
- .execute();
+ // Request 10 connections.
+ ListConnectionsResponse response = service.people().connections()
+ .list("people/me")
+ .setPageSize(10)
+ .setPersonFields("names,emailAddresses")
+ .execute();
- // Print display name of connections if available.
- List connections = response.getConnections();
- if (connections != null && connections.size() > 0) {
- for (Person person : connections) {
- List names = person.getNames();
- if (names != null && names.size() > 0) {
- System.out.println("Name: " + person.getNames().get(0)
- .getDisplayName());
- } else {
- System.out.println("No names available for connection.");
- }
- }
+ // Print display name of connections if available.
+ List connections = response.getConnections();
+ if (connections != null && connections.size() > 0) {
+ for (Person person : connections) {
+ List names = person.getNames();
+ if (names != null && names.size() > 0) {
+ System.out.println("Name: " + person.getNames().get(0)
+ .getDisplayName());
} else {
- System.out.println("No connections found.");
+ System.out.println("No names available for connection.");
}
+ }
+ } else {
+ System.out.println("No connections found.");
}
+ }
}
// [END people_quickstart]
diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle
index 08d14122..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.7
-targetCompatibility = 1.7
+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-sheets:v4-rev516-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-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 f65919d9..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,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.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;
import java.io.InputStreamReader;
@@ -35,62 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
+ 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 credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = SheetsQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).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/.gitignore b/sheets/snippets/.gitignore
new file mode 100644
index 00000000..0c27b487
--- /dev/null
+++ b/sheets/snippets/.gitignore
@@ -0,0 +1,67 @@
+# 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/
+bin/
+
+# 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
+
+# Eclipse
+.project
+.settings/
+.classpath
diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle
new file mode 100644
index 00000000..22610657
--- /dev/null
+++ b/sheets/snippets/build.gradle
@@ -0,0 +1,16 @@
+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-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 {
+ testLogging.showStandardStreams = true
+}
\ No newline at end of file
diff --git a/sheets/snippets/gradle/wrapper/gradle-wrapper.jar b/sheets/snippets/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..5ccda13e
Binary files /dev/null and b/sheets/snippets/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/sheets/snippets/settings.gradle b/sheets/snippets/settings.gradle
new file mode 100644
index 00000000..f93899b1
--- /dev/null
+++ b/sheets/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/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/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
new file mode 100644
index 00000000..6e815050
--- /dev/null
+++ b/sheets/snippets/src/test/java/BaseTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.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.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.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Before;
+
+public class BaseTest {
+ protected Sheets service;
+ protected Drive driveService;
+
+ 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 Sheets buildService(GoogleCredentials credentials) {
+ return new Sheets.Builder(
+ new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ new HttpCredentialsAdapter(credentials))
+ .setApplicationName("Sheets API Snippets")
+ .build();
+ }
+
+ public Drive buildDriveService(GoogleCredentials credentials) {
+ return new Drive.Builder(
+ new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ new HttpCredentialsAdapter(credentials))
+ .setApplicationName("Sheets API Snippets")
+ .build();
+ }
+
+ @Before
+ public void setup() throws IOException {
+ GoogleCredentials credential = getCredential();
+ this.service = buildService(credential);
+ this.driveService = buildDriveService(credential);
+ }
+
+ protected void deleteFileOnCleanup(String id) throws IOException {
+ this.driveService.files().delete(id).execute();
+ }
+
+ protected void populateValuesWithStrings(String spreadsheetId) throws IOException {
+ List requests = new ArrayList<>();
+ requests.add(new Request().setRepeatCell(new RepeatCellRequest()
+ .setRange(new GridRange()
+ .setSheetId(0)
+ .setStartRowIndex(0)
+ .setEndRowIndex(10)
+ .setStartColumnIndex(0)
+ .setEndColumnIndex(10))
+ .setCell(new CellData()
+ .setUserEnteredValue(new ExtendedValue()
+ .setStringValue("Hello")))
+ .setFields("userEnteredValue")));
+ BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest()
+ .setRequests(requests);
+ service.spreadsheets().batchUpdate(spreadsheetId, body).execute();
+ }
+
+ protected void populateValuesWithNumbers(String spreadsheetId) throws IOException {
+ List requests = new ArrayList<>();
+ requests.add(new Request().setRepeatCell(new RepeatCellRequest()
+ .setRange(new GridRange()
+ .setSheetId(0)
+ .setStartRowIndex(0)
+ .setEndRowIndex(10)
+ .setStartColumnIndex(0)
+ .setEndColumnIndex(10))
+ .setCell(new CellData()
+ .setUserEnteredValue(new ExtendedValue()
+ .setNumberValue(1337D)))
+ .setFields("userEnteredValue")));
+ BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest()
+ .setRequests(requests);
+ service.spreadsheets().batchUpdate(spreadsheetId, body).execute();
+ }
+}
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/slides/quickstart/build.gradle b/slides/quickstart/build.gradle
index 2b2da024..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.7
-targetCompatibility = 1.7
+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 211aee81..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,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.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;
import java.io.InputStreamReader;
@@ -36,54 +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 CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials.
+ 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 credentials/ folder.
- */
- private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY);
- private static final String CLIENT_SECRET_DIR = "client_secret.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 there is no client_secret.
- */
- private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
- // Load client secrets.
- InputStream in = SlidesQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR);
- 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(CREDENTIALS_FOLDER)))
- .setAccessType("offline")
- .build();
- return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
+ /**
+ * Creates an authorized Credential object.
+ *
+ * @param HTTP_TRANSPORT The network HTTP Transport.
+ * @return An authorized Credential object.
+ * @throws IOException If the credentials.json file cannot be found.
+ */
+ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT)
+ throws IOException {
+ // Load client secrets.
+ InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
+ if (in == null) {
+ throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
+ GoogleClientSecrets clientSecrets =
+ GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
+
+ // Build flow and trigger user authorization request.
+ GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
+ HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
+ .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
+ .setAccessType("offline")
+ .build();
+ LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
+ return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
+ }
- public static void main(String... args) throws IOException, GeneralSecurityException {
- // Build a new authorized API client service.
- final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
- Slides service = new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
- .setApplicationName(APPLICATION_NAME)
- .build();
+ public static void main(String... args) throws IOException, GeneralSecurityException {
+ // Build a new authorized API client service.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Slides service =
+ new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
+ .setApplicationName(APPLICATION_NAME)
+ .build();
- // Prints the number of slides and elements in a sample presentation:
- // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit
- String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc";
- Presentation response = service.presentations().get(presentationId).execute();
- List slides = response.getSlides();
+ // Prints the number of slides and elements in a sample presentation:
+ // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit
+ String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc";
+ Presentation response = service.presentations().get(presentationId).execute();
+ List slides = response.getSlides();
- System.out.printf("The presentation contains %s slides:\n", slides.size());
- for (int i = 0; i < slides.size(); ++i) {
- System.out.printf("- Slide #%s contains %s elements.\n", i + 1, slides.get(i).getPageElements().size());
- }
+ System.out.printf("The presentation contains %s slides:\n", slides.size());
+ for (int i = 0; i < slides.size(); ++i) {
+ System.out.printf("- Slide #%s contains %s elements.\n", i + 1,
+ slides.get(i).getPageElements().size());
}
+ }
}
// [END slides_quickstart]
diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle
index 8615d123..0471dc29 100644
--- a/slides/snippets/build.gradle
+++ b/slides/snippets/build.gradle
@@ -1,19 +1,19 @@
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-rev34-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'
+ implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0'
+ testImplementation 'junit:junit:4.13.2'
- compile fileTree(dir: 'lib', include: ['*.jar'])
+ implementation fileTree(dir: 'lib', include: ['*.jar'])
}
test {
testLogging.showStandardStreams = true
-}
\ No newline at end of file
+}
diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java
new file mode 100644
index 00000000..6b1def55
--- /dev/null
+++ b/slides/snippets/src/main/java/CopyPresentation.java
@@ -0,0 +1,80 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_copy_presentation]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.drive.Drive;
+import com.google.api.services.drive.model.File;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.Collections;
+
+/* Class to demonstrate the use of Slides Copy Presentation API */
+public class CopyPresentation {
+ /**
+ * Copy an existing presentation.
+ *
+ * @param presentationId - id of the presentation.
+ * @param copyTitle - New title of the presentation.
+ * @return presentation id
+ * @throws IOException - if credentials file not found.
+ */
+ public static String copyPresentation(String presentationId, String copyTitle)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.DRIVE));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the drive API client
+ Drive driveService = new Drive.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ String presentationCopyId = null;
+ try {
+ // Copies an existing presentation using specified presentation title.
+ File copyMetadata = new File().setName(copyTitle);
+ File presentationCopyFile =
+ driveService.files().copy(presentationId, copyMetadata).execute();
+ presentationCopyId = presentationCopyFile.getId();
+ // Prints the new copied presentation id.
+ System.out.println("New copied presentation id " + presentationCopyId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return presentationCopyId;
+ }
+}
+// [END slides_copy_presentation]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java
new file mode 100644
index 00000000..89202f6a
--- /dev/null
+++ b/slides/snippets/src/main/java/CreateBulletedText.java
@@ -0,0 +1,96 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_bulleted_text]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.CreateParagraphBulletsRequest;
+import com.google.api.services.slides.v1.model.Range;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slide Create Bulleted Text API */
+public class CreateBulletedText {
+ /**
+ * Add arrow-diamond-disc bullets to all text in the shape.
+ *
+ * @param presentationId - id of the presentation.
+ * @param shapeId - id of the shape.
+ * @return response
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse createBulletedText(String presentationId,
+ String shapeId)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Add arrow-diamond-disc bullets to all text in the shape.
+ List requests = new ArrayList<>();
+ requests.add(new Request()
+ .setCreateParagraphBullets(new CreateParagraphBulletsRequest()
+ .setObjectId(shapeId)
+ .setTextRange(new Range()
+ .setType("ALL"))
+ .setBulletPreset("BULLET_ARROW_DIAMOND_DISC")));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the request.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ System.out.println("Added bullets to text in shape with ID: " + shapeId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 400) {
+ System.out.printf("Shape not found with id '%s'.\n", shapeId);
+ } else if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_create_bulleted_text]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java
new file mode 100644
index 00000000..55ec3534
--- /dev/null
+++ b/slides/snippets/src/main/java/CreateImage.java
@@ -0,0 +1,114 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_image]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.AffineTransform;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.CreateImageRequest;
+import com.google.api.services.slides.v1.model.CreateImageResponse;
+import com.google.api.services.slides.v1.model.Dimension;
+import com.google.api.services.slides.v1.model.PageElementProperties;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.Size;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Create Image API */
+public class CreateImage {
+ /**
+ * Create a new image, using the supplied object ID, with content
+ * downloaded from imageUrl.
+ *
+ * @param presentationId - id of the presentation.
+ * @param slideId - id of the shape.
+ * @param imageUrl - Url of the image.
+ * @return image id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse createImage(String presentationId,
+ String slideId,
+ String imageUrl)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Create a new image, using the supplied object ID, with content downloaded from imageUrl.
+ List requests = new ArrayList<>();
+ String imageId = "MyImageId_01";
+ Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU");
+ requests.add(new Request()
+ .setCreateImage(new CreateImageRequest()
+ .setObjectId(imageId)
+ .setUrl(imageUrl)
+ .setElementProperties(new PageElementProperties()
+ .setPageObjectId(slideId)
+ .setSize(new Size()
+ .setHeight(emu4M)
+ .setWidth(emu4M))
+ .setTransform(new AffineTransform()
+ .setScaleX(1.0)
+ .setScaleY(1.0)
+ .setTranslateX(100000.0)
+ .setTranslateY(100000.0)
+ .setUnit("EMU")))));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the request.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage();
+ // Prints the created image id.
+ System.out.println("Created image with ID: " + createImageResponse.getObjectId());
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_create_image]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java
new file mode 100644
index 00000000..f7d7d96b
--- /dev/null
+++ b/slides/snippets/src/main/java/CreatePresentation.java
@@ -0,0 +1,66 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_presentation]
+
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.Presentation;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.Collections;
+
+/* Class to demonstrate the use of Slides Create Presentation API */
+public class CreatePresentation {
+ /**
+ * Creates a new presentation.
+ *
+ * @param title - the name of the presentation to be created
+ * @return presentation id
+ * @throws IOException - if credentials file not found.
+ */
+ public static String createPresentation(String title) throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Creates a blank presentation with a specified title.
+ Presentation presentation = new Presentation()
+ .setTitle(title);
+ presentation = service.presentations().create(presentation)
+ .setFields("presentationId")
+ .execute();
+ // Prints the newly created presentation id.
+ System.out.println("Created presentation with ID: " + presentation.getPresentationId());
+ return presentation.getPresentationId();
+ }
+}
+// [END slides_create_presentation]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java
new file mode 100644
index 00000000..3f3d3e9b
--- /dev/null
+++ b/slides/snippets/src/main/java/CreateSheetsChart.java
@@ -0,0 +1,114 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_sheets_chart]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.AffineTransform;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.CreateSheetsChartRequest;
+import com.google.api.services.slides.v1.model.Dimension;
+import com.google.api.services.slides.v1.model.PageElementProperties;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.Size;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Create Chart API */
+public class CreateSheetsChart {
+ /**
+ * Adds chart from spreadsheet to slides as linked.
+ *
+ * @param presentationId - id of the presentation.
+ * @param pageId - id of the page.
+ * @param spreadsheetId - id of the spreadsheet.
+ * @param sheetChartId - id of the chart in sheets.
+ * @return presentation chart id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse createSheetsChart(
+ String presentationId, String pageId, String spreadsheetId, Integer sheetChartId)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto
+ // a page in the presentation. Setting the linking mode as "LINKED" allows the
+ // chart to be refreshed if the Sheets version is updated.
+ List requests = new ArrayList<>();
+ Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU");
+ String presentationChartId = "MyEmbeddedChart";
+ requests.add(new Request()
+ .setCreateSheetsChart(new CreateSheetsChartRequest()
+ .setObjectId(presentationChartId)
+ .setSpreadsheetId(spreadsheetId)
+ .setChartId(sheetChartId)
+ .setLinkingMode("LINKED")
+ .setElementProperties(new PageElementProperties()
+ .setPageObjectId(pageId)
+ .setSize(new Size()
+ .setHeight(emu4M)
+ .setWidth(emu4M))
+ .setTransform(new AffineTransform()
+ .setScaleX(1.0)
+ .setScaleY(1.0)
+ .setTranslateX(100000.0)
+ .setTranslateY(100000.0)
+ .setUnit("EMU")))));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the request.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ System.out.println("Added a linked Sheets chart with ID " + presentationChartId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_create_sheets_chart]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java
new file mode 100644
index 00000000..1ef009ab
--- /dev/null
+++ b/slides/snippets/src/main/java/CreateSlide.java
@@ -0,0 +1,102 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_slide]
+
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.CreateSlideRequest;
+import com.google.api.services.slides.v1.model.CreateSlideResponse;
+import com.google.api.services.slides.v1.model.LayoutReference;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Create Slides API */
+public class CreateSlide {
+ /**
+ * Creates a new slide.
+ *
+ * @param presentationId - id of the presentation.
+ * @return slide id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse createSlide(String presentationId)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout
+ List requests = new ArrayList<>();
+ String slideId = "MyNewSlide_001";
+ BatchUpdatePresentationResponse response = null;
+ try {
+ requests.add(new Request()
+ .setCreateSlide(new CreateSlideRequest()
+ .setObjectId(slideId)
+ .setInsertionIndex(1)
+ .setSlideLayoutReference(new LayoutReference()
+ .setPredefinedLayout("TITLE_AND_TWO_COLUMNS"))));
+
+ // If you wish to populate the slide with elements, add create requests here,
+ // using the slide ID specified above.
+
+ // Execute the request.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide();
+ // Prints the slide id.
+ System.out.println("Created slide with ID: " + createSlideResponse.getObjectId());
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 400) {
+ System.out.printf(" Id '%s' should be unique among all pages and page elements.\n",
+ presentationId);
+ } else if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_create_slide]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java
new file mode 100644
index 00000000..797be99e
--- /dev/null
+++ b/slides/snippets/src/main/java/CreateTextboxWithText.java
@@ -0,0 +1,117 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_create_textbox_with_text]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.AffineTransform;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.CreateShapeRequest;
+import com.google.api.services.slides.v1.model.CreateShapeResponse;
+import com.google.api.services.slides.v1.model.Dimension;
+import com.google.api.services.slides.v1.model.InsertTextRequest;
+import com.google.api.services.slides.v1.model.PageElementProperties;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.Size;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Create Textbox API */
+public class CreateTextboxWithText {
+ /**
+ * Create a new square textbox, using the specified id.
+ *
+ * @param presentationId - id of the presentation.
+ * @param slideId - id of the slide.
+ * @param textBoxId - id for the textbox.
+ * @return textbox id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse createTextBoxWithText(
+ String presentationId, String slideId, String textBoxId) throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Create a new square text box, using a supplied object ID.
+ List requests = new ArrayList<>();
+ Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT");
+ requests.add(new Request()
+ .setCreateShape(new CreateShapeRequest()
+ .setObjectId(textBoxId)
+ .setShapeType("TEXT_BOX")
+ .setElementProperties(new PageElementProperties()
+ .setPageObjectId(slideId)
+ .setSize(new Size()
+ .setHeight(pt350)
+ .setWidth(pt350))
+ .setTransform(new AffineTransform()
+ .setScaleX(1.0)
+ .setScaleY(1.0)
+ .setTranslateX(350.0)
+ .setTranslateY(100.0)
+ .setUnit("PT")))));
+
+ // Insert text into the box, using the object ID given to it.
+ requests.add(new Request()
+ .setInsertText(new InsertTextRequest()
+ .setObjectId(textBoxId)
+ .setInsertionIndex(0)
+ .setText("New Box Text Inserted")));
+ BatchUpdatePresentationResponse response = null;
+
+ try {
+ // Execute the requests.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape();
+ System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId());
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_create_textbox_with_text]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java
new file mode 100644
index 00000000..a45b9ad8
--- /dev/null
+++ b/slides/snippets/src/main/java/ImageMerging.java
@@ -0,0 +1,116 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_image_merging]
+
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.drive.Drive;
+import com.google.api.services.drive.model.File;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.Response;
+import com.google.api.services.slides.v1.model.ReplaceAllShapesWithImageRequest;
+import com.google.api.services.slides.v1.model.SubstringMatchCriteria;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Image Merging API */
+public class ImageMerging {
+ /**
+ * Changes specified texts into images.
+ *
+ * @param templatePresentationId - id of the presentation.
+ * @param imageUrl - Url of the image.
+ * @param customerName - Name of the customer.
+ * @return merged presentation id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId,
+ String imageUrl,
+ String customerName)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS,
+ SlidesScopes.DRIVE));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Create the drive API client
+ Drive driveService = new Drive.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Duplicate the template presentation using the Drive API.
+ String copyTitle = customerName + " presentation";
+ File content = new File().setName(copyTitle);
+ File presentationFile =
+ driveService.files().copy(templatePresentationId, content).execute();
+ String presentationId = presentationFile.getId();
+
+ // Create the image merge (replaceAllShapesWithImage) requests.
+ List requests = new ArrayList<>();
+ requests.add(new Request()
+ .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest()
+ .setImageUrl(imageUrl)
+ .setImageReplaceMethod("CENTER_INSIDE")
+ .setContainsText(new SubstringMatchCriteria()
+ .setText("{{company-logo}}")
+ .setMatchCase(true))));
+
+ // Execute the requests.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ BatchUpdatePresentationResponse response =
+ service.presentations().batchUpdate(presentationId, body).execute();
+
+ int numReplacements = 0;
+ try {
+ // Count total number of replacements made.
+ for (Response resp : response.getReplies()) {
+ numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged();
+ }
+
+ // Prints the merged presentation id and count of replacements.
+ System.out.println("Created merged presentation with ID: " + presentationId);
+ System.out.println("Replaced " + numReplacements + " shapes instances with images.");
+ } catch (NullPointerException ne) {
+ System.out.println("Text not found to replace with image.");
+ }
+ return response;
+ }
+}
+// [END slides_image_merging]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java
new file mode 100644
index 00000000..7ff9df97
--- /dev/null
+++ b/slides/snippets/src/main/java/RefreshSheetsChart.java
@@ -0,0 +1,92 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_refresh_sheets_chart]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.RefreshSheetsChartRequest;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Refresh Chart API */
+public class RefreshSheetsChart {
+ /**
+ * Refresh the sheets charts.
+ *
+ * @param presentationId - id of the presentation.
+ * @param presentationChartId - id of the presentation chart.
+ * @return presentation chart id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse refreshSheetsChart(
+ String presentationId, String presentationChartId) throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ List requests = new ArrayList<>();
+
+ // Refresh an existing linked Sheets chart embedded a presentation.
+ requests.add(new Request()
+ .setRefreshSheetsChart(new RefreshSheetsChartRequest()
+ .setObjectId(presentationChartId)));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the request.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 400) {
+ System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId);
+ } else if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_refresh_sheets_chart]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java
new file mode 100644
index 00000000..0e23a303
--- /dev/null
+++ b/slides/snippets/src/main/java/SimpleTextReplace.java
@@ -0,0 +1,101 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_simple_text_replace]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.DeleteTextRequest;
+import com.google.api.services.slides.v1.model.InsertTextRequest;
+import com.google.api.services.slides.v1.model.Range;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Replace Text API */
+public class SimpleTextReplace {
+ /**
+ * Remove existing text in the shape, then insert new text.
+ *
+ * @param presentationId - id of the presentation.
+ * @param shapeId - id of the shape.
+ * @param replacementText - New replacement text.
+ * @return response
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse simpleTextReplace(
+ String presentationId, String shapeId, String replacementText) throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Remove existing text in the shape, then insert the new text.
+ List requests = new ArrayList<>();
+ requests.add(new Request()
+ .setDeleteText(new DeleteTextRequest()
+ .setObjectId(shapeId)
+ .setTextRange(new Range()
+ .setType("ALL"))));
+ requests.add(new Request()
+ .setInsertText(new InsertTextRequest()
+ .setObjectId(shapeId)
+ .setInsertionIndex(0)
+ .setText(replacementText)));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the requests.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ System.out.println("Replaced text in shape with ID: " + shapeId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 400) {
+ System.out.printf("Shape not found with id '%s'.\n", shapeId);
+ } else if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_simple_text_replace]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java
deleted file mode 100644
index 1b8512f8..00000000
--- a/slides/snippets/src/main/java/Snippets.java
+++ /dev/null
@@ -1,471 +0,0 @@
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.FileContent;
-import com.google.api.client.http.GenericUrl;
-import com.google.api.services.drive.Drive;
-import com.google.api.services.drive.model.File;
-import com.google.api.services.sheets.v4.Sheets;
-import com.google.api.services.sheets.v4.model.ValueRange;
-import com.google.api.services.slides.v1.Slides;
-import com.google.api.services.slides.v1.model.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Snippets {
-
- private Slides service;
- private Drive driveService;
- private Sheets sheetsService;
-
- Snippets(Slides service, Drive driveService, Sheets sheetsService) {
- this.service = service;
- this.driveService = driveService;
- this.sheetsService = sheetsService;
- }
-
- public String createPresentation(String title) throws IOException {
- Slides slidesService = this.service;
- // [START slides_create_presentation]
- Presentation presentation = new Presentation()
- .setTitle(title);
- presentation = slidesService.presentations().create(presentation)
- .setFields("presentationId")
- .execute();
- System.out.println("Created presentation with ID: " + presentation.getPresentationId());
- // [END slides_create_presentation]
- return presentation.getPresentationId();
- }
-
- public String copyPresentation(String presentationId, String copyTitle) throws IOException {
- Drive driveService = this.driveService;
- // [START slides_copy_presentation]
- File copyMetadata = new File().setName(copyTitle);
- File presentationCopyFile =
- driveService.files().copy(presentationId, copyMetadata).execute();
- String presentationCopyId = presentationCopyFile.getId();
- // [END slides_copy_presentation]
- return presentationCopyId;
- }
-
- public BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException {
- Slides slidesService = this.service;
- // [START slides_create_slide]
- // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout
- // and the ID "MyNewSlide_001".
- List requests = new ArrayList<>();
- String slideId = "MyNewSlide_001";
- requests.add(new Request()
- .setCreateSlide(new CreateSlideRequest()
- .setObjectId(slideId)
- .setInsertionIndex(1)
- .setSlideLayoutReference(new LayoutReference()
- .setPredefinedLayout("TITLE_AND_TWO_COLUMNS"))));
-
- // If you wish to populate the slide with elements, add create requests here,
- // using the slide ID specified above.
-
- // Execute the request.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide();
- System.out.println("Created slide with ID: " + createSlideResponse.getObjectId());
- // [END slides_create_slide]
- return response;
- }
-
- public BatchUpdatePresentationResponse createTextBoxWithText(
- String presentationId, String slideId) throws IOException {
- Slides slidesService = this.service;
- // [START slides_create_textbox_with_text]
- // Create a new square text box, using a supplied object ID.
- List requests = new ArrayList<>();
- String textBoxId = "MyTextBox_01";
- Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT");
- requests.add(new Request()
- .setCreateShape(new CreateShapeRequest()
- .setObjectId(textBoxId)
- .setShapeType("TEXT_BOX")
- .setElementProperties(new PageElementProperties()
- .setPageObjectId(slideId)
- .setSize(new Size()
- .setHeight(pt350)
- .setWidth(pt350))
- .setTransform(new AffineTransform()
- .setScaleX(1.0)
- .setScaleY(1.0)
- .setTranslateX(350.0)
- .setTranslateY(100.0)
- .setUnit("PT")))));
-
- // Insert text into the box, using the object ID given to it.
- requests.add(new Request()
- .setInsertText(new InsertTextRequest()
- .setObjectId(textBoxId)
- .setInsertionIndex(0)
- .setText("New Box Text Inserted")));
-
- // Execute the requests.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape();
- System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId());
- // [END slides_create_textbox_with_text]
- return response;
- }
-
-
- public BatchUpdatePresentationResponse createImage(String presentationId,
- String slideId,
- String imageFilePath,
- String imageMimeType,
- GoogleCredential credential)
- throws IOException {
- Slides slidesService = this.service;
- Drive driveService = this.driveService;
- // [START slides_create_image]
- // Temporarily upload a local image file to Drive, in order to to obtain a URL
- // for the image. Alternatively, you can provide the Slides service a URL of
- // an already hosted image.
- File file = new File();
- file.setName("My Image File");
- FileContent mediaContent = new FileContent(imageMimeType, new java.io.File(imageFilePath));
- File uploadedFile = driveService.files().create(file, mediaContent).execute();
- String fileId = uploadedFile.getId();
-
- // Obtain a URL for the image.
- GenericUrl getFileUrlBuilder = driveService.files().get(fileId).buildHttpRequestUrl();
- String imageUrl = getFileUrlBuilder
- .set("access_token", credential.getAccessToken())
- .set("alt", "media").build();
-
- // Create a new image, using a supplied object ID, with content downloaded from imageUrl.
- List requests = new ArrayList<>();
- String imageId = "MyImageId_01";
- Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU");
- requests.add(new Request()
- .setCreateImage(new CreateImageRequest()
- .setObjectId(imageId)
- .setUrl(imageUrl)
- .setElementProperties(new PageElementProperties()
- .setPageObjectId(slideId)
- .setSize(new Size()
- .setHeight(emu4M)
- .setWidth(emu4M))
- .setTransform(new AffineTransform()
- .setScaleX(1.0)
- .setScaleY(1.0)
- .setTranslateX(100000.0)
- .setTranslateY(100000.0)
- .setUnit("EMU")))));
-
- // Execute the request.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage();
- System.out.println("Created image with ID: " + createImageResponse.getObjectId());
-
- // Remove the temporary image file from Drive.
- driveService.files().delete(fileId).execute();
- // [END slides_create_image]
- return response;
- }
-
- public List textMerging(
- String templatePresentationId, String dataSpreadsheetId) throws IOException {
- Slides slidesService = this.service;
- Drive driveService = this.driveService;
- Sheets sheetsService = this.sheetsService;
- List responses = new ArrayList<>(5);
- // [START slides_text_merging]
- // Use the Sheets API to load data, one record per row.
- String dataRangeNotation = "Customers!A2:M6";
- ValueRange sheetsResponse = sheetsService.spreadsheets().values()
- .get(dataSpreadsheetId, dataRangeNotation).execute();
- List> values = sheetsResponse.getValues();
-
- // For each record, create a new merged presentation.
- for (List row: values) {
- String customerName = row.get(2).toString(); // name in column 3
- String caseDescription = row.get(5).toString(); // case description in column 6
- String totalPortfolio = row.get(11).toString(); // total portfolio in column 12
-
- // Duplicate the template presentation using the Drive API.
- String copyTitle = customerName + " presentation";
- File content = new File().setName(copyTitle);
- File presentationFile =
- driveService.files().copy(templatePresentationId, content).execute();
- String presentationId = presentationFile.getId();
-
- // Create the text merge (replaceAllText) requests for this presentation.
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setReplaceAllText(new ReplaceAllTextRequest()
- .setContainsText(new SubstringMatchCriteria()
- .setText("{{customer-name}}")
- .setMatchCase(true))
- .setReplaceText(customerName)));
- requests.add(new Request()
- .setReplaceAllText(new ReplaceAllTextRequest()
- .setContainsText(new SubstringMatchCriteria()
- .setText("{{case-description}}")
- .setMatchCase(true))
- .setReplaceText(caseDescription)));
- requests.add(new Request()
- .setReplaceAllText(new ReplaceAllTextRequest()
- .setContainsText(new SubstringMatchCriteria()
- .setText("{{total-portfolio}}")
- .setMatchCase(true))
- .setReplaceText(totalPortfolio)));
-
- // Execute the requests for this presentation.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- // [START_EXCLUDE silent]
- responses.add(response);
- // [END_EXCLUDE]
- // Count total number of replacements made.
- int numReplacements = 0;
- for (Response resp : response.getReplies()) {
- numReplacements += resp.getReplaceAllText().getOccurrencesChanged();
- }
-
- System.out.println("Created merged presentation for " +
- customerName + " with ID: " + presentationId);
- System.out.println("Replaced " + numReplacements + " text instances.");
- }
- // [END slides_text_merging]
- return responses;
- }
-
- public BatchUpdatePresentationResponse imageMerging(String templatePresentationId,
- String imageUrl,
- String customerName) throws IOException {
- Slides slidesService = this.service;
- Drive driveService = this.driveService;
- String logoUrl = imageUrl;
- String customerGraphicUrl = imageUrl;
-
- // [START slides_image_merging]
- // Duplicate the template presentation using the Drive API.
- String copyTitle = customerName + " presentation";
- File content = new File().setName(copyTitle);
- File presentationFile =
- driveService.files().copy(templatePresentationId, content).execute();
- String presentationId = presentationFile.getId();
-
- // Create the image merge (replaceAllShapesWithImage) requests.
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest()
- .setImageUrl(logoUrl)
- .setReplaceMethod("CENTER_INSIDE")
- .setContainsText(new SubstringMatchCriteria()
- .setText("{{company-logo}}")
- .setMatchCase(true))));
- requests.add(new Request()
- .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest()
- .setImageUrl(customerGraphicUrl)
- .setReplaceMethod("CENTER_INSIDE")
- .setContainsText(new SubstringMatchCriteria()
- .setText("{{customer-graphic}}")
- .setMatchCase(true))));
-
- // Execute the requests.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
-
- // Count total number of replacements made.
- int numReplacements = 0;
- for(Response resp: response.getReplies()) {
- numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged();
- }
-
- System.out.println("Created merged presentation with ID: " + presentationId);
- System.out.println("Replaced " + numReplacements + " shapes instances with images.");
- // [END slides_image_merging]
- return response;
- }
-
- public BatchUpdatePresentationResponse simpleTextReplace(
- String presentationId, String shapeId, String replacementText) throws IOException {
- Slides slidesService = this.service;
- // [START slides_simple_text_replace]
- // Remove existing text in the shape, then insert the new text.
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setDeleteText(new DeleteTextRequest()
- .setObjectId(shapeId)
- .setTextRange(new Range()
- .setType("ALL"))));
- requests.add(new Request()
- .setInsertText(new InsertTextRequest()
- .setObjectId(shapeId)
- .setInsertionIndex(0)
- .setText(replacementText)));
-
- // Execute the requests.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
-
- System.out.println("Replaced text in shape with ID: " + shapeId);
- // [END slides_simple_text_replace]
- return response;
- }
-
- public BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId)
- throws IOException {
- Slides slidesService = this.service;
- // [START slides_text_style_update]
- // Update the text style so that the first 5 characters are bolded
- // and italicized, and the next 5 are displayed in blue 14 pt Times
- // New Roman font, and the next five are hyperlinked.
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setUpdateTextStyle(new UpdateTextStyleRequest()
- .setObjectId(shapeId)
- .setTextRange(new Range()
- .setType("FIXED_RANGE")
- .setStartIndex(0)
- .setEndIndex(5))
- .setStyle(new TextStyle()
- .setBold(true)
- .setItalic(true))
- .setFields("bold,italic")));
- requests.add(new Request()
- .setUpdateTextStyle(new UpdateTextStyleRequest()
- .setObjectId(shapeId)
- .setTextRange(new Range()
- .setType("FIXED_RANGE")
- .setStartIndex(5)
- .setEndIndex(10))
- .setStyle(new TextStyle()
- .setFontFamily("Times New Roman")
- .setFontSize(new Dimension()
- .setMagnitude(14.0)
- .setUnit("PT"))
- .setForegroundColor(new OptionalColor()
- .setOpaqueColor(new OpaqueColor()
- .setRgbColor(new RgbColor()
- .setBlue(1.0F)
- .setGreen(0.0F)
- .setRed(0.0F)))))
- .setFields("foregroundColor,fontFamily,fontSize")));
- requests.add(new Request()
- .setUpdateTextStyle(new UpdateTextStyleRequest()
- .setObjectId(shapeId)
- .setTextRange(new Range()
- .setType("FIXED_RANGE")
- .setStartIndex(10)
- .setEndIndex(15))
- .setStyle(new TextStyle()
- .setLink(new Link()
- .setUrl("www.example.com")))
- .setFields("link")));
-
- // Execute the requests.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
-
- System.out.println("Updated text style for shape with ID: " + shapeId);
- // [END slides_text_style_update]
- return response;
- }
-
- public BatchUpdatePresentationResponse createBulletedText(String presentationId,
- String shapeId) throws IOException {
- Slides slidesService = this.service;
- // [START slides_create_bulleted_text]
- // Add arrow-diamond-disc bullets to all text in the shape.
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setCreateParagraphBullets(new CreateParagraphBulletsRequest()
- .setObjectId(shapeId)
- .setTextRange(new Range()
- .setType("ALL"))
- .setBulletPreset("BULLET_ARROW_DIAMOND_DISC")));
-
- // Execute the request.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- System.out.println("Added bullets to text in shape with ID: " + shapeId);
- // [END slides_create_bulleted_text]
- return response;
- }
-
- public BatchUpdatePresentationResponse createSheetsChart(
- String presentationId, String pageId, String spreadsheetId, Integer sheetChartId)
- throws IOException {
- Slides slidesService = this.service;
- // [START slides_create_sheets_chart]
- // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto
- // a page in the presentation. Setting the linking mode as "LINKED" allows the
- // chart to be refreshed if the Sheets version is updated.
- List requests = new ArrayList<>();
- Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU");
- String presentationChartId = "MyEmbeddedChart";
- requests.add(new Request()
- .setCreateSheetsChart(new CreateSheetsChartRequest()
- .setObjectId(presentationChartId)
- .setSpreadsheetId(spreadsheetId)
- .setChartId(sheetChartId)
- .setLinkingMode("LINKED")
- .setElementProperties(new PageElementProperties()
- .setPageObjectId(pageId)
- .setSize(new Size()
- .setHeight(emu4M)
- .setWidth(emu4M))
- .setTransform(new AffineTransform()
- .setScaleX(1.0)
- .setScaleY(1.0)
- .setTranslateX(100000.0)
- .setTranslateY(100000.0)
- .setUnit("EMU")))));
-
- // Execute the request.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- System.out.println("Added a linked Sheets chart with ID " + presentationChartId);
- // [END slides_create_sheets_chart]
- return response;
- }
-
- public BatchUpdatePresentationResponse refreshSheetsChart(
- String presentationId, String presentationChartId) throws IOException {
- Slides slidesService = this.service;
- // [START slides_refresh_sheets_chart]
- List requests = new ArrayList<>();
-
- // Refresh an existing linked Sheets chart embedded a presentation.
- requests.add(new Request()
- .setRefreshSheetsChart(new RefreshSheetsChartRequest()
- .setObjectId(presentationChartId)));
-
- // Execute the request.
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- slidesService.presentations().batchUpdate(presentationId, body).execute();
- System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId);
- // [END slides_refresh_sheets_chart]
- return response;
- }
-}
diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java
new file mode 100644
index 00000000..67f96955
--- /dev/null
+++ b/slides/snippets/src/main/java/TextMerging.java
@@ -0,0 +1,157 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// [START slides_text_merging]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.drive.Drive;
+import com.google.api.services.drive.model.File;
+import com.google.api.services.sheets.v4.Sheets;
+import com.google.api.services.sheets.v4.model.ValueRange;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.ReplaceAllTextRequest;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.Response;
+import com.google.api.services.slides.v1.model.SubstringMatchCriteria;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/* Class to demonstrate the use of Slides Text Merging API */
+public class TextMerging {
+ /**
+ * Changes specified texts with data from spreadsheet.
+ *
+ * @param templatePresentationId - id of the presentation.
+ * @param dataSpreadsheetId - id of the spreadsheet containing data.
+ * @return merged presentation id
+ * @throws IOException - if credentials file not found.
+ */
+ public static List textMerging(
+ String templatePresentationId, String dataSpreadsheetId) throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS,
+ SlidesScopes.DRIVE, SlidesScopes.SPREADSHEETS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Create the drive API client
+ Drive driveService = new Drive.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Create the sheets API client
+ Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ List responses = new ArrayList<>(5);
+ // Use the Sheets API to load data, one record per row.
+ String dataRangeNotation = "Customers!A2:M6";
+ ValueRange sheetsResponse = sheetsService.spreadsheets().values()
+ .get(dataSpreadsheetId, dataRangeNotation).execute();
+ List> values = sheetsResponse.getValues();
+
+ try {
+ // For each record, create a new merged presentation.
+ for (List row : values) {
+ String customerName = row.get(2).toString(); // name in column 3
+ String caseDescription = row.get(5).toString(); // case description in column 6
+ String totalPortfolio = row.get(11).toString(); // total portfolio in column 12
+
+ // Duplicate the template presentation using the Drive API.
+ String copyTitle = customerName + " presentation";
+ File content = new File().setName(copyTitle);
+ File presentationFile =
+ driveService.files().copy(templatePresentationId, content).execute();
+ String presentationId = presentationFile.getId();
+
+ // Create the text merge (replaceAllText) requests for this presentation.
+ List requests = new ArrayList<>();
+ requests.add(new Request()
+ .setReplaceAllText(new ReplaceAllTextRequest()
+ .setContainsText(new SubstringMatchCriteria()
+ .setText("{{customer-name}}")
+ .setMatchCase(true))
+ .setReplaceText(customerName)));
+ requests.add(new Request()
+ .setReplaceAllText(new ReplaceAllTextRequest()
+ .setContainsText(new SubstringMatchCriteria()
+ .setText("{{case-description}}")
+ .setMatchCase(true))
+ .setReplaceText(caseDescription)));
+ requests.add(new Request()
+ .setReplaceAllText(new ReplaceAllTextRequest()
+ .setContainsText(new SubstringMatchCriteria()
+ .setText("{{total-portfolio}}")
+ .setMatchCase(true))
+ .setReplaceText(totalPortfolio)));
+
+ // Execute the requests for this presentation.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ BatchUpdatePresentationResponse response =
+ service.presentations().batchUpdate(presentationId, body).execute();
+
+ // Count total number of replacements made.
+ int numReplacements = 0;
+ for (Response resp : response.getReplies()) {
+ numReplacements += resp.getReplaceAllText().getOccurrencesChanged();
+ }
+ // Prints the merged presentation id and count of replacements.
+ System.out.println("Created merged presentation for " +
+ customerName + " with ID: " + presentationId);
+ System.out.println("Replaced " + numReplacements + " text instances.");
+ }
+ } catch (NullPointerException ne) {
+ System.out.println("Text not found to replace with image.");
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId);
+ } else {
+ throw e;
+ }
+ }
+ return responses;
+ }
+}
+// [END slides_text_merging]
\ No newline at end of file
diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java
new file mode 100644
index 00000000..86b694d0
--- /dev/null
+++ b/slides/snippets/src/main/java/TextStyleUpdate.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 slides_text_style_update]
+
+import com.google.api.client.googleapis.json.GoogleJsonError;
+import com.google.api.client.googleapis.json.GoogleJsonResponseException;
+import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.services.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest;
+import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse;
+import com.google.api.services.slides.v1.model.Dimension;
+import com.google.api.services.slides.v1.model.Link;
+import com.google.api.services.slides.v1.model.OpaqueColor;
+import com.google.api.services.slides.v1.model.OptionalColor;
+import com.google.api.services.slides.v1.model.Range;
+import com.google.api.services.slides.v1.model.Request;
+import com.google.api.services.slides.v1.model.RgbColor;
+import com.google.api.services.slides.v1.model.TextStyle;
+import com.google.api.services.slides.v1.model.UpdateTextStyleRequest;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/* Class to demonstrate the use of Slide Text Structure and Styling API */
+public class TextStyleUpdate {
+ /**
+ * Styles text in the shape.
+ *
+ * @param presentationId - id of the presentation.
+ * @param shapeId - id of the shape.
+ * @return shape id
+ * @throws IOException - if credentials file not found.
+ */
+ public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId,
+ String shapeId)
+ throws IOException {
+ /* Load pre-authorized user credentials from the environment.
+ TODO(developer) - See https://developers.google.com/identity for
+ guides on implementing OAuth2 for your application. */
+ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
+ .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS));
+ HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
+ credentials);
+
+ // Create the slides API client
+ Slides service = new Slides.Builder(new NetHttpTransport(),
+ GsonFactory.getDefaultInstance(),
+ requestInitializer)
+ .setApplicationName("Slides samples")
+ .build();
+
+ // Update the text style so that the first 5 characters are bolded
+ // and italicized, and the next 5 are displayed in blue 14 pt Times
+ // New Roman font, and the next five are hyperlinked.
+ List requests = new ArrayList<>();
+ requests.add(new Request()
+ .setUpdateTextStyle(new UpdateTextStyleRequest()
+ .setObjectId(shapeId)
+ .setTextRange(new Range()
+ .setType("FIXED_RANGE")
+ .setStartIndex(0)
+ .setEndIndex(5))
+ .setStyle(new TextStyle()
+ .setBold(true)
+ .setItalic(true))
+ .setFields("bold,italic")));
+ requests.add(new Request()
+ .setUpdateTextStyle(new UpdateTextStyleRequest()
+ .setObjectId(shapeId)
+ .setTextRange(new Range()
+ .setType("FIXED_RANGE")
+ .setStartIndex(5)
+ .setEndIndex(10))
+ .setStyle(new TextStyle()
+ .setFontFamily("Times New Roman")
+ .setFontSize(new Dimension()
+ .setMagnitude(14.0)
+ .setUnit("PT"))
+ .setForegroundColor(new OptionalColor()
+ .setOpaqueColor(new OpaqueColor()
+ .setRgbColor(new RgbColor()
+ .setBlue(1.0F)
+ .setGreen(0.0F)
+ .setRed(0.0F)))))
+ .setFields("foregroundColor,fontFamily,fontSize")));
+ requests.add(new Request()
+ .setUpdateTextStyle(new UpdateTextStyleRequest()
+ .setObjectId(shapeId)
+ .setTextRange(new Range()
+ .setType("FIXED_RANGE")
+ .setStartIndex(10)
+ .setEndIndex(15))
+ .setStyle(new TextStyle()
+ .setLink(new Link()
+ .setUrl("www.example.com")))
+ .setFields("link")));
+
+ BatchUpdatePresentationResponse response = null;
+ try {
+ // Execute the requests.
+ BatchUpdatePresentationRequest body =
+ new BatchUpdatePresentationRequest().setRequests(requests);
+ response = service.presentations().batchUpdate(presentationId, body).execute();
+ System.out.println("Updated text style for shape with ID: " + shapeId);
+ } catch (GoogleJsonResponseException e) {
+ // TODO(developer) - handle error appropriately
+ GoogleJsonError error = e.getDetails();
+ if (error.getCode() == 400) {
+ System.out.printf("Shape not found with id '%s'.\n", shapeId);
+ } else if (error.getCode() == 404) {
+ System.out.printf("Presentation not found with id '%s'.\n", presentationId);
+ } else {
+ throw e;
+ }
+ }
+ return response;
+ }
+}
+// [END slides_text_style_update]
\ No newline at end of file
diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java
index eec4c1a9..d6f52d6b 100644
--- a/slides/snippets/src/test/java/BaseTest.java
+++ b/slides/snippets/src/test/java/BaseTest.java
@@ -1,208 +1,176 @@
-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.slides.v1.Slides;
+import com.google.api.services.slides.v1.SlidesScopes;
import com.google.api.services.slides.v1.model.*;
-
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.*;
import java.util.List;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-import org.junit.After;
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
import org.junit.Before;
+import org.junit.After;
public class BaseTest {
- static {
- enableLogging();
- }
-
- protected GoogleCredential credential;
- protected Slides service;
- protected Drive driveService;
- protected Sheets sheetsService;
- protected Set filesToDelete = new HashSet();
-
-
- public static void enableLogging() {
- Logger logger = Logger.getLogger(HttpTransport.class.getName());
- logger.setLevel(Level.INFO);
- logger.addHandler(new Handler() {
-
- @Override
- public void close() throws SecurityException {
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- public void publish(LogRecord record) {
- // default ConsoleHandler will print >= INFO to System.err
- if (record.getLevel().intValue() < Level.INFO.intValue()) {
- System.out.println(record.getMessage());
- }
- }
- });
- }
-
- public GoogleCredential getCredential() throws IOException {
- return GoogleCredential.getApplicationDefault()
- .createScoped(Arrays.asList(DriveScopes.DRIVE));
- }
-
- public Slides buildService(GoogleCredential credential)
- throws IOException, GeneralSecurityException {
- return new Slides.Builder(
- GoogleNetHttpTransport.newTrustedTransport(),
- JacksonFactory.getDefaultInstance(),
- credential)
- .setApplicationName("Slides API Snippets")
- .build();
- }
-
- public Drive buildDriveService(GoogleCredential credential)
- throws IOException, GeneralSecurityException {
- return new Drive.Builder(
- GoogleNetHttpTransport.newTrustedTransport(),
- JacksonFactory.getDefaultInstance(),
- credential)
- .setApplicationName("Slides API Snippets")
- .build();
- }
-
- public Sheets buildSheetsService(GoogleCredential credential)
- throws IOException, GeneralSecurityException {
- return new Sheets.Builder(
- GoogleNetHttpTransport.newTrustedTransport(),
- JacksonFactory.getDefaultInstance(),
- credential)
- .setApplicationName("Slides API Snippets")
- .build();
- }
-
- @Before
- public void setup() throws IOException, GeneralSecurityException {
- this.credential = getCredential();
- this.service = buildService(credential);
- this.driveService = buildDriveService(credential);
- this.sheetsService = buildSheetsService(credential);
- this.filesToDelete.clear();
- }
-
- @After
- public void cleanupFiles() {
- for(String id : filesToDelete) {
- try {
- this.driveService.files().delete(id).execute();
- } catch (IOException e) {
- System.err.println("Unable to cleanup file " + id);
- }
- }
- }
-
- protected void deleteFileOnCleanup(String id) {
- filesToDelete.add(id);
- }
-
- protected String createTestPresentation() throws IOException {
- Presentation presentation = new Presentation()
- .setTitle("Test Presentation");
- presentation = service.presentations().create(presentation)
- .setFields("presentationId")
- .execute();
- String presentationId = presentation.getPresentationId();
- this.deleteFileOnCleanup(presentationId);
- return presentationId;
- }
-
- protected String createTestSlide(String presentationId) throws IOException {
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setCreateSlide(new CreateSlideRequest()
- .setObjectId("TestSlide")
- .setInsertionIndex(0)
- .setSlideLayoutReference(new LayoutReference()
- .setPredefinedLayout("BLANK"))));
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- service.presentations().batchUpdate(presentationId, body).execute();
- return response.getReplies().get(0).getCreateSlide().getObjectId();
- }
-
- protected String createTestTextBox(String presentationId, String pageId) throws IOException {
- String textBoxId = "MyTextBox_01";
- Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT");
- List requests = new ArrayList<>();
- requests.add(new Request()
- .setCreateShape(new CreateShapeRequest()
- .setObjectId(textBoxId)
- .setShapeType("TEXT_BOX")
- .setElementProperties(new PageElementProperties()
- .setPageObjectId(pageId)
- .setSize(new Size()
- .setHeight(pt350)
- .setWidth(pt350))
- .setTransform(new AffineTransform()
- .setScaleX(1.0)
- .setScaleY(1.0)
- .setTranslateX(350.0)
- .setTranslateY(100.0)
- .setUnit("PT")))));
-
- requests.add(new Request()
- .setInsertText(new InsertTextRequest()
- .setObjectId(textBoxId)
- .setInsertionIndex(0)
- .setText("New Box Text Inserted")));
-
- BatchUpdatePresentationRequest body =
- new BatchUpdatePresentationRequest().setRequests(requests);
- BatchUpdatePresentationResponse response =
- service.presentations().batchUpdate(presentationId, body).execute();
- return response.getReplies().get(0).getCreateShape().getObjectId();
- }
-
- protected String createTestSheetsChart(String presentationId,
- String pageId,
- String spreadsheetId,
- Integer sheetChartId) throws IOException {
- String presentationChartId = "MyChartId_01";
- Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU");
- List