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/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..804a0939 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners + +.github/ @googleworkspace/workspace-devrel-dpe diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9841d4e9..38a3c6e9 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,16 @@ -(Please fill out these details before submitting an issue) +# Summary + +(description of issue) + +## Sample Name -### Sample Name (i.e. Gmail Quickstart) -### Expected Behavior +## Expected Behavior + +## Actual Behavior -### Actual Behavior +## Specifications -### Specifications - - Java version (`java -version`) - - OS (Mac/Linux/Windows) +- Java version (`java -version`) +- OS (Mac/Linux/Windows) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..f8f45ff1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,160 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/calendar/sync" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/tasks/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/calendar/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/sheets/snippets" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/sheets/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/adminSDK/alertcenter/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/adminSDK/directory/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/adminSDK/reseller/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/adminSDK/groups-settings/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/adminSDK/reports/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/classroom/snippets" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/classroom/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/docs/outputJSON" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/docs/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/slides/snippets" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/slides/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/people/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/appsScript/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v2" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v3" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/drive/activity/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/drive/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/drive/activity-v2/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/gmail/snippets" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/gmail/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/vault/quickstart" + schedule: + interval: "weekly" + commit-message: + prefix: "chore(deps):" + - package-ecosystem: "gradle" + directory: "/vault/vault-hold-migration-api" + schedule: + interval: "weekly" diff --git a/.github/linters/.htmlhintrc b/.github/linters/.htmlhintrc new file mode 100644 index 00000000..70391a46 --- /dev/null +++ b/.github/linters/.htmlhintrc @@ -0,0 +1,25 @@ +{ + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "attr-value-not-empty": false, + "attr-no-duplication": true, + "doctype-first": false, + "tag-pair": true, + "tag-self-close": false, + "spec-char-escape": false, + "id-unique": true, + "src-not-empty": true, + "title-require": false, + "alt-require": true, + "doctype-html5": true, + "id-class-value": false, + "style-disabled": false, + "inline-style-disabled": false, + "inline-script-disabled": false, + "space-tab-mixed-disabled": "space", + "id-class-ad-disabled": false, + "href-abs-or-rel": false, + "attr-unsafe-chars": true, + "head-script-disabled": false +} diff --git a/.github/linters/.yaml-lint.yml b/.github/linters/.yaml-lint.yml new file mode 100644 index 00000000..e8394fd5 --- /dev/null +++ b/.github/linters/.yaml-lint.yml @@ -0,0 +1,59 @@ +--- +########################################### +# These are the rules used for # +# linting all the yaml files in the stack # +# NOTE: # +# You can disable line with: # +# # yamllint disable-line # +########################################### +rules: + braces: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + brackets: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + colons: + level: warning + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: warning + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: disable + comments-indentation: disable + document-end: disable + document-start: + level: warning + present: true + empty-lines: + level: warning + max: 2 + max-start: 0 + max-end: 0 + hyphens: + level: warning + max-spaces-after: 1 + indentation: + level: warning + spaces: consistent + indent-sequences: true + check-multi-line-strings: false + key-duplicates: enable + line-length: + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: disable + new-lines: + type: unix + trailing-spaces: disable \ No newline at end of file diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml new file mode 100644 index 00000000..76d0840d --- /dev/null +++ b/.github/linters/sun_checks.xml @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..68cfe6fb --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +# Description + +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. +List any dependencies that are required for this change. + +Fixes # (issue) + +## Is it been tested? + +- [ ] Development testing done + +## Checklist + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have performed a peer-reviewed with team member(s) +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/scripts/authorize.sh b/.github/scripts/authorize.sh new file mode 100755 index 00000000..a6503421 --- /dev/null +++ b/.github/scripts/authorize.sh @@ -0,0 +1,48 @@ +#! /bin/bash + +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Utility for generating credentials used by tests. + +# Union of scopes used by samples +SCOPES=( + "https://www.googleapis.com/auth/drive" + "https://www.googleapis.com/auth/drive.activity" + "https://www.googleapis.com/auth/drive.appdata" + "https://mail.google.com/" + "https://www.googleapis.com/auth/classroom.courses" + "https://www.googleapis.com/auth/classroom.announcements" + "https://www.googleapis.com/auth/classroom.rosters" + "https://www.googleapis.com/auth/classroom.topics" + "https://www.googleapis.com/auth/classroom.guardianlinks.students" + "https://www.googleapis.com/auth/classroom.coursework.students" +) + +if [ -z "$CLIENT_ID_FILE" ]; then + echo "CLIENT_ID_FILE environment not set. Please set and run again." + exit 1 +fi + +if [ ! -f "$CLIENT_ID_FILE" ]; then + echo "$CLIENT_ID_FILE not found." + exit 1 +fi + +printf -v EXPANDED_SCOPES '%s,' "${SCOPES[@]}" +gcloud auth application-default login \ + --client-id-file="$CLIENT_ID_FILE" \ + --scopes="${EXPANDED_SCOPES}" + +cat "${HOME}/.config/gcloud/application_default_credentials.json" \ No newline at end of file diff --git a/.github/scripts/test.sh b/.github/scripts/test.sh new file mode 100755 index 00000000..cab34629 --- /dev/null +++ b/.github/scripts/test.sh @@ -0,0 +1,41 @@ +#! /bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 +export GOOGLE_APPLICATION_CREDENTIALS="${HOME}/secrets/default_credentials.json" +export SERVICE_ACCOUNT_CREDENTIALS="${HOME}/secrets/service_account.json" + +dirs=() + +IFS=$'\n' read -r -d '' -a dirs < <( find . -name 'build.gradle' -exec dirname '{}' \; | sort -u ) + +exit_code=0 + +for dir in "${dirs[@]}"; do + pushd "${dir}" || exit + gradle test + status=$? + if [ $status -ne 0 ]; then + exit_code=$status + fi + popd || exit +done + +if [ $exit_code -ne 0 ]; then + echo "Tests failed." +fi + +exit $exit_code \ No newline at end of file diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml new file mode 100644 index 00000000..6d6d1266 --- /dev/null +++ b/.github/snippet-bot.yml @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml new file mode 100644 index 00000000..7b363bc4 --- /dev/null +++ b/.github/sync-repo-settings.yaml @@ -0,0 +1,41 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# .github/sync-repo-settings.yaml +# See https://github.com/googleapis/repo-automation-bots/tree/main/packages/sync-repo-settings for app options. +rebaseMergeAllowed: true +squashMergeAllowed: true +mergeCommitAllowed: false +deleteBranchOnMerge: true +branchProtectionRules: + - pattern: main + isAdminEnforced: false + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + # .github/workflows/test.yml with a job called "test" + - "test" + # .github/workflows/lint.yml with a job called "lint" + - "lint" + # Google bots below + - "cla/google" + - "snippet-bot check" + - "header-check" + - "conventionalcommits.org" + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true +permissionRules: + - team: workspace-devrel-dpe + permission: admin + - team: workspace-devrel + permission: push diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml new file mode 100644 index 00000000..95f323bf --- /dev/null +++ b/.github/workflows/automation.yml @@ -0,0 +1,69 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +name: Automation +on: [ push, pull_request, workflow_dispatch ] +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request' }} + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GOOGLEWORKSPACE_BOT_TOKEN}} + steps: + - name: approve + run: gh pr review --approve "$PR_URL" + - name: merge + run: gh pr merge --auto --squash --delete-branch "$PR_URL" + default-branch-migration: + # this job helps with migrating the default branch to main + # it pushes main to master if master exists and main is the default branch + # it pushes master to main if master is the default branch + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + # required otherwise GitHub blocks infinite loops in pushes originating in an action + token: ${{ secrets.GOOGLEWORKSPACE_BOT_TOKEN }} + - name: Set env + run: | + # set DEFAULT BRANCH + echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> "$GITHUB_ENV"; + + # set HAS_MASTER_BRANCH + if [ -n "$(git ls-remote --heads origin master)" ]; then + echo "HAS_MASTER_BRANCH=true" >> "$GITHUB_ENV" + else + echo "HAS_MASTER_BRANCH=false" >> "$GITHUB_ENV" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: configure git + run: | + git config --global user.name 'googleworkspace-bot' + git config --global user.email 'googleworkspace-bot@google.com' + - if: ${{ env.DEFAULT_BRANCH == 'main' && env.HAS_MASTER_BRANCH == 'true' }} + name: Update master branch from main + run: | + git checkout -B master + git reset --hard origin/main + git push origin master + - if: ${{ env.DEFAULT_BRANCH == 'master'}} + name: Update main branch from master + run: | + git checkout -B main + git reset --hard origin/master + git push origin main diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..a12d8e07 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,32 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +name: Lint +on: [ push, pull_request, workflow_dispatch ] + +jobs: + lint: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2.4.0 + with: + fetch-depth: 0 + - uses: github/super-linter/slim@v4.8.5 + env: + ERROR_ON_MISSING_EXEC_BIT: true + VALIDATE_JSCPD: false + VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..7e906021 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,65 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Test + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + matrix: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + # Only run for internal PRs or after a merge + if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + strategy: + matrix: + # TODO - expand matrix once stable + java-version: [ 11 ] + steps: + - uses: actions/checkout@v3 + - name: Fetch and Diff PR with base from which it was cloned + if: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin master "${{ github.event.pull_request.base.sha }}" + git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: ${{ matrix.java-version }} + - name: Write test credentials + run: | + mkdir "${HOME}/secrets" + echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" + echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" + echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" + env: + DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} + SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} + CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2.1.1 + with: + gradle-version: 7.4 + - name: Run tests + run: ./.github/scripts/test.sh + test: + needs: [ matrix ] + runs-on: ubuntu-latest + steps: + - run: echo "Test matrix finished" \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c8b5032d..00000000 --- a/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: java -jdk: - - oraclejdk11 -# Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) -env: - - DIR=adminSDK/alertcenter/quickstart - - DIR=adminSDK/directory/quickstart - - DIR=adminSDK/reports/quickstart - - DIR=adminSDK/reseller/quickstart - - DIR=appsScript/quickstart - - DIR=classroom/quickstart - - DIR=drive/quickstart - - DIR=gmail/quickstart - - DIR=sheets/quickstart - - DIR=slides/quickstart - - DIR=tasks/quickstart -script: cd $DIR && gradle build # gradle -q run diff --git a/.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/CONTRIBUTING.md b/CONTRIBUTING.md index b5fd3b95..e3ebb3a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,9 +11,10 @@ Please fill out either the individual or corporate Contributor License Agreement. * If you are an individual writing original source code and you're sure you -own the intellectual property, then sign an [individual CLA](https://developers.google.com/open-source/cla/individual). + own the intellectual property, then sign an [individual CLA](https://developers.google.com/open-source/cla/individual) + . * If you work for a company that wants to allow you to contribute your work, -then sign a [corporate CLA](https://developers.google.com/open-source/cla/corporate). + then sign a [corporate CLA](https://developers.google.com/open-source/cla/corporate). Follow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. diff --git a/README.md b/README.md index 672237e0..975d6223 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# G Suite Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) +# Google Workspace Java Samples -A collection of samples that demonstrate how to call G Suite APIs in Java. +A collection of samples that demonstrate how to call Google Workspace APIs in Java. ## APIs @@ -19,7 +19,7 @@ A collection of samples that demonstrate how to call G Suite APIs in Java. - [Quickstart](https://developers.google.com/calendar/quickstart/java) - [Sync Tokens and Etags](calendar/sync) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) ### Classroom @@ -32,7 +32,7 @@ A collection of samples that demonstrate how to call G Suite APIs in Java. ### Drive V3 - [Quickstart](https://developers.google.com/drive/v3/web/quickstart/java) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) ### Gmail diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..07bc436f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,6 @@ +# Report a security issue + +To report a security issue, please use [https://g.co/vulnz](https://g.co/vulnz). We use +[https://g.co/vulnz](https://g.co/vulnz) for our intake, and do coordination and disclosure here on +GitHub (including using GitHub Security Advisory). The Google Security Team will +respond within 5 working days of your report on [https://g.co/vulnz](https://g.co/vulnz). diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index d044218e..2e7e184c 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'AdminSDKAlertCenterQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.auth:google-auth-library-oauth2-http:0.11.0' - compile 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20220718-2.0.0' } \ No newline at end of file diff --git a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java index d8120a9f..bf0768f9 100644 --- a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java +++ b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java @@ -17,7 +17,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.alertcenter.v1beta1.AlertCenter; import com.google.api.services.alertcenter.v1beta1.AlertCenterScopes; import com.google.api.services.alertcenter.v1beta1.model.Alert; @@ -35,9 +35,15 @@ import java.util.List; public class AdminSDKAlertCenterQuickstart { - - private static final String APPLICATION_NAME = "Google Admin SDK Alert Center API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Google Admin SDK Alert Center API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** * Global instance of the scopes required by this quickstart. diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index d6a9fc0e..08a0538e 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKDirectoryQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' } diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index 9c89edb5..a5466fc3 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START admin_sdk_directory_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,13 +22,12 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; -import com.google.api.services.admin.directory.model.User; -import com.google.api.services.admin.directory.model.Users; - +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; +import com.google.api.services.directory.model.User; +import com.google.api.services.directory.model.Users; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,63 +37,77 @@ import java.util.List; public class AdminSDKDirectoryQuickstart { - private static final String APPLICATION_NAME = "Google Admin SDK Directory API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Admin SDK Directory API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * 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(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = AdminSDKDirectoryQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = AdminSDKDirectoryQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Directory service = new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Directory service = + new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the first 10 users in the domain. - Users result = service.users().list() - .setCustomer("my_customer") - .setMaxResults(10) - .setOrderBy("email") - .execute(); - List users = result.getUsers(); - if (users == null || users.size() == 0) { - System.out.println("No users found."); - } else { - System.out.println("Users:"); - for (User user : users) { - System.out.println(user.getName().getFullName()); - } - } + // Print the first 10 users in the domain. + Users result = service.users().list() + .setCustomer("my_customer") + .setMaxResults(10) + .setOrderBy("email") + .execute(); + List users = result.getUsers(); + if (users == null || users.size() == 0) { + System.out.println("No users found."); + } else { + System.out.println("Users:"); + for (User user : users) { + System.out.println(user.getName().getFullName()); + } } + } } // [END admin_sdk_directory_quickstart] diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle new file mode 100644 index 00000000..26e5218e --- /dev/null +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'GroupsSettingsQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-2.0.0' +} diff --git a/adminSDK/groups-settings/quickstart/settings.gradle b/adminSDK/groups-settings/quickstart/settings.gradle new file mode 100644 index 00000000..a9b08d47 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'Groups Settings Quickstart' diff --git a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java new file mode 100644 index 00000000..13521c7d --- /dev/null +++ b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java @@ -0,0 +1,103 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START admin_sdk_groups_settings_quickstart] + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.groupssettings.Groupssettings; +import com.google.api.services.groupssettings.model.Groups; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.List; + +public class GroupsSettingsQuickstart { + private static final String APPLICATION_NAME = + "Google Admin SDK Group Settings API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList( + "https://www.googleapis.com/auth/apps.groups.settings"); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = GroupsSettingsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Groupssettings service = + new Groupssettings.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + // API is ready to use + + if (args.length == 0) { + System.out.println("No group email specified."); + return; + } + try { + String groupEmail = args[0]; + Groups settings = service.groups().get(groupEmail).execute(); + System.out.println(String.format("Description: %s", settings.getDescription())); + } catch (Exception e) { + // TODO(developer) - Handle errors + e.printStackTrace(); + } + } +} +// [END admin_sdk_groups_settings_quickstart] diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index eb8e50bb..9f9aff5d 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKReportsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev20211207-2.0.0' } diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index d5119f82..3b0d2d69 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -13,21 +13,22 @@ // limitations under the License. // [START admin_sdk_reports_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.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.reports.Reports; -import com.google.api.services.admin.reports.ReportsScopes; -import com.google.api.services.admin.reports.model.Activities; -import com.google.api.services.admin.reports.model.Activity; - +import com.google.api.services.reports.Reports; +import com.google.api.services.reports.ReportsScopes; +import com.google.api.services.reports.model.Activities; +import com.google.api.services.reports.model.Activity; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,66 +38,84 @@ import java.util.List; public class AdminSDKReportsQuickstart { - private static final String APPLICATION_NAME = "Google Admin SDK Reports API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Admin SDK Reports API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * 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(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = AdminSDKReportsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = AdminSDKReportsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Reports service = new Reports.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Reports service = + new Reports.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the last 10 login events. - String userKey = "all"; - String applicationName = "login"; - Activities result = service.activities().list(userKey, applicationName) - .setMaxResults(10) - .execute(); - List activities = result.getItems(); - if (activities == null || activities.size() == 0) { - System.out.println("No logins found."); - } else { - System.out.println("Logins:"); - for (Activity activity : activities) { - System.out.printf("%s: %s (%s)\n", - activity.getId().getTime(), - activity.getActor().getEmail(), - activity.getEvents().get(0).getName()); - } + // Print the last 10 login events. + String userKey = "all"; + String applicationName = "login"; + try { + Activities result = service.activities().list(userKey, applicationName) + .setMaxResults(10) + .execute(); + List activities = result.getItems(); + if (activities == null || activities.size() == 0) { + System.out.println("No logins found."); + } else { + System.out.println("Logins:"); + for (Activity activity : activities) { + System.out.printf("%s: %s (%s)\n", + activity.getId().getTime(), + activity.getActor().getEmail(), + activity.getEvents().get(0).getName()); } + } + } catch (GoogleJsonResponseException ge) { + ge.printStackTrace(); } + } } // [END admin_sdk_reports_quickstart] diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 5c64d3d8..3e382f87 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKResellerQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-reseller:v1sandbox-rev60-1.22.0' } diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index 2e6cde80..9f6c5a90 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -13,15 +13,17 @@ // limitations under the License. // [START admin_sdk_reseller_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.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.reseller.Reseller; import com.google.api.services.reseller.ResellerScopes; @@ -37,64 +39,80 @@ import java.util.List; public class AdminSDKResellerQuickstart { - private static final String APPLICATION_NAME = "Google Admin SDK Reseller API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(ResellerScopes.APPS_ORDER); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Admin SDK Reseller API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = AdminSDKResellerQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(ResellerScopes.APPS_ORDER); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = AdminSDKResellerQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Reseller service = new Reseller.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - // Print the first 10 subscriptions you manage. - Subscriptions result = service.subscriptions().list() - .setMaxResults(10L) - .execute(); - List subscriptions = result.getSubscriptions(); - if (subscriptions == null || subscriptions.size() == 0) { - System.out.println("No subscriptions found."); - } else { - System.out.println("Subscriptions:"); - for (Subscription sub : subscriptions) { - System.out.printf("%s (%s, %s)\n", - sub.getCustomerId(), - sub.getSkuId(), - sub.getPlan().getPlanName()); - } + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Reseller service = + new Reseller.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + try { + // Print the first 10 subscriptions you manage. + Subscriptions result = service.subscriptions().list() + .setMaxResults(10L) + .execute(); + List subscriptions = result.getSubscriptions(); + if (subscriptions == null || subscriptions.size() == 0) { + System.out.println("No subscriptions found."); + } else { + System.out.println("Subscriptions:"); + for (Subscription sub : subscriptions) { + System.out.printf("%s (%s, %s)\n", + sub.getCustomerId(), + sub.getSkuId(), + sub.getPlan().getPlanName()); } + } + } catch (GoogleJsonResponseException ge) { + ge.printStackTrace(); } + } } // [END admin_sdk_reseller_quickstart] diff --git a/appsScript/execute/src/main/java/Execute.java b/appsScript/execute/src/main/java/Execute.java index 8f42f898..ce4ef2c6 100644 --- a/appsScript/execute/src/main/java/Execute.java +++ b/appsScript/execute/src/main/java/Execute.java @@ -1,13 +1,12 @@ /** - * @license - * Copyright Google Inc. - * + * @license Copyright Google Inc. + *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,127 +14,128 @@ * limitations under the License. */ public class Execute { - // [START apps_script_api_execute] - /** - * Create a HttpRequestInitializer from the given one, except set - * the HTTP read timeout to be longer than the default (to allow - * called scripts time to execute). - * - * @param {HttpRequestInitializer} requestInitializer the initializer - * to copy and adjust; typically a Credential object. - * @return an initializer with an extended read timeout. - */ - private static HttpRequestInitializer setHttpTimeout( - final HttpRequestInitializer requestInitializer) { - return new HttpRequestInitializer() { - @Override - public void initialize(HttpRequest httpRequest) throws IOException { - requestInitializer.initialize(httpRequest); - // This allows the API to call (and avoid timing out on) - // functions that take up to 6 minutes to complete (the maximum - // allowed script run time), plus a little overhead. - httpRequest.setReadTimeout(380000); - } - }; - } + // [START apps_script_api_execute] - /** - * Build and return an authorized Script client service. - * - * @param {Credential} credential an authorized Credential object - * @return an authorized Script client service - */ - public static Script getScriptService() throws IOException { - Credential credential = authorize(); - return new Script.Builder( - HTTP_TRANSPORT, JSON_FACTORY, setHttpTimeout(credential)) - .setApplicationName(APPLICATION_NAME) - .build(); - } + /** + * Create a HttpRequestInitializer from the given one, except set + * the HTTP read timeout to be longer than the default (to allow + * called scripts time to execute). + * + * @param {HttpRequestInitializer} requestInitializer the initializer + * to copy and adjust; typically a Credential object. + * @return an initializer with an extended read timeout. + */ + private static HttpRequestInitializer setHttpTimeout( + final HttpRequestInitializer requestInitializer) { + return new HttpRequestInitializer() { + @Override + public void initialize(HttpRequest httpRequest) throws IOException { + requestInitializer.initialize(httpRequest); + // This allows the API to call (and avoid timing out on) + // functions that take up to 6 minutes to complete (the maximum + // allowed script run time), plus a little overhead. + httpRequest.setReadTimeout(380000); + } + }; + } - /** - * Interpret an error response returned by the API and return a String - * summary. - * - * @param {Operation} op the Operation returning an error response - * @return summary of error response, or null if Operation returned no - * error - */ - public static String getScriptError(Operation op) { - if (op.getError() == null) { - return null; - } + /** + * Build and return an authorized Script client service. + * + * @param {Credential} credential an authorized Credential object + * @return an authorized Script client service + */ + public static Script getScriptService() throws IOException { + Credential credential = authorize(); + return new Script.Builder( + HTTP_TRANSPORT, JSON_FACTORY, setHttpTimeout(credential)) + .setApplicationName(APPLICATION_NAME) + .build(); + } - // Extract the first (and only) set of error details and cast as a Map. - // The values of this map are the script's 'errorMessage' and - // 'errorType', and an array of stack trace elements (which also need to - // be cast as Maps). - Map detail = op.getError().getDetails().get(0); - List> stacktrace = - (List>)detail.get("scriptStackTraceElements"); + /** + * Interpret an error response returned by the API and return a String + * summary. + * + * @param {Operation} op the Operation returning an error response + * @return summary of error response, or null if Operation returned no + * error + */ + public static String getScriptError(Operation op) { + if (op.getError() == null) { + return null; + } - java.lang.StringBuilder sb = - new StringBuilder("\nScript error message: "); - sb.append(detail.get("errorMessage")); - sb.append("\nScript error type: "); - sb.append(detail.get("errorType")); + // Extract the first (and only) set of error details and cast as a Map. + // The values of this map are the script's 'errorMessage' and + // 'errorType', and an array of stack trace elements (which also need to + // be cast as Maps). + Map detail = op.getError().getDetails().get(0); + List> stacktrace = + (List>) detail.get("scriptStackTraceElements"); - if (stacktrace != null) { - // There may not be a stacktrace if the script didn't start - // executing. - sb.append("\nScript error stacktrace:"); - for (Map elem : stacktrace) { - sb.append("\n "); - sb.append(elem.get("function")); - sb.append(":"); - sb.append(elem.get("lineNumber")); - } - } - sb.append("\n"); - return sb.toString(); + java.lang.StringBuilder sb = + new StringBuilder("\nScript error message: "); + sb.append(detail.get("errorMessage")); + sb.append("\nScript error type: "); + sb.append(detail.get("errorType")); + + if (stacktrace != null) { + // There may not be a stacktrace if the script didn't start + // executing. + sb.append("\nScript error stacktrace:"); + for (Map elem : stacktrace) { + sb.append("\n "); + sb.append(elem.get("function")); + sb.append(":"); + sb.append(elem.get("lineNumber")); + } } + sb.append("\n"); + return sb.toString(); + } - public static void main(String[] args) throws IOException { - // ID of the script to call. Acquire this from the Apps Script editor, - // under Publish > Deploy as API executable. - String scriptId = "ENTER_YOUR_SCRIPT_ID_HERE"; - Script service = getScriptService(); + public static void main(String[] args) throws IOException { + // ID of the script to call. Acquire this from the Apps Script editor, + // under Publish > Deploy as API executable. + String scriptId = "ENTER_YOUR_SCRIPT_ID_HERE"; + Script service = getScriptService(); - // Create an execution request object. - ExecutionRequest request = new ExecutionRequest() - .setFunction("getFoldersUnderRoot"); + // Create an execution request object. + ExecutionRequest request = new ExecutionRequest() + .setFunction("getFoldersUnderRoot"); - try { - // Make the API request. - Operation op = - service.scripts().run(scriptId, request).execute(); + try { + // Make the API request. + Operation op = + service.scripts().run(scriptId, request).execute(); - // Print results of request. - if (op.getError() != null) { - // The API executed, but the script returned an error. - System.out.println(getScriptError(op)); - } else { - // The result provided by the API needs to be cast into - // the correct type, based upon what types the Apps - // Script function returns. Here, the function returns - // an Apps Script Object with String keys and values, - // so must be cast into a Java Map (folderSet). - Map folderSet = - (Map)(op.getResponse().get("result")); - if (folderSet.size() == 0) { - System.out.println("No folders returned!"); - } else { - System.out.println("Folders under your root folder:"); - for (String id: folderSet.keySet()) { - System.out.printf( - "\t%s (%s)\n", folderSet.get(id), id); - } - } - } - } catch (GoogleJsonResponseException e) { - // The API encountered a problem before the script was called. - e.printStackTrace(System.out); + // Print results of request. + if (op.getError() != null) { + // The API executed, but the script returned an error. + System.out.println(getScriptError(op)); + } else { + // The result provided by the API needs to be cast into + // the correct type, based upon what types the Apps + // Script function returns. Here, the function returns + // an Apps Script Object with String keys and values, + // so must be cast into a Java Map (folderSet). + Map folderSet = + (Map) (op.getResponse().get("result")); + if (folderSet.size() == 0) { + System.out.println("No folders returned!"); + } else { + System.out.println("Folders under your root folder:"); + for (String id : folderSet.keySet()) { + System.out.printf( + "\t%s (%s)\n", folderSet.get(id), id); + } } + } + } catch (GoogleJsonResponseException e) { + // The API encountered a problem before the script was called. + e.printStackTrace(System.out); } - // [END apps_script_api_execute] + } + // [END apps_script_api_execute] } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index dfa909d7..7ce6076f 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AppsScriptQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-script:v1-rev20220323-2.0.0' } diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index c7f4679a..ba42d201 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START apps_script_api_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,14 +22,13 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.script.Script; import com.google.api.services.script.model.Content; import com.google.api.services.script.model.CreateProjectRequest; import com.google.api.services.script.model.File; import com.google.api.services.script.model.Project; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -39,66 +39,71 @@ import java.util.List; public class AppsScriptQuickstart { - private static final String APPLICATION_NAME = "Apps Script API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials folder at /secret. - */ - private static final List SCOPES = Collections.singletonList("https://www.googleapis.com/auth/script.projects"); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Apps Script API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = AppsScriptQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved credentials folder at /secret. + */ + private static final List SCOPES = + Collections.singletonList("https://www.googleapis.com/auth/script.projects"); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = AppsScriptQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Script service = new Script.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - Script.Projects projects = service.projects(); + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - // Creates a new script project. - Project createOp = projects.create(new CreateProjectRequest().setTitle("My Script")).execute(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Script service = + new Script.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + Script.Projects projects = service.projects(); - // Uploads two files to the project. - File file1 = new File() - .setName("hello") - .setType("SERVER_JS") - .setSource("function helloWorld() {\n console.log(\"Hello, world!\");\n}"); - File file2 = new File() - .setName("appsscript") - .setType("JSON") - .setSource("{\"timeZone\":\"America/New_York\",\"exceptionLogging\":\"CLOUD\"}"); - Content content = new Content().setFiles(Arrays.asList(file1, file2)); - Content updatedContent = projects.updateContent(createOp.getScriptId(), content).execute(); + // Creates a new script project. + Project createOp = projects.create(new CreateProjectRequest().setTitle("My Script")).execute(); - // Logs the project URL. - System.out.printf("https://script.google.com/d/%s/edit\n", updatedContent.getScriptId()); - } + // Uploads two files to the project. + File file1 = new File() + .setName("hello") + .setType("SERVER_JS") + .setSource("function helloWorld() {\n console.log(\"Hello, world!\");\n}"); + File file2 = new File() + .setName("appsscript") + .setType("JSON") + .setSource("{\"timeZone\":\"America/New_York\",\"exceptionLogging\":\"CLOUD\"}"); + Content content = new Content().setFiles(Arrays.asList(file1, file2)); + Content updatedContent = projects.updateContent(createOp.getScriptId(), content).execute(); + + // Logs the project URL. + System.out.printf("https://script.google.com/d/%s/edit\n", updatedContent.getScriptId()); + } } // [END apps_script_api_quickstart] diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 2e580223..6252ad03 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'CalendarQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0' } diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index f173a632..19a50114 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START calendar_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,7 +22,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.DateTime; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.calendar.Calendar; @@ -37,70 +38,87 @@ import java.util.Collections; import java.util.List; +/* class to demonstrate use of Calendar events list API */ public class CalendarQuickstart { - private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(CalendarScopes.CALENDAR_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(CalendarScopes.CALENDAR_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Calendar service = + new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // List the next 10 events from the primary calendar. - DateTime now = new DateTime(System.currentTimeMillis()); - Events events = service.events().list("primary") - .setMaxResults(10) - .setTimeMin(now) - .setOrderBy("startTime") - .setSingleEvents(true) - .execute(); - List items = events.getItems(); - if (items.isEmpty()) { - System.out.println("No upcoming events found."); - } else { - System.out.println("Upcoming events"); - for (Event event : items) { - DateTime start = event.getStart().getDateTime(); - if (start == null) { - start = event.getStart().getDate(); - } - System.out.printf("%s (%s)\n", event.getSummary(), start); - } + // List the next 10 events from the primary calendar. + DateTime now = new DateTime(System.currentTimeMillis()); + Events events = service.events().list("primary") + .setMaxResults(10) + .setTimeMin(now) + .setOrderBy("startTime") + .setSingleEvents(true) + .execute(); + List items = events.getItems(); + if (items.isEmpty()) { + System.out.println("No upcoming events found."); + } else { + System.out.println("Upcoming events"); + for (Event event : items) { + DateTime start = event.getStart().getDateTime(); + if (start == null) { + start = event.getStart().getDate(); } + System.out.printf("%s (%s)\n", event.getSummary(), start); + } } + } } // [END calendar_quickstart] diff --git a/calendar/sync/README.md b/calendar/sync/README.md index b675e51d..2aeb82e6 100644 --- a/calendar/sync/README.md +++ b/calendar/sync/README.md @@ -29,9 +29,9 @@ Setup your Java environment: using the [Google Developers Console](https://console.developers.google.com). 1. Run `mvn compile` to build the project. 1. Run one of the three samples: - * Sync Token Sample: - `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.SyncTokenSample"` - * Conditional Modification Sample: - `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalModificationSample"` - * Conditional Retrieval Sample: - `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalRetrievalSample"` + * Sync Token Sample: + `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.SyncTokenSample"` + * Conditional Modification Sample: + `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalModificationSample"` + * Conditional Retrieval Sample: + `mvn exec:java -Dexec.mainClass="com.google.api.services.samples.calendar.sync.ConditionalRetrievalSample"` diff --git a/calendar/sync/packaging.yaml b/calendar/sync/packaging.yaml index 4a6cb239..c00ac9f6 100644 --- a/calendar/sync/packaging.yaml +++ b/calendar/sync/packaging.yaml @@ -1,15 +1,29 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # GOOGLE SAMPLE PACKAGING DATA # # This file is used by Google as part of our samples packaging process. # End users may safely ignore this file. It has no relevance to other systems. --- -status: PUBLISHED -technologies: [Google Apps] -categories: [Web Services] -languages: [Java] -solutions: [Enterprise] -github: googlesamples/calendar-sync -difficulty: INTERMEDIATE -api_refs: [ws:calendar.events] -dev_console_apis: [calendar] -license: apache2 +status: PUBLISHED +technologies: [ Google Apps ] +categories: [ Web Services ] +languages: [ Java ] +solutions: [ Enterprise ] +github: googlesamples/calendar-sync +difficulty: INTERMEDIATE +api_refs: [ ws:calendar.events ] +dev_console_apis: [ calendar ] +license: apache2 diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 115ab428..af98470c 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -1,88 +1,104 @@ - - - 4.0.0 - - com.google - google - 5 - - com.google.apis-samples - calendar-sync-samples - 1 - Samples demonstrating syncing techniques for the Calendar API. - TODO: Determine the final URL. - 2014 - - 2.0.9 - + + + + 4.0.0 + + com.google + google + 5 + + com.google.apis-samples + calendar-sync-samples + 1 + Samples demonstrating syncing techniques for the Calendar API. + TODO: Determine the final URL. + 2014 + + 3.0.0 + - - - - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - org.codehaus.mojo - exec-maven-plugin - 1.1 - - - - java - - - - - - - java.util.logging.config.file - logging.properties - - - - - - ${project.artifactId}-${project.version} - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + 1.8 + 1.8 + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + + + java.util.logging.config.file + logging.properties + + + + + + ${project.artifactId}-${project.version} + - - - com.google.apis - google-api-services-calendar - v3-rev81-1.18.0-rc - - - com.google.api-client - google-api-client - 1.18.0-rc - - - com.google.http-client - google-http-client-jackson2 - ${project.http.version} - - - com.google.oauth-client - google-oauth-client-jetty - ${project.oauth.version} - - - com.google.collections - google-collections - 1.0 - - + + + com.google.apis + google-api-services-calendar + v3-rev20220715-2.0.0 + + + com.google.api-client + google-api-client + 2.0.0 + + + com.google.http-client + google-http-client-jackson2 + ${project.http.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${project.oauth.version} + + + com.google.collections + google-collections + 1.0 + + - - 1.18.0-rc - 1.18.0-rc - UTF-8 - + + 1.41.0 + 1.32.1 + UTF-8 + diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java index e84a36a4..a3b0c500 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,10 +34,14 @@ */ public class ConditionalModificationSample { - /** The maximum number of times to attempt to update the event, before aborting. */ + /** + * The maximum number of times to attempt to update the event, before aborting. + */ private static final int MAX_UPDATE_ATTEMPTS = 5; - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java index 1d20f796..66dd210d 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,7 +34,9 @@ */ public class ConditionalRetrievalSample { - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java index 38b24ee3..396de651 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java @@ -22,7 +22,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Events; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.Date; import java.util.List; @@ -37,18 +36,23 @@ */ public class SyncTokenSample { - /** Global instance of the Calendar client. */ + /** + * The key in the sync settings datastore that holds the current sync token. + */ + private static final String SYNC_TOKEN_KEY = "syncToken"; + /** + * Global instance of the Calendar client. + */ private static Calendar client; - - /** Global instance of the event datastore. */ + /** + * Global instance of the event datastore. + */ private static DataStore eventDataStore; - - /** Global instance of the sync settings datastore. */ + /** + * Global instance of the sync settings datastore. + */ private static DataStore syncSettingsDataStore; - /** The key in the sync settings datastore that holds the current sync token. */ - private static final String SYNC_TOKEN_KEY = "syncToken"; - public static void main(String[] args) { try { List scopes = Lists.newArrayList(CalendarScopes.CALENDAR_READONLY); diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java index 32e9fb87..775dc403 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java @@ -30,7 +30,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Event.Reminders; import com.google.api.services.calendar.model.EventDateTime; - import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; @@ -41,20 +40,27 @@ * A collection of utility methods used by these samples. */ public class Utils { - /** Application name */ + /** + * Application name + */ private static final String APPLICATION_NAME = "Calendar Sync Samples"; - /** Directory to store user credentials. */ + /** + * Directory to store user credentials. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".store/calendar-sync"); - - /** Global instance of the {@link DataStoreFactory}. */ - private static FileDataStoreFactory dataStoreFactory; - - /** Global instance of the JSON factory. */ + /** + * Global instance of the JSON factory. + */ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ + /** + * Global instance of the {@link DataStoreFactory}. + */ + private static FileDataStoreFactory dataStoreFactory; + /** + * Global instance of the HTTP transport. + */ private static HttpTransport httpTransport; static { @@ -67,14 +73,18 @@ public class Utils { } } - /** Creates a new Calendar client to use when making requests to the API. */ + /** + * Creates a new Calendar client to use when making requests to the API. + */ public static Calendar createCalendarClient(List scopes) throws Exception { Credential credential = authorize(scopes); return new Calendar.Builder( httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); } - /** Authorizes the installed application to access user's protected data. */ + /** + * Authorizes the installed application to access user's protected data. + */ public static Credential authorize(List scopes) throws Exception { // Load client secrets. GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, @@ -83,7 +93,7 @@ public static Credential authorize(List scopes) throws Exception { || clientSecrets.getDetails().getClientSecret().startsWith("Enter")) { System.out.println( "Overwrite the src/main/resources/client_secrets.json file with the client secrets file " - + "you downloaded from your Google Developers Console project."); + + "you downloaded from your Google Developers Console project."); System.exit(1); } @@ -94,12 +104,16 @@ public static Credential authorize(List scopes) throws Exception { return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } - /** Gets the datastore factory used in these samples. */ + /** + * Gets the datastore factory used in these samples. + */ public static DataStoreFactory getDataStoreFactory() { return dataStoreFactory; } - /** Creates a test event. */ + /** + * Creates a test event. + */ public static Event createTestEvent(Calendar client, String summary) throws IOException { Date oneHourFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 1); Date twoHoursFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 2); @@ -116,7 +130,7 @@ public static Event createTestEvent(Calendar client, String summary) throws IOEx /** * Gets a new {@link java.util.Date} relative to the current date and time. * - * @param field the field identifier from {@link java.util.Calendar} to increment + * @param field the field identifier from {@link java.util.Calendar} to increment * @param amount the amount of the field to increment * @return the new date */ diff --git a/chat/client-libraries/cloud/README.md b/chat/client-libraries/cloud/README.md new file mode 100644 index 00000000..7ec1fce9 --- /dev/null +++ b/chat/client-libraries/cloud/README.md @@ -0,0 +1,28 @@ +# Google Chat API - Cloud Client library samples + +## Set up + +Add `service_account.json` and/or `client_secrets.json` to the current +folder depending on the credentials used by the samples to run: + +1. `service_account.json` for + [app credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-app) + +1. `client_secrets.json` for + [user credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user) + +## Run with Maven + +Execute +`mvn exec:java -Dexec.mainClass="replace.with.the.sample.mainClass"` +wih the main class of the sample. + +For example, to run the sample `CreateMessageAppCred`, run +`mvn exec:java -Dexec.mainClass="com.google.workspace.api.chat.samples.CreateMessageAppCred"`. + +## Run with Gradle + +Execute `gradle run` after setting the main class of the sample in the `build.gradle` file. + +For example, to run the sample `CreateMessageAppCred`, use +`com.google.workspace.api.chat.samples.CreateMessageAppCred`. diff --git a/chat/client-libraries/cloud/build.gradle b/chat/client-libraries/cloud/build.gradle new file mode 100644 index 00000000..470b5e81 --- /dev/null +++ b/chat/client-libraries/cloud/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'com.google.workspace.api.chat.samples.CreateMessageAppCred' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.apis:google-api-services-chat:v1-rev20240509-2.0.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/client-libraries/cloud/pom.xml b/chat/client-libraries/cloud/pom.xml new file mode 100644 index 00000000..06af9826 --- /dev/null +++ b/chat/client-libraries/cloud/pom.xml @@ -0,0 +1,59 @@ + + 4.0.0 + + com.google.workspace.api.chat.samples + chat-api-samples + 0.0.1 + Google API Client Library Chat Samples For Java + + + + 21 + 1.8 + 1.8 + + + + + + + com.google.auth + google-auth-library-oauth2-http + 1.23.0 + + + com.google.oauth-client + google-oauth-client-jetty + 1.34.1 + + + + + + com.google.apis + google-api-services-chat + v1-rev20240509-2.0.0 + + + + + + com.google.api.grpc + proto-google-cloud-chat-v1 + 0.8.0 + + + com.google.api + gax + 2.48.1 + + + + com.google.cloud + google-cloud-chat + 0.1.0 + + + + + diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java new file mode 100644 index 00000000..5ffd2ff2 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java @@ -0,0 +1,121 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.google.auth.oauth2.UserCredentials; +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.common.collect.ImmutableList; + +import java.io.FileInputStream; +import java.io.FileReader; +import java.util.Collections; +import java.util.Date; + +public class AuthenticationUtils{ + + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String SERVICE_ACCOUNT_FILE = "service_account.json"; + private static final String CLIENT_SECRET_FILE = "client_secrets.json"; + private static final String APP_AUTH_OAUTH_SCOPE = + "https://www.googleapis.com/auth/chat.bot"; + + public static ChatServiceClient createClientWithAppCredentials() + throws Exception { + // For more information on service account authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-app + GoogleCredentials credential = ServiceAccountCredentials.fromStream( + new FileInputStream(SERVICE_ACCOUNT_FILE)) + .createScoped(ImmutableList.of(APP_AUTH_OAUTH_SCOPE)); + + // Create the ChatServiceSettings with the app credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(credential)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + public static ChatServiceClient createClientWithUserCredentials( + ImmutableList scopes) throws Exception { + // For more information on user authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-user + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( + JSON_FACTORY, new FileReader(CLIENT_SECRET_FILE)); + + Credential credential = authorize(scopes, clientSecrets); + + AccessToken accessToken = new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + UserCredentials googleCredentials = + UserCredentials + .newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings + .newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(googleCredentials)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + // Generate access token and refresh token using scopes and client secrets. + private static Credential authorize( + ImmutableList scopes, GoogleClientSecrets clientSecrets) + throws Exception { + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JSON_FACTORY, + clientSecrets, + scopes) + // Set these two options to generate refresh token alongside access token. + .setAccessType("offline") + .setApprovalPrompt("force") + .build(); + + // Authorize. + return new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + } +} diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java new file mode 100644 index 00000000..c10605bd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_membership_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for a human +// user. +public class CreateMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // replace USER_NAME here + .setName("users/USER_NAME") + // user type for the membership + .setType(User.Type.HUMAN))); + Membership response = chatServiceClient.createMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java new file mode 100644 index 00000000..1572da40 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_membership_user_cred_for_app] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for the +// calling app. +public class CreateMembershipUserCredForApp { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.app"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // member name for app membership, do not change this. + .setName("users/app") + // user type for the membership + .setType(User.Type.BOT))); + Membership response = chatServiceClient.createMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_membership_user_cred_for_app] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java new file mode 100644 index 00000000..43e20ac0 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_membership_user_cred_for_group] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.Group; + +// This sample shows how to create membership with user credential for a group. +public class CreateMembershipUserCredForGroup { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setGroupMember(Group.newBuilder() + // replace GROUP_NAME here + .setName("groups/GROUP_NAME"))); + Membership response = chatServiceClient.createMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_membership_user_cred_for_group] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java new file mode 100644 index 00000000..b32bd8dd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -0,0 +1,90 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_app_cred] +import com.google.apps.card.v1.Button; +import com.google.apps.card.v1.ButtonList; +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Icon; +import com.google.apps.card.v1.MaterialIcon; +import com.google.apps.card.v1.OnClick; +import com.google.apps.card.v1.OpenLink; +import com.google.apps.card.v1.TextParagraph; +import com.google.apps.card.v1.Widget; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.apps.card.v1.Card.Section; +import com.google.chat.v1.AccessoryWidget; +import com.google.chat.v1.CardWithId; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with app credential. +public class CreateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world! I created this message by calling " + + "the Chat API\'s `messages.create()` method.") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("About this message") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg")) + .addSections(Section.newBuilder() + .setHeader("Contents") + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔡 Text which can include " + + "hyperlinks 🔗, emojis 😄🎉, and @mentions 🗣️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🖼️ A card to display visual elements " + + "and request information such as text 🔤, " + + "dates and times 📅, and selections ☑️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "👉🔘 An accessory widget which adds " + + "a button to the bottom of a message.")))) + .addSections(Section.newBuilder() + .setHeader("What's next") + .setCollapsible(true) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "❤️ Add a reaction."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔄 Update " + + "or ❌ delete " + + "the message.")))))) + .addAccessoryWidgets(AccessoryWidget.newBuilder() + .setButtonList(ButtonList.newBuilder() + .addButtons(Button.newBuilder() + .setText("View documentation") + .setIcon(Icon.newBuilder() + .setMaterialIcon(MaterialIcon.newBuilder().setName("link"))) + .setOnClick(OnClick.newBuilder() + .setOpenLink(OpenLink.newBuilder() + .setUrl("https://developers.google.com/workspace/chat/create-messages"))))))); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java new file mode 100644 index 00000000..cef822a1 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with user credential. +public class CreateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world!" + + "Text messages can contain things like:\n\n" + + "* Hyperlinks 🔗\n" + + "* Emojis 😄🎉\n" + + "* Mentions of other Chat users `@` \n\n" + + "For details, see the " + + ".")); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java new file mode 100644 index 00000000..a52874bd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred_at_mention] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with user credential with a user +// mention. +public class CreateMessageUserCredAtMention { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage(Message.newBuilder() + // The user with USER_NAME will be mentioned if they are in the + // space. + // Replace USER_NAME here + .setText("Hello !")); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred_at_mention] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java new file mode 100644 index 00000000..0312ce07 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred_message_id] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with message id specified with user +// credential. +public class CreateMessageUserCredMessageId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) + // Message ID lets chat apps get, update or delete a message without + // needing to store the system assigned ID in the message's resource + // name. + .setMessageId("client-MESSAGE-ID"); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred_message_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java new file mode 100644 index 00000000..c9acce76 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred_request_id] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with request id specified with user +// credential. +public class CreateMessageUserCredRequestId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) + // Specifying an existing request ID returns the message created with + // that ID instead of creating a new message. + .setRequestId("REQUEST_ID"); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred_request_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java new file mode 100644 index 00000000..8fa51135 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred_thread_key] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with a thread key with user +// credential. +public class CreateMessageUserCredThreadKey { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread_key. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Thread key specifies a thread and is unique to the chat app + // that sets it. + .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY"))); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred_thread_key] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java new file mode 100644 index 00000000..e27387fb --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java @@ -0,0 +1,58 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_message_user_cred_thread_name] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with thread name specified with user +// credential. +public class CreateMessageUserCredThreadName { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread name. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Resource name of a thread that uniquely identify a thread. + .setThread(Thread.newBuilder().setName( + // replace SPACE_NAME and THREAD_NAME here + "spaces/SPACE_NAME/threads/THREAD_NAME"))); + Message response = chatServiceClient.createMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_message_user_cred_thread_name] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java new file mode 100644 index 00000000..713f64a9 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to create space with user credential. +public class CreateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateSpaceRequest.Builder request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")); + Space response = chatServiceClient.createSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java new file mode 100644 index 00000000..f0fea33b --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -0,0 +1,36 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +// [START chat_delete_message_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; + +// This sample shows how to delete message with app credential. +public class DeleteMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); + } + } +} +// [END chat_delete_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java new file mode 100644 index 00000000..34d5adc2 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +// [START chat_delete_message_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; +import com.google.chat.v1.SpaceName; + +// This sample shows how to delete message with user credential. +public class DeleteMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); + } + } +} +// [END chat_delete_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java new file mode 100644 index 00000000..52c2e86f --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_get_membership_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with app credential. +public class GetMembershipAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_membership_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java new file mode 100644 index 00000000..55637384 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_get_membership_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with user credential. +public class GetMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java new file mode 100644 index 00000000..f79e8a79 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_get_message_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with app credential. +public class GetMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java new file mode 100644 index 00000000..f8a99a70 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_get_message_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with user credential. +public class GetMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java new file mode 100644 index 00000000..4b76c13d --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_get_space_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with app credential. +public class GetSpaceAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_space_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java new file mode 100644 index 00000000..ab85d9ce --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_get_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with user credential. +public class GetSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_get_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java new file mode 100644 index 00000000..8a4a56f0 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -0,0 +1,49 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_list_memberships_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with app credential. +public class ListMembershipsAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); + + // Iterate over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request.build()).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_list_memberships_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java new file mode 100644 index 00000000..8ddeb7dd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_list_memberships_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with user credential. +public class ListMembershipsUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); + + // Iterating over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request.build()).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_list_memberships_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java new file mode 100644 index 00000000..d9081b24 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_list_messages_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMessagesRequest; +import com.google.chat.v1.ListMessagesResponse; +import com.google.chat.v1.Message; + +// This sample shows how to list messages with user credential. +public class ListMessagesUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMessagesRequest.Builder request = ListMessagesRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Number of results that will be returned at once. + .setPageSize(10); + + // Iterate over results and resolve additional pages automatically. + for (Message response : + chatServiceClient.listMessages(request.build()).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_list_messages_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java new file mode 100644 index 00000000..8fd15cc3 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_list_spaces_app_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with app credential. +public class ListSpacesAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request.build()).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_list_spaces_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java new file mode 100644 index 00000000..bffdf6cb --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_list_spaces_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with user credential. +public class ListSpacesUserCred{ + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request.build()).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_list_spaces_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java new file mode 100644 index 00000000..d39b6192 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; + +// [START chat_set_up_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SetUpSpaceRequest; +import com.google.chat.v1.Space; +import com.google.chat.v1.User; + +// This sample shows how to set up a named space with one initial member with +// user credential. +public class SetUpSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + SetUpSpaceRequest.Builder request = SetUpSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")) + .addAllMemberships(ImmutableList.of(Membership.newBuilder() + .setMember(User.newBuilder() + // Replace USER_NAME here. + .setName("users/USER_NAME") + .setType(User.Type.HUMAN)).build())); + Space response = chatServiceClient.setUpSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_set_up_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java new file mode 100644 index 00000000..559ad13f --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; + +import java.util.List; + +// [START chat_update_message_app_cred] +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.chat.v1.CardWithId; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with app credential. +public class UpdateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Text updated with app credential!") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("Card updated with app credential!") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg"))))) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addAllPaths(List.of("text", "cards_v2"))); + Message response = chatServiceClient.updateMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_update_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java new file mode 100644 index 00000000..abda65c7 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_update_message_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with user credential. +public class UpdateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with user credential!")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("text")); + Message response = chatServiceClient.updateMessage(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_update_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java new file mode 100644 index 00000000..73b5cec3 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_update_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateSpaceRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.FieldMask; + +// This sample shows how to update space with user credential. +public class UpdateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateSpaceRequest.Builder request = UpdateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + // Replace SPACE_NAME here. + .setName("spaces/SPACE_NAME") + .setDisplayName("New space display name")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("display_name")); + Space response = chatServiceClient.updateSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_update_space_user_cred] diff --git a/chat/quickstart/README.md b/chat/quickstart/README.md new file mode 100644 index 00000000..ccae2e71 --- /dev/null +++ b/chat/quickstart/README.md @@ -0,0 +1,12 @@ +# Google Chat Java Quickstart + +Complete the steps described in the [quickstart instructions]( +https://developers.google.com/workspace/chat/api/guides/quickstart/java), +and in about five minutes you'll have a simple Java command-line +application that makes requests to the Google Chat API. + +## Run + +After following the quickstart setup instructions, run the sample: + +`gradle run` diff --git a/chat/quickstart/build.gradle b/chat/quickstart/build.gradle new file mode 100644 index 00000000..a1a7d7ef --- /dev/null +++ b/chat/quickstart/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'ChatQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/quickstart/settings.gradle b/chat/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/chat/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/chat/quickstart/src/main/java/ChatQuickstart.java b/chat/quickstart/src/main/java/ChatQuickstart.java new file mode 100644 index 00000000..4956be1d --- /dev/null +++ b/chat/quickstart/src/main/java/ChatQuickstart.java @@ -0,0 +1,130 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START chat_quickstart] + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.auth.Credentials; +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.UserCredentials; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.util.JsonFormat; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/* class to demonstrate use of Google Chat API spaces list API */ +public class ChatQuickstart { + /** Directory to store authorization tokens for this application. */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList("https://www.googleapis.com/auth/chat.spaces.readonly"); + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() throws Exception { + // Load client secrets. + InputStream credentialsFileInputStream = + ChatQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (credentialsFileInputStream == null) { + throw new FileNotFoundException("Credentials file resource not found."); + } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(credentialsFileInputStream)); + + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, clientSecrets, SCOPES) + // Set these two options to generate refresh token alongside access token. + .setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + // Authorize. + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + + // Build and return an authorized Credential object + AccessToken accessToken = + new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + return UserCredentials.newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (ChatServiceClient chatServiceClient = ChatServiceClient.create(chatServiceSettings)) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_quickstart] diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 517a3543..d69815f0 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' } diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index e95381da..fb174b5e 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START classroom_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,7 +22,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.*; @@ -36,61 +37,66 @@ import java.util.List; public class ClassroomQuickstart { - private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Classroom service = new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // List the first 10 courses that the user has access to. - ListCoursesResponse response = service.courses().list() - .setPageSize(10) - .execute(); - List courses = response.getCourses(); - if (courses == null || courses.size() == 0) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s\n", course.getName()); - } - } + // List the first 10 courses that the user has access to. + ListCoursesResponse response = service.courses().list() + .setPageSize(10) + .execute(); + List courses = response.getCourses(); + if (courses == null || courses.size() == 0) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s\n", course.getName()); + } } + } } // [END classroom_quickstart] diff --git a/classroom/snippets/.gitignore b/classroom/snippets/.gitignore new file mode 100644 index 00000000..0df08ceb --- /dev/null +++ b/classroom/snippets/.gitignore @@ -0,0 +1,8 @@ +.gradle +.settings +bin +build +gradle +src/main/java/com/google/api +.classpath +.project diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle new file mode 100644 index 00000000..8def0b0f --- /dev/null +++ b/classroom/snippets/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'java' + +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenCentral() +} + +dependencies { + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' + testImplementation 'junit:junit:4.13.2' + + /** This will be removed once all the classes have been updated to use the + * ClassroomCredentials class. */ + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' +} + +test { + testLogging.showStandardStreams = true +} diff --git a/classroom/snippets/settings.gradle b/classroom/snippets/settings.gradle new file mode 100644 index 00000000..c5f47228 --- /dev/null +++ b/classroom/snippets/settings.gradle @@ -0,0 +1,19 @@ +/* + * This settings file was auto generated by the Gradle buildInit task + * by 'ekoleda' at '6/25/15 1:48 PM' with Gradle 2.3 + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at http://gradle.org/docs/2.3/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'java' diff --git a/classroom/snippets/src/main/java/AcceptInvitation.java b/classroom/snippets/src/main/java/AcceptInvitation.java new file mode 100644 index 00000000..137a23a0 --- /dev/null +++ b/classroom/snippets/src/main/java/AcceptInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_accept_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Accept Invitation API. */ +public class AcceptInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Accepts an invitation to a course. + * + * @param id - the identifier of the invitation to accept. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void acceptInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_accept_invitation_code_snippet] + try { + service.invitations().accept(id).execute(); + System.out.printf("Invitation (%s) was accepted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_accept_invitation_code_snippet] + } +} +// [END classroom_accept_invitation] diff --git a/classroom/snippets/src/main/java/AddAliasToCourse.java b/classroom/snippets/src/main/java/AddAliasToCourse.java new file mode 100644 index 00000000..720dccec --- /dev/null +++ b/classroom/snippets/src/main/java/AddAliasToCourse.java @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_add_alias_to_course_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Create Alias API. */ +public class AddAliasToCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Add an alias on an existing course. + * + * @param courseId - id of the course to add an alias to. + * @return - newly created course alias. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static CourseAlias addAliasToCourse(String courseId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_add_alias_to_course_code_snippet] + + /* Create a new CourseAlias object with a project-wide alias. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + CourseAlias content = new CourseAlias().setAlias("p:biology_10"); + CourseAlias courseAlias = null; + + try { + courseAlias = service.courses().aliases().create(courseId, content).execute(); + System.out.printf("Course alias created: %s \n", courseAlias.getAlias()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return courseAlias; + + // [END classroom_add_alias_to_course_code_snippet] + + } +} +// [END classroom_add_alias_to_course_class] diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java new file mode 100644 index 00000000..6331f3ed --- /dev/null +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -0,0 +1,88 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_add_student] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Add Student API */ +public class AddStudent { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Add a student in a specified course. + * + * @param courseId - Id of the course. + * @param enrollmentCode - Code of the course to enroll. + * @return newly added student + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Student addStudent(String courseId, String enrollmentCode, String studentId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Student student = new Student().setUserId(studentId); + try { + // Enrolling a student to a specified course + student = + service + .courses() + .students() + .create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + // Prints the course id with the Student name + System.out.printf( + "User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return student; + } +} +// [END classroom_add_student] diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java new file mode 100644 index 00000000..4c843721 --- /dev/null +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -0,0 +1,82 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_add_teacher] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Teacher; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Add Teacher API */ +public class AddTeacher { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Add teacher to a specific course. + * + * @param courseId - Id of the course. + * @param teacherEmail - Email address of the teacher. + * @return newly created teacher + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Teacher addTeacher(String courseId, String teacherEmail) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + // Add a teacher to a specified course + teacher = service.courses().teachers().create(courseId, teacher).execute(); + // Prints the course id with the teacher name + System.out.printf( + "User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return teacher; + } +} +// [END classroom_add_teacher] diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java new file mode 100644 index 00000000..d4a54c2e --- /dev/null +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -0,0 +1,82 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_batch_add_students] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom Batch Add Students API */ +public class BatchAddStudents { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Add multiple students in a specified course. + * + * @param courseId - Id of the course to add students. + * @param studentEmails - Email address of the students. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void batchAddStudents(String courseId, List studentEmails) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + BatchRequest batch = service.batch(); + JsonBatchCallback callback = + new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf( + "User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } + + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); + } + batch.execute(); + } +} +// [END classroom_batch_add_students] diff --git a/classroom/snippets/src/main/java/CancelGuardianInvitation.java b/classroom/snippets/src/main/java/CancelGuardianInvitation.java new file mode 100644 index 00000000..33585400 --- /dev/null +++ b/classroom/snippets/src/main/java/CancelGuardianInvitation.java @@ -0,0 +1,97 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_cancel_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Patch Guardian Invitation API. */ +public class CancelGuardianInvitation { + /** + * Cancel a guardian invitation by modifying the state of the invite. + * + * @param studentId - the id of the student. + * @param invitationId - the id of the guardian invitation to modify. + * @return - the modified guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation cancelGuardianInvitation(String studentId, String invitationId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_cancel_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + try { + /* Change the state of the GuardianInvitation from PENDING to COMPLETE. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + service.userProfiles().guardianInvitations().get(studentId, invitationId).execute(); + content.setState("COMPLETE"); + + guardianInvitation = + service + .userProfiles() + .guardianInvitations() + .patch(studentId, invitationId, content) + .set("updateMask", "state") + .execute(); + + System.out.printf( + "Invitation (%s) state set to %s\n.", + guardianInvitation.getInvitationId(), guardianInvitation.getState()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "There is no record of studentId (%s) or invitationId (%s).", studentId, invitationId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_cancel_guardian_invitation_code_snippet] + } +} +// [END classroom_cancel_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/ClassroomCredentials.java b/classroom/snippets/src/main/java/ClassroomCredentials.java new file mode 100644 index 00000000..70cd5d94 --- /dev/null +++ b/classroom/snippets/src/main/java/ClassroomCredentials.java @@ -0,0 +1,64 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; + +public class ClassroomCredentials { + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @param SCOPES The scopes required to make the API call. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT, Collection SCOPES) + throws IOException { + // Load client secrets. + InputStream in = ClassroomCredentials.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } +} diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java new file mode 100644 index 00000000..95f7353c --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -0,0 +1,87 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_course] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Create Course API */ +public class CreateCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Creates a course + * + * @return newly created course + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Course createCourse() throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Adding a new course with description. Set CourseState to `ACTIVE`. Possible values of + // CourseState can be found here: + // https://developers.google.com/classroom/reference/rest/v1/courses#coursestate + course = + new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription( + "We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("ACTIVE"); + course = service.courses().create(course).execute(); + // Prints the new created course Id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.err.println("Unable to create course, ownerId not specified.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_create_course] diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java new file mode 100644 index 00000000..c676b973 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.java @@ -0,0 +1,93 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_course_with_alias_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate how to create a course with an alias. */ +public class CreateCourseWithAlias { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Create a new course with an alias. Set the new course id to the desired alias. + * + * @return - newly created course. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Course createCourseWithAlias() throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_course_with_alias_code_snippet] + + Course course = null; + + /* Create a new Course with the alias set as the id field. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + Course content = + new Course() + .setId("p:history_4_2022") + .setName("9th Grade History") + .setSection("Period 4") + .setDescriptionHeading("Welcome to 9th Grade History.") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + + try { + course = service.courses().create(content).execute(); + // Prints the new created course id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content.getId()); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return course; + + // [END classroom_create_course_with_alias_code_snippet] + + } +} +// [END classroom_create_course_with_alias_class] diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java new file mode 100644 index 00000000..5d6c948d --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -0,0 +1,110 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_coursework_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseWork; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.Material; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create CourseWork API. */ +public class CreateCourseWork { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + + /** + * Creates course work. + * + * @param courseId - id of the course to create coursework in. + * @return - newly created CourseWork object. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static CourseWork createCourseWork(String courseId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_coursework_code_snippet] + + CourseWork courseWork = null; + try { + // Create a link to add as a material on course work. + Link articleLink = + new Link() + .setTitle("SR-71 Blackbird") + .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); + + // Create a list of Materials to add to course work. + List materials = Arrays.asList(new Material().setLink(articleLink)); + + /* Create new CourseWork object with the material attached. + Set workType to `ASSIGNMENT`. Possible values of workType can be found here: + https://developers.google.com/classroom/reference/rest/v1/CourseWorkType + Set state to `PUBLISHED`. Possible values of state can be found here: + https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */ + CourseWork content = + new CourseWork() + .setTitle("Supersonic aviation") + .setDescription( + "Read about how the SR-71 Blackbird, the world’s fastest and " + + "highest-flying manned aircraft, was built.") + .setMaterials(materials) + .setWorkType("ASSIGNMENT") + .setState("PUBLISHED"); + + courseWork = service.courses().courseWork().create(courseId, content).execute(); + + /* Prints the created courseWork. */ + System.out.printf("CourseWork created: %s\n", courseWork.getTitle()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + throw e; + } catch (Exception e) { + throw e; + } + return courseWork; + + // [END classroom_create_coursework_code_snippet] + } +} +// [END classroom_create_coursework_class] diff --git a/classroom/snippets/src/main/java/CreateGuardianInvitation.java b/classroom/snippets/src/main/java/CreateGuardianInvitation.java new file mode 100644 index 00000000..cb3fe374 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateGuardianInvitation.java @@ -0,0 +1,90 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create Guardian Invitation API. */ +public class CreateGuardianInvitation { + /** + * Creates a guardian invitation by sending an email to the guardian for confirmation. + * + * @param studentId - the id of the student. + * @param guardianEmail - email to send the guardian invitation to. + * @return - the newly created guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation createGuardianInvitation(String studentId, String guardianEmail) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + /* Create a GuardianInvitation object with state set to PENDING. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + new GuardianInvitation() + .setStudentId(studentId) + .setInvitedEmailAddress(guardianEmail) + .setState("PENDING"); + try { + guardianInvitation = + service.userProfiles().guardianInvitations().create(studentId, content).execute(); + + System.out.printf("Invitation created: %s\n", guardianInvitation.getInvitationId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId: %s", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_create_guardian_invitation_code_snippet] + } +} +// [END classroom_create_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/CreateInvitation.java b/classroom/snippets/src/main/java/CreateInvitation.java new file mode 100644 index 00000000..3e3d22ac --- /dev/null +++ b/classroom/snippets/src/main/java/CreateInvitation.java @@ -0,0 +1,89 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Create Invitation API. */ +public class CreateInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Create an invitation to allow a user to join a course. + * + * @param courseId - the course to invite the user to. + * @param userId - the user to be invited to the course. + * @return the created invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation createInvitation(String courseId, String userId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_invitation_code_snippet] + + Invitation invitation = null; + try { + /* Set the role the user is invited to have in the course. Possible values of CourseRole can be + found here: https://developers.google.com/classroom/reference/rest/v1/invitations#courserole.*/ + Invitation content = + new Invitation().setCourseId(courseId).setUserId(userId).setRole("TEACHER"); + + invitation = service.invitations().create(content).execute(); + + System.out.printf( + "User (%s) has been invited to course (%s).\n", + invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The course or user does not exist.\n"); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + + // [END classroom_create_invitation_code_snippet] + } +} +// [END classroom_create_invitation] diff --git a/classroom/snippets/src/main/java/CreateTopic.java b/classroom/snippets/src/main/java/CreateTopic.java new file mode 100644 index 00000000..1be964a3 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateTopic.java @@ -0,0 +1,83 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_topic_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate how to create a topic. */ +public class CreateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + + /** + * Create a new topic in a course. + * + * @param courseId - the id of the course to create a topic in. + * @return - newly created topic. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Topic createTopic(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_topic_code_snippet] + + Topic topic = null; + try { + // Create the new Topic. + Topic content = new Topic().setName("Semester 1"); + topic = service.courses().topics().create(courseId, content).execute(); + System.out.println("Topic id: " + topic.getTopicId() + "\n" + "Course id: " + courseId); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_create_topic_code_snippet] + + } +} +// [END classroom_create_topic_class] diff --git a/classroom/snippets/src/main/java/DeleteGuardian.java b/classroom/snippets/src/main/java/DeleteGuardian.java new file mode 100644 index 00000000..7cc67a23 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteGuardian.java @@ -0,0 +1,66 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_delete_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Delete Guardian API. */ +public class DeleteGuardian { + /** + * Delete a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void deleteGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_guardian_code_snippet] + try { + service.userProfiles().guardians().delete(studentId, guardianId).execute(); + System.out.printf("The guardian with id %s was deleted.\n", guardianId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of guardianId (%s).", guardianId); + } + } + // [END classroom_delete_guardian_code_snippet] + } +} +// [END classroom_delete_guardian_class] diff --git a/classroom/snippets/src/main/java/DeleteInvitation.java b/classroom/snippets/src/main/java/DeleteInvitation.java new file mode 100644 index 00000000..eca59e92 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_delete_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Delete Invitation API. */ +public class DeleteInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Deletes an invitation. + * + * @param id - the identifier of the invitation to delete. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void deleteInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_invitation_code_snippet] + try { + service.invitations().delete(id).execute(); + System.out.printf("Invitation (%s) was deleted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_delete_invitation_code_snippet] + } +} +// [END classroom_delete_invitation] diff --git a/classroom/snippets/src/main/java/DeleteTopic.java b/classroom/snippets/src/main/java/DeleteTopic.java new file mode 100644 index 00000000..15188de6 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteTopic.java @@ -0,0 +1,73 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_delete_topic_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate how to delete a topic. */ +public class DeleteTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + + /** + * Delete a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to delete. + * @return - updated topic. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void deleteTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_topic_code_snippet] + + try { + service.courses().topics().delete(courseId, topicId).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + throw e; + } catch (Exception e) { + throw e; + } + + // [END classroom_delete_topic_code_snippet] + + } +} +// [END classroom_delete_topic_class] diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java new file mode 100644 index 00000000..94d07f75 --- /dev/null +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_course] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Get Course API */ +public class GetCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Retrieve a single course's metadata. + * + * @param courseId - Id of the course to return. + * @return a course + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Course getCourse(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_get_course] diff --git a/classroom/snippets/src/main/java/GetGuardian.java b/classroom/snippets/src/main/java/GetGuardian.java new file mode 100644 index 00000000..781b6728 --- /dev/null +++ b/classroom/snippets/src/main/java/GetGuardian.java @@ -0,0 +1,74 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Get Guardian API. */ +public class GetGuardian { + /** + * Retrieve a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void getGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_guardian_code_snippet] + Guardian guardian = null; + + try { + guardian = service.userProfiles().guardians().get(studentId, guardianId).execute(); + System.out.printf("Guardian retrieved: %s", guardian.getInvitedEmailAddress()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.printf("There is no record of guardianId (%s).\n", guardianId); + throw e; + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + // [END classroom_get_guardian_code_snippet] + } +} +// [END classroom_get_guardian_class] diff --git a/classroom/snippets/src/main/java/GetInvitation.java b/classroom/snippets/src/main/java/GetInvitation.java new file mode 100644 index 00000000..77d0598f --- /dev/null +++ b/classroom/snippets/src/main/java/GetInvitation.java @@ -0,0 +1,76 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Get Invitation API. */ +public class GetInvitation { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Retrieves an invitation. + * + * @param id - the identifier of the invitation to retrieve. + * @return the specified invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation getInvitation(String id) throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_invitation_code_snippet] + Invitation invitation = null; + try { + invitation = service.invitations().get(id).execute(); + System.out.printf( + "Invitation (%s) for user (%s) in course (%s) retrieved.\n", + invitation.getId(), invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + // [END classroom_get_invitation_code_snippet] + } +} +// [END classroom_get_invitation] diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java new file mode 100644 index 00000000..5fb42012 --- /dev/null +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -0,0 +1,83 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_topic_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate how to get a topic. */ +public class GetTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + + /** + * Get a topic in a course. + * + * @param courseId - the id of the course the topic belongs to. + * @param topicId - the id of the topic to retrieve. + * @return - the topic to retrieve. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Topic getTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_topic_code_snippet] + + Topic topic = null; + try { + // Get the topic. + topic = service.courses().topics().get(courseId, topicId).execute(); + System.out.printf("Topic '%s' found.\n", topic.getName()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } + throw e; + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_get_topic_code_snippet] + + } +} +// [END classroom_get_topic_class] diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java new file mode 100644 index 00000000..dbec2299 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -0,0 +1,103 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_aliases_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.ListCourseAliasesResponse; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Alias API */ +public class ListCourseAliases { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Retrieve the aliases for a course. + * + * @param courseId - id of the course. + * @return list of course aliases + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static List listCourseAliases(String courseId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_aliases_code_snippet] + + String pageToken = null; + List courseAliases = new ArrayList<>(); + + try { + // List of aliases of specified course + do { + ListCourseAliasesResponse response = + service + .courses() + .aliases() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); + } + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return courseAliases; + + // [END classroom_list_aliases_code_snippet] + } +} +// [END classroom_list_aliases_class] diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java new file mode 100644 index 00000000..c5a00b25 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -0,0 +1,83 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_courses] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.ListCoursesResponse; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Course API */ +public class ListCourses { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Retrieves all courses with metadata + * + * @return list of courses with its metadata + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static List listCourses() throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + String pageToken = null; + List courses = new ArrayList<>(); + + try { + do { + ListCoursesResponse response = + service.courses().list().setPageSize(100).setPageToken(pageToken).execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); + } + } + } catch (NullPointerException ne) { + // TODO(developer) - handle error appropriately + System.err.println("No courses found.\n"); + } + return courses; + } +} +// [END classroom_list_courses] diff --git a/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..b565f44d --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java @@ -0,0 +1,102 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_guardian_invitations_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import com.google.api.services.classroom.model.ListGuardianInvitationsResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardian Invitations API. */ +public class ListGuardianInvitationsByStudent { + /** + * Retrieves guardian invitations by student. + * + * @param studentId - the id of the student. + * @return a list of guardian invitations that were sent for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardianInvitationsByStudent(String studentId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardian_invitations_code_snippet] + + List guardianInvitations = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardianInvitationsResponse response = + service + .userProfiles() + .guardianInvitations() + .list(studentId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardianInvitations() != null) { + guardianInvitations.addAll(response.getGuardianInvitations()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardianInvitations.isEmpty()) { + System.out.println("No guardian invitations found."); + } else { + for (GuardianInvitation invitation : guardianInvitations) { + System.out.printf("Guardian invitation id: %s\n", invitation.getInvitationId()); + } + } + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitations; + + // [END classroom_list_guardian_invitations_code_snippet] + } +} +// [END classroom_list_guardian_invitations_class] diff --git a/classroom/snippets/src/main/java/ListGuardians.java b/classroom/snippets/src/main/java/ListGuardians.java new file mode 100644 index 00000000..1cb87014 --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardians.java @@ -0,0 +1,99 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_guardians_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import com.google.api.services.classroom.model.ListGuardiansResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardians API. */ +public class ListGuardians { + /** + * Retrieves active guardians for a specific student. + * + * @param studentId - the id of the student. + * @return a list of active guardians for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardians(String studentId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardians_code_snippet] + + List guardians = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardiansResponse response = + service.userProfiles().guardians().list(studentId).setPageToken(pageToken).execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardians() != null) { + guardians.addAll(response.getGuardians()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardians.isEmpty()) { + System.out.println("No guardians found."); + } else { + for (Guardian guardian : guardians) { + System.out.printf( + "Guardian name: %s, guardian id: %s, guardian email: %s\n", + guardian.getGuardianProfile().getName().getFullName(), + guardian.getGuardianId(), + guardian.getInvitedEmailAddress()); + } + } + + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardians; + + // [END classroom_list_guardians_code_snippet] + } +} +// [END classroom_list_guardians_class] diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java new file mode 100644 index 00000000..20e322a1 --- /dev/null +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -0,0 +1,179 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_student_submissions_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListStudentSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + + /** + * Retrieves a specific student's submissions for the specified course work. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param userId - identifier of the student whose work to return. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static List listStudentSubmissions( + String courseId, String courseWorkId, String userId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_student_submissions_code_snippet] + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // Set the userId as a query parameter on the request. + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .set("userId", userId) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf("Student submission: %s.\n", submission.getId()); + } + } + // [END classroom_list_student_submissions_code_snippet] + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s), courseWorkId (%s), or userId (%s) does " + "not exist.\n", + courseId, courseWorkId, userId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + } + + /** + * Lists all assigned grades for a particular coursework item. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void listAssignedGrades(String courseId, String courseWorkId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // [START classroom_list_assigned_grades_code_snippet] + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submissions found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf( + "User ID %s, Assigned grade: %s\n", + submission.getUserId(), submission.getAssignedGrade()); + } + } + // [END classroom_list_assigned_grades_code_snippet] + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + } +} +// [END classroom_list_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java new file mode 100644 index 00000000..105c9b41 --- /dev/null +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -0,0 +1,111 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_submissions_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** + * Retrieves submissions for all students for the specified course work in a course. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static List listSubmissions(String courseId, String courseWorkId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_submissions_code_snippet] + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf( + "Student id (%s), student submission id (%s)\n", + submission.getUserId(), submission.getId()); + } + } + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + + // [END classroom_list_submissions_code_snippet] + + } +} +// [END classroom_list_submissions_class] diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java new file mode 100644 index 00000000..ea35cf90 --- /dev/null +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -0,0 +1,108 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_topic_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListTopicResponse; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate how to list topics in a course. */ +public class ListTopics { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + + /** + * List topics in a course. + * + * @param courseId - the id of the course to retrieve topics for. + * @return - the list of topics in the course that the caller is permitted to view. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static List listTopics(String courseId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_topic_code_snippet] + + List topics = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListTopicResponse response = + service + .courses() + .topics() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getTopic() != null) { + topics.addAll(response.getTopic()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (topics.isEmpty()) { + System.out.println("No topics found."); + } else { + for (Topic topic : topics) { + System.out.printf("%s (%s)\n", topic.getName(), topic.getTopicId()); + } + } + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topics; + + // [END classroom_list_topic_code_snippet] + + } +} +// [END classroom_list_topic_class] diff --git a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java new file mode 100644 index 00000000..d047ac2b --- /dev/null +++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java @@ -0,0 +1,107 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_modify_attachments_student_submissions_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Attachment; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.ModifyAttachmentsRequest; +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom ModifyAttachments StudentSubmissions API. */ +public class ModifyAttachmentsStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + + /** + * Modify attachments on a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the modified student submission. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, String id) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_modify_attachments_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Create ModifyAttachmentRequest object that includes a new attachment with a link. + Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number"); + Attachment attachment = new Attachment().setLink(link); + ModifyAttachmentsRequest modifyAttachmentsRequest = + new ModifyAttachmentsRequest().setAddAttachments(Arrays.asList(attachment)); + + // The modified studentSubmission object is returned with the new attachment added to it. + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .modifyAttachments(courseId, courseWorkId, id, modifyAttachmentsRequest) + .execute(); + + /* Prints the modified student submission. */ + System.out.printf( + "Modified student submission attachments: '%s'.\n", + studentSubmission.getAssignmentSubmission().getAttachments()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_modify_attachments_student_submissions_code_snippet] + + } +} +// [END classroom_modify_attachments_student_submissions_class] diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java new file mode 100644 index 00000000..05bc71ac --- /dev/null +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_patch_course] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Patch Course API */ +public class PatchCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + + /** + * Updates one or more fields in a course. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Course patchCourse(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + course = new Course().setSection("Period 3").setRoom("302"); + course = service.courses().patch(courseId, course).setUpdateMask("section,room").execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_patch_course] diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java new file mode 100644 index 00000000..33ed5165 --- /dev/null +++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java @@ -0,0 +1,110 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_patch_student_submissions_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Patch StudentSubmissions API. */ +public class PatchStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** + * Updates the draft grade and/or assigned grade of a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the updated student submission. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static StudentSubmission patchStudentSubmission( + String courseId, String courseWorkId, String id) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_patch_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Updating the draftGrade and assignedGrade fields for the specific student submission. + StudentSubmission content = + service + .courses() + .courseWork() + .studentSubmissions() + .get(courseId, courseWorkId, id) + .execute(); + content.setAssignedGrade(90.00); + content.setDraftGrade(80.00); + + // The updated studentSubmission object is returned with the new draftGrade and assignedGrade. + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .patch(courseId, courseWorkId, id, content) + .set("updateMask", "draftGrade,assignedGrade") + .execute(); + + /* Prints the updated student submission. */ + System.out.printf( + "Updated student submission draft grade (%s) and assigned grade (%s).\n", + studentSubmission.getDraftGrade(), studentSubmission.getAssignedGrade()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_patch_student_submissions_code_snippet] + + } +} +// [END classroom_patch_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java new file mode 100644 index 00000000..61c891a0 --- /dev/null +++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.java @@ -0,0 +1,87 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_return_student_submissions_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Return StudentSubmissions API. */ +public class ReturnStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** + * Return a student submission back to the student which updates the submission state to + * `RETURNED`. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void returnSubmission(String courseId, String courseWorkId, String id) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_return_student_submissions_code_snippet] + + try { + service + .courses() + .courseWork() + .studentSubmissions() + .classroomReturn(courseId, courseWorkId, id, null) + .execute(); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + + // [END classroom_return_student_submissions_code_snippet] + + } +} +// [END classroom_return_student_submissions_class] diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java new file mode 100644 index 00000000..fdfd6062 --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_update_course] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Update Course API */ +public class UpdateCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** + * Updates a course's metadata. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Course updateCourse(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Updating the section and room in a course + course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + // Prints the updated course + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_update_course] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java new file mode 100644 index 00000000..e45c3cc8 --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_update_topic_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate how to update one or more fields in a topic. */ +public class UpdateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + + /** + * Update one or more fields in a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to update. + * @return - updated topic. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Topic updateTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_update_topic_code_snippet] + + Topic topic = null; + try { + // Retrieve the topic to update. + Topic topicToUpdate = service.courses().topics().get(courseId, topicId).execute(); + + // Update the name field for the topic retrieved. + topicToUpdate.setName("Semester 2"); + + /* Call the patch endpoint and set the updateMask query parameter to the field that needs to + be updated. */ + topic = + service + .courses() + .topics() + .patch(courseId, topicId, topicToUpdate) + .set("updateMask", "name") + .execute(); + + /* Prints the updated topic. */ + System.out.printf("Topic '%s' updated.\n", topic.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_update_topic_code_snippet] + + } +} +// [END classroom_update_topic_class] diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..1b2eb04d --- /dev/null +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -0,0 +1,83 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.UUID; +import org.junit.After; + +// Base class for integration tests. +public class BaseTest { + protected Classroom service; + protected Course testCourse; + + /** + * Creates a default authorization Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException - if credentials file not found. + */ + protected Classroom buildService(ArrayList SCOPES) + throws GeneralSecurityException, IOException { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + SCOPES.add(ClassroomScopes.CLASSROOM_COURSES); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + return service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + } + + public void setup(ArrayList scopes) throws GeneralSecurityException, IOException { + this.service = buildService(scopes); + this.testCourse = CreateCourse.createCourse(); + createAlias(this.testCourse.getId()); + } + + @After + public void tearDown() throws IOException { + if (this.testCourse != null) { + deleteCourse(this.testCourse.getId()); + } + this.testCourse = null; + } + + public void createAlias(String courseId) throws IOException { + String alias = "p:" + UUID.randomUUID(); + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + this.service.courses().aliases().create(courseId, courseAlias).execute(); + } + + public void deleteCourse(String courseId) throws IOException { + // updating the course state to be archived so the course can be deleted. + Course course = service.courses().get(courseId).execute(); + course.setCourseState("ARCHIVED"); + this.service.courses().update(courseId, course).execute(); + this.service.courses().delete(courseId).execute(); + } +} diff --git a/classroom/snippets/src/test/java/TestAcceptInvitation.java b/classroom/snippets/src/test/java/TestAcceptInvitation.java new file mode 100644 index 00000000..98a6fec3 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAcceptInvitation.java @@ -0,0 +1,39 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestAcceptInvitation { + + private String invitationId = "insert_invitation_id"; + + @Test + public void testAcceptInvitation() throws GeneralSecurityException, IOException { + AcceptInvitation.acceptInvitation(invitationId); + /* Once an invitation is accepted, it is removed and the user is added to the course as a + teacher or a student. */ + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitationId)); + } + + @Test + public void testAcceptInvitationWithInvalidId() { + Assert.assertThrows( + GoogleJsonResponseException.class, () -> AcceptInvitation.acceptInvitation("invalid-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestAddAliasToCourse.java b/classroom/snippets/src/test/java/TestAddAliasToCourse.java new file mode 100644 index 00000000..4eb659eb --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Add Alias classroom snippet +public class TestAddAliasToCourse extends BaseTest { + + @Test + public void testAddCourseAlias() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddAliasToCourse.SCOPES); + CourseAlias courseAlias = AddAliasToCourse.addAliasToCourse(testCourse.getId()); + List courseAliases = + service.courses().aliases().list(testCourse.getId()).execute().getAliases(); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java new file mode 100644 index 00000000..2b185c9a --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Student; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Add Student classroom snippet +public class TestAddStudent extends BaseTest { + + private String studentId = "insert_student_id"; + + @Test + public void testAddStudent() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddStudent.SCOPES); + Student student = + AddStudent.addStudent(testCourse.getId(), testCourse.getEnrollmentCode(), this.studentId); + Assert.assertNotNull("Student not returned.", student); + Assert.assertNotNull("Course not returned.", student.getCourseId()); + Assert.assertEquals( + "Student added to wrong course.", testCourse.getId(), student.getCourseId()); + } +} diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java new file mode 100644 index 00000000..58eaae57 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Teacher; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Add Teacher classroom snippet +public class TestAddTeacher extends BaseTest { + + private String teacherEmail = "insert_teacher_email"; + + @Test + public void testAddTeacher() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddTeacher.SCOPES); + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.teacherEmail); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals( + "Teacher added to wrong course.", testCourse.getId(), teacher.getCourseId()); + } +} diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java new file mode 100644 index 00000000..1f66874a --- /dev/null +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +// Unit test class for Batch Add Students classroom snippet +public class TestBatchAddStudents extends BaseTest { + + @Test + public void testBatchAddStudents() throws GeneralSecurityException, IOException { + setup(BatchAddStudents.SCOPES); + List studentEmails = Arrays.asList("insert_student_1_email", "insert_student_2_email"); + BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); + } +} diff --git a/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java new file mode 100644 index 00000000..d5ad35b4 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java @@ -0,0 +1,37 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Cancel Guardian Invitation classroom snippet +public class TestCancelGuardianInvitation { + + @Test + public void testCancelGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + + GuardianInvitation invitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + GuardianInvitation guardianInvitation = + CancelGuardianInvitation.cancelGuardianInvitation(studentId, invitation.getInvitationId()); + + Assert.assertTrue("Guardian invitation not canceled.", guardianInvitation != null); + Assert.assertTrue( + "Guardian invitation state not updated.", guardianInvitation.getState().equals("COMPLETE")); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java new file mode 100644 index 00000000..a251f15c --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Course classroom snippet +public class TestCreateCourse extends BaseTest { + + @Test + public void testCreateCourse() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourse.SCOPES); + Course course = CreateCourse.createCourse(); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java new file mode 100644 index 00000000..2d906fbf --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Alias classroom snippet +public class TestCreateCourseWithAlias extends BaseTest { + + @Test + public void testCreateCourseWithAlias() throws GeneralSecurityException, IOException { + setup(CreateCourseWithAlias.SCOPES); + Course course = CreateCourseWithAlias.createCourseWithAlias(); + List courseAliases = + service.courses().aliases().list(course.getId()).execute().getAliases(); + Assert.assertNotNull("Course not returned.", course); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + deleteCourse(course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java new file mode 100644 index 00000000..5a160af0 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWork.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseWork; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Coursework classroom snippet +public class TestCreateCourseWork extends BaseTest { + + @Test + public void testCreateCoursework() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourseWork.SCOPES); + CourseWork courseWork = CreateCourseWork.createCourseWork(testCourse.getId()); + Assert.assertNotNull("Coursework not returned.", courseWork); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java new file mode 100644 index 00000000..bc98e2b9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Guardian Invitation classroom snippet +public class TestCreateGuardianInvitation { + + @Test + public void testCreateGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + GuardianInvitation guardianInvitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + Assert.assertTrue("Guardian invitation not created.", guardianInvitation != null); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateInvitation.java b/classroom/snippets/src/test/java/TestCreateInvitation.java new file mode 100644 index 00000000..13095342 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateInvitation.java @@ -0,0 +1,43 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestCreateInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testCreateInvitation() throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + Assert.assertNotNull("Invitation not created", invitation); + Assert.assertEquals(invitation.getCourseId(), testCourse.getId()); + Assert.assertEquals(invitation.getUserId(), userId); + } + + @Test + public void testCreateInvitationWithInvalidCourseId() + throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> CreateInvitation.createInvitation("invalid-course-id", userId)); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateTopic.java b/classroom/snippets/src/test/java/TestCreateTopic.java new file mode 100644 index 00000000..381921d9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateTopic.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Topic classroom snippet +public class TestCreateTopic extends BaseTest { + + @Test + public void testCreateTopic() throws GeneralSecurityException, IOException { + setup(CreateTopic.SCOPES); + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Assert.assertNotNull("Topic not returned.", topic); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteGuardian.java b/classroom/snippets/src/test/java/TestDeleteGuardian.java new file mode 100644 index 00000000..fc70bd08 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteGuardian.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Delete Guardian classroom snippet +public class TestDeleteGuardian { + + @Test + public void testDeleteGuardian() throws Exception { + String studentId = "insert_student_id"; + String guardianId = "insert_guardian_id"; + DeleteGuardian.deleteGuardian(studentId, guardianId); + + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetGuardian.getGuardian(studentId, guardianId)); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteInvitation.java b/classroom/snippets/src/test/java/TestDeleteInvitation.java new file mode 100644 index 00000000..84448189 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteInvitation.java @@ -0,0 +1,42 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testDeleteInvitation() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + DeleteInvitation.deleteInvitation(invitation.getId()); + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitation.getId())); + } + + @Test + public void testDeleteInvitationWithInvalidId() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> DeleteInvitation.deleteInvitation("invalid-invitation-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteTopic.java b/classroom/snippets/src/test/java/TestDeleteTopic.java new file mode 100644 index 00000000..bffff20d --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteTopic.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteTopic extends BaseTest { + + @Test + public void testDeleteTopic() throws GeneralSecurityException, IOException { + setup(DeleteTopic.SCOPES); + Topic topic = CreateTopic.createTopic(testCourse.getId()); + DeleteTopic.deleteTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> GetTopic.getTopic(testCourse.getId(), topic.getTopicId())); + } +} diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java new file mode 100644 index 00000000..ac95bda5 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Get Course classroom snippet +public class TestGetCourse extends BaseTest { + + @Test + public void testGetCourse() throws GeneralSecurityException, IOException { + setup(GetCourse.SCOPES); + Course course = GetCourse.getCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java new file mode 100644 index 00000000..39775ff2 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetTopic.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Get Topic classroom snippet +public class TestGetTopic extends BaseTest { + + @Test + public void testGetTopic() throws GeneralSecurityException, IOException { + setup(GetTopic.SCOPES); + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Topic getTopic = GetTopic.getTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotNull("Topic could not be created.", topic); + Assert.assertNotNull("Topic could not be retrieved.", getTopic); + Assert.assertEquals("Wrong topic was retrieved.", topic, getTopic); + } +} diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java new file mode 100644 index 00000000..d3e357b5 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Course Aliases classroom snippet +public class TestListCourseAliases extends BaseTest { + + @Test + public void testListCourseAliases() throws GeneralSecurityException, IOException { + setup(ListCourseAliases.SCOPES); + List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } +} diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java new file mode 100644 index 00000000..7a4dd553 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Course classroom snippet +public class TestListCourses { + + @Test + public void testListCourses() throws GeneralSecurityException, IOException { + List courses = ListCourses.listCourses(); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..0ee3390f --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardian Invitations classroom snippet +public class TestListGuardianInvitationsByStudent { + + @Test + public void testListGuardianInvitationsByStudent() throws Exception { + String studentId = "insert_student_id"; + List invitationList = + ListGuardianInvitationsByStudent.listGuardianInvitationsByStudent(studentId); + + Assert.assertTrue("No guardian invitations returned.", invitationList.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardians.java b/classroom/snippets/src/test/java/TestListGuardians.java new file mode 100644 index 00000000..b1b5eb03 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardians.java @@ -0,0 +1,30 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Guardian; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardians classroom snippet +public class TestListGuardians { + + @Test + public void testListGuardians() throws Exception { + String studentId = "insert_student_id"; + List guardianList = ListGuardians.listGuardians(studentId); + + Assert.assertTrue("No guardians returned.", guardianList.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java new file mode 100644 index 00000000..1649e926 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListSubmissions.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for ListSubmissions classroom snippet +public class TestListSubmissions extends BaseTest { + + @Test + public void testListSubmissions() throws GeneralSecurityException, IOException { + setup(ListSubmissions.SCOPES); + List submissions = ListSubmissions.listSubmissions(testCourse.getId(), "-"); + Assert.assertNotNull("No submissions returned.", submissions); + } +} diff --git a/classroom/snippets/src/test/java/TestListTopics.java b/classroom/snippets/src/test/java/TestListTopics.java new file mode 100644 index 00000000..f0b0bc85 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListTopics.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Topics classroom snippet +public class TestListTopics extends BaseTest { + + @Test + public void testListTopics() throws GeneralSecurityException, IOException { + setup(ListTopics.SCOPES); + CreateTopic.createTopic(testCourse.getId()); + List listTopics = ListTopics.listTopics(testCourse.getId()); + Assert.assertNotNull("Topics could not be retrieved.", listTopics); + Assert.assertFalse("No topics were retrieved.", listTopics.size() == 0); + } +} diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java new file mode 100644 index 00000000..a7d0d92f --- /dev/null +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Patch Course classroom snippet +public class TestPatchCourse extends BaseTest { + + @Test + public void testPatchCourse() throws GeneralSecurityException, IOException { + setup(PatchCourse.SCOPES); + Course course = PatchCourse.patchCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java new file mode 100644 index 00000000..3c7cbda2 --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Update Course classroom snippet +public class TestUpdateCourse extends BaseTest { + + @Test + public void testUpdateCourse() throws GeneralSecurityException, IOException { + setup(UpdateCourse.SCOPES); + Course course = UpdateCourse.updateCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java new file mode 100644 index 00000000..3144ff2d --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateTopic.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Update Topic classroom snippet +public class TestUpdateTopic extends BaseTest { + + @Test + public void testUpdateTopic() throws GeneralSecurityException, IOException { + setup(UpdateTopic.SCOPES); + Topic topic = CreateTopic.createTopic(testCourse.getId()); + System.out.println("New topic created: " + topic.getName()); + Topic updatedTopic = UpdateTopic.updateTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotEquals("Topic name was not updated.", topic.getName(), updatedTopic.getName()); + } +} diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 401c8edd..0e76e226 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'OutputJSON' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,8 +11,8 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' - compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' } diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java index d64769ad..e7ad0715 100644 --- a/docs/outputJSON/src/main/java/OutputJSON.java +++ b/docs/outputJSON/src/main/java/OutputJSON.java @@ -20,7 +20,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.docs.v1.Docs; import com.google.api.services.docs.v1.DocsScopes; @@ -35,59 +35,60 @@ import java.util.List; // [START docs_output_json] + /** * OutputJSON prints the JSON representation of a Google Doc. */ public class OutputJSON { - private static final String APPLICATION_NAME = "Google Docs API Document Contents"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; + private static final String APPLICATION_NAME = "Google Docs API Document Contents"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; - /** - * Global instance of the scopes required by this sample. If modifying these scopes, delete - * your previously saved tokens/ folder. - */ - private static final List SCOPES = - Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + /** + * Global instance of the scopes required by this sample. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) - throws IOException { - // Load client secrets. - InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - GoogleClientSecrets credentials = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + GoogleClientSecrets credentials = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs docsService = - new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs docsService = + new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - Document response = docsService.documents().get(DOCUMENT_ID).execute(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - System.out.println(gson.toJson(response)); - } + Document response = docsService.documents().get(DOCUMENT_ID).execute(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(response)); + } } // [END docs_output_json] diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index cded13f2..9f6c9fd7 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DocsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.1' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' - compile 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' } diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index cfc3900b..531e044b 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START docs_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,7 +22,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.docs.v1.Docs; import com.google.api.services.docs.v1.DocsScopes; @@ -35,56 +36,72 @@ import java.util.Collections; import java.util.List; +/* class to demonstrate use of Docs get documents API */ public class DocsQuickstart { - private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - // Prints the title of the requested doc: - // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit - Document response = service.documents().get(DOCUMENT_ID).execute(); - String title = response.getTitle(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - System.out.printf("The title of the doc is: %s\n", title); - } + // Prints the title of the requested doc: + // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit + Document response = service.documents().get(DOCUMENT_ID).execute(); + String title = response.getTitle(); + + System.out.printf("The title of the doc is: %s\n", title); + } } // [END docs_quickstart] diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 1c756882..86df8be7 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.27.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - compile 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20220926-2.0.0' } diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 30f9d1cb..6e2c9b16 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_activity_v2_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,7 +22,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.driveactivity.v2.DriveActivityScopes; import com.google.api.services.driveactivity.v2.model.*; @@ -36,181 +37,205 @@ import java.util.stream.Collectors; public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** - * Global instance of the scopes required by this quickstart. - * - *

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

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

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

