diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md
new file mode 100644
index 00000000..0f175c59
--- /dev/null
+++ b/.gemini/GEMINI.md
@@ -0,0 +1,12 @@
+# Overview
+
+This codebase is part of the Google Workspace GitHub organization, https://github.com/googleworkspace.
+
+## Style Guide
+
+Use open source best practices for code style and formatting with a preference for Google's style guides.
+
+## Tools
+
+- Verify against Google Workspace documentation with the `workspace-developer` MCP server tools.
+- Use `gh` for GitHub interactions.
diff --git a/.gemini/config.yaml b/.gemini/config.yaml
new file mode 100644
index 00000000..a4814a5f
--- /dev/null
+++ b/.gemini/config.yaml
@@ -0,0 +1,12 @@
+# Config for the Gemini Pull Request Review Bot.
+# https://github.com/marketplace/gemini-code-assist
+have_fun: false
+code_review:
+ disable: false
+ comment_severity_threshold: "HIGH"
+ max_review_comments: -1
+ pull_request_opened:
+ help: false
+ summary: true
+ code_review: true
+ignore_patterns: []
diff --git a/.gemini/settings.json b/.gemini/settings.json
new file mode 100644
index 00000000..ec3565d5
--- /dev/null
+++ b/.gemini/settings.json
@@ -0,0 +1,8 @@
+{
+ "mcpServers": {
+ "workspace-developer": {
+ "httpUrl": "https://workspace-developer.goog/mcp",
+ "trust": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..4a9deaa4
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "google-workspace.google-workspace-developer-tools"
+ ]
+}
\ No newline at end of file
diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java
index 3eb09e6d..19a50114 100644
--- a/calendar/quickstart/src/main/java/CalendarQuickstart.java
+++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java
@@ -38,7 +38,7 @@
import java.util.Collections;
import java.util.List;
-/* class to demonstarte use of Calendar events list API */
+/* class to demonstrate use of Calendar events list API */
public class CalendarQuickstart {
/**
* Application name.
diff --git a/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/snippets/build.gradle b/classroom/snippets/build.gradle
index 6971123c..8def0b0f 100644
--- a/classroom/snippets/build.gradle
+++ b/classroom/snippets/build.gradle
@@ -7,9 +7,13 @@ repositories {
dependencies {
implementation 'com.google.api-client:google-api-client:2.0.0'
- implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0'
+ implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0'
testImplementation 'junit:junit:4.13.2'
+
+ /** This will be removed once all the classes have been updated to use the
+ * ClassroomCredentials class. */
+ implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0'
}
test {
diff --git a/classroom/snippets/src/main/java/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
index c04c38fb..6331f3ed 100644
--- a/classroom/snippets/src/main/java/AddStudent.java
+++ b/classroom/snippets/src/main/java/AddStudent.java
@@ -12,57 +12,64 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_add_student]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Student;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Add Student API */
public class AddStudent {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS));
+
/**
* Add a student in a specified course.
*
- * @param courseId - Id of the course.
+ * @param courseId - Id of the course.
* @param enrollmentCode - Code of the course to enroll.
* @return newly added student
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static Student addStudent(String courseId, String enrollmentCode)
- throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static Student addStudent(String courseId, String enrollmentCode, String studentId)
+ throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
- Student student = new Student().setUserId("gduser1@workspacesamples.dev");
+ Student student = new Student().setUserId(studentId);
try {
// Enrolling a student to a specified course
- student = service.courses().students().create(courseId, student)
- .setEnrollmentCode(enrollmentCode)
- .execute();
+ student =
+ service
+ .courses()
+ .students()
+ .create(courseId, student)
+ .setEnrollmentCode(enrollmentCode)
+ .execute();
// Prints the course id with the Student name
- System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n",
+ System.out.printf(
+ "User '%s' was enrolled as a student in the course with ID '%s'.\n",
student.getProfile().getName().getFullName(), courseId);
} catch (GoogleJsonResponseException e) {
// TODO(developer) - handle error appropriately
@@ -78,4 +85,4 @@ public static Student addStudent(String courseId, String enrollmentCode)
return student;
}
}
-// [END classroom_add_student]
\ No newline at end of file
+// [END classroom_add_student]
diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java
index 9f5652e3..4c843721 100644
--- a/classroom/snippets/src/main/java/AddTeacher.java
+++ b/classroom/snippets/src/main/java/AddTeacher.java
@@ -12,55 +12,58 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_add_teacher]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Teacher;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Add Teacher API */
public class AddTeacher {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS));
+
/**
* Add teacher to a specific course.
*
- * @param courseId - Id of the course.
+ * @param courseId - Id of the course.
* @param teacherEmail - Email address of the teacher.
* @return newly created teacher
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
public static Teacher addTeacher(String courseId, String teacherEmail)
- throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
Teacher teacher = new Teacher().setUserId(teacherEmail);
try {
// Add a teacher to a specified course
teacher = service.courses().teachers().create(courseId, teacher).execute();
// Prints the course id with the teacher name
- System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n",
+ System.out.printf(
+ "User '%s' was added as a teacher to the course with ID '%s'.\n",
teacher.getProfile().getName().getFullName(), courseId);
} catch (GoogleJsonResponseException e) {
// TODO(developer) - handle error appropriately
@@ -76,4 +79,4 @@ public static Teacher addTeacher(String courseId, String teacherEmail)
return teacher;
}
}
-// [END classroom_add_teacher]
\ No newline at end of file
+// [END classroom_add_teacher]
diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java
index 9588ec3d..d4a54c2e 100644
--- a/classroom/snippets/src/main/java/BatchAddStudents.java
+++ b/classroom/snippets/src/main/java/BatchAddStudents.java
@@ -12,62 +12,66 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_batch_add_students]
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.http.HttpHeaders;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Student;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/* Class to demonstrate the use of Classroom Batch Add Students API */
public class BatchAddStudents {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS));
+
/**
* Add multiple students in a specified course.
*
- * @param courseId - Id of the course to add students.
+ * @param courseId - Id of the course to add students.
* @param studentEmails - Email address of the students.
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
public static void batchAddStudents(String courseId, List studentEmails)
- throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
BatchRequest batch = service.batch();
- JsonBatchCallback callback = new JsonBatchCallback<>() {
- public void onSuccess(Student student, HttpHeaders responseHeaders) {
- System.out.printf("User '%s' was added as a student to the course.\n",
- student.getProfile().getName().getFullName());
- }
+ JsonBatchCallback callback =
+ new JsonBatchCallback<>() {
+ public void onSuccess(Student student, HttpHeaders responseHeaders) {
+ System.out.printf(
+ "User '%s' was added as a student to the course.\n",
+ student.getProfile().getName().getFullName());
+ }
- public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) {
- System.out.printf("Error adding student to the course: %s\n", error.getMessage());
- }
- };
+ public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) {
+ System.out.printf("Error adding student to the course: %s\n", error.getMessage());
+ }
+ };
for (String studentEmail : studentEmails) {
Student student = new Student().setUserId(studentEmail);
service.courses().students().create(courseId, student).queue(batch, callback);
@@ -75,4 +79,4 @@ public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) {
batch.execute();
}
}
-// [END classroom_batch_add_students]
\ No newline at end of file
+// [END classroom_batch_add_students]
diff --git a/classroom/snippets/src/main/java/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
index ce33dd4d..95f7353c 100644
--- a/classroom/snippets/src/main/java/CreateCourse.java
+++ b/classroom/snippets/src/main/java/CreateCourse.java
@@ -12,59 +12,64 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_create_course]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Create Course API */
public class CreateCourse {
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
+
/**
* Creates a course
*
* @return newly created course
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static Course createCourse() throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static Course createCourse() throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
Course course = null;
try {
- // Adding a new course with description
- course = new Course()
- .setName("10th Grade Biology")
- .setSection("Period 2")
- .setDescriptionHeading("Welcome to 10th Grade Biology")
- .setDescription("We'll be learning about about the structure of living creatures "
- + "from a combination of textbooks, guest lectures, and lab work. Expect "
- + "to be excited!")
- .setRoom("301")
- .setOwnerId("me")
- .setCourseState("PROVISIONED");
+ // Adding a new course with description. Set CourseState to `ACTIVE`. Possible values of
+ // CourseState can be found here:
+ // https://developers.google.com/classroom/reference/rest/v1/courses#coursestate
+ course =
+ new Course()
+ .setName("10th Grade Biology")
+ .setSection("Period 2")
+ .setDescriptionHeading("Welcome to 10th Grade Biology")
+ .setDescription(
+ "We'll be learning about about the structure of living creatures "
+ + "from a combination of textbooks, guest lectures, and lab work. Expect "
+ + "to be excited!")
+ .setRoom("301")
+ .setOwnerId("me")
+ .setCourseState("ACTIVE");
course = service.courses().create(course).execute();
// Prints the new created course Id and name
System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId());
@@ -79,4 +84,4 @@ public static Course createCourse() throws IOException {
return course;
}
}
-// [END classroom_create_course]
\ No newline at end of file
+// [END classroom_create_course]
diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java
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
index 7955f1da..94d07f75 100644
--- a/classroom/snippets/src/main/java/GetCourse.java
+++ b/classroom/snippets/src/main/java/GetCourse.java
@@ -12,46 +12,48 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_get_course]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Get Course API */
public class GetCourse {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
+
/**
* Retrieve a single course's metadata.
*
* @param courseId - Id of the course to return.
* @return a course
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static Course getCourse(String courseId) throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static Course getCourse(String courseId) throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
Course course = null;
try {
@@ -69,4 +71,4 @@ public static Course getCourse(String courseId) throws IOException {
return course;
}
}
-// [END classroom_get_course]
\ No newline at end of file
+// [END classroom_get_course]
diff --git a/classroom/snippets/src/main/java/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
index 171f4fa6..dbec2299 100644
--- a/classroom/snippets/src/main/java/ListCourseAliases.java
+++ b/classroom/snippets/src/main/java/ListCourseAliases.java
@@ -12,50 +12,53 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// [START classroom_list_aliases_class]
-// [START classroom_list_aliases]
-
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.CourseAlias;
import com.google.api.services.classroom.model.ListCourseAliasesResponse;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
import java.util.List;
/* Class to demonstrate the use of Classroom List Alias API */
public class ListCourseAliases {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
+
/**
* Retrieve the aliases for a course.
*
* @param courseId - id of the course.
* @return list of course aliases
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
public static List listCourseAliases(String courseId)
- throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
+
+ // [START classroom_list_aliases_code_snippet]
String pageToken = null;
List courseAliases = new ArrayList<>();
@@ -63,10 +66,14 @@ public static List listCourseAliases(String courseId)
try {
// List of aliases of specified course
do {
- ListCourseAliasesResponse response = service.courses().aliases().list(courseId)
- .setPageSize(100)
- .setPageToken(pageToken)
- .execute();
+ ListCourseAliasesResponse response =
+ service
+ .courses()
+ .aliases()
+ .list(courseId)
+ .setPageSize(100)
+ .setPageToken(pageToken)
+ .execute();
courseAliases.addAll(response.getAliases());
pageToken = response.getNextPageToken();
} while (pageToken != null);
@@ -89,6 +96,8 @@ public static List listCourseAliases(String courseId)
}
}
return courseAliases;
+
+ // [END classroom_list_aliases_code_snippet]
}
}
-// [END classroom_list_aliases]
\ No newline at end of file
+// [END classroom_list_aliases_class]
diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java
index 5b7bd58f..c5a00b25 100644
--- a/classroom/snippets/src/main/java/ListCourses.java
+++ b/classroom/snippets/src/main/java/ListCourses.java
@@ -12,57 +12,55 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_list_courses]
-import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
import com.google.api.services.classroom.model.ListCoursesResponse;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
-
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
import java.util.List;
/* Class to demonstrate the use of Classroom List Course API */
public class ListCourses {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
+
/**
* Retrieves all courses with metadata
*
* @return list of courses with its metadata
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static List listCourses() throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static List listCourses() throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
String pageToken = null;
List courses = new ArrayList<>();
try {
do {
- ListCoursesResponse response = service.courses().list()
- .setPageSize(100)
- .setPageToken(pageToken)
- .execute();
+ ListCoursesResponse response =
+ service.courses().list().setPageSize(100).setPageToken(pageToken).execute();
courses.addAll(response.getCourses());
pageToken = response.getNextPageToken();
} while (pageToken != null);
@@ -82,4 +80,4 @@ public static List listCourses() throws IOException {
return courses;
}
}
-// [END classroom_list_courses]
\ No newline at end of file
+// [END classroom_list_courses]
diff --git a/classroom/snippets/src/main/java/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
index e8c5d31b..05bc71ac 100644
--- a/classroom/snippets/src/main/java/PatchCourse.java
+++ b/classroom/snippets/src/main/java/PatchCourse.java
@@ -12,54 +12,53 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_patch_course]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Patch Course API */
public class PatchCourse {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
+
/**
* Updates one or more fields in a course.
*
* @param courseId - Id of the course to update.
* @return updated course
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static Course patchCourse(String courseId) throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static Course patchCourse(String courseId) throws GeneralSecurityException, IOException {
+
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
Course course = null;
try {
- course = new Course()
- .setSection("Period 3")
- .setRoom("302");
- course = service.courses().patch(courseId, course)
- .setUpdateMask("section,room")
- .execute();
+ course = new Course().setSection("Period 3").setRoom("302");
+ course = service.courses().patch(courseId, course).setUpdateMask("section,room").execute();
System.out.printf("Course '%s' updated.\n", course.getName());
} catch (GoogleJsonResponseException e) {
// TODO(developer) - handle error appropriately
@@ -73,4 +72,4 @@ public static Course patchCourse(String courseId) throws IOException {
return course;
}
}
-// [END classroom_patch_course]
\ No newline at end of file
+// [END classroom_patch_course]
diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java
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
index 9e0d63ed..fdfd6062 100644
--- a/classroom/snippets/src/main/java/UpdateCourse.java
+++ b/classroom/snippets/src/main/java/UpdateCourse.java
@@ -12,46 +12,47 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
// [START classroom_update_course]
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
-import java.util.Collections;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
/* Class to demonstrate the use of Classroom Update Course API */
public class UpdateCourse {
+
+ /* Scopes required by this API call. If modifying these scopes, delete your previously saved
+ tokens/ folder. */
+ static ArrayList SCOPES =
+ new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES));
/**
* Updates a course's metadata.
*
* @param courseId - Id of the course to update.
* @return updated course
* @throws IOException - if credentials file not found.
+ * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created.
*/
- public static Course updateCourse(String courseId) throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES));
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ public static Course updateCourse(String courseId) throws GeneralSecurityException, IOException {
- // Create the classroom API client
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom samples")
- .build();
+ // Create the classroom API client.
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ Classroom service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
Course course = null;
try {
@@ -74,4 +75,4 @@ public static Course updateCourse(String courseId) throws IOException {
return course;
}
}
-// [END classroom_update_course]
\ No newline at end of file
+// [END classroom_update_course]
diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java
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
index c1e46717..1b2eb04d 100644
--- a/classroom/snippets/src/test/java/BaseTest.java
+++ b/classroom/snippets/src/test/java/BaseTest.java
@@ -1,33 +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.
- */
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
-import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.classroom.Classroom;
import com.google.api.services.classroom.ClassroomScopes;
import com.google.api.services.classroom.model.Course;
import com.google.api.services.classroom.model.CourseAlias;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
-import org.junit.After;
-import org.junit.Before;
-
import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
import java.util.UUID;
+import org.junit.After;
// Base class for integration tests.
public class BaseTest {
@@ -40,46 +36,48 @@ public class BaseTest {
* @return an authorized Classroom client service
* @throws IOException - if credentials file not found.
*/
- protected Classroom buildService() throws IOException {
- /* Load pre-authorized user credentials from the environment.
- TODO(developer) - See https://developers.google.com/identity for
- guides on implementing OAuth2 for your application. */
- GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
- .createScoped(ClassroomScopes.CLASSROOM_ROSTERS);
- HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
- credentials);
+ protected Classroom buildService(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
- Classroom service = new Classroom.Builder(new NetHttpTransport(),
- GsonFactory.getDefaultInstance(),
- requestInitializer)
- .setApplicationName("Classroom Snippets")
- .build();
-
- return service;
+ final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
+ return service =
+ new Classroom.Builder(
+ HTTP_TRANSPORT,
+ GsonFactory.getDefaultInstance(),
+ ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES))
+ .setApplicationName("Classroom samples")
+ .build();
}
- @Before
- public void setup() throws IOException {
- this.service = buildService();
+ public void setup(ArrayList scopes) throws GeneralSecurityException, IOException {
+ this.service = buildService(scopes);
this.testCourse = CreateCourse.createCourse();
createAlias(this.testCourse.getId());
}
@After
public void tearDown() throws IOException {
- deleteCourse(this.testCourse.getId());
+ if (this.testCourse != null) {
+ deleteCourse(this.testCourse.getId());
+ }
this.testCourse = null;
}
- public CourseAlias createAlias(String courseId) throws IOException {
+ public void createAlias(String courseId) throws IOException {
String alias = "p:" + UUID.randomUUID();
CourseAlias courseAlias = new CourseAlias().setAlias(alias);
- courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute();
- return courseAlias;
+ this.service.courses().aliases().create(courseId, courseAlias).execute();
}
public void deleteCourse(String courseId) throws IOException {
+ // 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
index f023989a..2b185c9a 100644
--- a/classroom/snippets/src/test/java/TestAddStudent.java
+++ b/classroom/snippets/src/test/java/TestAddStudent.java
@@ -12,22 +12,26 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import com.google.api.services.classroom.model.Course;
import com.google.api.services.classroom.model.Student;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Add Student classroom snippet
public class TestAddStudent extends BaseTest {
+ private String studentId = "insert_student_id";
+
@Test
- public void testAddStudent() throws IOException {
- Course course = CreateCourse.createCourse();
- Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode());
- deleteCourse(course.getId());
+ public void testAddStudent() throws GeneralSecurityException, IOException {
+ // Include the scopes required to run the code example for testing purposes.
+ setup(AddStudent.SCOPES);
+ Student student =
+ AddStudent.addStudent(testCourse.getId(), testCourse.getEnrollmentCode(), this.studentId);
Assert.assertNotNull("Student not returned.", student);
- Assert.assertEquals("Student added to wrong course.", course.getId(),
- student.getCourseId());
+ Assert.assertNotNull("Course not returned.", student.getCourseId());
+ Assert.assertEquals(
+ "Student added to wrong course.", testCourse.getId(), student.getCourseId());
}
-}
\ No newline at end of file
+}
diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java
index f2846ddf..58eaae57 100644
--- a/classroom/snippets/src/test/java/TestAddTeacher.java
+++ b/classroom/snippets/src/test/java/TestAddTeacher.java
@@ -13,19 +13,23 @@
// limitations under the License.
import com.google.api.services.classroom.model.Teacher;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Add Teacher classroom snippet
public class TestAddTeacher extends BaseTest {
- private String otherUser = "gduser1@workspacesamples.dev";
+
+ private String teacherEmail = "insert_teacher_email";
@Test
- public void testAddTeacher() throws IOException {
- Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser);
+ public void testAddTeacher() throws GeneralSecurityException, IOException {
+ // Include the scopes required to run the code example for testing purposes.
+ setup(AddTeacher.SCOPES);
+ Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.teacherEmail);
Assert.assertNotNull("Teacher not returned.", teacher);
- Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(),
- teacher.getCourseId());
+ Assert.assertEquals(
+ "Teacher added to wrong course.", testCourse.getId(), teacher.getCourseId());
}
-}
\ No newline at end of file
+}
diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java
index 04ee930e..1f66874a 100644
--- a/classroom/snippets/src/test/java/TestBatchAddStudents.java
+++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java
@@ -12,18 +12,19 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import org.junit.Test;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;
+import org.junit.Test;
// Unit test class for Batch Add Students classroom snippet
public class TestBatchAddStudents extends BaseTest {
@Test
- public void testBatchAddStudents() throws IOException {
- List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev",
- "gduser3@workpsacesamples.dev");
+ public void testBatchAddStudents() throws GeneralSecurityException, IOException {
+ setup(BatchAddStudents.SCOPES);
+ List studentEmails = Arrays.asList("insert_student_1_email", "insert_student_2_email");
BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails);
}
-}
\ No newline at end of file
+}
diff --git a/classroom/snippets/src/test/java/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
index 381f2c2c..a251f15c 100644
--- a/classroom/snippets/src/test/java/TestCreateCourse.java
+++ b/classroom/snippets/src/test/java/TestCreateCourse.java
@@ -13,15 +13,18 @@
// limitations under the License.
import com.google.api.services.classroom.model.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Create Course classroom snippet
public class TestCreateCourse extends BaseTest {
@Test
- public void testCreateCourse() throws IOException {
+ public void testCreateCourse() throws GeneralSecurityException, IOException {
+ // Include the scopes required to run the code example for testing purposes.
+ setup(CreateCourse.SCOPES);
Course course = CreateCourse.createCourse();
Assert.assertNotNull("Course not returned.", course);
deleteCourse(course.getId());
diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java
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
index c43059f7..ac95bda5 100644
--- a/classroom/snippets/src/test/java/TestGetCourse.java
+++ b/classroom/snippets/src/test/java/TestGetCourse.java
@@ -13,15 +13,17 @@
// limitations under the License.
import com.google.api.services.classroom.model.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Get Course classroom snippet
public class TestGetCourse extends BaseTest {
@Test
- public void testGetCourse() throws IOException {
+ public void testGetCourse() throws GeneralSecurityException, IOException {
+ setup(GetCourse.SCOPES);
Course course = GetCourse.getCourse(testCourse.getId());
Assert.assertNotNull("Course not returned.", course);
Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId());
diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java
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
index f18c1cce..d3e357b5 100644
--- a/classroom/snippets/src/test/java/TestListCourseAliases.java
+++ b/classroom/snippets/src/test/java/TestListCourseAliases.java
@@ -13,17 +13,19 @@
// limitations under the License.
import com.google.api.services.classroom.model.CourseAlias;
-import org.junit.Assert;
-import org.junit.Test;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.List;
+import org.junit.Assert;
+import org.junit.Test;
// Unit test class for List Course Aliases classroom snippet
public class TestListCourseAliases extends BaseTest {
@Test
- public void testListCourseAliases() throws IOException {
+ public void testListCourseAliases() throws GeneralSecurityException, IOException {
+ setup(ListCourseAliases.SCOPES);
List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId());
Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1);
}
-}
\ No newline at end of file
+}
diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java
index fe254b76..7a4dd553 100644
--- a/classroom/snippets/src/test/java/TestListCourses.java
+++ b/classroom/snippets/src/test/java/TestListCourses.java
@@ -13,16 +13,17 @@
// limitations under the License.
import com.google.api.services.classroom.model.Course;
-import org.junit.Assert;
-import org.junit.Test;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.List;
+import org.junit.Assert;
+import org.junit.Test;
// Unit test class for List Course classroom snippet
public class TestListCourses {
@Test
- public void testListCourses() throws IOException {
+ public void testListCourses() throws GeneralSecurityException, IOException {
List courses = ListCourses.listCourses();
Assert.assertTrue("No courses returned.", courses.size() > 0);
}
diff --git a/classroom/snippets/src/test/java/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
index 51e05a43..a7d0d92f 100644
--- a/classroom/snippets/src/test/java/TestPatchCourse.java
+++ b/classroom/snippets/src/test/java/TestPatchCourse.java
@@ -13,15 +13,17 @@
// limitations under the License.
import com.google.api.services.classroom.model.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Patch Course classroom snippet
public class TestPatchCourse extends BaseTest {
@Test
- public void testPatchCourse() throws IOException {
+ public void testPatchCourse() throws GeneralSecurityException, IOException {
+ setup(PatchCourse.SCOPES);
Course course = PatchCourse.patchCourse(testCourse.getId());
Assert.assertNotNull("Course not returned.", course);
Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId());
diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java
index f5e0080d..3c7cbda2 100644
--- a/classroom/snippets/src/test/java/TestUpdateCourse.java
+++ b/classroom/snippets/src/test/java/TestUpdateCourse.java
@@ -13,15 +13,17 @@
// limitations under the License.
import com.google.api.services.classroom.model.Course;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
// Unit test class for Update Course classroom snippet
public class TestUpdateCourse extends BaseTest {
@Test
- public void testUpdateCourse() throws IOException {
+ public void testUpdateCourse() throws GeneralSecurityException, IOException {
+ setup(UpdateCourse.SCOPES);
Course course = UpdateCourse.updateCourse(testCourse.getId());
Assert.assertNotNull("Course not returned.", course);
Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId());
diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java
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/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java
index 431c8394..531e044b 100644
--- a/docs/quickstart/src/main/java/DocsQuickstart.java
+++ b/docs/quickstart/src/main/java/DocsQuickstart.java
@@ -36,7 +36,7 @@
import java.util.Collections;
import java.util.List;
-/* class to demonstarte use of Docs get documents API */
+/* class to demonstrate use of Docs get documents API */
public class DocsQuickstart {
/**
* Application name.
diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java
index e72a2c24..4a5e4657 100644
--- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java
+++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java
@@ -34,7 +34,7 @@
import java.util.Arrays;
import java.util.List;
-/* class to demonstarte use of Drive Activity list API */
+/* class to demonstrate use of Drive Activity list API */
public class DriveActivityQuickstart {
/**
* Application name.
diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java
index c88f9063..62db72b8 100644
--- a/drive/quickstart/src/main/java/DriveQuickstart.java
+++ b/drive/quickstart/src/main/java/DriveQuickstart.java
@@ -36,7 +36,7 @@
import java.util.Collections;
import java.util.List;
-/* class to demonstarte use of Drive files list API */
+/* class to demonstrate use of Drive files list API */
public class DriveQuickstart {
/**
* Application name.
diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java
index 08f574b1..2e5e7f01 100644
--- a/drive/snippets/drive_v3/src/main/java/SearchFile.java
+++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java
@@ -60,7 +60,7 @@ public static List searchFile() throws IOException {
FileList result = service.files().list()
.setQ("mimeType='image/jpeg'")
.setSpaces("drive")
- .setFields("nextPageToken, items(id, title)")
+ .setFields("nextPageToken, files(id, title)")
.setPageToken(pageToken)
.execute();
for (File file : result.getFiles()) {
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/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/solutions/webhook-chat-app/README.md b/solutions/webhook-chat-app/README.md
new file mode 100644
index 00000000..59643860
--- /dev/null
+++ b/solutions/webhook-chat-app/README.md
@@ -0,0 +1,4 @@
+# Google Chat App Webhook
+
+Please see related guide on how to
+[send messages to Google Chat with incoming webhooks](https://developers.google.com/workspace/chat/quickstart/webhooks).
diff --git a/solutions/webhook-chat-app/pom.xml b/solutions/webhook-chat-app/pom.xml
new file mode 100644
index 00000000..be47addd
--- /dev/null
+++ b/solutions/webhook-chat-app/pom.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+ 4.0.0
+
+ com.google.chat.webhook
+ webhook-app
+ 0.1.0
+ webhook-app
+
+
+ 11
+ 11
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.9.1
+
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+
+
+
+
diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java
new file mode 100644
index 00000000..3f9f4032
--- /dev/null
+++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright 2022 Google LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.chat.webhook;
+
+// [START chat_webhook]
+import com.google.gson.Gson;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Map;
+import java.net.URI;
+
+public class App {
+ private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN";
+ private static final Gson gson = new Gson();
+ private static final HttpClient client = HttpClient.newHttpClient();
+
+ public static void main(String[] args) throws Exception {
+ String message = gson.toJson(Map.of(
+ "text", "Hello from Java!"
+ ));
+
+ HttpRequest request = HttpRequest.newBuilder(URI.create(URL))
+ .header("accept", "application/json; charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofString(message)).build();
+
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+
+ System.out.println(response.body());
+ }
+}
+// [END chat_webhook]
diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java
new file mode 100644
index 00000000..d5c5fb52
--- /dev/null
+++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright 2025 Google LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.chat.webhook;
+
+// [START chat_webhook_thread]
+import com.google.gson.Gson;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Map;
+import java.net.URI;
+
+public class App {
+ private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD";
+ private static final Gson gson = new Gson();
+ private static final HttpClient client = HttpClient.newHttpClient();
+
+ public static void main(String[] args) throws Exception {
+ String message = gson.toJson(Map.of(
+ "text", "Hello from Java!",
+ "thread", Map.of(
+ "threadKey", "THREAD_KEY_VALUE"
+ )
+ ));
+
+ HttpRequest request = HttpRequest.newBuilder(URI.create(URL))
+ .header("accept", "application/json; charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofString(message)).build();
+
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+
+ System.out.println(response.body());
+ }
+}
+// [END chat_webhook_thread]