If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } - - /** - * Build and return an authorized Apps Activity client service. - * @return an authorized Appsactivity client service - * @throws IOException - */ - public static Appsactivity getAppsactivityService() throws IOException { - Credential credential = authorize(); - return new Appsactivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } - - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Appsactivity service = getAppsactivityService(); - - // Print the recent activity in your Google Drive. - ListActivitiesResponse result = service.activities().list() - .setSource("drive.google.com") - .setDriveAncestorId("root") - .setPageSize(10) - .execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (Activity activity : activities) { - Event event = activity.getCombinedEvent(); - User user = event.getUser(); - Target target = event.getTarget(); - if (user == null || target == null ) { - continue; - } - String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") - .format(new java.util.Date(event.getEventTimeMillis().longValue())); - System.out.printf("%s: %s, %s, %s (%s)\n", - date, - user.getName(), - event.getPrimaryEventType(), - target.getName(), - target.getMimeType()); - } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + //returns an authorized Credential object. + return credential; + } + + /** + * Build and return an authorized Apps Activity client service. + * + * @return an authorized Appsactivity client service + * @throws IOException + */ + public static Appsactivity getAppsactivityService() throws IOException { + Credential credential = authorize(); + Appsactivity service = new Appsactivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + return service; + } + + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Appsactivity service = getAppsactivityService(); + + // Print the recent activity in your Google Drive. + ListActivitiesResponse result = service.activities().list() + .setSource("drive.google.com") + .setDriveAncestorId("root") + .setPageSize(10) + .execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (Activity activity : activities) { + Event event = activity.getCombinedEvent(); + User user = event.getUser(); + Target target = event.getTarget(); + if (user == null || target == null) { + continue; } + String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") + .format(new java.util.Date(event.getEventTimeMillis().longValue())); + System.out.printf("%s: %s, %s, %s (%s)\n", + date, + user.getName(), + event.getPrimaryEventType(), + target.getName(), + target.getMimeType()); + } } + } } // [END drive_activity_quickstart] diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 1a6964bc..bcc8c21a 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' } diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 33b6ae9e..62db72b8 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,13 +22,12 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -36,63 +36,79 @@ import java.util.Collections; import java.util.List; +/* class to demonstrate use of Drive files list API */ public class DriveQuickstart { - private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the names and IDs for up to 10 files. - FileList result = service.files().list() - .setPageSize(10) - .setFields("nextPageToken, files(id, name)") - .execute(); - List files = result.getFiles(); - if (files == null || files.isEmpty()) { - System.out.println("No files found."); - } else { - System.out.println("Files:"); - for (File file : files) { - System.out.printf("%s (%s)\n", file.getName(), file.getId()); - } - } + // Print the names and IDs for up to 10 files. + FileList result = service.files().list() + .setPageSize(10) + .setFields("nextPageToken, files(id, name)") + .execute(); + List files = result.getFiles(); + if (files == null || files.isEmpty()) { + System.out.println("No files found."); + } else { + System.out.println("Files:"); + for (File file : files) { + System.out.printf("%s (%s)\n", file.getName(), file.getId()); + } } + } } // [END drive_quickstart] diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle new file mode 100644 index 00000000..df0967a5 --- /dev/null +++ b/drive/snippets/drive_v2/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.apis:google-api-services-drive:v2-rev20220815-2.0.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.code.gson:gson:2.9.1' + testImplementation 'junit:junit:4.13.2' +} + +test { + testLogging.showStandardStreams = true +} diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json new file mode 100644 index 00000000..b42f309e --- /dev/null +++ b/drive/snippets/drive_v2/files/config.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} \ No newline at end of file diff --git a/drive/snippets/drive_v2/files/document.txt b/drive/snippets/drive_v2/files/document.txt new file mode 100644 index 00000000..e69de29b diff --git a/drive/snippets/drive_v2/files/photo.jpg b/drive/snippets/drive_v2/files/photo.jpg new file mode 100644 index 00000000..98b05d35 Binary files /dev/null and b/drive/snippets/drive_v2/files/photo.jpg differ diff --git a/drive/snippets/drive_v2/files/report.csv b/drive/snippets/drive_v2/files/report.csv new file mode 100644 index 00000000..801005b7 --- /dev/null +++ b/drive/snippets/drive_v2/files/report.csv @@ -0,0 +1,3 @@ +"Name", "Phone Number" +"Bob", "123-4567" +"Mary", "234-5678" \ No newline at end of file diff --git a/drive/snippets/drive_v2/settings.gradle b/drive/snippets/drive_v2/settings.gradle new file mode 100644 index 00000000..f91561c8 --- /dev/null +++ b/drive/snippets/drive_v2/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'drive_v2' + diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java new file mode 100644 index 00000000..31265b2e --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().insert(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java new file mode 100644 index 00000000..ed909ecf --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -0,0 +1,69 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_folder] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_create_folder] diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..0e4b817c --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -0,0 +1,69 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java new file mode 100644 index 00000000..dff70011 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -0,0 +1,69 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_team_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.TeamDrive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create team drive. */ +public class CreateTeamDrive { + + /** + * Create a drive for team. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createTeamDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + return teamDrive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_team_drive] + diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java new file mode 100644 index 00000000..2098d1a9 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -0,0 +1,70 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java new file mode 100644 index 00000000..789e232a --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -0,0 +1,69 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..16c27b6f --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java new file mode 100644 index 00000000..d2154eaa --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list().setPageToken(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getItems()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..a3445c7a --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java new file mode 100644 index 00000000..1628c42b --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ +public class ListAppData { + + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..15dcf2b9 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -0,0 +1,88 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + List parentIds = file.getParents() + .stream() + .map(ParentReference::getId) + .collect(Collectors.toList()); + String previousParents = String.join(",", parentIds); + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents) + .setFields("id, parents") + .execute(); + + List parents = new ArrayList<>(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..d00de913 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -0,0 +1,107 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_drives] + + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + + newOrganizerPermission.setValue(realUser); + + + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + drives.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java new file mode 100644 index 00000000..84705826 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -0,0 +1,110 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_team_drives] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's recover all team drives without an organizer. */ +public class RecoverTeamDrive { + + /** + * Finds all Team Drives without an organizer and add one. + * + * @param realUser User ID for the new organizer. + * @return All team drives without an organizer. + * @throws IOException if service account credentials file not found. + */ + public static List recoverTeamDrives(String realUser) throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List teamDrives = new ArrayList(); + + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + + newOrganizerPermission.setValue(realUser); + try { + do { + TeamDriveList result = service.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + } + + teamDrives.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return teamDrives; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to recover team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_recover_team_drives] + diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java new file mode 100644 index 00000000..f6543292 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -0,0 +1,79 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + files.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java new file mode 100644 index 00000000..ecbd3bf1 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -0,0 +1,117 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setValue(realUser); + try { + service.permissions().insert(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setValue(realDomain); + + service.permissions().insert(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java new file mode 100644 index 00000000..6875d862 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -0,0 +1,78 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + return file.getModifiedDate().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java new file mode 100644 index 00000000..2bd4f557 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -0,0 +1,84 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** + * Class to demonstrate use-case of create file in the application data folder. + */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java new file mode 100644 index 00000000..374f240b --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -0,0 +1,72 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_basic] + +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_upload_basic] diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java new file mode 100644 index 00000000..460abe3b --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -0,0 +1,73 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..fead5537 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(realFolderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..da62bf44 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java new file mode 100644 index 00000000..1bf73c68 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -0,0 +1,147 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); + } + + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..9bd04c2c --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..1c4cffb7 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -0,0 +1,29 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateFolder { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..ab3e0f2f --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java new file mode 100644 index 00000000..daccae50 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateTeamDrive extends BaseTest { + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = CreateTeamDrive.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..526dea94 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..16ede7b4 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java new file mode 100644 index 00000000..8a2ed14b --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +// Unit test class for testing of FetchAppDataFolder snippet +public class TestFetchAppdataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..353d1186 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -0,0 +1,32 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..ec781a28 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,28 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java new file mode 100644 index 00000000..a6baf68c --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.FileList; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +// Unit test class for testing of ListAppData snippet +public class TestListAppdata extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getItems().size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..7e914647 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,37 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Test; + +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } + +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..731f3f18 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java new file mode 100644 index 00000000..c9b9a07f --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import com.google.api.services.drive.model.TeamDrive; +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +public class TestRecoverTeamDrives extends BaseTest { + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = RecoverTeamDrive.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = CreateTeamDrive.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..280c6b9c --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.File; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Test; + +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java new file mode 100644 index 00000000..167a7ec7 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -0,0 +1,32 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..9d7d80b8 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..c9c13961 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +// Unit test class for testing of UploadAppData snippet +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..f083eb65 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadBasic { + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..ea7e7eea --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..fcec0691 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; + +import com.google.api.services.drive.model.File; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..11b5f2f9 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/.gitignore b/drive/snippets/drive_v3/.gitignore new file mode 100644 index 00000000..1b6985c0 --- /dev/null +++ b/drive/snippets/drive_v3/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle new file mode 100644 index 00000000..9f0dc9f7 --- /dev/null +++ b/drive/snippets/drive_v3/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'java' +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenCentral() +} +dependencies { + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.code.gson:gson:2.9.1' + testImplementation 'junit:junit:4.13.2' +} + +test { + testLogging.showStandardStreams = true +} diff --git a/drive/snippets/drive_v3/settings.gradle b/drive/snippets/drive_v3/settings.gradle new file mode 100644 index 00000000..d8be1d67 --- /dev/null +++ b/drive/snippets/drive_v3/settings.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.3/userguide/multi_project_builds.html + */ + +rootProject.name = 'drive_v3' +include('plugin') diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java new file mode 100644 index 00000000..ceb53f9b --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java new file mode 100644 index 00000000..e907cb7d --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_folder] diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..12acc6e7 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -0,0 +1,69 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java new file mode 100644 index 00000000..2098d1a9 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -0,0 +1,70 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java new file mode 100644 index 00000000..789e232a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -0,0 +1,69 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..d80db884 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java new file mode 100644 index 00000000..49a2319e --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..a3445c7a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java new file mode 100644 index 00000000..96192020 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ +public class ListAppData { + + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..bba31a82 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + + return file.getParents(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..87fd32a8 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -0,0 +1,107 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_drives] + + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer"); + + newOrganizerPermission.setEmailAddress(realUser); + + + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + + drives.addAll(result.getDrives()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java new file mode 100644 index 00000000..2e5e7f01 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -0,0 +1,79 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, files(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + files.addAll(result.getFiles()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java new file mode 100644 index 00000000..438440df --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -0,0 +1,117 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setEmailAddress(realUser); + try { + service.permissions().create(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setDomain(realDomain); + + service.permissions().create(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java new file mode 100644 index 00000000..138a7e18 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + return file.getModifiedTime().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java new file mode 100644 index 00000000..4ed8e934 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** + * Class to demonstrate use-case of create file in the application data folder. + */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java new file mode 100644 index 00000000..a39a696c --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_basic] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_basic] diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java new file mode 100644 index 00000000..7ed2acac --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -0,0 +1,73 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload new file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..b6bd86ad --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(realFolderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..114e1b94 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java new file mode 100644 index 00000000..7e4252fb --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -0,0 +1,147 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); + } + + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..37e3b23f --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +// Unit test class for create-drive Drive snippet +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..d8492a08 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateFolder extends BaseTest { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..ab3e0f2f --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..526dea94 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..16ede7b4 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java new file mode 100644 index 00000000..791e0480 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -0,0 +1,29 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestFetchAppDataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..aed15304 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +// Unit test class for fetchChanges change snippet +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..1d334a1e --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,27 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +// Unit test class for fetchStartPageToken change snippet +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java new file mode 100644 index 00000000..c747f7ee --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -0,0 +1,32 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.FileList; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestListAppData extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..2c5aa74c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,36 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Test; + +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..28e92433 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java @@ -0,0 +1,47 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +// Unit test class for recover-drives Drive snippet +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..280c6b9c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotEquals; + +import com.google.api.services.drive.model.File; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; +import org.junit.Test; + +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java new file mode 100644 index 00000000..167a7ec7 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -0,0 +1,32 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..9d7d80b8 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..69608a87 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..fa53f4ff --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadBasic extends BaseTest { + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..ea7e7eea --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..feee6a6a --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; + +import com.google.api.services.drive.model.File; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..11b5f2f9 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Test; + +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index e073c032..ca113827 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'GmailQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' } diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 4aee4cfc..56ebd1dd 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START gmail_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,13 +22,12 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; import com.google.api.services.gmail.model.Label; import com.google.api.services.gmail.model.ListLabelsResponse; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -36,61 +36,76 @@ import java.util.Collections; import java.util.List; +/* class to demonstrate use of Gmail list labels API */ public class GmailQuickstart { - private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the labels in the user's account. - String user = "me"; - ListLabelsResponse listResponse = service.users().labels().list(user).execute(); - List

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + if (smimeInfo != null) { + InsertSmimeInfo.insertSmimeInfo(userId, + userId, + smimeInfo); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); + } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_insert_cert_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java new file mode 100644 index 00000000..25af7f83 --- /dev/null +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_insert_smime_info] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; + +/* Class to demonstrate the use of Gmail Insert Smime Certificate API*/ +public class InsertSmimeInfo { + /** + * Upload an S/MIME certificate for the user. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static SmimeInfo insertSmimeInfo(String userId, + String sendAsEmail, + SmimeInfo smimeInfo) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + try { + SmimeInfo results = service.users().settings().sendAs().smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); + } + return null; + } +} +// [END gmail_insert_smime_info] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java new file mode 100644 index 00000000..de989866 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_send_message] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Properties; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import org.apache.commons.codec.binary.Base64; + +/* Class to demonstrate the use of Gmail Send Message API */ +public class SendMessage { + /** + * Send an email from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmail(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } + } + return null; + } +} +// [END gmail_send_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java new file mode 100644 index 00000000..2a9903f0 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -0,0 +1,124 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_send_message_with_attachment] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Properties; +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import org.apache.commons.codec.binary.Base64; + +/* Class to demonstrate the use of Gmail Send Message with attachment API */ +public class SendMessageWithAttachment { + /** + * Send an email with attachment from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmailWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } + } + return null; + } +} +// [END gmail_send_message_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java new file mode 100644 index 00000000..3f5bf92e --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_update_signature] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.ListSendAsResponse; +import com.google.api.services.gmail.model.SendAs; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; + +/* Class to demonstrate the use of Gmail Update Signature API */ +public class UpdateSignature { + /** + * Update the gmail signature. + * + * @return the updated signature id , {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static String updateGmailSignature() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try { + SendAs primaryAlias = null; + ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); + for (SendAs alias : aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; + } + } + // Updating a new signature + SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); + SendAs result = service.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + //Prints the updated signature + System.out.println("Updated signature - " + result.getSignature()); + return result.getSignature(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to update signature: " + e.getDetails()); + } else { + throw e; + } + } + return null; + } +} +// [END gmail_update_signature] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java new file mode 100644 index 00000000..0a92ce8a --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -0,0 +1,144 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_update_smime_certs] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/* Class to demonstrate the use of Gmail Update Smime Certificate API*/ +public class UpdateSmimeCerts { + /** + * Update S/MIME certificates for the user. + * + *

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

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = CSVParser.parse(csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + UpdateSmimeCerts.updateSmimeCerts(userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_update_smime_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..fbba7f1c --- /dev/null +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import org.junit.Before; + +public class BaseTest { + + public static final String TEST_USER = "ci-test01@workspacesamples.dev"; + public static final String RECIPIENT = "gduser1@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; + + protected Gmail service; + + /** + * Create a default authorization Gmail client service. + * + * @return an authorized Gmail client service + * @throws IOException - if credentials file not found. + */ + public Gmail buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the Gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail API Snippets") + .build(); + return service; + } + + @Before + public void setupService() throws IOException { + this.service = buildService(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java new file mode 100644 index 00000000..71e56eb9 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraft.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.Draft; +import java.io.IOException; +import javax.mail.MessagingException; +import org.junit.Test; + +// Unit testcase for gmail create draft snippet +public class TestCreateDraft extends BaseTest { + + @Test + public void testCreateDraft() throws MessagingException, IOException { + Draft draft = CreateDraft.createDraftMessage(RECIPIENT, TEST_USER); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java new file mode 100644 index 00000000..065c64c6 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.Draft; +import java.io.IOException; +import javax.mail.MessagingException; +import org.junit.Test; + +// Unit testcase for gmail create draft with attachment snippet +public class TestCreateDraftWithAttachment extends BaseTest { + + @Test + public void testCreateDraftWithAttachment() throws MessagingException, IOException { + Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, + TEST_USER, + new java.io.File("files/photo.jpg")); + assertNotNull(draft); + this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateEmail.java b/gmail/snippets/src/test/java/TestCreateEmail.java new file mode 100644 index 00000000..043397a0 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateEmail.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.junit.Test; + +// Unit testcase for gmail create email snippet +public class TestCreateEmail extends BaseTest { + + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java new file mode 100644 index 00000000..fbf72c2b --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -0,0 +1,61 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.Label; +import com.google.api.services.gmail.model.ListLabelsResponse; +import java.io.IOException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +// Unit testcase for gmail create filter snippet +public class TestCreateFilter extends BaseTest { + + private Label testLabel = null; + + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } + } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } + + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; + } + } + + @Test + public void testCreateNewFilter() throws IOException { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateMessage.java b/gmail/snippets/src/test/java/TestCreateMessage.java new file mode 100644 index 00000000..d31bd75e --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateMessage.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.junit.Test; + +// Unit testcase for gmail create message snippet +public class TestCreateMessage extends BaseTest { + + @Test + public void testCreateMessageWithEmail() throws MessagingException, + IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + + com.google.api.services.gmail.model.Message message = + CreateMessage.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } +} diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java new file mode 100644 index 00000000..dcf90890 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; + +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Test; + +// Unit testcase for gmail create smime info snippet +public class TestCreateSmimeInfo { + + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + null /* password */); + + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + "certpass"); + + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/notfound.p12", + null /* password */); + assertNull(smimeInfo); + } +} diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java new file mode 100644 index 00000000..829e4c6d --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.VacationSettings; +import java.io.IOException; +import org.junit.Test; + +// Unit testcase for gmail enable auto reply snippet +public class TestEnableAutoReply extends BaseTest { + + @Test + public void testAutoReply() throws IOException { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } +} \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java new file mode 100644 index 00000000..b7719fc3 --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -0,0 +1,44 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.AutoForwarding; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; + +// Unit testcase for gmail enable forwarding snippet +public class TestEnableForwarding extends BaseTest { + + @Test + public void TestEnableAutoForwarding() throws IOException { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + } + + @Before + public void cleanup() { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS) + .execute(); + } catch (Exception e) { + // Ignore -- resources might not exist + e.printStackTrace(); + } + } +} diff --git a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java new file mode 100644 index 00000000..2a1ccc60 --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java @@ -0,0 +1,111 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +// Unit testcase for gmail insert cert from csv snippet +public class TestInsertCertFromCsv extends BaseTest { + + public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; + public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); + verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java new file mode 100644 index 00000000..360174e7 --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java @@ -0,0 +1,126 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +// Unit testcase for gmail insert smime info snippet +public class TestInsertSmimeInfo extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, + smimeInfo); + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessage.java b/gmail/snippets/src/test/java/TestSendMessage.java new file mode 100644 index 00000000..e915a244 --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessage.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.Message; +import java.io.IOException; +import javax.mail.MessagingException; +import org.junit.Test; + +// Unit testcase for gmail send email snippet +public class TestSendMessage extends BaseTest { + + @Test + public void testSendEmail() throws MessagingException, IOException { + Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java new file mode 100644 index 00000000..8c428982 --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.gmail.model.Message; +import java.io.File; +import java.io.IOException; +import javax.mail.MessagingException; +import org.junit.Test; + +// Unit testcase for gmail send email with attachment snippet +public class TestSendMessageWithAttachment extends BaseTest { + + @Test + public void testSendEmailWithAttachment() throws MessagingException, + IOException { + Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, + TEST_USER, + new File("files/photo.jpg")); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java new file mode 100644 index 00000000..809da2a8 --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import org.junit.Test; + +// Unit testcase for gmail update signature snippet +public class TestUpdateSignature extends BaseTest { + + @Test + public void testUpdateGmailSignature() throws IOException { + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } +} \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java new file mode 100644 index 00000000..0808062b --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java @@ -0,0 +1,279 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +// Unit testcase for gmail update smime certs snippet +public class TestUpdateSmimeCerts extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java new file mode 100644 index 00000000..6b89e455 --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java @@ -0,0 +1,148 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +// Unit testcase for gmail update smime from csv snippet +public class TestUpdateSmimeFromCsv extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(6); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo) + .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList, times(2)).execute(); + verify(mockInsert, times(2)).execute(); + verify(mockSetDefault, times(2)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList<>(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/meet/README.md b/meet/README.md new file mode 100644 index 00000000..edc158da --- /dev/null +++ b/meet/README.md @@ -0,0 +1 @@ +Additional samples can be found at https://github.com/googleapis/google-cloud-java/tree/main/java-meet/google-cloud-meet \ No newline at end of file diff --git a/meet/quickstart/build.gradle b/meet/quickstart/build.gradle new file mode 100644 index 00000000..fbb8bc29 --- /dev/null +++ b/meet/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'MeetQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.cloud:google-cloud-meet:0.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.19.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/meet/quickstart/settings.gradle b/meet/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/meet/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/meet/quickstart/src/main/java/MeetQuickstart.java b/meet/quickstart/src/main/java/MeetQuickstart.java new file mode 100644 index 00000000..cd8aec6b --- /dev/null +++ b/meet/quickstart/src/main/java/MeetQuickstart.java @@ -0,0 +1,174 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START meet_quickstart] + +import java.awt.Desktop; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; + +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.apps.meet.v2.CreateSpaceRequest; +import com.google.apps.meet.v2.Space; +import com.google.apps.meet.v2.SpacesServiceClient; +import com.google.apps.meet.v2.SpacesServiceSettings; +import com.google.auth.Credentials; +import com.google.auth.oauth2.ClientId; +import com.google.auth.oauth2.DefaultPKCEProvider; +import com.google.auth.oauth2.TokenStore; +import com.google.auth.oauth2.UserAuthorizer; + +/* class to demonstrate use of Drive files list API */ +public class MeetQuickstart { + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections + .singletonList("https://www.googleapis.com/auth/meetings.space.created"); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + private static final String USER = "default"; + + // Simple file-based token storage for storing oauth tokens + private static final TokenStore TOKEN_STORE = new TokenStore() { + private Path pathFor(String id) { + return Paths.get(".", TOKENS_DIRECTORY_PATH, id + ".json"); + } + + @Override + public String load(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return null; + } + return Files.readString(pathFor(id)); + } + + @Override + public void store(String id, String token) throws IOException { + Files.createDirectories(Paths.get(".", TOKENS_DIRECTORY_PATH)); + Files.writeString(pathFor(id), token); + } + + @Override + public void delete(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return; + } + Files.delete(pathFor(id)); + } + }; + + /** + * Initialize a UserAuthorizer for local authorization. + * + * @param callbackUri + * @return + */ + private static UserAuthorizer getAuthorizer(URI callbackUri) throws IOException { + // Load client secrets. + try (InputStream in = MeetQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH)) { + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + ClientId clientId = ClientId.fromStream(in); + + UserAuthorizer authorizer = UserAuthorizer.newBuilder() + .setClientId(clientId) + .setCallbackUri(callbackUri) + .setScopes(SCOPES) + .setPKCEProvider(new DefaultPKCEProvider() { + // Temporary fix for https://github.com/googleapis/google-auth-library-java/issues/1373 + @Override + public String getCodeChallenge() { + return super.getCodeChallenge().split("=")[0]; + } + }) + .setTokenStore(TOKEN_STORE).build(); + return authorizer; + } + } + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() + throws Exception { + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().build(); + try { + URI callbackUri = URI.create(receiver.getRedirectUri()); + UserAuthorizer authorizer = getAuthorizer(callbackUri); + + Credentials credentials = authorizer.getCredentials(USER); + if (credentials != null) { + return credentials; + } + + URL authorizationUrl = authorizer.getAuthorizationUrl(USER, "", null); + if (Desktop.isDesktopSupported() && + Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Desktop.getDesktop().browse(authorizationUrl.toURI()); + } else { + System.out.printf("Open the following URL to authorize access: %s\n", + authorizationUrl.toExternalForm()); + } + + String code = receiver.waitForCode(); + credentials = authorizer.getAndStoreCredentialsFromCode(USER, code, callbackUri); + return credentials; + } finally { + receiver.stop(); + } + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + SpacesServiceSettings settings = SpacesServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (SpacesServiceClient spacesServiceClient = SpacesServiceClient.create(settings)) { + CreateSpaceRequest request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder().build()) + .build(); + Space response = spacesServiceClient.createSpace(request); + System.out.printf("Space created: %s\n", response.getMeetingUri()); + } catch (IOException e) { + // TODO(developer): Handle errors + e.printStackTrace(); + } + } +} +// [END meet_quickstart] diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 69a500f6..8009371c 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'PeopleQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-people:v1-rev20220531-2.0.0' } diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index c50f86a0..dcbc81f9 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START people_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,7 +22,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.people.v1.PeopleService; import com.google.api.services.people.v1.PeopleServiceScopes; @@ -38,70 +39,74 @@ import java.util.List; public class PeopleQuickstart { - private static final String APPLICATION_NAME = "Google People API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google People API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + PeopleService service = + new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Request 10 connections. - ListConnectionsResponse response = service.people().connections() - .list("people/me") - .setPageSize(10) - .setPersonFields("names,emailAddresses") - .execute(); + // Request 10 connections. + ListConnectionsResponse response = service.people().connections() + .list("people/me") + .setPageSize(10) + .setPersonFields("names,emailAddresses") + .execute(); - // Print display name of connections if available. - List connections = response.getConnections(); - if (connections != null && connections.size() > 0) { - for (Person person : connections) { - List names = person.getNames(); - if (names != null && names.size() > 0) { - System.out.println("Name: " + person.getNames().get(0) - .getDisplayName()); - } else { - System.out.println("No names available for connection."); - } - } + // Print display name of connections if available. + List connections = response.getConnections(); + if (connections != null && connections.size() > 0) { + for (Person person : connections) { + List names = person.getNames(); + if (names != null && names.size() > 0) { + System.out.println("Name: " + person.getNames().get(0) + .getDisplayName()); } else { - System.out.println("No connections found."); + System.out.println("No names available for connection."); } + } + } else { + System.out.println("No connections found."); } + } } // [END people_quickstart] diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index cdf07781..e0c6f5a5 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SheetsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.4' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4' - compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' } diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index b0eddd07..10eef669 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START sheets_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,12 +22,11 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.ValueRange; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -36,66 +36,71 @@ import java.util.List; public class SheetsQuickstart { - private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - /** - * Prints the names and majors of students in a sample spreadsheet: - * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit - */ - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; - final String range = "Class Data!A2:E"; - Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - ValueRange response = service.spreadsheets().values() - .get(spreadsheetId, range) - .execute(); - List> values = response.getValues(); - if (values == null || values.isEmpty()) { - System.out.println("No data found."); - } else { - System.out.println("Name, Major"); - for (List row : values) { - // Print columns A and E, which correspond to indices 0 and 4. - System.out.printf("%s, %s\n", row.get(0), row.get(4)); - } - } + /** + * Prints the names and majors of students in a sample spreadsheet: + * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit + */ + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; + final String range = "Class Data!A2:E"; + Sheets service = + new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + ValueRange response = service.spreadsheets().values() + .get(spreadsheetId, range) + .execute(); + List> values = response.getValues(); + if (values == null || values.isEmpty()) { + System.out.println("No data found."); + } else { + System.out.println("Name, Major"); + for (List row : values) { + // Print columns A and E, which correspond to indices 0 and 4. + System.out.printf("%s, %s\n", row.get(0), row.get(4)); + } } + } } // [END sheets_quickstart] diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 5e599ff9..22610657 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' + testImplementation 'junit:junit:4.13.2' } test { diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java new file mode 100644 index 00000000..5da38dd1 --- /dev/null +++ b/sheets/snippets/src/main/java/AppendValues.java @@ -0,0 +1,87 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_append_values] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Append Values API */ +public class AppendValues { + /** + * Appends values to a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with appended values + * @throws IOException - if credentials file not found. + */ + public static AppendValuesResponse appendValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + AppendValuesResponse result = null; + try { + // Append values to the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + // Prints the spreadsheet with appended values. + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_append_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchGetValues.java b/sheets/snippets/src/main/java/BatchGetValues.java new file mode 100644 index 00000000..1a79a213 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchGetValues.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_get_values] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Get Values API */ +public class BatchGetValues { + /** + * Returns one or more ranges of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param ranges - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static BatchGetValuesResponse batchGetValues(String spreadsheetId, + List ranges) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + BatchGetValuesResponse result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute(); + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_get_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java new file mode 100644 index 00000000..5c742500 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdate.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_update] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.FindReplaceRequest; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update API */ +public class BatchUpdate { + /** + * Updates spreadsheet's title and cell values. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param title - New title of the spreadsheet. + * @param find - Find cell values + * @param replacement - Replaced cell values + * @return response metadata + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, + String title, + String find, + String replacement) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List requests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse response = null; + try { + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return response; + } +} +// [END sheets_batch_update] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java new file mode 100644 index 00000000..7ce0306a --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdateValues.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_update_values] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update Values API */ +public class BatchUpdateValues { + /** + * Set values in one or more ranges of spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); + + BatchUpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java new file mode 100644 index 00000000..4cecfc76 --- /dev/null +++ b/sheets/snippets/src/main/java/ConditionalFormatting.java @@ -0,0 +1,139 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_conditional_formatting] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AddConditionalFormatRuleRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.BooleanCondition; +import com.google.api.services.sheets.v4.model.BooleanRule; +import com.google.api.services.sheets.v4.model.CellFormat; +import com.google.api.services.sheets.v4.model.Color; +import com.google.api.services.sheets.v4.model.ConditionValue; +import com.google.api.services.sheets.v4.model.ConditionalFormatRule; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.TextFormat; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Conditional Formatting API */ +public class ConditionalFormatting { + /** + * Create conditional formatting. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return updated changes count. + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) + ) + ) + .setIndex(0) + ) + ); + + BatchUpdateSpreadsheetResponse result = null; + try { + // Execute the requests. + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_conditional_formatting] diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java new file mode 100644 index 00000000..4d66e78c --- /dev/null +++ b/sheets/snippets/src/main/java/Create.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_create] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Create API */ +public class Create { + /** + * Create a new spreadsheet. + * + * @param title - the name of the sheet to be created. + * @return newly created spreadsheet id + * @throws IOException - if credentials file not found. + */ + public static String createSpreadsheet(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create new spreadsheet with a title + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + // Prints the new spreadsheet id + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + return spreadsheet.getSpreadsheetId(); + } +} +// [END sheets_create] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java new file mode 100644 index 00000000..157d6cdf --- /dev/null +++ b/sheets/snippets/src/main/java/GetValues.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_get_values] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Get Values API */ +public class GetValues { + /** + * Returns a range of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static ValueRange getValues(String spreadsheetId, String range) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + ValueRange result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_get_values] diff --git a/sheets/snippets/src/main/java/PivotTables.java b/sheets/snippets/src/main/java/PivotTables.java new file mode 100644 index 00000000..8b56a058 --- /dev/null +++ b/sheets/snippets/src/main/java/PivotTables.java @@ -0,0 +1,145 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_pivot_tables] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AddSheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.CellData; +import com.google.api.services.sheets.v4.model.GridCoordinate; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.PivotGroup; +import com.google.api.services.sheets.v4.model.PivotTable; +import com.google.api.services.sheets.v4.model.PivotValue; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.RowData; +import com.google.api.services.sheets.v4.model.UpdateCellsRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.common.collect.Lists; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */ +public class PivotTables { + /** + * Create pivot table. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return pivot table's spreadsheet + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse result = null; + try { + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); + + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) + + )); + + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_pivot_tables] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/SheetsFilterViews.java b/sheets/snippets/src/main/java/SheetsFilterViews.java new file mode 100644 index 00000000..06a1f939 --- /dev/null +++ b/sheets/snippets/src/main/java/SheetsFilterViews.java @@ -0,0 +1,175 @@ +/ * +Copyright 2026 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +* / + +// [START sheets_filter_views] + +/* + * Dependencies (Maven): + * com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0 + * com.google.auth:google-auth-library-oauth2-http:1.19.0 + */ + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.*; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; + +public class SheetsFilterViews { + + public static void main(String... args) { + filterViews("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k"); + } + + public static void filterViews(String spreadsheetId) { + try { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + + Sheets service = new Sheets.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) + .setApplicationName("Sheets Filter Views Sample") + .build(); + + // --- Step 1: Add Filter View --- + GridRange myRange = new GridRange() + .setSheetId(0) + .setStartRowIndex(0) + .setStartColumnIndex(0); + + // Construct Criteria for Column 0 (Hidden Values) + FilterCriteria criteria0 = new FilterCriteria() + .setHiddenValues(Collections.singletonList("Panel")); + + // Construct Criteria for Column 6 (Date Condition) + ConditionValue dateValue = new ConditionValue().setUserEnteredValue("4/30/2016"); + BooleanCondition dateCondition = new BooleanCondition() + .setType("DATE_BEFORE") + .setValues(Collections.singletonList(dateValue)); + FilterCriteria criteria6 = new FilterCriteria().setCondition(dateCondition); + + // Map criteria to column indices (Note: keys are Strings in Java map) + Map criteriaMap = new HashMap<>(); + criteriaMap.put("0", criteria0); + criteriaMap.put("6", criteria6); + + FilterView filterView = new FilterView() + .setTitle("Sample Filter") + .setRange(myRange) + .setSortSpecs(Collections.singletonList( + new SortSpec().setDimensionIndex(3).setSortOrder("DESCENDING") + )) + .setCriteria(criteriaMap); + + // --- Step 1: Add Filter View --- + // (Request construction remains the same) + // ... + AddFilterViewRequest addFilterViewRequest = new AddFilterViewRequest().setFilter(filterView); + + BatchUpdateSpreadsheetRequest batchRequest1 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setAddFilterView(addFilterViewRequest))); + + BatchUpdateSpreadsheetResponse response1 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest1) + .execute(); + + if (response1.getReplies() == null || response1.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from AddFilterView request."); + return; + } + + Response reply1 = response1.getReplies().get(0); + if (reply1.getAddFilterView() == null || reply1.getAddFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain AddFilterView data."); + return; + } + + int filterId = reply1.getAddFilterView().getFilter().getFilterViewId(); + + // --- Step 2: Duplicate Filter View --- + DuplicateFilterViewRequest duplicateRequest = new DuplicateFilterViewRequest() + .setFilterId(filterId); + + BatchUpdateSpreadsheetRequest batchRequest2 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setDuplicateFilterView(duplicateRequest))); + + BatchUpdateSpreadsheetResponse response2 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest2) + .execute(); + + if (response2.getReplies() == null || response2.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from DuplicateFilterView request."); + return; + } + + Response reply2 = response2.getReplies().get(0); + if (reply2.getDuplicateFilterView() == null || reply2.getDuplicateFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain DuplicateFilterView data."); + return; + } + + int newFilterId = reply2.getDuplicateFilterView().getFilter().getFilterViewId(); + + // --- Step 3: Update Filter View --- + // Extract the new ID from the duplicate response + int newFilterId = response2.getReplies().get(0) + .getDuplicateFilterView().getFilter().getFilterViewId(); + + // Create update criteria + Map updateCriteriaMap = new HashMap<>(); + updateCriteriaMap.put("0", new FilterCriteria()); // Empty criteria + + ConditionValue numValue = new ConditionValue().setUserEnteredValue("5"); + BooleanCondition numCondition = new BooleanCondition() + .setType("NUMBER_GREATER") + .setValues(Collections.singletonList(numValue)); + updateCriteriaMap.put("3", new FilterCriteria().setCondition(numCondition)); + + FilterView updateFilterView = new FilterView() + .setFilterViewId(newFilterId) + .setTitle("Updated Filter") + .setCriteria(updateCriteriaMap); + + UpdateFilterViewRequest updateRequest = new UpdateFilterViewRequest() + .setFilter(updateFilterView) + .setFields("criteria,title"); + + BatchUpdateSpreadsheetRequest batchRequest3 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setUpdateFilterView(updateRequest))); + + BatchUpdateSpreadsheetResponse response3 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest3) + .execute(); + + System.out.println(response3.toPrettyString()); + + } catch (IOException | GeneralSecurityException e) { + System.err.println("An error occurred: " + e); + } + } +} + +// [END sheets_filter_views] diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java deleted file mode 100644 index 9b37346f..00000000 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.*; -import com.google.common.collect.Lists; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpreadsheetSnippets { - private Sheets service; - - public SpreadsheetSnippets(Sheets service) { - this.service = service; - } - - public String create(String title) throws IOException { - Sheets service = this.service; - // [START sheets_create] - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle(title)); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - // [END sheets_create] - return spreadsheet.getSpreadsheetId(); - } - - public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String title, - String find, String replacement) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update] - List requests = new ArrayList<>(); - // Change the spreadsheet's title. - requests.add(new Request() - .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() - .setProperties(new SpreadsheetProperties() - .setTitle(title)) - .setFields("title"))); - // Find and replace text. - requests.add(new Request() - .setFindReplace(new FindReplaceRequest() - .setFind(find) - .setReplacement(replacement) - .setAllSheets(true))); - // Add additional requests (operations) ... - - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(requests); - BatchUpdateSpreadsheetResponse response = - service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); - FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); - System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - // [END sheets_batch_update] - return response; - } - - public ValueRange getValues(String spreadsheetId, String range) throws IOException { - Sheets service = this.service; - // [START sheets_get_values] - ValueRange result = service.spreadsheets().values().get(spreadsheetId, range).execute(); - int numRows = result.getValues() != null ? result.getValues().size() : 0; - System.out.printf("%d rows retrieved.", numRows); - // [END sheets_get_values] - return result; - } - - public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_get_values] - List ranges = Arrays.asList( - //Range names ... - ); - // [START_EXCLUDE silent] - ranges = _ranges; - // [END_EXCLUDE] - BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) - .setRanges(ranges).execute(); - System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - // [END sheets_batch_get_values] - return result; - } - public UpdateValuesResponse updateValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - UpdateValuesResponse result = - service.spreadsheets().values().update(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells updated.", result.getUpdatedCells()); - // [END sheets_update_values] - return result; - } - - public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String range, - String valueInputOption, - List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - List data = new ArrayList<>(); - data.add(new ValueRange() - .setRange(range) - .setValues(values)); - // Additional ranges to update ... - - BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() - .setValueInputOption(valueInputOption) - .setData(data); - BatchUpdateValuesResponse result = - service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); - System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - // [END sheets_batch_update_values] - return result; - } - - public AppendValuesResponse appendValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_append_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - AppendValuesResponse result = - service.spreadsheets().values().append(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - // [END sheets_append_values] - return result; - } - - public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { - Sheets service = this.service; - - // Create two sheets for our pivot table. - List sheetsRequests = new ArrayList<>(); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - - BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(sheetsRequests); - BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() - .batchUpdate(spreadsheetId, createSheetsBody).execute(); - int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() - .getSheetId(); - int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() - .getSheetId(); - - // [START sheets_pivot_tables] - PivotTable pivotTable = new PivotTable() - .setSource( - new GridRange() - .setSheetId(sourceSheetId) - .setStartRowIndex(0) - .setStartColumnIndex(0) - .setEndRowIndex(20) - .setEndColumnIndex(7) - ) - .setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(1) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(4) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(4) - )); - List requests = Lists.newArrayList(); - Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() - .setFields("*") - .setRows(Collections.singletonList( - new RowData().setValues( - Collections.singletonList( - new CellData().setPivotTable(pivotTable)) - ) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) - - )); - - requests.add(updateCellsRequest); - BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, updateCellsBody).execute(); - // [END sheets_pivot_tables] - return result; - } - - public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) - throws IOException { - // [START sheets_conditional_formatting] - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor( - new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) - ) - ); - - BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - System.out.printf("%d cells updated.", result.getReplies().size()); - // [END sheets_conditional_formatting] - return result; - } -} diff --git a/sheets/snippets/src/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java new file mode 100644 index 00000000..21e23308 --- /dev/null +++ b/sheets/snippets/src/main/java/UpdateValues.java @@ -0,0 +1,86 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_update_values] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Update Values API */ +public class UpdateValues { + /** + * Sets values in a range of a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - List of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static UpdateValuesResponse updateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + UpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 34ff8dad..6e815050 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -1,120 +1,77 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; import com.google.api.services.sheets.v4.model.CellData; import com.google.api.services.sheets.v4.model.ExtendedValue; import com.google.api.services.sheets.v4.model.GridRange; import com.google.api.services.sheets.v4.model.RepeatCellRequest; import com.google.api.services.sheets.v4.model.Request; -import com.google.api.services.sheets.v4.model.Spreadsheet; -import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; import org.junit.Before; public class BaseTest { - static { - enableLogging(); - } - protected Sheets service; protected Drive driveService; - protected Set filesToDelete = new HashSet<>(); - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SheetsScopes.SPREADSHEETS, SheetsScopes.DRIVE); + return credentials; } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); - } - - public Sheets buildService(GoogleCredential credential) throws IOException, - GeneralSecurityException { + public Sheets buildService(GoogleCredentials credentials) { return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Drive buildDriveService(GoogleCredentials credentials) { return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } @Before - public void setup() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); this.service = buildService(credential); this.driveService = buildDriveService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } - } - - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); } - protected String createTestSpreadsheet() throws IOException { - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle("Test Spreadsheet")); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - return spreadsheet.getSpreadsheetId(); + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); } protected void populateValuesWithStrings(String spreadsheetId) throws IOException { diff --git a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java b/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java deleted file mode 100644 index 9e632720..00000000 --- a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java +++ /dev/null @@ -1,121 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.sheets.v4.model.*; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SpreadsheetSnippetsTest extends BaseTest { - private SpreadsheetSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new SpreadsheetSnippets(this.service); - } - - @Test - public void testCreate() throws IOException { - String id = this.snippets.create("Title"); - assertNotNull(id); - this.deleteFileOnCleanup(id); - } - - @Test - public void testBatchUpdate() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); - List replies = response.getReplies(); - assertEquals(2, replies.size()); - FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); - assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); - } - - @Test - public void testConditionalFormat() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithNumbers(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.conditionalFormat(spreadsheetId); - assertEquals(spreadsheetId, response.getSpreadsheetId()); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - ValueRange result = this.snippets.getValues(spreadsheetId, "A1:C2"); - List> values = result.getValues(); - assertEquals(2, values.size()); - assertEquals(3, values.get(0).size()); - } - - @Test - public void testBatchGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List ranges = Arrays.asList("A1:A3", "B1:C1"); - BatchGetValuesResponse result = this.snippets.batchGetValues(spreadsheetId, ranges); - List valueRanges = result.getValueRanges(); - assertEquals(2, valueRanges.size()); - List> values = valueRanges.get(0).getValues(); - assertEquals(3, values.size()); - } - - @Test - public void testUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - UpdateValuesResponse result = - this.snippets.updateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(2, result.getUpdatedRows().intValue()); - assertEquals(2, result.getUpdatedColumns().intValue()); - assertEquals(4, result.getUpdatedCells().intValue()); - } - - @Test - public void testBatchUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - BatchUpdateValuesResponse result = - this.snippets.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(1, result.getResponses().size()); - assertEquals(2, result.getTotalUpdatedRows().intValue()); - assertEquals(2, result.getTotalUpdatedColumns().intValue()); - assertEquals(4, result.getTotalUpdatedCells().intValue()); - } - - @Test - public void testAppendValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - AppendValuesResponse result = - this.snippets.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals("Sheet1!A1:J10", result.getTableRange()); - UpdateValuesResponse updates = result.getUpdates(); - assertEquals(2, updates.getUpdatedRows().intValue()); - assertEquals(2, updates.getUpdatedColumns().intValue()); - assertEquals(4, updates.getUpdatedCells().intValue()); - } - - @Test - public void testPivotTable() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - BatchUpdateSpreadsheetResponse result = this.snippets.pivotTables(spreadsheetId); - assertNotNull(result); - } -} diff --git a/sheets/snippets/src/test/java/TestAppendValues.java b/sheets/snippets/src/test/java/TestAppendValues.java new file mode 100644 index 00000000..b0dd9551 --- /dev/null +++ b/sheets/snippets/src/test/java/TestAppendValues.java @@ -0,0 +1,43 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet append values snippet +public class TestAppendValues extends BaseTest { + + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchGetValues.java b/sheets/snippets/src/test/java/TestBatchGetValues.java new file mode 100644 index 00000000..9833ddc4 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchGetValues.java @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet batch get values snippet +public class TestBatchGetValues extends BaseTest { + + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, + ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdate.java b/sheets/snippets/src/test/java/TestBatchUpdate.java new file mode 100644 index 00000000..24d78ca0 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdate.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Response; +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet batch update snippet +public class TestBatchUpdate extends BaseTest { + + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdateValues.java b/sheets/snippets/src/test/java/TestBatchUpdateValues.java new file mode 100644 index 00000000..21560d94 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java @@ -0,0 +1,41 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet batch update values snippet +public class TestBatchUpdateValues extends BaseTest { + + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java new file mode 100644 index 00000000..22173381 --- /dev/null +++ b/sheets/snippets/src/test/java/TestConditionalFormatting.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import java.io.IOException; +import org.junit.Test; + +// Unit testcase for spreadsheet conditional formatting snippet +public class TestConditionalFormatting extends BaseTest { + + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + ConditionalFormatting.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java new file mode 100644 index 00000000..2fe55351 --- /dev/null +++ b/sheets/snippets/src/test/java/TestCreate.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +// Unit testcase for create spreadsheet snippet +public class TestCreate extends BaseTest { + + @Test + public void testCreate() throws IOException { + String id = Create.createSpreadsheet("Test Spreadsheet"); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/sheets/snippets/src/test/java/TestGetValues.java b/sheets/snippets/src/test/java/TestGetValues.java new file mode 100644 index 00000000..13bee226 --- /dev/null +++ b/sheets/snippets/src/test/java/TestGetValues.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.ValueRange; +import java.io.IOException; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet get values snippet +public class TestGetValues extends BaseTest { + + @Test + public void testGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java new file mode 100644 index 00000000..91bd4f48 --- /dev/null +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import java.io.IOException; +import org.junit.Test; + +// Unit testcase for spreadsheet pivot table snippet +public class TestPivotTable extends BaseTest { + + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); + assertNotNull(result); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestUpdateValues.java b/sheets/snippets/src/test/java/TestUpdateValues.java new file mode 100644 index 00000000..8c8355a7 --- /dev/null +++ b/sheets/snippets/src/test/java/TestUpdateValues.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.assertEquals; + +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +// Unit testcase for spreadsheet update values snippet +public class TestUpdateValues extends BaseTest { + + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, + "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/test.sh b/sheets/snippets/test.sh deleted file mode 100755 index 49d2c9e8..00000000 --- a/sheets/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test --rerun-tasks # --rerun-tasks forces UP-TO-DATE tests to re-run diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 8d86e30b..8350296e 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SlidesQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' } diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index 63c06d47..b404b3cb 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START slides_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,13 +22,12 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.slides.v1.Slides; import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.Page; import com.google.api.services.slides.v1.model.Presentation; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,58 +37,64 @@ import java.util.List; public class SlidesQuickstart { - private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Slides service = new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Slides service = + new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Prints the number of slides and elements in a sample presentation: - // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit - String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; - Presentation response = service.presentations().get(presentationId).execute(); - List slides = response.getSlides(); + // Prints the number of slides and elements in a sample presentation: + // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit + String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; + Presentation response = service.presentations().get(presentationId).execute(); + List slides = response.getSlides(); - System.out.printf("The presentation contains %s slides:\n", slides.size()); - for (int i = 0; i < slides.size(); ++i) { - System.out.printf("- Slide #%s contains %s elements.\n", i + 1, slides.get(i).getPageElements().size()); - } + System.out.printf("The presentation contains %s slides:\n", slides.size()); + for (int i = 0; i < slides.size(); ++i) { + System.out.printf("- Slide #%s contains %s elements.\n", i + 1, + slides.get(i).getPageElements().size()); } + } } // [END slides_quickstart] diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 300684f4..0471dc29 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -1,18 +1,17 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' + testImplementation 'junit:junit:4.13.2' - compile fileTree(dir: 'lib', include: ['*.jar']) + implementation fileTree(dir: 'lib', include: ['*.jar']) } test { diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java new file mode 100644 index 00000000..6b1def55 --- /dev/null +++ b/slides/snippets/src/main/java/CopyPresentation.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_copy_presentation] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Copy Presentation API */ +public class CopyPresentation { + /** + * Copy an existing presentation. + * + * @param presentationId - id of the presentation. + * @param copyTitle - New title of the presentation. + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String copyPresentation(String presentationId, String copyTitle) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + String presentationCopyId = null; + try { + // Copies an existing presentation using specified presentation title. + File copyMetadata = new File().setName(copyTitle); + File presentationCopyFile = + driveService.files().copy(presentationId, copyMetadata).execute(); + presentationCopyId = presentationCopyFile.getId(); + // Prints the new copied presentation id. + System.out.println("New copied presentation id " + presentationCopyId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return presentationCopyId; + } +} +// [END slides_copy_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java new file mode 100644 index 00000000..89202f6a --- /dev/null +++ b/slides/snippets/src/main/java/CreateBulletedText.java @@ -0,0 +1,96 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_bulleted_text] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateParagraphBulletsRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Create Bulleted Text API */ +public class CreateBulletedText { + /** + * Add arrow-diamond-disc bullets to all text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createBulletedText(String presentationId, + String shapeId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add arrow-diamond-disc bullets to all text in the shape. + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateParagraphBullets(new CreateParagraphBulletsRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")) + .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added bullets to text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_bulleted_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java new file mode 100644 index 00000000..55ec3534 --- /dev/null +++ b/slides/snippets/src/main/java/CreateImage.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_image] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateImageRequest; +import com.google.api.services.slides.v1.model.CreateImageResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Image API */ +public class CreateImage { + /** + * Create a new image, using the supplied object ID, with content + * downloaded from imageUrl. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the shape. + * @param imageUrl - Url of the image. + * @return image id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createImage(String presentationId, + String slideId, + String imageUrl) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. + List requests = new ArrayList<>(); + String imageId = "MyImageId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + requests.add(new Request() + .setCreateImage(new CreateImageRequest() + .setObjectId(imageId) + .setUrl(imageUrl) + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); + // Prints the created image id. + System.out.println("Created image with ID: " + createImageResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_image] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java new file mode 100644 index 00000000..f7d7d96b --- /dev/null +++ b/slides/snippets/src/main/java/CreatePresentation.java @@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_presentation] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.Presentation; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Create Presentation API */ +public class CreatePresentation { + /** + * Creates a new presentation. + * + * @param title - the name of the presentation to be created + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String createPresentation(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Creates a blank presentation with a specified title. + Presentation presentation = new Presentation() + .setTitle(title); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + // Prints the newly created presentation id. + System.out.println("Created presentation with ID: " + presentation.getPresentationId()); + return presentation.getPresentationId(); + } +} +// [END slides_create_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java new file mode 100644 index 00000000..3f3d3e9b --- /dev/null +++ b/slides/snippets/src/main/java/CreateSheetsChart.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_sheets_chart] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSheetsChartRequest; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Chart API */ +public class CreateSheetsChart { + /** + * Adds chart from spreadsheet to slides as linked. + * + * @param presentationId - id of the presentation. + * @param pageId - id of the page. + * @param spreadsheetId - id of the spreadsheet. + * @param sheetChartId - id of the chart in sheets. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSheetsChart( + String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto + // a page in the presentation. Setting the linking mode as "LINKED" allows the + // chart to be refreshed if the Sheets version is updated. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + String presentationChartId = "MyEmbeddedChart"; + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java new file mode 100644 index 00000000..1ef009ab --- /dev/null +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_slide] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSlideRequest; +import com.google.api.services.slides.v1.model.CreateSlideResponse; +import com.google.api.services.slides.v1.model.LayoutReference; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Create Slides API */ +public class CreateSlide { + /** + * Creates a new slide. + * + * @param presentationId - id of the presentation. + * @return slide id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSlide(String presentationId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout + List requests = new ArrayList<>(); + String slideId = "MyNewSlide_001"; + BatchUpdatePresentationResponse response = null; + try { + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId(slideId) + .setInsertionIndex(1) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); + + // If you wish to populate the slide with elements, add create requests here, + // using the slide ID specified above. + + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); + // Prints the slide id. + System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", + presentationId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_slide] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java new file mode 100644 index 00000000..797be99e --- /dev/null +++ b/slides/snippets/src/main/java/CreateTextboxWithText.java @@ -0,0 +1,117 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_textbox_with_text] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateShapeRequest; +import com.google.api.services.slides.v1.model.CreateShapeResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Textbox API */ +public class CreateTextboxWithText { + /** + * Create a new square textbox, using the specified id. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the slide. + * @param textBoxId - id for the textbox. + * @return textbox id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createTextBoxWithText( + String presentationId, String slideId, String textBoxId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new square text box, using a supplied object ID. + List requests = new ArrayList<>(); + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + // Insert text into the box, using the object ID given to it. + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + BatchUpdatePresentationResponse response = null; + + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); + System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_textbox_with_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java new file mode 100644 index 00000000..a45b9ad8 --- /dev/null +++ b/slides/snippets/src/main/java/ImageMerging.java @@ -0,0 +1,116 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_image_merging] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.ReplaceAllShapesWithImageRequest; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Image Merging API */ +public class ImageMerging { + /** + * Changes specified texts into images. + * + * @param templatePresentationId - id of the presentation. + * @param imageUrl - Url of the image. + * @param customerName - Name of the customer. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, + String imageUrl, + String customerName) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the image merge (replaceAllShapesWithImage) requests. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() + .setImageUrl(imageUrl) + .setImageReplaceMethod("CENTER_INSIDE") + .setContainsText(new SubstringMatchCriteria() + .setText("{{company-logo}}") + .setMatchCase(true)))); + + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + + int numReplacements = 0; + try { + // Count total number of replacements made. + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " shapes instances with images."); + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } + return response; + } +} +// [END slides_image_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java new file mode 100644 index 00000000..7ff9df97 --- /dev/null +++ b/slides/snippets/src/main/java/RefreshSheetsChart.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_refresh_sheets_chart] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.RefreshSheetsChartRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Refresh Chart API */ +public class RefreshSheetsChart { + /** + * Refresh the sheets charts. + * + * @param presentationId - id of the presentation. + * @param presentationChartId - id of the presentation chart. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse refreshSheetsChart( + String presentationId, String presentationChartId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List requests = new ArrayList<>(); + + // Refresh an existing linked Sheets chart embedded a presentation. + requests.add(new Request() + .setRefreshSheetsChart(new RefreshSheetsChartRequest() + .setObjectId(presentationChartId))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_refresh_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java new file mode 100644 index 00000000..0e23a303 --- /dev/null +++ b/slides/snippets/src/main/java/SimpleTextReplace.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_simple_text_replace] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.DeleteTextRequest; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Replace Text API */ +public class SimpleTextReplace { + /** + * Remove existing text in the shape, then insert new text. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @param replacementText - New replacement text. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse simpleTextReplace( + String presentationId, String shapeId, String replacementText) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Remove existing text in the shape, then insert the new text. + List requests = new ArrayList<>(); + requests.add(new Request() + .setDeleteText(new DeleteTextRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")))); + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(shapeId) + .setInsertionIndex(0) + .setText(replacementText))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Replaced text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_simple_text_replace] \ No newline at end of file diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java deleted file mode 100644 index c1c07907..00000000 --- a/slides/snippets/src/main/java/Snippets.java +++ /dev/null @@ -1,450 +0,0 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.ValueRange; -import com.google.api.services.slides.v1.Slides; -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class Snippets { - - private Slides service; - private Drive driveService; - private Sheets sheetsService; - - Snippets(Slides service, Drive driveService, Sheets sheetsService) { - this.service = service; - this.driveService = driveService; - this.sheetsService = sheetsService; - } - - public String createPresentation(String title) throws IOException { - Slides slidesService = this.service; - // [START slides_create_presentation] - Presentation presentation = new Presentation() - .setTitle(title); - presentation = slidesService.presentations().create(presentation) - .setFields("presentationId") - .execute(); - System.out.println("Created presentation with ID: " + presentation.getPresentationId()); - // [END slides_create_presentation] - return presentation.getPresentationId(); - } - - public String copyPresentation(String presentationId, String copyTitle) throws IOException { - Drive driveService = this.driveService; - // [START slides_copy_presentation] - File copyMetadata = new File().setName(copyTitle); - File presentationCopyFile = - driveService.files().copy(presentationId, copyMetadata).execute(); - String presentationCopyId = presentationCopyFile.getId(); - // [END slides_copy_presentation] - return presentationCopyId; - } - - public BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_slide] - // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout - // and the ID "MyNewSlide_001". - List requests = new ArrayList<>(); - String slideId = "MyNewSlide_001"; - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId(slideId) - .setInsertionIndex(1) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); - - // If you wish to populate the slide with elements, add create requests here, - // using the slide ID specified above. - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); - System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); - // [END slides_create_slide] - return response; - } - - public BatchUpdatePresentationResponse createTextBoxWithText( - String presentationId, String slideId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_textbox_with_text] - // Create a new square text box, using a supplied object ID. - List requests = new ArrayList<>(); - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - // Insert text into the box, using the object ID given to it. - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); - System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); - // [END slides_create_textbox_with_text] - return response; - } - - - public BatchUpdatePresentationResponse createImage(String presentationId, - String slideId, - GoogleCredential credential) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_image] - String imageUrl = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - - // Create a new image, using the supplied object ID, with content downloaded from imageUrl. - List requests = new ArrayList<>(); - String imageId = "MyImageId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - requests.add(new Request() - .setCreateImage(new CreateImageRequest() - .setObjectId(imageId) - .setUrl(imageUrl) - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); - System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - // [END slides_create_image] - return response; - } - - public List textMerging( - String templatePresentationId, String dataSpreadsheetId) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - Sheets sheetsService = this.sheetsService; - List responses = new ArrayList<>(5); - // [START slides_text_merging] - // Use the Sheets API to load data, one record per row. - String dataRangeNotation = "Customers!A2:M6"; - ValueRange sheetsResponse = sheetsService.spreadsheets().values() - .get(dataSpreadsheetId, dataRangeNotation).execute(); - List> values = sheetsResponse.getValues(); - - // For each record, create a new merged presentation. - for (List row: values) { - String customerName = row.get(2).toString(); // name in column 3 - String caseDescription = row.get(5).toString(); // case description in column 6 - String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 - - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the text merge (replaceAllText) requests for this presentation. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-name}}") - .setMatchCase(true)) - .setReplaceText(customerName))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{case-description}}") - .setMatchCase(true)) - .setReplaceText(caseDescription))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{total-portfolio}}") - .setMatchCase(true)) - .setReplaceText(totalPortfolio))); - - // Execute the requests for this presentation. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - // [START_EXCLUDE silent] - responses.add(response); - // [END_EXCLUDE] - // Count total number of replacements made. - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation for " + - customerName + " with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " text instances."); - } - // [END slides_text_merging] - return responses; - } - - public BatchUpdatePresentationResponse imageMerging(String templatePresentationId, - String imageUrl, - String customerName) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - String logoUrl = imageUrl; - String customerGraphicUrl = imageUrl; - - // [START slides_image_merging] - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the image merge (replaceAllShapesWithImage) requests. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(logoUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{company-logo}}") - .setMatchCase(true)))); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(customerGraphicUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-graphic}}") - .setMatchCase(true)))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - // Count total number of replacements made. - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " shapes instances with images."); - // [END slides_image_merging] - return response; - } - - public BatchUpdatePresentationResponse simpleTextReplace( - String presentationId, String shapeId, String replacementText) throws IOException { - Slides slidesService = this.service; - // [START slides_simple_text_replace] - // Remove existing text in the shape, then insert the new text. - List requests = new ArrayList<>(); - requests.add(new Request() - .setDeleteText(new DeleteTextRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")))); - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(shapeId) - .setInsertionIndex(0) - .setText(replacementText))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Replaced text in shape with ID: " + shapeId); - // [END slides_simple_text_replace] - return response; - } - - public BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) - throws IOException { - Slides slidesService = this.service; - // [START slides_text_style_update] - // Update the text style so that the first 5 characters are bolded - // and italicized, and the next 5 are displayed in blue 14 pt Times - // New Roman font, and the next five are hyperlinked. - List requests = new ArrayList<>(); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(0) - .setEndIndex(5)) - .setStyle(new TextStyle() - .setBold(true) - .setItalic(true)) - .setFields("bold,italic"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(5) - .setEndIndex(10)) - .setStyle(new TextStyle() - .setFontFamily("Times New Roman") - .setFontSize(new Dimension() - .setMagnitude(14.0) - .setUnit("PT")) - .setForegroundColor(new OptionalColor() - .setOpaqueColor(new OpaqueColor() - .setRgbColor(new RgbColor() - .setBlue(1.0F) - .setGreen(0.0F) - .setRed(0.0F))))) - .setFields("foregroundColor,fontFamily,fontSize"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(10) - .setEndIndex(15)) - .setStyle(new TextStyle() - .setLink(new Link() - .setUrl("www.example.com"))) - .setFields("link"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Updated text style for shape with ID: " + shapeId); - // [END slides_text_style_update] - return response; - } - - public BatchUpdatePresentationResponse createBulletedText(String presentationId, - String shapeId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_bulleted_text] - // Add arrow-diamond-disc bullets to all text in the shape. - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateParagraphBullets(new CreateParagraphBulletsRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")) - .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added bullets to text in shape with ID: " + shapeId); - // [END slides_create_bulleted_text] - return response; - } - - public BatchUpdatePresentationResponse createSheetsChart( - String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_sheets_chart] - // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto - // a page in the presentation. Setting the linking mode as "LINKED" allows the - // chart to be refreshed if the Sheets version is updated. - List requests = new ArrayList<>(); - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - String presentationChartId = "MyEmbeddedChart"; - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added a linked Sheets chart with ID " + presentationChartId); - // [END slides_create_sheets_chart] - return response; - } - - public BatchUpdatePresentationResponse refreshSheetsChart( - String presentationId, String presentationChartId) throws IOException { - Slides slidesService = this.service; - // [START slides_refresh_sheets_chart] - List requests = new ArrayList<>(); - - // Refresh an existing linked Sheets chart embedded a presentation. - requests.add(new Request() - .setRefreshSheetsChart(new RefreshSheetsChartRequest() - .setObjectId(presentationChartId))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); - // [END slides_refresh_sheets_chart] - return response; - } -} diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java new file mode 100644 index 00000000..67f96955 --- /dev/null +++ b/slides/snippets/src/main/java/TextMerging.java @@ -0,0 +1,157 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_text_merging] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.ReplaceAllTextRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Text Merging API */ +public class TextMerging { + /** + * Changes specified texts with data from spreadsheet. + * + * @param templatePresentationId - id of the presentation. + * @param dataSpreadsheetId - id of the spreadsheet containing data. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static List textMerging( + String templatePresentationId, String dataSpreadsheetId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE, SlidesScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the sheets API client + Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List responses = new ArrayList<>(5); + // Use the Sheets API to load data, one record per row. + String dataRangeNotation = "Customers!A2:M6"; + ValueRange sheetsResponse = sheetsService.spreadsheets().values() + .get(dataSpreadsheetId, dataRangeNotation).execute(); + List> values = sheetsResponse.getValues(); + + try { + // For each record, create a new merged presentation. + for (List row : values) { + String customerName = row.get(2).toString(); // name in column 3 + String caseDescription = row.get(5).toString(); // case description in column 6 + String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the text merge (replaceAllText) requests for this presentation. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{customer-name}}") + .setMatchCase(true)) + .setReplaceText(customerName))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{case-description}}") + .setMatchCase(true)) + .setReplaceText(caseDescription))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{total-portfolio}}") + .setMatchCase(true)) + .setReplaceText(totalPortfolio))); + + // Execute the requests for this presentation. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + + // Count total number of replacements made. + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation for " + + customerName + " with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " text instances."); + } + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); + } else { + throw e; + } + } + return responses; + } +} +// [END slides_text_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java new file mode 100644 index 00000000..86b694d0 --- /dev/null +++ b/slides/snippets/src/main/java/TextStyleUpdate.java @@ -0,0 +1,139 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_text_style_update] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.Link; +import com.google.api.services.slides.v1.model.OpaqueColor; +import com.google.api.services.slides.v1.model.OptionalColor; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.RgbColor; +import com.google.api.services.slides.v1.model.TextStyle; +import com.google.api.services.slides.v1.model.UpdateTextStyleRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Text Structure and Styling API */ +public class TextStyleUpdate { + /** + * Styles text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return shape id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, + String shapeId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Update the text style so that the first 5 characters are bolded + // and italicized, and the next 5 are displayed in blue 14 pt Times + // New Roman font, and the next five are hyperlinked. + List requests = new ArrayList<>(); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(0) + .setEndIndex(5)) + .setStyle(new TextStyle() + .setBold(true) + .setItalic(true)) + .setFields("bold,italic"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(5) + .setEndIndex(10)) + .setStyle(new TextStyle() + .setFontFamily("Times New Roman") + .setFontSize(new Dimension() + .setMagnitude(14.0) + .setUnit("PT")) + .setForegroundColor(new OptionalColor() + .setOpaqueColor(new OpaqueColor() + .setRgbColor(new RgbColor() + .setBlue(1.0F) + .setGreen(0.0F) + .setRed(0.0F))))) + .setFields("foregroundColor,fontFamily,fontSize"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(10) + .setEndIndex(15)) + .setStyle(new TextStyle() + .setLink(new Link() + .setUrl("www.example.com"))) + .setFields("link"))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Updated text style for shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_text_style_update] \ No newline at end of file diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index 99e97610..d6f52d6b 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -1,208 +1,176 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.*; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.*; import java.util.List; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; +import org.junit.After; public class BaseTest { - static { - enableLogging(); - } - - protected GoogleCredential credential; - protected Slides service; - protected Drive driveService; - protected Sheets sheetsService; - protected Set filesToDelete = new HashSet<>(); - - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); - } - - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); - } - - public Slides buildService(GoogleCredential credential) - throws IOException, GeneralSecurityException { - return new Slides.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { - return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Sheets buildSheetsService(GoogleCredential credential) - throws IOException, GeneralSecurityException { - return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) - .setApplicationName("Slides API Snippets") - .build(); - } - - @Before - public void setup() throws IOException, GeneralSecurityException { - this.credential = getCredential(); - this.service = buildService(credential); - this.driveService = buildDriveService(credential); - this.sheetsService = buildSheetsService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } - } - - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); - } - - protected String createTestPresentation() throws IOException { - Presentation presentation = new Presentation() - .setTitle("Test Presentation"); - presentation = service.presentations().create(presentation) - .setFields("presentationId") - .execute(); - String presentationId = presentation.getPresentationId(); - this.deleteFileOnCleanup(presentationId); - return presentationId; - } - - protected String createTestSlide(String presentationId) throws IOException { - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId("TestSlide") - .setInsertionIndex(0) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("BLANK")))); - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSlide().getObjectId(); - } - - protected String createTestTextBox(String presentationId, String pageId) throws IOException { - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateShape().getObjectId(); - } - - protected String createTestSheetsChart(String presentationId, - String pageId, - String spreadsheetId, - Integer sheetChartId) throws IOException { - String presentationChartId = "MyChartId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - } + protected Slides service; + protected Drive driveService; + protected Sheets sheetsService; + + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); + return credentials; + } + + public Slides buildService(GoogleCredentials credential) { + return new Slides.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Drive buildDriveService(GoogleCredentials credential) { + return new Drive.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Sheets buildSheetsService(GoogleCredentials credential) { + return new Sheets.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + @Before + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); + this.service = buildService(credential); + this.driveService = buildDriveService(credential); + this.sheetsService = buildSheetsService(credential); + } + + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); + } + + protected String createTestPresentation() throws IOException { + Presentation presentation = new Presentation() + .setTitle("Test Presentation"); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + return presentation.getPresentationId(); + } + + protected String createTestSlide(String presentationId) throws IOException { + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId("TestSlide") + .setInsertionIndex(0) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("BLANK")))); + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSlide().getObjectId(); + } + + protected String createTestTextBox(String presentationId, String pageId) throws IOException { + String textBoxId = "MyTextBox_01"; + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateShape().getObjectId(); + } + + protected String createTestSheetsChart(String presentationId, + String pageId, + String spreadsheetId, + Integer sheetChartId) throws IOException { + String presentationChartId = "MyChartId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + } } diff --git a/slides/snippets/src/test/java/SnippetsTest.java b/slides/snippets/src/test/java/SnippetsTest.java deleted file mode 100644 index ec2a4ce7..00000000 --- a/slides/snippets/src/test/java/SnippetsTest.java +++ /dev/null @@ -1,160 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SnippetsTest extends BaseTest { - - private Snippets snippets; - - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - private final Integer CHART_ID = 1107320627; - - private final String CUSTOMER_NAME = "Fake Customer"; - - @Before - public void createSnippets() { - this.snippets = new Snippets(this.service, this.driveService, this.sheetsService); - } - - @Test - public void testCreatePresentation() throws IOException { - String presentationId = this.snippets.createPresentation("Title"); - assertNotNull(presentationId); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testCopyPresentation() throws IOException { - String presentationId = this.createTestPresentation(); - String copyId = this.snippets.copyPresentation(presentationId, "My Duplicate Presentation"); - assertNotNull(copyId); - this.deleteFileOnCleanup(copyId); - } - - @Test - public void testCreateSlide() throws IOException { - String presentationId = this.createTestPresentation(); - BatchUpdatePresentationResponse response = this.snippets.createSlide(presentationId); - assertNotNull(response); - assertEquals(1, response.getReplies().size()); - String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); - assertNotNull(pageId); - } - - @Test - public void testCreateTextBox() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createTextBoxWithText(presentationId, pageId); - assertEquals(2, response.getReplies().size()); - String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); - assertNotNull(boxId); - } - - @Test - public void testCreateImage() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = this.snippets.createImage( - presentationId, pageId, this.credential); - assertEquals(1, response.getReplies().size()); - String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); - assertNotNull(imageId); - } - - @Test - public void testTextMerge() throws IOException { - List responses = - this.snippets.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); - for (BatchUpdatePresentationResponse response: responses) { - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(3, response.getReplies().size()); - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - assertEquals(4, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - } - - @Test - public void testImageMerge() throws IOException { - BatchUpdatePresentationResponse response = - this.snippets.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(2, response.getReplies().size()); - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - assertEquals(2, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testSimpleTextReplace() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testTextStyleUpdate() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.textStyleUpdate(presentationId, boxId); - assertEquals(3, response.getReplies().size()); - } - - @Test - public void testCreateBulletText() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.createBulletedText(presentationId, boxId); - assertEquals(1, response.getReplies().size()); - } - - @Test - public void testCreateSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createSheetsChart( - presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - assertEquals(1, response.getReplies().size()); - String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - assertNotNull(chartId); - } - - @Test - public void testRefreshSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String chartId = - this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - BatchUpdatePresentationResponse response = - this.snippets.refreshSheetsChart(presentationId, chartId); - assertEquals(1, response.getReplies().size()); - } -} diff --git a/slides/snippets/src/test/java/TestCopyPresentation.java b/slides/snippets/src/test/java/TestCopyPresentation.java new file mode 100644 index 00000000..ddbf8d3e --- /dev/null +++ b/slides/snippets/src/test/java/TestCopyPresentation.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for copy presentation snippet +public class TestCopyPresentation extends BaseTest { + + @Test + public void testCopyPresentation() throws IOException { + String presentationId = createTestPresentation(); + String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); + assertNotNull(copyId); + deleteFileOnCleanup(copyId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateBulletedText.java b/slides/snippets/src/test/java/TestCreateBulletedText.java new file mode 100644 index 00000000..8d707000 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateBulletedText.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for createBulletedText snippet +public class TestCreateBulletedText extends BaseTest { + + @Test + public void testCreateBulletText() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + CreateBulletedText.createBulletedText(presentationId, boxId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateImage.java b/slides/snippets/src/test/java/TestCreateImage.java new file mode 100644 index 00000000..d4d51840 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateImage.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createImage snippet +public class TestCreateImage extends BaseTest { + + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + + @Test + public void testCreateImage() throws IOException { + String presentationId = createTestPresentation(); + String slideId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = CreateImage.createImage( + presentationId, slideId, IMAGE_URL); + assertEquals(1, response.getReplies().size()); + String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); + assertNotNull(imageId); + } +} diff --git a/slides/snippets/src/test/java/TestCreatePresentation.java b/slides/snippets/src/test/java/TestCreatePresentation.java new file mode 100644 index 00000000..06bdd053 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreatePresentation.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createPresentation snippet +public class TestCreatePresentation extends BaseTest { + + @Test + public void testCreatePresentation() throws IOException { + String presentationId = CreatePresentation.createPresentation("Title"); + assertNotNull(presentationId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSheetsChart.java b/slides/snippets/src/test/java/TestCreateSheetsChart.java new file mode 100644 index 00000000..7e7fa2c8 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSheetsChart.java @@ -0,0 +1,41 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSheetsChart snippet +public class TestCreateSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testCreateSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateSheetsChart.createSheetsChart( + presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + assertEquals(1, response.getReplies().size()); + String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + assertNotNull(chartId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSlide.java b/slides/snippets/src/test/java/TestCreateSlide.java new file mode 100644 index 00000000..506baa9d --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSlide.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSlide snippet +public class TestCreateSlide extends BaseTest { + + @Test + public void testCreateSlide() throws IOException { + String presentationId = createTestPresentation(); + BatchUpdatePresentationResponse response = + CreateSlide.createSlide(presentationId); + assertNotNull(response); + assertEquals(1, response.getReplies().size()); + String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); + assertNotNull(pageId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateTextboxWithText.java b/slides/snippets/src/test/java/TestCreateTextboxWithText.java new file mode 100644 index 00000000..60dacb02 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateTextboxWithText.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createTextboxWithText snippet +public class TestCreateTextboxWithText extends BaseTest { + + @Test + public void testCreateTextBox() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateTextboxWithText.createTextBoxWithText(presentationId, + pageId, "MyTextBox"); + assertEquals(2, response.getReplies().size()); + String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); + assertNotNull(boxId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestImageMerging.java b/slides/snippets/src/test/java/TestImageMerging.java new file mode 100644 index 00000000..43c6a4c4 --- /dev/null +++ b/slides/snippets/src/test/java/TestImageMerging.java @@ -0,0 +1,46 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for imageMerging snippet +public class TestImageMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String CUSTOMER_NAME = "Fake Customer"; + + @Test + public void testImageMerge() throws IOException { + BatchUpdatePresentationResponse response = + ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(2, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + assertEquals(2, numReplacements); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestRefreshSheetsChart.java b/slides/snippets/src/test/java/TestRefreshSheetsChart.java new file mode 100644 index 00000000..6031f85b --- /dev/null +++ b/slides/snippets/src/test/java/TestRefreshSheetsChart.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for refreshSheetsChart snippet +public class TestRefreshSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testRefreshSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String chartId = + this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + BatchUpdatePresentationResponse response = + RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestSimpleTextReplace.java b/slides/snippets/src/test/java/TestSimpleTextReplace.java new file mode 100644 index 00000000..67df2489 --- /dev/null +++ b/slides/snippets/src/test/java/TestSimpleTextReplace.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for simpleTextReplace snippet +public class TestSimpleTextReplace extends BaseTest { + + @Test + public void testSimpleTextReplace() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestTextMerging.java b/slides/snippets/src/test/java/TestTextMerging.java new file mode 100644 index 00000000..873e89f5 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextMerging.java @@ -0,0 +1,47 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for textMerging snippet +public class TestTextMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + + @Test + public void testTextMerge() throws IOException { + List responses = + TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); + for (BatchUpdatePresentationResponse response : responses) { + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(3, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + assertEquals(4, numReplacements); + deleteFileOnCleanup(presentationId); + } + } +} diff --git a/slides/snippets/src/test/java/TestTextStyleUpdate.java b/slides/snippets/src/test/java/TestTextStyleUpdate.java new file mode 100644 index 00000000..d751c217 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextStyleUpdate.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for textStyleUpdate snippet +public class TestTextStyleUpdate extends BaseTest { + + @Test + public void testTextStyleUpdate() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String boxId = this.createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + TextStyleUpdate.textStyleUpdate(presentationId, boxId); + assertEquals(3, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/test.sh b/slides/snippets/test.sh deleted file mode 100755 index fbe3fff3..00000000 --- a/slides/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test \ No newline at end of file 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] diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 1e4b111a..2ae5b7d2 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'TasksQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-2.0.0' } \ No newline at end of file diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 3b8abca9..3e3f8346 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START tasks_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -21,13 +22,12 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.tasks.Tasks; import com.google.api.services.tasks.TasksScopes; import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskLists; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,61 +37,64 @@ import java.util.List; public class TasksQuickstart { - private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the first 10 task lists. - TaskLists result = service.tasklists().list() - .setMaxResults(10L) - .execute(); - List taskLists = result.getItems(); - if (taskLists == null || taskLists.isEmpty()) { - System.out.println("No task lists found."); - } else { - System.out.println("Task lists:"); - for (TaskList tasklist : taskLists) { - System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); - } - } + // Print the first 10 task lists. + TaskLists result = service.tasklists().list() + .setMaxResults(10) + .execute(); + List taskLists = result.getItems(); + if (taskLists == null || taskLists.isEmpty()) { + System.out.println("No task lists found."); + } else { + System.out.println("Task lists:"); + for (TaskList tasklist : taskLists) { + System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); + } } + } } // [END tasks_quickstart] diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 1e7b2e97..d3221860 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'Quickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' } diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 36b2a8c2..66d99a64 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START vault_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -20,7 +21,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.vault.v1.VaultScopes; @@ -35,100 +36,109 @@ import java.util.List; public class Quickstart { - /** Application name. */ - private static final String APPLICATION_NAME = - "Google Vault API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = - JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Google Vault API Java Quickstart"; - /** Global instance of the scopes required by this quickstart. - * - * If modifying these scopes, delete your previously saved credentials - * at ~/.credentials/vault.googleapis.com-java-quickstart - */ - private static final List SCOPES = - Arrays.asList(VaultScopes.EDISCOVERY_READONLY); + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + *

+ * If modifying these scopes, delete your previously saved credentials + * at ~/.credentials/vault.googleapis.com-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(VaultScopes.EDISCOVERY_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } + } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = - Quickstart.class.getResourceAsStream("/credentials.json"); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = new AuthorizationCodeInstalledApp( - flow, new LocalServerReceiver()).authorize("user"); - System.out.println( - "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + Quickstart.class.getResourceAsStream("/credentials.json"); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - /** - * Build and return an authorized Vault client service. - * @return an authorized Vault client service - * @throws IOException - */ - public static Vault getVaultService() throws IOException { - Credential credential = authorize(); - return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Vault service = getVaultService(); + /** + * Build and return an authorized Vault client service. + * + * @return an authorized Vault client service + * @throws IOException + */ + public static Vault getVaultService() throws IOException { + Credential credential = authorize(); + return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } - // List the first 10 matters. - ListMattersResponse response = service.matters().list() - .setPageSize(10) - .execute(); - List matters = response.getMatters(); - if (matters == null || matters.size() == 0) { - System.out.println("No matters found."); - } else { - System.out.println("Matters:"); - for (Matter matter: matters) { - System.out.printf("%s (%s)\n", matter.getName(), - matter.getMatterId()); - } - } + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Vault service = getVaultService(); + + // List the first 10 matters. + ListMattersResponse response = service.matters().list() + .setPageSize(10) + .execute(); + List matters = response.getMatters(); + if (matters == null || matters.size() == 0) { + System.out.println("No matters found."); + return; + } + System.out.println("Matters:"); + for (Matter matter : matters) { + System.out.printf("%s (%s)\n", matter.getName(), + matter.getMatterId()); } + } } // [END vault_quickstart] diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 25933cd7..16a5b2c2 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'com.google.vault.chatmigration.QuickStart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,11 +12,11 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' - compile group: 'org.apache.commons', name: 'commons-csv', version: '1.1' - compile "com.github.rholder:guava-retrying:2.0.0" - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' - compile group: 'commons-cli', name: 'commons-cli', version: '1.4' + implementation 'com.google.api-client:google-api-client:2.0.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' + implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' + implementation 'com.github.rholder:guava-retrying:2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java index 55d2bf7c..4c36043a 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java @@ -1,10 +1,26 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.model.OrgUnit; -import com.google.api.services.admin.directory.model.OrgUnits; -import com.google.api.services.admin.directory.model.User; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnits; +import com.google.api.services.directory.model.User; import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java index 7cfc8ed7..25a06f0f 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; @@ -19,15 +35,14 @@ import org.apache.commons.csv.CSVRecord; public class DuplicateHold { - private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); - private static final String ERROR_DESCRIPTION = "Error Description"; public static final String HOLD_NAME_SUFFIX = "_hangoutsChat"; + private static final String ERROR_DESCRIPTION = "Error Description"; private static final int MAX_ACCOUNTS_FOR_HOLD = 100; - + private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); + Vault vaultService; private CSVParser csvParser; private boolean includeRooms; private CSVPrinter errorReport; - Vault vaultService; private int numberOfHolds = 0; public DuplicateHold( @@ -50,8 +65,8 @@ public int duplicateHolds() throws Exception { (accounts.equals("")) ? null : Arrays.stream(accounts.split(",")) - .map(account -> new HeldAccount().setAccountId(account)) - .collect(Collectors.toList()); + .map(account -> new HeldAccount().setAccountId(account)) + .collect(Collectors.toList()); boolean exceedsAccountLimit = false; Hold hold = new Hold().setName(name + HOLD_NAME_SUFFIX).setCorpus("HANGOUTS_CHAT"); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index 8ed6af36..d42f608b 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -1,6 +1,22 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnit; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.model.Hold; import com.google.api.services.vault.v1.model.ListHoldsResponse; @@ -15,8 +31,6 @@ public class HoldsReport { - private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); - public static final String MATTER_ID = "Matter Id"; public static final String MATTER_NAME = "Matter Name"; public static final String HOLD_ID = "Hold Id"; @@ -30,7 +44,7 @@ public class HoldsReport { public static final String TERMS = "Terms"; public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; - + private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); private Vault vaultService; private DirectoryService directoryService; private CSVPrinter printer; @@ -55,11 +69,11 @@ private void iterateMatters(String nextPageToken) throws Exception { ListMattersResponse response = RetryableTemplate.callWithRetry( vaultService - .matters() - .list() - .setState("OPEN") - .setPageSize(100) - .setPageToken(nextPageToken) + .matters() + .list() + .setState("OPEN") + .setPageSize(100) + .setPageToken(nextPageToken) ::execute); List matters = response.getMatters(); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index d66a9551..c18f697c 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.google.api.client.auth.oauth2.Credential; @@ -8,10 +24,10 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.VaultScopes; import java.io.IOException; @@ -27,44 +43,25 @@ public class MigrationHelper { - enum MigrationOptions { - GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), - DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), - REPORT_FILE("f", "reportfile", "Path to holds report file"), - ERROR_FILE("e", "errorfile", "Path to error report file"), - INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), - HELP("h", "help", "Options Help"); - - private final String option; - private final String longOpt; - private final String description; - - MigrationOptions(String opt, String longOpt, String description) { - this.option = opt; - this.longOpt = longOpt; - this.description = description; - } - - public String getOption() { - return option; - } - } - - /** Application name. */ + static final Option helpOption = + Option.builder(MigrationOptions.HELP.option) + .longOpt(MigrationOptions.HELP.longOpt) + .argName("help") + .desc(MigrationOptions.HELP.description) + .build(); + /** + * Application name. + */ private static final String APPLICATION_NAME = "Google Vault API Java Quickstart"; - /** Directory to store authorization tokens for this application. */ + /** + * Directory to store authorization tokens for this application. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** * Global instance of the scopes required by this quickstart. * @@ -76,6 +73,14 @@ public String getOption() { VaultScopes.EDISCOVERY, DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; static { try { @@ -90,13 +95,6 @@ public String getOption() { } } - static final Option helpOption = - Option.builder(MigrationOptions.HELP.option) - .longOpt(MigrationOptions.HELP.longOpt) - .argName("help") - .desc(MigrationOptions.HELP.description) - .build(); - static Options buildOptions() { Options options = new Options(); @@ -198,4 +196,27 @@ public static Directory getDirectoryService() throws IOException { .build(); return service; } + + enum MigrationOptions { + GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), + DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), + REPORT_FILE("f", "reportfile", "Path to holds report file"), + ERROR_FILE("e", "errorfile", "Path to error report file"), + INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), + HELP("h", "help", "Options Help"); + + private final String option; + private final String longOpt; + private final String description; + + MigrationOptions(String opt, String longOpt, String description) { + this.option = opt; + this.longOpt = longOpt; + this.description = description; + } + + public String getOption() { + return option; + } + } } diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java index b4fd4cea..c94ccbfc 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java @@ -1,6 +1,22 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.Directory; +import com.google.api.services.directory.Directory; import com.google.api.services.vault.v1.Vault; import com.google.vault.chatmigration.MigrationHelper.MigrationOptions; import java.io.File; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java index 5f1fc347..d9642d58 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException;