From 0d6d505ff2154a23da09eca17341fa962a165f1e Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Wed, 20 Oct 2021 20:21:09 +0200 Subject: [PATCH 001/343] Add @PierreBtz as code owner --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 68a799752..cd0295f3c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,4 +5,4 @@ # @cloudbees/team-support will be requested for # review when someone opens a pull request. -* @aheritier @johnou @duemir +* @aheritier @johnou @duemir @PierreBtz From de2e3ddae96558e63fd63aeec4107ee3ac4a01f1 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 20 Oct 2021 21:05:17 +0200 Subject: [PATCH 002/343] [fix] RealSmokeTest#createOrganization test was failing Because it was too long to review in 30sec all organizations to delete the ones with a given externalId We now directly search for these specific orgs to delete them --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index fff2f4943..54631b50a 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1060,10 +1060,8 @@ public void createOrganization() throws Exception { createClientWithTokenOrPassword(); // Clean up to avoid conflicts - for (Organization t : instance.getOrganizations()) { - if ("testorg".equals(t.getExternalId())) { - instance.deleteOrganization(t); - } + for (Organization t : instance.lookupOrganizationsByExternalId("testorg")) { + instance.deleteOrganization(t); } Organization org = new Organization(); From 4f996246b838035ca0089f6dee6e4b63cf104af3 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 20 Oct 2021 21:46:04 +0200 Subject: [PATCH 003/343] [fix] Do not execute integration tests when not setup --- .../java/org/zendesk/client/v2/RealSmokeTest.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index fff2f4943..54b0e66d3 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -77,6 +77,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.lessThanOrEqualTo; @@ -116,21 +117,21 @@ public class RealSmokeTest { public static void loadConfig() { config = ZendeskConfig.load(); assumeThat("We have a configuration", config, notNullValue()); - assertThat("Configuration has an url", config.getProperty("url"), notNullValue()); + assumeThat("Configuration has an url", config.getProperty("url"), not(isEmptyString())); } public void assumeHaveToken() { - assumeThat("We have a username", config.getProperty("username"), notNullValue()); - assumeThat("We have a token", config.getProperty("token"), notNullValue()); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); + assumeThat("We have a token", config.getProperty("token"), not(isEmptyString())); } public void assumeHavePassword() { - assumeThat("We have a username", config.getProperty("username"), notNullValue()); - assumeThat("We have a password", config.getProperty("password"), notNullValue()); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); + assumeThat("We have a password", config.getProperty("password"), not(isEmptyString())); } public void assumeHaveTokenOrPassword() { - assumeThat("We have a username", config.getProperty("username"), notNullValue()); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); assumeThat("We have a token or password", config.getProperty("token") != null || config.getProperty("password") != null, is( true)); } From 9595c2d4dd77d31c758f5ddca863b558c6ea97b8 Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Wed, 20 Oct 2021 21:50:42 +0200 Subject: [PATCH 004/343] Add codeql analysis --- .github/workflows/codeql-analysis.yml | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..636cede1c --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '30 8 * * 2' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'java' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 From c7a0e9e5aebcbbcf475f64197b8b2e08afc95d12 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 20 Oct 2021 21:58:33 +0200 Subject: [PATCH 005/343] [chore] Split PRs and Masters CI builds --- .github/workflows/{ci.yml => ci-master.yml} | 2 -- .github/workflows/ci-pr.yml | 27 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) rename .github/workflows/{ci.yml => ci-master.yml} (97%) create mode 100644 .github/workflows/ci-pr.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci-master.yml similarity index 97% rename from .github/workflows/ci.yml rename to .github/workflows/ci-master.yml index a170ab410..ff44fbe07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci-master.yml @@ -6,8 +6,6 @@ name: Java CI with Maven on: push: branches: [ master ] - pull_request: - branches: [ master ] jobs: build: diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml new file mode 100644 index 000000000..d6f313b5a --- /dev/null +++ b/.github/workflows/ci-pr.yml @@ -0,0 +1,27 @@ +# This workflow will build a Java project with Maven +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: Java CI with Maven for PRs + +on: + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud + fetch-depth: 0 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c6eea647cd5773a09fa51dc5f0a61dd0175e98d1 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 20 Oct 2021 22:02:27 +0200 Subject: [PATCH 006/343] [chore] Update dependabot settings * Execute daily * Check for github action updates --- .github/dependabot.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4c2239364..d06e1afd9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,4 +8,9 @@ updates: - package-ecosystem: "maven" # See documentation for possible values directory: "/" # Location of package manifests schedule: - interval: "weekly" + interval: "daily" + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" From cebbc7532616bab5f07b62488690c97338e8dd55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:04:40 +0000 Subject: [PATCH 007/343] Bump async-http-client from 2.12.2 to 2.12.3 Bumps [async-http-client](https://github.com/AsyncHttpClient/async-http-client) from 2.12.2 to 2.12.3. - [Release notes](https://github.com/AsyncHttpClient/async-http-client/releases) - [Changelog](https://github.com/AsyncHttpClient/async-http-client/blob/master/CHANGES.md) - [Commits](https://github.com/AsyncHttpClient/async-http-client/compare/async-http-client-project-2.12.2...async-http-client-project-2.12.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba0f51eba..7b69569f6 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ org.asynchttpclient async-http-client - 2.12.2 + 2.12.3 com.fasterxml.jackson.core From 8cb75ef8af88cd369f1fbcb8d137c2d9ef1e7cff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:05:31 +0000 Subject: [PATCH 008/343] Bump release-drafter/release-drafter from 5.11.0 to 5.15.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.11.0 to 5.15.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.11.0...v5.15.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 7292bee51..f55b27f10 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.11.0 + - uses: release-drafter/release-drafter@v5.15.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 47b464e125d8a72950d907a459afb52ec0844cb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:05:35 +0000 Subject: [PATCH 009/343] Bump actions/setup-java from 1 to 2.3.1 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 1 to 2.3.1. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v1...v2.3.1) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-master.yml | 4 ++-- .github/workflows/ci-pr.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index ff44fbe07..52cd10c0b 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2.3.1 with: java-version: 1.8 - name: Build with Maven @@ -32,7 +32,7 @@ jobs: ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL }} ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME }} - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2.3.1 with: java-version: 11 - name: Analyze with SonarQube diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index d6f313b5a..1a3fa8807 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2.3.1 with: java-version: 1.8 - name: Build with Maven From 25ebf5853e91506ffad7894153b9e002481fee45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:07:48 +0000 Subject: [PATCH 010/343] Bump awaitility from 4.0.3 to 4.1.0 Bumps [awaitility](https://github.com/awaitility/awaitility) from 4.0.3 to 4.1.0. - [Release notes](https://github.com/awaitility/awaitility/releases) - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/commits/awaitility-4.1.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba0f51eba..10d7e85b9 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ org.awaitility awaitility - 4.0.3 + 4.1.0 test From ce12f8fe707054d55050bb8dc81c19794efbd1d0 Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Wed, 20 Oct 2021 22:16:11 +0200 Subject: [PATCH 011/343] Add distribution for setup-java v2 --- .github/workflows/ci-master.yml | 2 ++ .github/workflows/ci-pr.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index 52cd10c0b..717cf2613 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -20,6 +20,7 @@ jobs: - name: Set up JDK 1.8 uses: actions/setup-java@v2.3.1 with: + distribution: 'adopt' java-version: 1.8 - name: Build with Maven run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage @@ -34,6 +35,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v2.3.1 with: + distribution: 'adopt' java-version: 11 - name: Analyze with SonarQube run: mvn --show-version --no-transfer-progress sonar:sonar --file pom.xml -Dsonar.organization=cloudbees -Dsonar.host.url=${SONAR_URL} -Dsonar.login=${SONAR_TOKEN} diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 1a3fa8807..4cbbe5258 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -20,6 +20,7 @@ jobs: - name: Set up JDK 1.8 uses: actions/setup-java@v2.3.1 with: + distribution: 'adopt' java-version: 1.8 - name: Build with Maven run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage From ab6a458e1e67206e3e92fef6d4492fd10fbaeae9 Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Wed, 20 Oct 2021 22:19:36 +0200 Subject: [PATCH 012/343] Java 8 instead of 1.8 --- .github/workflows/ci-master.yml | 2 +- .github/workflows/ci-pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index 717cf2613..e1ecc45ac 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-java@v2.3.1 with: distribution: 'adopt' - java-version: 1.8 + java-version: 8 - name: Build with Maven run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage env: diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 4cbbe5258..dc10c395c 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-java@v2.3.1 with: distribution: 'adopt' - java-version: 1.8 + java-version: 8 - name: Build with Maven run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage env: From 9c817693d6452feb4cefc8ade6147be72d476690 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:21:31 +0000 Subject: [PATCH 013/343] Bump jacoco-maven-plugin from 0.8.6 to 0.8.7 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.6 to 0.8.7. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.6...v0.8.7) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 968bfe4d3..001d95244 100644 --- a/pom.xml +++ b/pom.xml @@ -253,7 +253,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + 0.8.7 prepare-agent From aabd97345c05a4f1f27dc9c63ffcdd19481135e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:22:25 +0000 Subject: [PATCH 014/343] Bump assertj-core from 3.19.0 to 3.21.0 Bumps [assertj-core](https://github.com/assertj/assertj-core) from 3.19.0 to 3.21.0. - [Release notes](https://github.com/assertj/assertj-core/releases) - [Commits](https://github.com/assertj/assertj-core/compare/assertj-core-3.19.0...assertj-core-3.21.0) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 968bfe4d3..c57a92cc6 100644 --- a/pom.xml +++ b/pom.xml @@ -157,7 +157,7 @@ org.assertj assertj-core - 3.19.0 + 3.21.0 test From 3076216a26b45892f534508a7570fe09086f3a2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:23:41 +0000 Subject: [PATCH 015/343] Bump jackson-bom from 2.12.2 to 2.13.0 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.12.2 to 2.13.0. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.12.2...jackson-bom-2.13.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 968bfe4d3..ebb880362 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.12.2 + 2.13.0 pom import From 27562f78c7e1925bd2275d8939da52c34ed804f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:23:42 +0000 Subject: [PATCH 016/343] Bump maven-enforcer-plugin from 3.0.0-M3 to 3.0.0 Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.0.0-M3 to 3.0.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.0.0-M3...enforcer-3.0.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index ba0f51eba..ab1d86b6a 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ org.asynchttpclient async-http-client - 2.12.2 + 2.12.3 com.fasterxml.jackson.core @@ -169,7 +169,7 @@ org.awaitility awaitility - 4.0.3 + 4.1.0 test @@ -179,7 +179,7 @@ maven-enforcer-plugin - 3.0.0-M3 + 3.0.0 org.apache.maven.plugins From cdfd1239b576ec17e9dfba7bde42e92d1a282f9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:32:10 +0000 Subject: [PATCH 017/343] Bump slf4j-api from 1.7.30 to 1.7.32 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 1.7.30 to 1.7.32. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.30...v_1.7.32) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9896e31be..1f75a01e7 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ org.slf4j slf4j-api - 1.7.30 + 1.7.32 org.asynchttpclient From 316544bc00cec55173b53eef05f40b8f6b3b6870 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 20:36:22 +0000 Subject: [PATCH 018/343] Bump slf4j-simple from 1.7.30 to 1.7.32 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 1.7.30 to 1.7.32. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.30...v_1.7.32) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1f75a01e7..057391e9c 100644 --- a/pom.xml +++ b/pom.xml @@ -144,7 +144,7 @@ org.slf4j slf4j-simple - 1.7.30 + 1.7.32 test From 19fa6f80e4543f12dc9cf0624776ae917f7ab0f8 Mon Sep 17 00:00:00 2001 From: Naveen Reddy Alka Date: Mon, 20 Sep 2021 01:54:11 -0700 Subject: [PATCH 019/343] feat(searchPagination): added pagination search api fpr tickets --- pom.xml | 2 +- .../java/org/zendesk/client/v2/Zendesk.java | 999 ++++++++++-------- .../org/zendesk/client/v2/model/Page.java | 41 + .../zendesk/client/v2/model/TicketPage.java | 23 + 4 files changed, 596 insertions(+), 469 deletions(-) create mode 100644 src/main/java/org/zendesk/client/v2/model/Page.java create mode 100644 src/main/java/org/zendesk/client/v2/model/TicketPage.java diff --git a/pom.xml b/pom.xml index 1f75a01e7..973dcb4a0 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.14.2-SNAPSHOT + 0.14.3-SNAPSHOT zendesk-java-client Java client for the Zendesk API diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 1de73d221..1a8c04dad 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1,13 +1,25 @@ package org.zendesk.client.v2; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.StdDateFormat; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; @@ -47,6 +59,7 @@ import org.zendesk.client.v2.model.Ticket; import org.zendesk.client.v2.model.TicketForm; import org.zendesk.client.v2.model.TicketImport; +import org.zendesk.client.v2.model.TicketPage; import org.zendesk.client.v2.model.TicketResult; import org.zendesk.client.v2.model.Topic; import org.zendesk.client.v2.model.Trigger; @@ -59,10 +72,10 @@ import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.ArticleAttachments; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; import org.zendesk.client.v2.model.hc.Translation; -import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.UserSegment; import org.zendesk.client.v2.model.schedules.Holiday; import org.zendesk.client.v2.model.schedules.Schedule; @@ -73,26 +86,14 @@ import org.zendesk.client.v2.model.targets.Target; import org.zendesk.client.v2.model.targets.TwitterTarget; import org.zendesk.client.v2.model.targets.UrlTarget; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; /** * @author stephenc @@ -113,7 +114,7 @@ public class Zendesk implements Closeable { private static final Map> targetTypes = targetTypes(); private static Map> searchResultTypes() { - Map> result = new HashMap<>(); + final Map> result = new HashMap<>(); result.put("ticket", Ticket.class); result.put("user", User.class); result.put("group", Group.class); @@ -122,9 +123,9 @@ private static Map> searchResultType result.put("article", Article.class); return Collections.unmodifiableMap(result); } - + private static Map> targetTypes() { - Map> result = new HashMap<>(); + final Map> result = new HashMap<>(); result.put("url_target", UrlTarget.class); result.put("email_target",EmailTarget.class); result.put("basecamp_target", BasecampTarget.class); @@ -141,7 +142,7 @@ private static Map> targetTypes() { return Collections.unmodifiableMap(result); } - private Zendesk(AsyncHttpClient client, String url, String username, String password, Map headers) { + private Zendesk(final AsyncHttpClient client, final String url, final String username, final String password, final Map headers) { this.logger = LoggerFactory.getLogger(Zendesk.class); this.closeClient = client == null; this.oauthToken = null; @@ -163,7 +164,7 @@ private Zendesk(AsyncHttpClient client, String url, String username, String pass } - private Zendesk(AsyncHttpClient client, String url, String oauthToken, Map headers) { + private Zendesk(final AsyncHttpClient client, final String url, final String oauthToken, final Map headers) { this.logger = LoggerFactory.getLogger(Zendesk.class); this.closeClient = client == null; this.realm = null; @@ -188,11 +189,12 @@ public boolean isClosed() { return closed || client.isClosed(); } + @Override public void close() { if (closeClient && !client.isClosed()) { try { client.close(); - } catch (IOException e) { + } catch (final IOException e) { logger.warn("Unexpected error on client close", e); } } @@ -203,25 +205,25 @@ public void close() { // Action methods ////////////////////////////////////////////////////////////////////// - public JobStatus getJobStatus(JobStatus status) { + public JobStatus getJobStatus(final JobStatus status) { return complete(getJobStatusAsync(status)); } - public ListenableFuture getJobStatusAsync(JobStatus status) { + public ListenableFuture getJobStatusAsync(final JobStatus status) { return submit(req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())), handleJobStatus()); } - public List getJobStatuses(List statuses) { + public List getJobStatuses(final List statuses) { return complete(getJobStatusesAsync(statuses)); } - public ListenableFuture> getJobStatusesAsync(List statuses) { - List ids = new ArrayList<>(statuses.size()); - for (JobStatus status : statuses) { + public ListenableFuture> getJobStatusesAsync(final List statuses) { + final List ids = new ArrayList<>(statuses.size()); + for (final JobStatus status : statuses) { ids.add(status.getId()); } - Class clazz = (Class) (Object) JobStatus.class; + final Class clazz = (Class) (Object) JobStatus.class; return submit(req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)), handleList(clazz, "job_statuses")); } @@ -231,7 +233,7 @@ public List getBrands(){ "brands"))); } - public TicketForm getTicketForm(long id) { + public TicketForm getTicketForm(final long id) { return complete(submit(req("GET", tmpl("/ticket_forms/{id}.json").set("id", id)), handle(TicketForm.class, "ticket_form"))); } @@ -241,41 +243,41 @@ public List getTicketForms() { "ticket_forms"))); } - public TicketForm createTicketForm(TicketForm ticketForm) { + public TicketForm createTicketForm(final TicketForm ticketForm) { return complete(submit(req("POST", cnst("/ticket_forms.json"), JSON, json( Collections.singletonMap("ticket_form", ticketForm))), handle(TicketForm.class, "ticket_form"))); } - public Ticket importTicket(TicketImport ticketImport) { + public Ticket importTicket(final TicketImport ticketImport) { return complete(submit(req("POST", cnst("/imports/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticketImport))), handle(Ticket.class, "ticket"))); } - public JobStatus importTickets(TicketImport... ticketImports) { + public JobStatus importTickets(final TicketImport... ticketImports) { return importTickets(Arrays.asList(ticketImports)); } - public JobStatus importTickets(List ticketImports) { + public JobStatus importTickets(final List ticketImports) { return complete(importTicketsAsync(ticketImports)); } - public ListenableFuture importTicketsAsync(List ticketImports) { + public ListenableFuture importTicketsAsync(final List ticketImports) { return submit(req("POST", cnst("/imports/tickets/create_many.json"), JSON, json( Collections.singletonMap("tickets", ticketImports))), handleJobStatus()); } - public Ticket getTicket(long id) { + public Ticket getTicket(final long id) { return complete(submit(req("GET", tmpl("/tickets/{id}.json").set("id", id)), handle(Ticket.class, "ticket"))); } - public List getTicketIncidents(long id) { + public List getTicketIncidents(final long id) { return complete(submit(req("GET", tmpl("/tickets/{id}/incidents.json").set("id", id)), handleList(Ticket.class, "tickets"))); } - public List getTicketCollaborators(long id) { + public List getTicketCollaborators(final long id) { return complete(submit(req("GET", tmpl("/tickets/{id}/collaborators.json").set("id", id)), handleList(User.class, "users"))); } @@ -290,98 +292,98 @@ public Iterable getDeletedTickets() { /** * https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets */ - public Iterable getDeletedTickets(String sortBy, SortOrder sortOrder) { + public Iterable getDeletedTickets(final String sortBy, final SortOrder sortOrder) { return new PagedIterable<>(tmpl("/deleted_tickets.json?sort_by={sortBy}&sort_order={sortOrder}") .set("sortBy", sortBy) .set("sortOrder", sortOrder.getQueryParameter()), handleList(DeletedTicket.class, "deleted_tickets")); } - public void deleteTicket(Ticket ticket) { + public void deleteTicket(final Ticket ticket) { checkHasId(ticket); deleteTicket(ticket.getId()); } - public void deleteTicket(long id) { + public void deleteTicket(final long id) { complete(submit(req("DELETE", tmpl("/tickets/{id}.json").set("id", id)), handleStatus())); } - public JobStatus permanentlyDeleteTicket(Ticket ticket) { + public JobStatus permanentlyDeleteTicket(final Ticket ticket) { checkHasId(ticket); return permanentlyDeleteTicket(ticket.getId()); } - public JobStatus permanentlyDeleteTicket(long id) { + public JobStatus permanentlyDeleteTicket(final long id) { return complete(submit( req("DELETE", tmpl("/deleted_tickets/{id}.json").set("id", id)), handleJobStatus()) ); } - public ListenableFuture queueCreateTicketAsync(Ticket ticket) { + public ListenableFuture queueCreateTicketAsync(final Ticket ticket) { return submit(req("POST", cnst("/tickets.json?async=true"), JSON, json(Collections.singletonMap("ticket", ticket))), handleJobStatus()); } - public ListenableFuture createTicketAsync(Ticket ticket) { + public ListenableFuture createTicketAsync(final Ticket ticket) { return submit(req("POST", cnst("/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket")); } - public Ticket createTicket(Ticket ticket) { + public Ticket createTicket(final Ticket ticket) { return complete(createTicketAsync(ticket)); } - public JobStatus createTickets(Ticket... tickets) { + public JobStatus createTickets(final Ticket... tickets) { return createTickets(Arrays.asList(tickets)); } - public JobStatus createTickets(List tickets) { + public JobStatus createTickets(final List tickets) { return complete(createTicketsAsync(tickets)); } - public ListenableFuture createTicketsAsync(List tickets) { + public ListenableFuture createTicketsAsync(final List tickets) { return submit(req("POST", cnst("/tickets/create_many.json"), JSON, json( Collections.singletonMap("tickets", tickets))), handleJobStatus()); } - public Ticket updateTicket(Ticket ticket) { + public Ticket updateTicket(final Ticket ticket) { checkHasId(ticket); return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticket.getId()), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket"))); } - public JobStatus updateTickets(Ticket... tickets) { + public JobStatus updateTickets(final Ticket... tickets) { return updateTickets(Arrays.asList(tickets)); } - public JobStatus updateTickets(List tickets) { + public JobStatus updateTickets(final List tickets) { return complete(updateTicketsAsync(tickets)); } - public ListenableFuture updateTicketsAsync(List tickets) { + public ListenableFuture updateTicketsAsync(final List tickets) { return submit(req("PUT", cnst("/tickets/update_many.json"), JSON, json( Collections.singletonMap("tickets", tickets))), handleJobStatus()); } - public void markTicketAsSpam(Ticket ticket) { + public void markTicketAsSpam(final Ticket ticket) { checkHasId(ticket); markTicketAsSpam(ticket.getId()); } - public void markTicketAsSpam(long id) { + public void markTicketAsSpam(final long id) { complete(submit(req("PUT", tmpl("/tickets/{id}/mark_as_spam.json").set("id", id)), handleStatus())); } - public void deleteTickets(long id, long... ids) { + public void deleteTickets(final long id, final long... ids) { complete(submit(req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), handleStatus())); } - public JobStatus permanentlyDeleteTickets(long id, long... ids) { + public JobStatus permanentlyDeleteTickets(final long id, final long... ids) { return complete( submit( req("DELETE", tmpl("/deleted_tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), @@ -399,13 +401,13 @@ public Iterable getTickets() { * @return */ @Deprecated - public Iterable getTicketsByStatus(Status... ticketStatus) { + public Iterable getTicketsByStatus(final Status... ticketStatus) { return new PagedIterable<>(tmpl("/tickets.json{?status}").set("status", statusArray(ticketStatus)), handleList(Ticket.class, "tickets")); } - public Iterable getTicketsByExternalId(String externalId, boolean includeArchived) { - Iterable results = + public Iterable getTicketsByExternalId(final String externalId, final boolean includeArchived) { + final Iterable results = new PagedIterable<>(tmpl("/tickets.json{?external_id}").set("external_id", externalId), handleList(Ticket.class, "tickets")); @@ -417,41 +419,41 @@ public Iterable getTicketsByExternalId(String externalId, boolean includ handleList(Ticket.class, "results")); } - public Iterable getTicketsByExternalId(String externalId) { + public Iterable getTicketsByExternalId(final String externalId) { return getTicketsByExternalId(externalId, false); } - public Iterable getTicketsFromSearch(String searchTerm) { + public Iterable getTicketsFromSearch(final String searchTerm) { return new PagedIterable<>(tmpl("/search.json{?query}").set("query", searchTerm + "+type:ticket"), handleList(Ticket.class, "results")); } - public Iterable
getArticleFromSearch(String searchTerm) { + public Iterable
getArticleFromSearch(final String searchTerm) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?query}").set("query", searchTerm), handleList(Article.class, "results")); } - public Iterable
getArticleFromSearch(String searchTerm, Long sectionId) { + public Iterable
getArticleFromSearch(final String searchTerm, final Long sectionId) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?section,query}") .set("query", searchTerm).set("section", sectionId), handleList(Article.class, "results")); } - public Iterable
getArticlesFromAnyLabels(List labels) { + public Iterable
getArticlesFromAnyLabels(final List labels) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?label_names}").set("label_names", labels), handleList(Article.class, "results")); } - public Iterable
getArticlesFromAllLabels(List labels) { + public Iterable
getArticlesFromAllLabels(final List labels) { return new PagedIterable<>(tmpl("/help_center/en-us/articles.json{?label_names}").set("label_names", labels), handleList(Article.class, "articles")); } - public List getAttachmentsFromArticle(Long articleID) { + public List getAttachmentsFromArticle(final Long articleID) { return complete(submit(req("GET", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleID)), handleArticleAttachmentsList("article_attachments"))); } - public List getTickets(long id, long... ids) { + public List getTickets(final long id, final long... ids) { return complete(submit(req("GET", tmpl("/tickets/show_many.json{?ids}").set("ids", idArray(id, ids))), handleList(Ticket.class, "tickets"))); } @@ -463,7 +465,7 @@ public Iterable getRecentTickets() { /** * https://developer.zendesk.com/rest_api/docs/support/incremental_export */ - public Iterable getTicketsIncrementally(Date startTime) { + public Iterable getTicketsIncrementally(final Date startTime) { return new PagedIterable<>( tmpl("/incremental/tickets.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(Ticket.class, "tickets")); @@ -475,7 +477,7 @@ public Iterable getTicketsIncrementally(Date startTime) { * @deprecated incremental export does not support an end_time parameter */ @Deprecated - public Iterable getTicketsIncrementally(Date startTime, Date endTime) { + public Iterable getTicketsIncrementally(final Date startTime, final Date endTime) { return new PagedIterable<>( tmpl("/incremental/tickets.json{?start_time,end_time}") .set("start_time", msToSeconds(startTime.getTime())) @@ -483,28 +485,28 @@ public Iterable getTicketsIncrementally(Date startTime, Date endTime) { handleIncrementalList(Ticket.class, "tickets")); } - public Iterable getOrganizationTickets(long organizationId) { + public Iterable getOrganizationTickets(final long organizationId) { return new PagedIterable<>( tmpl("/organizations/{organizationId}/tickets.json").set("organizationId", organizationId), handleList(Ticket.class, "tickets")); } - public Iterable getUserRequestedTickets(long userId) { + public Iterable getUserRequestedTickets(final long userId) { return new PagedIterable<>(tmpl("/users/{userId}/tickets/requested.json").set("userId", userId), handleList(Ticket.class, "tickets")); } - public Iterable getComplianceDeletionStatuses(long userId) { + public Iterable getComplianceDeletionStatuses(final long userId) { return new PagedIterable<>(tmpl("/users/{userId}/compliance_deletion_statuses.json").set("userId", userId), handleList(ComplianceDeletionStatus.class, "compliance_deletion_statuses")); } - public Iterable getUserCCDTickets(long userId) { + public Iterable getUserCCDTickets(final long userId) { return new PagedIterable<>(tmpl("/users/{userId}/tickets/ccd.json").set("userId", userId), handleList(Ticket.class, "tickets")); } - public UserRelatedInfo getUserRelatedInfo(long userId) { + public UserRelatedInfo getUserRelatedInfo(final long userId) { return complete(submit(req("GET", tmpl("/users/{userId}/related.json").set("userId", userId)), handle(UserRelatedInfo.class, "user_related"))); } @@ -513,67 +515,67 @@ public Iterable getTicketMetrics() { return new PagedIterable<>(cnst("/ticket_metrics.json"), handleList(Metric.class, "ticket_metrics")); } - public Metric getTicketMetricByTicket(long id) { + public Metric getTicketMetricByTicket(final long id) { return complete(submit(req("GET", tmpl("/tickets/{ticketId}/metrics.json").set("ticketId", id)), handle(Metric.class, "ticket_metric"))); } - public Metric getTicketMetric(long id) { + public Metric getTicketMetric(final long id) { return complete(submit(req("GET", tmpl("/ticket_metrics/{ticketMetricId}.json").set("ticketMetricId", id)), handle(Metric.class, "ticket_metric"))); } - public Iterable getTicketAudits(Ticket ticket) { + public Iterable getTicketAudits(final Ticket ticket) { checkHasId(ticket); return getTicketAudits(ticket.getId()); } - public Iterable getTicketAudits(Long id) { + public Iterable getTicketAudits(final Long id) { return new PagedIterable<>(tmpl("/tickets/{ticketId}/audits.json").set("ticketId", id), handleList(Audit.class, "audits")); } - public Audit getTicketAudit(Ticket ticket, Audit audit) { + public Audit getTicketAudit(final Ticket ticket, final Audit audit) { checkHasId(audit); return getTicketAudit(ticket, audit.getId()); } - public Audit getTicketAudit(Ticket ticket, long id) { + public Audit getTicketAudit(final Ticket ticket, final long id) { checkHasId(ticket); return getTicketAudit(ticket.getId(), id); } - public Audit getTicketAudit(long ticketId, long auditId) { + public Audit getTicketAudit(final long ticketId, final long auditId) { return complete(submit(req("GET", tmpl("/tickets/{ticketId}/audits/{auditId}.json").set("ticketId", ticketId) .set("auditId", auditId)), handle(Audit.class, "audit"))); } - public void trustTicketAudit(Ticket ticket, Audit audit) { + public void trustTicketAudit(final Ticket ticket, final Audit audit) { checkHasId(audit); trustTicketAudit(ticket, audit.getId()); } - public void trustTicketAudit(Ticket ticket, long id) { + public void trustTicketAudit(final Ticket ticket, final long id) { checkHasId(ticket); trustTicketAudit(ticket.getId(), id); } - public void trustTicketAudit(long ticketId, long auditId) { + public void trustTicketAudit(final long ticketId, final long auditId) { complete(submit(req("PUT", tmpl("/tickets/{ticketId}/audits/{auditId}/trust.json").set("ticketId", ticketId) .set("auditId", auditId)), handleStatus())); } - public void makePrivateTicketAudit(Ticket ticket, Audit audit) { + public void makePrivateTicketAudit(final Ticket ticket, final Audit audit) { checkHasId(audit); makePrivateTicketAudit(ticket, audit.getId()); } - public void makePrivateTicketAudit(Ticket ticket, long id) { + public void makePrivateTicketAudit(final Ticket ticket, final long id) { checkHasId(ticket); makePrivateTicketAudit(ticket.getId(), id); } - public void makePrivateTicketAudit(long ticketId, long auditId) { + public void makePrivateTicketAudit(final long ticketId, final long auditId) { complete(submit(req("PUT", tmpl("/tickets/{ticketId}/audits/{auditId}/make_private.json").set("ticketId", ticketId) .set("auditId", auditId)), handleStatus())); @@ -583,28 +585,28 @@ public List getTicketFields() { return complete(submit(req("GET", cnst("/ticket_fields.json")), handleList(Field.class, "ticket_fields"))); } - public Field getTicketField(long id) { + public Field getTicketField(final long id) { return complete(submit(req("GET", tmpl("/ticket_fields/{id}.json").set("id", id)), handle(Field.class, "ticket_field"))); } - public Field createTicketField(Field field) { + public Field createTicketField(final Field field) { return complete(submit(req("POST", cnst("/ticket_fields.json"), JSON, json( Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); } - public Field updateTicketField(Field field) { + public Field updateTicketField(final Field field) { checkHasId(field); return complete(submit(req("PUT", tmpl("/ticket_fields/{id}.json").set("id", field.getId()), JSON, json(Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); } - public void deleteTicketField(Field field) { + public void deleteTicketField(final Field field) { checkHasId(field); deleteTicket(field.getId()); } - public void deleteTicketField(long id) { + public void deleteTicketField(final long id) { complete(submit(req("DELETE", tmpl("/ticket_fields/{id}.json").set("id", id)), handleStatus())); } @@ -613,25 +615,25 @@ public Iterable getSuspendedTickets() { handleList(SuspendedTicket.class, "suspended_tickets")); } - public void deleteSuspendedTicket(SuspendedTicket ticket) { + public void deleteSuspendedTicket(final SuspendedTicket ticket) { checkHasId(ticket); deleteSuspendedTicket(ticket.getId()); } - public void deleteSuspendedTicket(long id) { + public void deleteSuspendedTicket(final long id) { complete(submit(req("DELETE", tmpl("/suspended_tickets/{id}.json").set("id", id)), handleStatus())); } - public Attachment.Upload createUpload(String fileName, byte[] content) { + public Attachment.Upload createUpload(final String fileName, final byte[] content) { return createUpload(null, fileName, "application/binary", content); } - public Attachment.Upload createUpload(String fileName, String contentType, byte[] content) { + public Attachment.Upload createUpload(final String fileName, final String contentType, final byte[] content) { return createUpload(null, fileName, contentType, content); } - public Attachment.Upload createUpload(String token, String fileName, String contentType, byte[] content) { - TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); + public Attachment.Upload createUpload(final String token, final String fileName, final String contentType, final byte[] content) { + final TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); if (token != null) { uri.set("token", token); } @@ -640,10 +642,10 @@ public Attachment.Upload createUpload(String token, String fileName, String cont content), handle(Attachment.Upload.class, "upload"))); } - public void associateAttachmentsToArticle(String idArticle, List attachments) { - TemplateUri uri = tmpl("/help_center/articles/{article_id}/bulk_attachments.json").set("article_id", idArticle); - List attachmentsIds = new ArrayList<>(); - for(Attachment item : attachments){ + public void associateAttachmentsToArticle(final String idArticle, final List attachments) { + final TemplateUri uri = tmpl("/help_center/articles/{article_id}/bulk_attachments.json").set("article_id", idArticle); + final List attachmentsIds = new ArrayList<>(); + for(final Attachment item : attachments){ attachmentsIds.add(item.getId()); } complete(submit(req("POST", uri, JSON, json(Collections.singletonMap("attachment_ids", attachmentsIds))), handleStatus())); @@ -652,12 +654,12 @@ public void associateAttachmentsToArticle(String idArticle, List att /** * Create upload article with inline false */ - public ArticleAttachments createUploadArticle(long articleId, File file) throws IOException { + public ArticleAttachments createUploadArticle(final long articleId, final File file) throws IOException { return createUploadArticle(articleId, file, false); } - public ArticleAttachments createUploadArticle(long articleId, File file, boolean inline) throws IOException { - RequestBuilder builder = reqBuilder("POST", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleId).toString()); + public ArticleAttachments createUploadArticle(final long articleId, final File file, final boolean inline) throws IOException { + final RequestBuilder builder = reqBuilder("POST", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleId).toString()); builder.setHeader("Content-Type", "multipart/form-data"); if (inline) @@ -669,31 +671,31 @@ public ArticleAttachments createUploadArticle(long articleId, File file, boolean return complete(submit(req, handle(ArticleAttachments.class, "article_attachment"))); } - public void deleteUpload(Attachment.Upload upload) { + public void deleteUpload(final Attachment.Upload upload) { checkHasToken(upload); deleteUpload(upload.getToken()); } - public void deleteUpload(String token) { + public void deleteUpload(final String token) { complete(submit(req("DELETE", tmpl("/uploads/{token}.json").set("token", token)), handleStatus())); } - public Attachment getAttachment(Attachment attachment) { + public Attachment getAttachment(final Attachment attachment) { checkHasId(attachment); return getAttachment(attachment.getId()); } - public Attachment getAttachment(long id) { + public Attachment getAttachment(final long id) { return complete(submit(req("GET", tmpl("/attachments/{id}.json").set("id", id)), handle(Attachment.class, "attachment"))); } - public void deleteAttachment(Attachment attachment) { + public void deleteAttachment(final Attachment attachment) { checkHasId(attachment); deleteAttachment(attachment.getId()); } - public void deleteAttachment(long id) { + public void deleteAttachment(final long id) { complete(submit(req("DELETE", tmpl("/attachments/{id}.json").set("id", id)), handleStatus())); } @@ -701,16 +703,16 @@ public Iterable getTargets() { return new PagedIterable<>(cnst("/targets.json"), handleTargetList("targets")); } - public Target getTarget(long id) { + public Target getTarget(final long id) { return complete(submit(req("GET", tmpl("/targets/{id}.json").set("id", id)), handle(Target.class, "target"))); } - public Target createTarget(Target target) { + public Target createTarget(final Target target) { return complete(submit(req("POST", cnst("/targets.json"), JSON, json(Collections.singletonMap("target", target))), handle(Target.class, "target"))); } - public void deleteTarget(long targetId) { + public void deleteTarget(final long targetId) { complete(submit(req("DELETE", tmpl("/targets/{id}.json").set("id", targetId)), handleStatus())); } @@ -718,21 +720,21 @@ public Iterable getTriggers() { return new PagedIterable<>(cnst("/triggers.json"), handleList(Trigger.class, "triggers")); } - public Trigger getTrigger(long id) { + public Trigger getTrigger(final long id) { return complete(submit(req("GET", tmpl("/triggers/{id}.json").set("id", id)), handle(Trigger.class, "trigger"))); } - public Trigger createTrigger(Trigger trigger) { + public Trigger createTrigger(final Trigger trigger) { return complete(submit(req("POST", cnst("/triggers.json"), JSON, json(Collections.singletonMap("trigger", trigger))), handle(Trigger.class, "trigger"))); } - public Trigger updateTrigger(Long triggerId, Trigger trigger) { + public Trigger updateTrigger(final Long triggerId, final Trigger trigger) { return complete(submit(req("PUT", tmpl("/triggers/{id}.json").set("id", triggerId), JSON, json(Collections.singletonMap("trigger", trigger))), handle(Trigger.class, "trigger"))); } - public void deleteTrigger(long triggerId) { + public void deleteTrigger(final long triggerId) { complete(submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); } @@ -743,26 +745,26 @@ public Iterable getAutomations() { handleList(Automation.class, "automations")); } - public Automation getAutomation(long id) { + public Automation getAutomation(final long id) { return complete(submit(req("GET", tmpl("/automations/{id}.json").set("id", id)), handle(Automation.class, "automation"))); } - public Automation createAutomation(Automation automation) { + public Automation createAutomation(final Automation automation) { return complete(submit( req("POST", cnst("/automations.json"), JSON, json(Collections.singletonMap("automation", automation))), handle(Automation.class, "automation"))); } - public Automation updateAutomation(Long automationId, Automation automation) { + public Automation updateAutomation(final Long automationId, final Automation automation) { return complete(submit( req("PUT", tmpl("/automations/{id}.json").set("id", automationId), JSON, json(Collections.singletonMap("automation", automation))), handle(Automation.class, "automation"))); } - public void deleteAutomation(long automationId) { + public void deleteAutomation(final long automationId) { complete(submit(req("DELETE", tmpl("/automations/{id}.json").set("id", automationId)), handleStatus())); } @@ -778,7 +780,7 @@ public Iterable getUsers() { return new PagedIterable<>(cnst("/users.json"), handleList(User.class, "users")); } - public Iterable getUsersByRole(String role, String... roles) { + public Iterable getUsersByRole(final String role, final String... roles) { // Going to have to build this URI manually, because the RFC6570 template spec doesn't support // variables like ?role[]=...role[]=..., which is what Zendesk requires. // See https://developer.zendesk.com/rest_api/docs/core/users#filters @@ -794,22 +796,22 @@ public Iterable getUsersByRole(String role, String... roles) { return new PagedIterable<>(cnst(uriBuilder.toString()), handleList(User.class, "users")); } - public Iterable getUsersIncrementally(Date startTime) { + public Iterable getUsersIncrementally(final Date startTime) { return new PagedIterable<>( tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(User.class, "users")); } - public Iterable getGroupUsers(long id) { + public Iterable getGroupUsers(final long id) { return new PagedIterable<>(tmpl("/groups/{id}/users.json").set("id", id), handleList(User.class, "users")); } - public Iterable getOrganizationUsers(long id) { + public Iterable getOrganizationUsers(final long id) { return new PagedIterable<>(tmpl("/organizations/{id}/users.json").set("id", id), handleList(User.class, "users")); } - public User getUser(long id) { + public User getUser(final long id) { return complete(submit(req("GET", tmpl("/users/{id}.json").set("id", id)), handle(User.class, "user"))); } @@ -822,105 +824,105 @@ public Iterable getUserFields() { handleList(UserField.class, "user_fields"))); } - public User createUser(User user) { + public User createUser(final User user) { return complete(submit(req("POST", cnst("/users.json"), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public User mergeUsers(long userIdThatWillRemain, long userIdThatWillBeMerged) { + public User mergeUsers(final long userIdThatWillRemain, final long userIdThatWillBeMerged) { return complete(submit(req("PUT", tmpl("/users/{id}/merge.json").set("id", userIdThatWillBeMerged), JSON, json( Collections.singletonMap("user", Collections.singletonMap("id", userIdThatWillRemain)))), handle(User.class, "user"))); } - public JobStatus createUsers(User... users) { + public JobStatus createUsers(final User... users) { return createUsers(Arrays.asList(users)); } - public JobStatus createUsers(List users) { + public JobStatus createUsers(final List users) { return complete(createUsersAsync(users)); } - public ListenableFuture createUsersAsync(List users) { + public ListenableFuture createUsersAsync(final List users) { return submit(req("POST", cnst("/users/create_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public User createOrUpdateUser(User user) { + public User createOrUpdateUser(final User user) { return complete(submit(req("POST", cnst("/users/create_or_update.json"), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public JobStatus createOrUpdateUsers(User... users) { + public JobStatus createOrUpdateUsers(final User... users) { return createOrUpdateUsers(Arrays.asList(users)); } - public JobStatus createOrUpdateUsers(List users) { + public JobStatus createOrUpdateUsers(final List users) { return complete(createOrUpdateUsersAsync(users)); } - public ListenableFuture createOrUpdateUsersAsync(List users) { + public ListenableFuture createOrUpdateUsersAsync(final List users) { return submit(req("POST", cnst("/users/create_or_update_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public User updateUser(User user) { + public User updateUser(final User user) { checkHasId(user); return complete(submit(req("PUT", tmpl("/users/{id}.json").set("id", user.getId()), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public JobStatus updateUsers(User... users) { + public JobStatus updateUsers(final User... users) { return updateUsers(Arrays.asList(users)); } - public JobStatus updateUsers(List users) { + public JobStatus updateUsers(final List users) { return complete(updateUsersAsync(users)); } - public ListenableFuture updateUsersAsync(List users) { + public ListenableFuture updateUsersAsync(final List users) { return submit(req("PUT", cnst("/users/update_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public void deleteUser(User user) { + public void deleteUser(final User user) { checkHasId(user); deleteUser(user.getId()); } - public void deleteUser(long id) { + public void deleteUser(final long id) { complete(submit(req("DELETE", tmpl("/users/{id}.json").set("id", id)), handleStatus())); } - public User permanentlyDeleteUser(User user) { + public User permanentlyDeleteUser(final User user) { checkHasId(user); return permanentlyDeleteUser(user.getId()); } - public User permanentlyDeleteUser(long id) { + public User permanentlyDeleteUser(final long id) { deleteUser(id); return complete(submit(req("DELETE", tmpl("/deleted_users/{id}.json").set("id", id)), handle(User.class))); } - public User suspendUser(long id) { - User user = new User(); + public User suspendUser(final long id) { + final User user = new User(); user.setId(id); user.setSuspended(true); return updateUser(user); } - public User unsuspendUser(long id) { - User user = new User(); + public User unsuspendUser(final long id) { + final User user = new User(); user.setId(id); user.setSuspended(false); return updateUser(user); } - public Iterable lookupUserByEmail(String email) { + public Iterable lookupUserByEmail(final String email) { return new PagedIterable<>(tmpl("/users/search.json{?query}").set("query", email), handleList(User.class, "users")); } - public Iterable lookupUserByExternalId(String externalId) { + public Iterable lookupUserByExternalId(final String externalId) { return new PagedIterable<>(tmpl("/users/search.json{?external_id}").set("external_id", externalId), handleList(User.class, "users")); } @@ -929,135 +931,135 @@ public User getCurrentUser() { return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); } - public void resetUserPassword(User user, String password) { + public void resetUserPassword(final User user, final String password) { checkHasId(user); resetUserPassword(user.getId(), password); } - public void resetUserPassword(long id, String password) { + public void resetUserPassword(final long id, final String password) { complete(submit(req("POST", tmpl("/users/{id}/password.json").set("id", id), JSON, json(Collections.singletonMap("password", password))), handleStatus())); } - public void changeUserPassword(User user, String oldPassword, String newPassword) { + public void changeUserPassword(final User user, final String oldPassword, final String newPassword) { checkHasId(user); - Map req = new HashMap<>(); + final Map req = new HashMap<>(); req.put("previous_password", oldPassword); req.put("password", newPassword); complete(submit(req("PUT", tmpl("/users/{id}/password.json").set("id", user.getId()), JSON, json(req)), handleStatus())); } - public List getUserIdentities(User user) { + public List getUserIdentities(final User user) { checkHasId(user); return getUserIdentities(user.getId()); } - public List getUserIdentities(long userId) { + public List getUserIdentities(final long userId) { return complete(submit(req("GET", tmpl("/users/{id}/identities.json").set("id", userId)), handleList(Identity.class, "identities"))); } - public Identity getUserIdentity(User user, Identity identity) { + public Identity getUserIdentity(final User user, final Identity identity) { checkHasId(identity); return getUserIdentity(user, identity.getId()); } - public Identity getUserIdentity(User user, long identityId) { + public Identity getUserIdentity(final User user, final long identityId) { checkHasId(user); return getUserIdentity(user.getId(), identityId); } - public Identity getUserIdentity(long userId, long identityId) { + public Identity getUserIdentity(final long userId, final long identityId) { return complete(submit(req("GET", tmpl("/users/{userId}/identities/{identityId}.json").set("userId", userId) .set("identityId", identityId)), handle( Identity.class, "identity"))); } - public List setUserPrimaryIdentity(User user, Identity identity) { + public List setUserPrimaryIdentity(final User user, final Identity identity) { checkHasId(identity); return setUserPrimaryIdentity(user, identity.getId()); } - public List setUserPrimaryIdentity(User user, long identityId) { + public List setUserPrimaryIdentity(final User user, final long identityId) { checkHasId(user); return setUserPrimaryIdentity(user.getId(), identityId); } - public List setUserPrimaryIdentity(long userId, long identityId) { + public List setUserPrimaryIdentity(final long userId, final long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/make_primary.json").set("userId", userId) .set("identityId", identityId), JSON, null), handleList(Identity.class, "identities"))); } - public Identity verifyUserIdentity(User user, Identity identity) { + public Identity verifyUserIdentity(final User user, final Identity identity) { checkHasId(identity); return verifyUserIdentity(user, identity.getId()); } - public Identity verifyUserIdentity(User user, long identityId) { + public Identity verifyUserIdentity(final User user, final long identityId) { checkHasId(user); return verifyUserIdentity(user.getId(), identityId); } - public Identity verifyUserIdentity(long userId, long identityId) { + public Identity verifyUserIdentity(final long userId, final long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/verify.json") .set("userId", userId) .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); } - public Identity requestVerifyUserIdentity(User user, Identity identity) { + public Identity requestVerifyUserIdentity(final User user, final Identity identity) { checkHasId(identity); return requestVerifyUserIdentity(user, identity.getId()); } - public Identity requestVerifyUserIdentity(User user, long identityId) { + public Identity requestVerifyUserIdentity(final User user, final long identityId) { checkHasId(user); return requestVerifyUserIdentity(user.getId(), identityId); } - public Identity requestVerifyUserIdentity(long userId, long identityId) { + public Identity requestVerifyUserIdentity(final long userId, final long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/request_verification.json") .set("userId", userId) .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); } - public Identity updateUserIdentity(long userId, Identity identity) { + public Identity updateUserIdentity(final long userId, final Identity identity) { checkHasId(identity); return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}.json") .set("userId", userId) .set("identityId", identity.getId()), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } - public Identity updateUserIdentity(User user, Identity identity) { + public Identity updateUserIdentity(final User user, final Identity identity) { checkHasId(user); return updateUserIdentity(user.getId(), identity); } - public void deleteUserIdentity(User user, Identity identity) { + public void deleteUserIdentity(final User user, final Identity identity) { checkHasId(identity); deleteUserIdentity(user, identity.getId()); } - public void deleteUserIdentity(User user, long identityId) { + public void deleteUserIdentity(final User user, final long identityId) { checkHasId(user); deleteUserIdentity(user.getId(), identityId); } - public void deleteUserIdentity(long userId, long identityId) { + public void deleteUserIdentity(final long userId, final long identityId) { complete(submit(req("DELETE", tmpl("/users/{userId}/identities/{identityId}.json") .set("userId", userId) .set("identityId", identityId) ), handleStatus())); } - public Identity createUserIdentity(long userId, Identity identity) { + public Identity createUserIdentity(final long userId, final Identity identity) { return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", userId), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } - public Identity createUserIdentity(User user, Identity identity) { + public Identity createUserIdentity(final User user, final Identity identity) { return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", user.getId()), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } @@ -1087,49 +1089,49 @@ public Iterable getCCRequests() { handleList(org.zendesk.client.v2.model.Request.class, "requests")); } - public Iterable getUserRequests(User user) { + public Iterable getUserRequests(final User user) { checkHasId(user); return getUserRequests(user.getId()); } - public Iterable getUserRequests(long id) { + public Iterable getUserRequests(final long id) { return new PagedIterable<>(tmpl("/users/{id}/requests.json").set("id", id), handleList(org.zendesk.client.v2.model.Request.class, "requests")); } - public org.zendesk.client.v2.model.Request getRequest(long id) { + public org.zendesk.client.v2.model.Request getRequest(final long id) { return complete(submit(req("GET", tmpl("/requests/{id}.json").set("id", id)), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public org.zendesk.client.v2.model.Request createRequest(org.zendesk.client.v2.model.Request request) { + public org.zendesk.client.v2.model.Request createRequest(final org.zendesk.client.v2.model.Request request) { return complete(submit(req("POST", cnst("/requests.json"), JSON, json(Collections.singletonMap("request", request))), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public org.zendesk.client.v2.model.Request updateRequest(org.zendesk.client.v2.model.Request request) { + public org.zendesk.client.v2.model.Request updateRequest(final org.zendesk.client.v2.model.Request request) { checkHasId(request); return complete(submit(req("PUT", tmpl("/requests/{id}.json").set("id", request.getId()), JSON, json(Collections.singletonMap("request", request))), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public Iterable getRequestComments(org.zendesk.client.v2.model.Request request) { + public Iterable getRequestComments(final org.zendesk.client.v2.model.Request request) { checkHasId(request); return getRequestComments(request.getId()); } - public Iterable getRequestComments(long id) { + public Iterable getRequestComments(final long id) { return new PagedIterable<>(tmpl("/requests/{id}/comments.json").set("id", id), handleList(Comment.class, "comments")); } - public Iterable getTicketComments(long id) { + public Iterable getTicketComments(final long id) { return getTicketComments(id, SortOrder.ASCENDING); } - public Iterable getTicketComments(long id, SortOrder order) { + public Iterable getTicketComments(final long id, final SortOrder order) { return new PagedIterable<>( tmpl("/tickets/{id}/comments.json?sort_order={order}") .set("id", id) @@ -1137,33 +1139,33 @@ public Iterable getTicketComments(long id, SortOrder order) { handleList(Comment.class, "comments")); } - public Comment getRequestComment(org.zendesk.client.v2.model.Request request, Comment comment) { + public Comment getRequestComment(final org.zendesk.client.v2.model.Request request, final Comment comment) { checkHasId(comment); return getRequestComment(request, comment.getId()); } - public Comment getRequestComment(org.zendesk.client.v2.model.Request request, long commentId) { + public Comment getRequestComment(final org.zendesk.client.v2.model.Request request, final long commentId) { checkHasId(request); return getRequestComment(request.getId(), commentId); } - public Comment getRequestComment(long requestId, long commentId) { + public Comment getRequestComment(final long requestId, final long commentId) { return complete(submit(req("GET", tmpl("/requests/{requestId}/comments/{commentId}.json") .set("requestId", requestId) .set("commentId", commentId)), handle(Comment.class, "comment"))); } - public Ticket createComment(long ticketId, Comment comment) { - Ticket ticket = new Ticket(); + public Ticket createComment(final long ticketId, final Comment comment) { + final Ticket ticket = new Ticket(); ticket.setComment(comment); return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticketId), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket"))); } - public Ticket createTicketFromTweet(long tweetId, long monitorId) { - Map map = new HashMap<>(); + public Ticket createTicketFromTweet(final long tweetId, final long monitorId) { + final Map map = new HashMap<>(); map.put("twitter_status_message_id", tweetId); map.put("monitored_twitter_handle_id", monitorId); @@ -1177,7 +1179,7 @@ public Iterable getOrganizations() { handleList(Organization.class, "organizations")); } - public Iterable getOrganizationsIncrementally(Date startTime) { + public Iterable getOrganizationsIncrementally(final Date startTime) { return new PagedIterable<>( tmpl("/incremental/organizations.json{?start_time}") .set("start_time", msToSeconds(startTime.getTime())), @@ -1190,7 +1192,7 @@ public Iterable getOrganizationFields() { handleList(OrganizationField.class, "organization_fields"))); } - public Iterable getAutoCompleteOrganizations(String name) { + public Iterable getAutoCompleteOrganizations(final String name) { if (name == null || name.length() < 2) { throw new IllegalArgumentException("Name must be at least 2 characters long"); } @@ -1200,58 +1202,58 @@ public Iterable getAutoCompleteOrganizations(String name) { // TODO getOrganizationRelatedInformation - public Organization getOrganization(long id) { + public Organization getOrganization(final long id) { return complete(submit(req("GET", tmpl("/organizations/{id}.json").set("id", id)), handle(Organization.class, "organization"))); } - public Organization createOrganization(Organization organization) { + public Organization createOrganization(final Organization organization) { return complete(submit(req("POST", cnst("/organizations.json"), JSON, json( Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); } - public JobStatus createOrganizations(Organization... organizations) { + public JobStatus createOrganizations(final Organization... organizations) { return createOrganizations(Arrays.asList(organizations)); } - public JobStatus createOrganizations(List organizations) { + public JobStatus createOrganizations(final List organizations) { return complete(createOrganizationsAsync(organizations)); } - public ListenableFuture createOrganizationsAsync(List organizations) { + public ListenableFuture createOrganizationsAsync(final List organizations) { return submit(req("POST", cnst("/organizations/create_many.json"), JSON, json( Collections.singletonMap("organizations", organizations))), handleJobStatus()); } - public Organization updateOrganization(Organization organization) { + public Organization updateOrganization(final Organization organization) { checkHasId(organization); return complete(submit(req("PUT", tmpl("/organizations/{id}.json").set("id", organization.getId()), JSON, json( Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); } - public JobStatus updateOrganizations(Organization... organizations) { + public JobStatus updateOrganizations(final Organization... organizations) { return updateOrganizations(Arrays.asList(organizations)); } - public JobStatus updateOrganizations(List organizations) { + public JobStatus updateOrganizations(final List organizations) { return complete(updateOrganizationsAsync(organizations)); } - public ListenableFuture updateOrganizationsAsync(List organizations) { + public ListenableFuture updateOrganizationsAsync(final List organizations) { return submit(req("PUT", cnst("/organizations/update_many.json"), JSON, json( Collections.singletonMap("organizations", organizations))), handleJobStatus()); } - public void deleteOrganization(Organization organization) { + public void deleteOrganization(final Organization organization) { checkHasId(organization); deleteOrganization(organization.getId()); } - public void deleteOrganization(long id) { + public void deleteOrganization(final long id) { complete(submit(req("DELETE", tmpl("/organizations/{id}.json").set("id", id)), handleStatus())); } - public Iterable lookupOrganizationsByExternalId(String externalId) { + public Iterable lookupOrganizationsByExternalId(final String externalId) { if (externalId == null || externalId.length() < 2) { throw new IllegalArgumentException("Name must be at least 2 characters long"); } @@ -1265,30 +1267,30 @@ public Iterable getOrganizationMemberships() { handleList(OrganizationMembership.class, "organization_memberships")); } - public Iterable getOrganizationMembershipsForOrg(long organization_id) { + public Iterable getOrganizationMembershipsForOrg(final long organization_id) { return new PagedIterable<>(tmpl("/organizations/{organization_id}/organization_memberships.json") .set("organization_id", organization_id), handleList(OrganizationMembership.class, "organization_memberships")); } - public Iterable getOrganizationMembershipsForUser(long user_id) { + public Iterable getOrganizationMembershipsForUser(final long user_id) { return new PagedIterable<>(tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id), handleList(OrganizationMembership.class, "organization_memberships")); } - public OrganizationMembership getOrganizationMembershipForUser(long user_id, long id) { + public OrganizationMembership getOrganizationMembershipForUser(final long user_id, final long id) { return complete(submit(req("GET", tmpl("/users/{user_id}/organization_memberships/{id}.json").set("user_id", user_id).set("id", id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership getOrganizationMembership(long id) { + public OrganizationMembership getOrganizationMembership(final long id) { return complete(submit(req("GET", tmpl("/organization_memberships/{id}.json").set("id", id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership createOrganizationMembership(OrganizationMembership organizationMembership) { + public OrganizationMembership createOrganizationMembership(final OrganizationMembership organizationMembership) { return complete(submit(req("POST", cnst("/organization_memberships.json"), JSON, json( Collections.singletonMap("organization_membership", @@ -1298,14 +1300,14 @@ public OrganizationMembership createOrganizationMembership(OrganizationMembershi /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships */ - public JobStatus createOrganizationMemberships(OrganizationMembership... organizationMemberships) { + public JobStatus createOrganizationMemberships(final OrganizationMembership... organizationMemberships) { return createOrganizationMemberships(Arrays.asList(organizationMemberships)); } /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships */ - public JobStatus createOrganizationMemberships(List organizationMemberships) { + public JobStatus createOrganizationMemberships(final List organizationMemberships) { return complete(createOrganizationMembershipsAsync(organizationMemberships)); } @@ -1313,19 +1315,19 @@ public JobStatus createOrganizationMemberships(List orga * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships */ public ListenableFuture createOrganizationMembershipsAsync( - List organizationMemberships) { + final List organizationMemberships) { return submit(req("POST", cnst("/organization_memberships/create_many.json"), JSON, json( Collections.singletonMap("organization_memberships", organizationMemberships))), handleJobStatus()); } - public void deleteOrganizationMembership(long id) { + public void deleteOrganizationMembership(final long id) { complete(submit(req("DELETE", tmpl("/organization_memberships/{id}.json").set("id", id)), handleStatus())); } /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#bulk-delete-memberships */ - public void deleteOrganizationMemberships(long id, long... ids) { + public void deleteOrganizationMemberships(final long id, final long... ids) { complete(submit(req("DELETE", tmpl("/organization_memberships/destroy_many.json{?ids}").set("ids", idArray(id, ids))), handleStatus())); } @@ -1340,12 +1342,12 @@ public Iterable getAssignableGroups() { handleList(Group.class, "groups")); } - public Group getGroup(long id) { + public Group getGroup(final long id) { return complete(submit(req("GET", tmpl("/groups/{id}.json").set("id", id)), handle(Group.class, "group"))); } - public Group createGroup(Group group) { + public Group createGroup(final Group group) { return complete(submit(req("POST", cnst("/groups.json"), JSON, json( Collections.singletonMap("group", group))), handle(Group.class, "group"))); } @@ -1357,7 +1359,7 @@ public Group createGroup(Group group) { * @see Zendesk Java Client Issue #111 */ @Deprecated - public List createGroups(Group... groups) { + public List createGroups(final Group... groups) { return createGroups(Arrays.asList(groups)); } @@ -1368,22 +1370,22 @@ public List createGroups(Group... groups) { * @see Zendesk Java Client Issue #111 */ @Deprecated - public List createGroups(List groups) { + public List createGroups(final List groups) { throw new ZendeskException("API Endpoint for createGroups does not exist."); } - public Group updateGroup(Group group) { + public Group updateGroup(final Group group) { checkHasId(group); return complete(submit(req("PUT", tmpl("/groups/{id}.json").set("id", group.getId()), JSON, json( Collections.singletonMap("group", group))), handle(Group.class, "group"))); } - public void deleteGroup(Group group) { + public void deleteGroup(final Group group) { checkHasId(group); deleteGroup(group.getId()); } - public void deleteGroup(long id) { + public void deleteGroup(final long id) { complete(submit(req("DELETE", tmpl("/groups/{id}.json").set("id", id)), handleStatus())); } @@ -1392,71 +1394,71 @@ public Iterable getMacros(){ handleList(Macro.class, "macros")); } - public Macro getMacro(long macroId){ + public Macro getMacro(final long macroId){ return complete(submit(req("GET", tmpl("/macros/{id}.json").set("id", macroId)), handle(Macro.class, "macro"))); } - public Macro createMacro(Macro macro) { + public Macro createMacro(final Macro macro) { return complete(submit( req("POST", cnst("/macros.json"), JSON, json(Collections.singletonMap("macro", macro))), handle(Macro.class, "macro"))); } - public Macro updateMacro(Long macroId, Macro macro) { + public Macro updateMacro(final Long macroId, final Macro macro) { return complete(submit(req("PUT", tmpl("/macros/{id}.json").set("id", macroId), JSON, json(Collections.singletonMap("macro", macro))), handle(Macro.class, "macro"))); } - public Ticket macrosShowChangesToTicket(long macroId) { + public Ticket macrosShowChangesToTicket(final long macroId) { return complete(submit(req("GET", tmpl("/macros/{id}/apply.json").set("id", macroId)), handle(TicketResult.class, "result"))).getTicket(); } - public Ticket macrosShowTicketAfterChanges(long ticketId, long macroId) { + public Ticket macrosShowTicketAfterChanges(final long ticketId, final long macroId) { return complete(submit(req("GET", tmpl("/tickets/{ticket_id}/macros/{id}/apply.json") .set("ticket_id", ticketId) .set("id", macroId)), handle(TicketResult.class, "result"))).getTicket(); } - public List addTagToTicket(long id, String... tags) { + public List addTagToTicket(final long id, final String... tags) { return complete(submit( req("PUT", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List addTagToTopics(long id, String... tags) { + public List addTagToTopics(final long id, final String... tags) { return complete(submit( req("PUT", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List addTagToOrganisations(long id, String... tags) { + public List addTagToOrganisations(final long id, final String... tags) { return complete(submit( req("PUT", tmpl("/organizations/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnTicket(long id, String... tags) { + public List setTagOnTicket(final long id, final String... tags) { return complete(submit( req("POST", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnTopics(long id, String... tags) { + public List setTagOnTopics(final long id, final String... tags) { return complete(submit( req("POST", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnOrganisations(long id, String... tags) { + public List setTagOnOrganisations(final long id, final String... tags) { return complete(submit( req("POST", tmpl("/organizations/{id}/tags.json").set("id", id), @@ -1464,21 +1466,21 @@ JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromTicket(long id, String... tags) { + public List removeTagFromTicket(final long id, final String... tags) { return complete(submit( req("DELETE", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromTopics(long id, String... tags) { + public List removeTagFromTopics(final long id, final String... tags) { return complete(submit( req("DELETE", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromOrganisations(long id, String... tags) { + public List removeTagFromOrganisations(final long id, final String... tags) { return complete(submit( req("DELETE", tmpl("/organizations/{id}/tags.json").set("id", id), @@ -1486,7 +1488,7 @@ JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public Map getIncrementalTicketsResult(long unixEpochTime) { + public Map getIncrementalTicketsResult(final long unixEpochTime) { return complete(submit( req("GET", tmpl("/exports/tickets.json?start_time={time}").set( @@ -1498,12 +1500,12 @@ public Iterable getGroupMemberships() { handleList(GroupMembership.class, "group_memberships")); } - public List getGroupMembershipByUser(long user_id) { + public List getGroupMembershipByUser(final long user_id) { return complete(submit(req("GET", tmpl("/users/{user_id}/group_memberships.json").set("user_id", user_id)), handleList(GroupMembership.class, "group_memberships"))); } - public List getGroupMemberships(long group_id) { + public List getGroupMemberships(final long group_id) { return complete(submit(req("GET", tmpl("/groups/{group_id}/memberships.json").set("group_id", group_id)), handleList(GroupMembership.class, "group_memberships"))); } @@ -1513,55 +1515,55 @@ public Iterable getAssignableGroupMemberships() { handleList(GroupMembership.class, "group_memberships")); } - public List getAssignableGroupMemberships(long group_id) { + public List getAssignableGroupMemberships(final long group_id) { return complete(submit(req("GET", tmpl("/groups/{group_id}/memberships/assignable.json").set("group_id", group_id)), handleList(GroupMembership.class, "group_memberships"))); } - public GroupMembership getGroupMembership(long id) { + public GroupMembership getGroupMembership(final long id) { return complete(submit(req("GET", tmpl("/group_memberships/{id}.json").set("id", id)), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership getGroupMembership(long user_id, long group_membership_id) { + public GroupMembership getGroupMembership(final long user_id, final long group_membership_id) { return complete(submit(req("GET", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) .set("gmid", group_membership_id)), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership createGroupMembership(GroupMembership groupMembership) { + public GroupMembership createGroupMembership(final GroupMembership groupMembership) { return complete(submit(req("POST", cnst("/group_memberships.json"), JSON, json( Collections.singletonMap("group_membership", groupMembership))), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership createGroupMembership(long user_id, GroupMembership groupMembership) { + public GroupMembership createGroupMembership(final long user_id, final GroupMembership groupMembership) { return complete(submit(req("POST", tmpl("/users/{id}/group_memberships.json").set("id", user_id), JSON, json(Collections.singletonMap("group_membership", groupMembership))), handle(GroupMembership.class, "group_membership"))); } - public void deleteGroupMembership(GroupMembership groupMembership) { + public void deleteGroupMembership(final GroupMembership groupMembership) { checkHasId(groupMembership); deleteGroupMembership(groupMembership.getId()); } - public void deleteGroupMembership(long id) { + public void deleteGroupMembership(final long id) { complete(submit(req("DELETE", tmpl("/group_memberships/{id}.json").set("id", id)), handleStatus())); } - public void deleteGroupMembership(long user_id, GroupMembership groupMembership) { + public void deleteGroupMembership(final long user_id, final GroupMembership groupMembership) { checkHasId(groupMembership); deleteGroupMembership(user_id, groupMembership.getId()); } - public void deleteGroupMembership(long user_id, long group_membership_id) { + public void deleteGroupMembership(final long user_id, final long group_membership_id) { complete(submit(req("DELETE", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) .set("gmid", group_membership_id)), handleStatus())); } - public List setGroupMembershipAsDefault(long user_id, GroupMembership groupMembership) { + public List setGroupMembershipAsDefault(final long user_id, final GroupMembership groupMembership) { checkHasId(groupMembership); return complete(submit(req("PUT", tmpl("/users/{uid}/group_memberships/{gmid}/make_default.json") .set("uid", user_id).set("gmid", groupMembership.getId()), JSON, json( @@ -1573,28 +1575,28 @@ public Iterable getForums() { return new PagedIterable<>(cnst("/forums.json"), handleList(Forum.class, "forums")); } - public List getForums(long category_id) { + public List getForums(final long category_id) { return complete(submit(req("GET", tmpl("/categories/{id}/forums.json").set("id", category_id)), handleList(Forum.class, "forums"))); } - public Forum getForum(long id) { + public Forum getForum(final long id) { return complete(submit(req("GET", tmpl("/forums/{id}.json").set("id", id)), handle(Forum.class, "forum"))); } - public Forum createForum(Forum forum) { + public Forum createForum(final Forum forum) { return complete(submit(req("POST", cnst("/forums.json"), JSON, json( Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); } - public Forum updateForum(Forum forum) { + public Forum updateForum(final Forum forum) { checkHasId(forum); return complete(submit(req("PUT", tmpl("/forums/{id}.json").set("id", forum.getId()), JSON, json( Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); } - public void deleteForum(Forum forum) { + public void deleteForum(final Forum forum) { checkHasId(forum); complete(submit(req("DELETE", tmpl("/forums/{id}.json").set("id", forum.getId())), handleStatus())); } @@ -1603,78 +1605,78 @@ public Iterable getTopics() { return new PagedIterable<>(cnst("/topics.json"), handleList(Topic.class, "topics")); } - public List getTopics(long forum_id) { + public List getTopics(final long forum_id) { return complete(submit(req("GET", tmpl("/forums/{id}/topics.json").set("id", forum_id)), handleList(Topic.class, "topics"))); } - public List getTopicsByUser(long user_id) { + public List getTopicsByUser(final long user_id) { return complete(submit(req("GET", tmpl("/users/{id}/topics.json").set("id", user_id)), handleList(Topic.class, "topics"))); } - public Topic getTopic(long id) { + public Topic getTopic(final long id) { return complete(submit(req("GET", tmpl("/topics/{id}.json").set("id", id)), handle(Topic.class, "topic"))); } - public Topic createTopic(Topic topic) { + public Topic createTopic(final Topic topic) { checkHasId(topic); return complete(submit(req("POST", cnst("/topics.json"), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public Topic importTopic(Topic topic) { + public Topic importTopic(final Topic topic) { checkHasId(topic); return complete(submit(req("POST", cnst("/import/topics.json"), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public List getTopics(long id, long... ids) { + public List getTopics(final long id, final long... ids) { return complete(submit(req("POST", tmpl("/topics/show_many.json{?ids}").set("ids", idArray(id, ids))), handleList(Topic.class, "topics"))); } - public Topic updateTopic(Topic topic) { + public Topic updateTopic(final Topic topic) { checkHasId(topic); return complete(submit(req("PUT", tmpl("/topics/{id}.json").set("id", topic.getId()), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public void deleteTopic(Topic topic) { + public void deleteTopic(final Topic topic) { checkHasId(topic); complete(submit(req("DELETE", tmpl("/topics/{id}.json").set("id", topic.getId())), handleStatus())); } // https://support.zendesk.com/hc/communities/public/posts/203464106-Managing-Organization-Memberships-via-the-Zendesk-API - public List getOrganizationMembershipByUser(long user_id) { + public List getOrganizationMembershipByUser(final long user_id) { return complete(submit(req("GET", tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id)), handleList(OrganizationMembership.class, "organization_memberships"))); } - public OrganizationMembership getGroupOrganization(long user_id, long organization_membership_id) { + public OrganizationMembership getGroupOrganization(final long user_id, final long organization_membership_id) { return complete(submit(req("GET", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) .set("oid", organization_membership_id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership createOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { + public OrganizationMembership createOrganizationMembership(final long user_id, final OrganizationMembership organizationMembership) { return complete(submit(req("POST", tmpl("/users/{id}/organization_memberships.json").set("id", user_id), JSON, json(Collections.singletonMap("organization_membership", organizationMembership))), handle(OrganizationMembership.class, "organization_membership"))); } - public void deleteOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { + public void deleteOrganizationMembership(final long user_id, final OrganizationMembership organizationMembership) { checkHasId(organizationMembership); deleteOrganizationMembership(user_id, organizationMembership.getId()); } - public void deleteOrganizationMembership(long user_id, long organization_membership_id) { + public void deleteOrganizationMembership(final long user_id, final long organization_membership_id) { complete(submit(req("DELETE", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) .set("oid", organization_membership_id)), handleStatus())); } - public List setOrganizationMembershipAsDefault(long user_id, OrganizationMembership organizationMembership) { + public List setOrganizationMembershipAsDefault(final long user_id, final OrganizationMembership organizationMembership) { checkHasId(organizationMembership); return complete(submit(req("PUT", tmpl("/users/{uid}/organization_memberships/{omid}/make_default.json") .set("uid", user_id).set("omid", organizationMembership.getId()), JSON, json( @@ -1683,12 +1685,12 @@ public List setOrganizationMembershipAsDefault(long user } //-- END BETA - public Iterable getSearchResults(String query) { + public Iterable getSearchResults(final String query) { return new PagedIterable<>(tmpl("/search.json{?query}").set("query", query), handleSearchList("results")); } - public Iterable getSearchResults(Class type, String query) { + public Iterable getSearchResults(final Class type, final String query) { return getSearchResults(type, query, Collections.emptyMap()); } @@ -1696,21 +1698,21 @@ public Iterable getSearchResults(Class type * @deprecated Use {@link #getSearchResults(Class, String, Map)} instead. */ @Deprecated - public Iterable getSearchResults(Class type, String query, String params) { + public Iterable getSearchResults(final Class type, final String query, final String params) { /* preserving backwards compatabile logic, this method will continue to do what it did before, which is "wrong" in that you can't really specify things like sort order via this method */ - Map paramsMap = new HashMap<>(1); + final Map paramsMap = new HashMap<>(1); paramsMap.put("params", params); return getSearchResults(type, query, paramsMap); } - public Iterable getSearchResults(Class type, String query, String sortBy, SortOrder sortOrder) { - Map paramsMap = new HashMap<>(2); + public Iterable getSearchResults(final Class type, final String query, final String sortBy, final SortOrder sortOrder) { + final Map paramsMap = new HashMap<>(2); paramsMap.put("sort_by", sortBy); paramsMap.put("sort_order", sortOrder.getQueryParameter()); @@ -1718,9 +1720,9 @@ public Iterable getSearchResults(Class type } - public Iterable getSearchResults(Class type, String query, Map params) { + public Iterable getSearchResults(final Class type, final String query, final Map params) { String typeName = null; - for (Map.Entry> entry : searchResultTypes.entrySet()) { + for (final Map.Entry> entry : searchResultTypes.entrySet()) { if (type.equals(entry.getValue())) { typeName = entry.getKey(); break; @@ -1730,17 +1732,17 @@ public Iterable getSearchResults(Class type return Collections.emptyList(); } - StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace + final StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace //we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri - for (String paramName : params.keySet()) { + for (final String paramName : params.keySet()) { uriTemplate.append(",") .append(paramName); } uriTemplate.append("}"); - TemplateUri templateUri = tmpl(uriTemplate.toString()) + final TemplateUri templateUri = tmpl(uriTemplate.toString()) .set("query", query + "+type:" + typeName); if(params != null) { @@ -1750,11 +1752,68 @@ public Iterable getSearchResults(Class type return new PagedIterable<>(templateUri, handleList(type, "results")); } - public void notifyApp(String json) { + public Optional getSearchPageResults( + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder, + final Class searchType, + final Class pageType + ) { + + final Map paramsMap = new HashMap<>(); + + if(queryParams != null) { + paramsMap.putAll(queryParams); + } + + if(sortBy!=null && sortOrder!=null) { + paramsMap.put("sort_by", sortBy); + paramsMap.put("sort_order", sortOrder.getQueryParameter()); + } + + + final StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); + + for (final String paramName : paramsMap.keySet()) { + uriTemplate.append(",") + .append(paramName); + } + + uriTemplate.append("}"); + + String typeName = null; + for (final Map.Entry> entry : searchResultTypes.entrySet()) { + if (searchType.equals(entry.getValue())) { + typeName = entry.getKey(); + break; + } + } + + final TemplateUri templateUri = tmpl(uriTemplate.toString()) + .set("query", query+ "+type:" + typeName); + + if(queryParams != null) { + templateUri.set(queryParams); + } + + return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType)))); + } + + public Optional getSearchTicketPageResults( + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder) { + + return getSearchPageResults(query, queryParams, sortBy, sortOrder, Ticket.class, TicketPage.class); + } + + public void notifyApp(final String json) { complete(submit(req("POST", cnst("/apps/notify.json"), JSON, json.getBytes()), handleStatus())); } - public void updateInstallation(int id, String json) { + public void updateInstallation(final int id, final String json) { complete(submit(req("PUT", tmpl("/apps/installations/{id}.json").set("id", id), JSON, json.getBytes()), handleStatus())); } @@ -1763,19 +1822,19 @@ public Iterable getSatisfactionRatings() { handleList(SatisfactionRating.class, "satisfaction_ratings")); } - public SatisfactionRating getSatisfactionRating(long id) { + public SatisfactionRating getSatisfactionRating(final long id) { return complete(submit(req("GET", tmpl("/satisfaction_ratings/{id}.json").set("id", id)), handle(SatisfactionRating.class, "satisfaction_rating"))); } - public SatisfactionRating createSatisfactionRating(long ticketId, SatisfactionRating satisfactionRating) { + public SatisfactionRating createSatisfactionRating(final long ticketId, final SatisfactionRating satisfactionRating) { return complete(submit(req("POST", tmpl("/tickets/{ticketId}/satisfaction_rating.json") .set("ticketId", ticketId), JSON, json(Collections.singletonMap("satisfaction_rating", satisfactionRating))), handle(SatisfactionRating.class, "satisfaction_rating"))); } - public SatisfactionRating createSatisfactionRating(Ticket ticket, SatisfactionRating satisfactionRating) { + public SatisfactionRating createSatisfactionRating(final Ticket ticket, final SatisfactionRating satisfactionRating) { return createSatisfactionRating(ticket.getId(), satisfactionRating); } @@ -1787,22 +1846,22 @@ public Iterable getDynamicContentItems() { return new PagedIterable<>(cnst("/dynamic_content/items.json"), handleList(DynamicContentItem.class, "items")); } - public DynamicContentItem getDynamicContentItem(long id) { + public DynamicContentItem getDynamicContentItem(final long id) { return complete(submit(req("GET", tmpl("/dynamic_content/items/{id}.json").set("id", id)), handle(DynamicContentItem.class, "item"))); } - public DynamicContentItem createDynamicContentItem(DynamicContentItem item) { + public DynamicContentItem createDynamicContentItem(final DynamicContentItem item) { return complete(submit(req("POST", cnst("/dynamic_content/items.json"), JSON, json( Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); } - public DynamicContentItem updateDynamicContentItem(DynamicContentItem item) { + public DynamicContentItem updateDynamicContentItem(final DynamicContentItem item) { checkHasId(item); return complete(submit(req("PUT", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId()), JSON, json(Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); } - public void deleteDynamicContentItem(DynamicContentItem item) { + public void deleteDynamicContentItem(final DynamicContentItem item) { checkHasId(item); complete(submit(req("DELETE", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId())), handleStatus())); @@ -1810,32 +1869,32 @@ public void deleteDynamicContentItem(DynamicContentItem item) { /** VARIANTS */ - public Iterable getDynamicContentItemVariants(DynamicContentItem item) { + public Iterable getDynamicContentItemVariants(final DynamicContentItem item) { checkHasId(item); return new PagedIterable<>( tmpl("/dynamic_content/items/{id}/variants.json").set("id", item.getId()), handleList(DynamicContentItemVariant.class, "variants")); } - public DynamicContentItemVariant getDynamicContentItemVariant(Long itemId, long id) { + public DynamicContentItemVariant getDynamicContentItemVariant(final Long itemId, final long id) { return complete(submit(req("GET", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", id)), handle(DynamicContentItemVariant.class, "variant"))); } - public DynamicContentItemVariant createDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { + public DynamicContentItemVariant createDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { checkHasItemId(itemId); return complete(submit(req("POST", tmpl("/dynamic_content/items/{id}/variants.json").set("id", itemId), JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); } - public DynamicContentItemVariant updateDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { + public DynamicContentItemVariant updateDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { checkHasItemId(itemId); checkHasId(variant); return complete(submit(req("PUT", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId()), JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); } - public void deleteDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { + public void deleteDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { checkHasItemId(itemId); checkHasId(variant); complete(submit(req("DELETE", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId())), handleStatus())); @@ -1860,7 +1919,7 @@ public Iterable getPermissionGroups() { * * @param id */ - public PermissionGroup getPermissionGroup(long id) { + public PermissionGroup getPermissionGroup(final long id) { return complete(submit(req("GET", tmpl("/guide/permission_groups/{id}.json").set("id", id)), handle(PermissionGroup.class, "permission_group"))); } @@ -1869,7 +1928,7 @@ public PermissionGroup getPermissionGroup(long id) { * * @param permissionGroup */ - public PermissionGroup createPermissionGroup(PermissionGroup permissionGroup) { + public PermissionGroup createPermissionGroup(final PermissionGroup permissionGroup) { return complete(submit(req("POST", tmpl("/guide/permission_groups.json"), JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); } @@ -1878,7 +1937,7 @@ public PermissionGroup createPermissionGroup(PermissionGroup permissionGroup) { * * @param permissionGroup */ - public PermissionGroup updatePermissionGroup(PermissionGroup permissionGroup) { + public PermissionGroup updatePermissionGroup(final PermissionGroup permissionGroup) { checkHasId(permissionGroup); return complete(submit(req("PUT", tmpl("/guide/permission_groups/{id}.json").set("id", permissionGroup.getId()), JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); @@ -1888,7 +1947,7 @@ public PermissionGroup updatePermissionGroup(PermissionGroup permissionGroup) { * * @param permissionGroup */ - public void deletePermissionGroup(PermissionGroup permissionGroup) { + public void deletePermissionGroup(final PermissionGroup permissionGroup) { checkHasId(permissionGroup); deletePermissionGroup(permissionGroup.getId()); } @@ -1897,7 +1956,7 @@ public void deletePermissionGroup(PermissionGroup permissionGroup) { * * @param id */ - public void deletePermissionGroup(long id) { + public void deletePermissionGroup(final long id) { complete(submit(req("DELETE", tmpl("/guide/permission_groups/{id}.json").set("id", id)), handleStatus())); } @@ -1915,7 +1974,7 @@ public Iterable getUserSegments() { * * @return List of User Segments */ - public Iterable getUserSegments(long id) { + public Iterable getUserSegments(final long id) { return new PagedIterable<>(tmpl("/help_center/users/{id}/user_segments.json").set("id", id), handleList(UserSegment.class, "user_segments")); } @@ -1933,7 +1992,7 @@ public Iterable getUserSegmentsApplicable() { * * @param id */ - public UserSegment getUserSegment(long id) { + public UserSegment getUserSegment(final long id) { return complete(submit(req("GET", tmpl("/help_center/user_segments/{id}.json").set("id", id)), handle(UserSegment.class, "user_segment"))); } @@ -1944,7 +2003,7 @@ public UserSegment getUserSegment(long id) { * @param userSegment * @return List of Sections */ - public Iterable
getSections(UserSegment userSegment) { + public Iterable
getSections(final UserSegment userSegment) { checkHasId(userSegment); return new PagedIterable<>( tmpl("/help_center/user_segments/{id}/sections.json").set("id", userSegment.getId()), @@ -1957,7 +2016,7 @@ public Iterable
getSections(UserSegment userSegment) { * @param userSegment * @return List of Topics */ - public Iterable getTopics(UserSegment userSegment) { + public Iterable getTopics(final UserSegment userSegment) { checkHasId(userSegment); return new PagedIterable<>( tmpl("/help_center/user_segments/{id}/topics.json").set("id", userSegment.getId()), @@ -1969,7 +2028,7 @@ public Iterable getTopics(UserSegment userSegment) { * * @param userSegment */ - public UserSegment createUserSegment(UserSegment userSegment) { + public UserSegment createUserSegment(final UserSegment userSegment) { return complete(submit(req("POST", tmpl("/help_center/user_segments.json"), JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); } @@ -1978,7 +2037,7 @@ public UserSegment createUserSegment(UserSegment userSegment) { * * @param userSegment */ - public UserSegment updateUserSegment(UserSegment userSegment) { + public UserSegment updateUserSegment(final UserSegment userSegment) { checkHasId(userSegment); return complete(submit(req("PUT", tmpl("/help_center/user_segments/{id}.json").set("id", userSegment.getId()), JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); @@ -1988,7 +2047,7 @@ public UserSegment updateUserSegment(UserSegment userSegment) { * * @param userSegment */ - public void deleteUserSegment(UserSegment userSegment) { + public void deleteUserSegment(final UserSegment userSegment) { checkHasId(userSegment); deleteUserSegment(userSegment.getId()); } @@ -1998,7 +2057,7 @@ public void deleteUserSegment(UserSegment userSegment) { * * @param id */ - public void deleteUserSegment(long id) { + public void deleteUserSegment(final long id) { complete(submit(req("DELETE", tmpl("/help_center/user_segments/{id}.json").set("id", id)), handleStatus())); } @@ -2019,58 +2078,58 @@ public Iterable
getArticles() { handleList(Article.class, "articles")); } - public Iterable
getArticles(String locale) { + public Iterable
getArticles(final String locale) { return new PagedIterable<>(tmpl("/help_center/{locale}/articles.json").set("locale", locale), handleList(Article.class, "articles")); } - public Iterable
getArticles(Category category) { + public Iterable
getArticles(final Category category) { checkHasId(category); return new PagedIterable<>( tmpl("/help_center/categories/{id}/articles.json").set("id", category.getId()), handleList(Article.class, "articles")); } - public Iterable
getArticles(Section section) { + public Iterable
getArticles(final Section section) { checkHasId(section); return new PagedIterable<>( tmpl("/help_center/sections/{id}/articles.json").set("id", section.getId()), handleList(Article.class, "articles")); } - public Iterable
getArticlesIncrementally(Date startTime) { + public Iterable
getArticlesIncrementally(final Date startTime) { return new PagedIterable<>( tmpl("/help_center/incremental/articles.json{?start_time}") .set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(Article.class, "articles")); } - public List
getArticlesFromPage(int page) { + public List
getArticlesFromPage(final int page) { return complete(submit(req("GET", tmpl("/help_center/articles.json?page={page}").set("page", page)), handleList(Article.class, "articles"))); } - public Article getArticle(long id) { + public Article getArticle(final long id) { return complete(submit(req("GET", tmpl("/help_center/articles/{id}.json").set("id", id)), handle(Article.class, "article"))); } - public Iterable getArticleTranslations(Long articleId) { + public Iterable getArticleTranslations(final Long articleId) { return new PagedIterable<>( tmpl("/help_center/articles/{articleId}/translations.json").set("articleId", articleId), handleList(Translation.class, "translations")); } - public Article createArticle(Article article) { + public Article createArticle(final Article article) { checkHasSectionId(article); return complete(submit(req("POST", tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); } - public Article createArticle(Article article, boolean notifySubscribers) { + public Article createArticle(final Article article, final boolean notifySubscribers) { checkHasSectionId(article); - Map map = new HashMap(); + final Map map = new HashMap(); map.put("article", article); map.put("notify_subscribers", notifySubscribers ? String.valueOf("true") : String.valueOf("false")); @@ -2078,25 +2137,25 @@ public Article createArticle(Article article, boolean notifySubscribers) { JSON, json(Collections.unmodifiableMap(map))), handle(Article.class, "article"))); } - public Article updateArticle(Article article) { + public Article updateArticle(final Article article) { checkHasId(article); return complete(submit(req("PUT", tmpl("/help_center/articles/{id}.json").set("id", article.getId()), JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); } - public Translation createArticleTranslation(Long articleId, Translation translation) { + public Translation createArticleTranslation(final Long articleId, final Translation translation) { checkHasArticleId(articleId); return complete(submit(req("POST", tmpl("/help_center/articles/{id}/translations.json").set("id", articleId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateArticleTranslation(Long articleId, String locale, Translation translation) { + public Translation updateArticleTranslation(final Long articleId, final String locale, final Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/articles/{id}/translations/{locale}.json").set("id", articleId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteArticle(Article article) { + public void deleteArticle(final Article article) { checkHasId(article); complete(submit(req("DELETE", tmpl("/help_center/articles/{id}.json").set("id", article.getId())), handleStatus())); @@ -2106,7 +2165,7 @@ public void deleteArticle(Article article) { * Delete translation. * @param translation */ - public void deleteTranslation(Translation translation) { + public void deleteTranslation(final Translation translation) { checkHasId(translation); deleteTranslation(translation.getId()); } @@ -2115,7 +2174,7 @@ public void deleteTranslation(Translation translation) { * Delete translation. * @param translationId */ - public void deleteTranslation(Long translationId) { + public void deleteTranslation(final Long translationId) { complete(submit(req("DELETE", tmpl("/help_center/translations/{id}.json").set("id", translationId)), handleStatus())); } @@ -2124,7 +2183,7 @@ public void deleteTranslation(Long translationId) { * Delete attachment from article. * @param attachment */ - public void deleteArticleAttachment(ArticleAttachments attachment) { + public void deleteArticleAttachment(final ArticleAttachments attachment) { checkHasId(attachment); deleteArticleAttachment(attachment.getId()); } @@ -2133,7 +2192,7 @@ public void deleteArticleAttachment(ArticleAttachments attachment) { * Delete attachment from article. * @param id attachment identifier. */ - public void deleteArticleAttachment(long id) { + public void deleteArticleAttachment(final long id) { complete(submit(req("DELETE", tmpl("/help_center/articles/attachments/{id}.json").set("id", id)), handleStatus())); } @@ -2142,40 +2201,40 @@ public Iterable getCategories() { handleList(Category.class, "categories")); } - public Category getCategory(long id) { + public Category getCategory(final long id) { return complete(submit(req("GET", tmpl("/help_center/categories/{id}.json").set("id", id)), handle(Category.class, "category"))); } - public Iterable getCategoryTranslations(Long categoryId) { + public Iterable getCategoryTranslations(final Long categoryId) { return new PagedIterable<>( tmpl("/help_center/categories/{categoryId}/translations.json").set("categoryId", categoryId), handleList(Translation.class, "translations")); } - public Category createCategory(Category category) { + public Category createCategory(final Category category) { return complete(submit(req("POST", cnst("/help_center/categories.json"), JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); } - public Category updateCategory(Category category) { + public Category updateCategory(final Category category) { checkHasId(category); return complete(submit(req("PUT", tmpl("/help_center/categories/{id}.json").set("id", category.getId()), JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); } - public Translation createCategoryTranslation(Long categoryId, Translation translation) { + public Translation createCategoryTranslation(final Long categoryId, final Translation translation) { checkHasCategoryId(categoryId); return complete(submit(req("POST", tmpl("/help_center/categories/{id}/translations.json").set("id", categoryId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateCategoryTranslation(Long categoryId, String locale, Translation translation) { + public Translation updateCategoryTranslation(final Long categoryId, final String locale, final Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/categories/{id}/translations/{locale}.json").set("id", categoryId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteCategory(Category category) { + public void deleteCategory(final Category category) { checkHasId(category); complete(submit(req("DELETE", tmpl("/help_center/categories/{id}.json").set("id", category.getId())), handleStatus())); @@ -2186,80 +2245,80 @@ public Iterable
getSections() { cnst("/help_center/sections.json"), handleList(Section.class, "sections")); } - public Iterable
getSections(Category category) { + public Iterable
getSections(final Category category) { checkHasId(category); return new PagedIterable<>( tmpl("/help_center/categories/{id}/sections.json").set("id", category.getId()), handleList(Section.class, "sections")); } - public Section getSection(long id) { + public Section getSection(final long id) { return complete(submit(req("GET", tmpl("/help_center/sections/{id}.json").set("id", id)), handle(Section.class, "section"))); } - public Iterable getSectionTranslations(Long sectionId) { + public Iterable getSectionTranslations(final Long sectionId) { return new PagedIterable<>( tmpl("/help_center/sections/{sectionId}/translations.json").set("sectionId", sectionId), handleList(Translation.class, "translations")); } - public Section createSection(Section section) { + public Section createSection(final Section section) { checkHasCategoryId(section); return complete(submit(req("POST", tmpl("/help_center/categories/{id}/sections.json").set("id", section.getCategoryId()), JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); } - public Section updateSection(Section section) { + public Section updateSection(final Section section) { checkHasId(section); return complete(submit(req("PUT", tmpl("/help_center/sections/{id}.json").set("id", section.getId()), JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); } - public Translation createSectionTranslation(Long sectionId, Translation translation) { + public Translation createSectionTranslation(final Long sectionId, final Translation translation) { checkHasSectionId(sectionId); return complete(submit(req("POST", tmpl("/help_center/sections/{id}/translations.json").set("id", sectionId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateSectionTranslation(Long sectionId, String locale, Translation translation) { + public Translation updateSectionTranslation(final Long sectionId, final String locale, final Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/sections/{id}/translations/{locale}.json").set("id", sectionId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteSection(Section section) { + public void deleteSection(final Section section) { checkHasId(section); complete(submit(req("DELETE", tmpl("/help_center/sections/{id}.json").set("id", section.getId())), handleStatus())); } - public Iterable getUserSubscriptions(User user) { + public Iterable getUserSubscriptions(final User user) { checkHasId(user); return getUserSubscriptions(user.getId()); } - public Iterable getUserSubscriptions(Long userId) { + public Iterable getUserSubscriptions(final Long userId) { return new PagedIterable<>( tmpl("/help_center/users/{userId}/subscriptions.json").set("userId", userId), handleList(Subscription.class, "subscriptions")); } - public Iterable getArticleSubscriptions(Long articleId) { + public Iterable getArticleSubscriptions(final Long articleId) { return getArticleSubscriptions(articleId, null); } - public Iterable getArticleSubscriptions(Long articleId, String locale) { + public Iterable getArticleSubscriptions(final Long articleId, final String locale) { return new PagedIterable<>( tmpl("/help_center{/locale}/articles/{articleId}/subscriptions.json").set("locale", locale) .set("articleId", articleId), handleList(Subscription.class, "subscriptions")); } - public Iterable getSectionSubscriptions(Long sectionId) { + public Iterable getSectionSubscriptions(final Long sectionId) { return getSectionSubscriptions(sectionId, null); } - public Iterable getSectionSubscriptions(Long sectionId, String locale) { + public Iterable getSectionSubscriptions(final Long sectionId, final String locale) { return new PagedIterable<>( tmpl("/help_center{/locale}/sections/{sectionId}/subscriptions.json").set("locale", locale) .set("sectionId", sectionId), @@ -2275,22 +2334,22 @@ public Iterable getSchedules() { handleList(Schedule.class, "schedules"))); } - public Schedule getSchedule(Schedule schedule) { + public Schedule getSchedule(final Schedule schedule) { checkHasId(schedule); return getSchedule(schedule.getId()); } - public Schedule getSchedule(Long scheduleId) { + public Schedule getSchedule(final Long scheduleId) { return complete(submit(req("GET", tmpl("/business_hours/schedules/{id}.json").set("id", scheduleId)), handle(Schedule.class, "schedule"))); } - public Iterable getHolidaysForSchedule(Schedule schedule) { + public Iterable getHolidaysForSchedule(final Schedule schedule) { checkHasId(schedule); return getHolidaysForSchedule(schedule.getId()); } - public Iterable getHolidaysForSchedule(Long scheduleId) { + public Iterable getHolidaysForSchedule(final Long scheduleId) { return complete(submit(req("GET", tmpl("/business_hours/schedules/{id}/holidays.json").set("id", scheduleId)), handleList(Holiday.class, "holidays"))); @@ -2300,15 +2359,15 @@ public Iterable getHolidaysForSchedule(Long scheduleId) { // Helper methods ////////////////////////////////////////////////////////////////////// - private byte[] json(Object object) { + private byte[] json(final Object object) { try { return mapper.writeValueAsBytes(object); - } catch (JsonProcessingException e) { + } catch (final JsonProcessingException e) { throw new ZendeskException(e.getMessage(), e); } } - private ListenableFuture submit(Request request, ZendeskAsyncCompletionHandler handler) { + private ListenableFuture submit(final Request request, final ZendeskAsyncCompletionHandler handler) { if (logger.isDebugEnabled()) { if (request.getStringData() != null) { logger.debug("Request {} {}\n{}", request.getMethod(), request.getUrl(), request.getStringData()); @@ -2324,7 +2383,7 @@ private ListenableFuture submit(Request request, ZendeskAsyncCompletionHa private static abstract class ZendeskAsyncCompletionHandler extends AsyncCompletionHandler { @Override - public void onThrowable(Throwable t) { + public void onThrowable(final Throwable t) { if (t instanceof IOException) { throw new ZendeskException(t); } else { @@ -2333,25 +2392,25 @@ public void onThrowable(Throwable t) { } } - private Request req(String method, Uri template) { + private Request req(final String method, final Uri template) { return req(method, template.toString()); } private static final Pattern RESTRICTED_PATTERN = Pattern.compile("%2B", Pattern.LITERAL); - private Request req(String method, String url) { + private Request req(final String method, final String url) { return reqBuilder(method, url).build(); } - private Request req(String method, Uri template, String contentType, byte[] body) { - RequestBuilder builder = reqBuilder(method, template.toString()); + private Request req(final String method, final Uri template, final String contentType, final byte[] body) { + final RequestBuilder builder = reqBuilder(method, template.toString()); builder.addHeader("Content-type", contentType); builder.setBody(body); return builder.build(); } - private RequestBuilder reqBuilder(String method, String url) { - RequestBuilder builder = new RequestBuilder(method); + private RequestBuilder reqBuilder(final String method, final String url) { + final RequestBuilder builder = new RequestBuilder(method); if (realm != null) { builder.setRealm(realm); } else { @@ -2364,7 +2423,7 @@ private RequestBuilder reqBuilder(String method, String url) { protected ZendeskAsyncCompletionHandler handleStatus() { return new ZendeskAsyncCompletionHandler() { @Override - public Void onCompleted(Response response) throws Exception { + public Void onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { return null; @@ -2380,7 +2439,7 @@ public Void onCompleted(Response response) throws Exception { protected ZendeskAsyncCompletionHandler handle(final Class clazz) { return new ZendeskAsyncCompletionHandler() { @Override - public T onCompleted(Response response) throws Exception { + public T onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { return (T) mapper.readerFor(clazz).readValue(response.getResponseBodyAsStream()); @@ -2400,18 +2459,18 @@ private class BasicAsyncCompletionHandler extends ZendeskAsyncCompletionHandl private final String name; private final Class[] typeParams; - public BasicAsyncCompletionHandler(Class clazz, String name, Class... typeParams) { + public BasicAsyncCompletionHandler(final Class clazz, final String name, final Class... typeParams) { this.clazz = clazz; this.name = name; this.typeParams = typeParams; } @Override - public T onCompleted(Response response) throws Exception { + public T onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { if (typeParams.length > 0) { - JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); + final JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), type); } return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), clazz); @@ -2432,8 +2491,8 @@ protected ZendeskAsyncCompletionHandler handle(final Class clazz, fina protected ZendeskAsyncCompletionHandler handleJobStatus() { return new BasicAsyncCompletionHandler(JobStatus.class, "job_status") { @Override - public JobStatus onCompleted(Response response) throws Exception { - JobStatus result = super.onCompleted(response); + public JobStatus onCompleted(final Response response) throws Exception { + final JobStatus result = super.onCompleted(response); if (result == null) { // null is when we receive a 404 response. // For an async job we trigger an error @@ -2452,8 +2511,8 @@ public JobStatus onCompleted(Response response) throws Exception { private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { private String nextPage; - public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode node = responseNode.get(NEXT_PAGE); + public void setPagedProperties(final JsonNode responseNode, final Class clazz) { + final JsonNode node = responseNode.get(NEXT_PAGE); if (node == null) { this.nextPage = null; if (logger.isDebugEnabled()) { @@ -2469,7 +2528,7 @@ public String getNextPage() { return nextPage; } - public void setNextPage(String nextPage) { + public void setNextPage(final String nextPage) { this.nextPage = nextPage; } } @@ -2477,19 +2536,19 @@ public void setNextPage(String nextPage) { private class PagedAsyncListCompletionHandler extends PagedAsyncCompletionHandler> { private final Class clazz; private final String name; - public PagedAsyncListCompletionHandler(Class clazz, String name) { + public PagedAsyncListCompletionHandler(final Class clazz, final String name) { this.clazz = clazz; this.name = name; } @Override - public List onCompleted(Response response) throws Exception { + public List onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); setPagedProperties(responseNode, clazz); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { + final List values = new ArrayList<>(); + for (final JsonNode node : responseNode.get(name)) { values.add(mapper.convertValue(node, clazz)); } return values; @@ -2509,8 +2568,8 @@ protected PagedAsyncCompletionHandler> handleList(final Class cla protected PagedAsyncCompletionHandler> handleIncrementalList(final Class clazz, final String name) { return new PagedAsyncListCompletionHandler(clazz, name) { @Override - public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode node = responseNode.get(NEXT_PAGE); + public void setPagedProperties(final JsonNode responseNode, final Class clazz) { + final JsonNode node = responseNode.get(NEXT_PAGE); if (node == null) { if (logger.isDebugEnabled()) { logger.debug(NEXT_PAGE + " property not found, pagination not supported" + @@ -2519,7 +2578,7 @@ public void setPagedProperties(JsonNode responseNode, Class clazz) { setNextPage(null); return; } - JsonNode endTimeNode = responseNode.get(END_TIME); + final JsonNode endTimeNode = responseNode.get(END_TIME); if (endTimeNode == null || endTimeNode.asLong() == 0) { if (logger.isDebugEnabled()) { logger.debug(END_TIME + " property not found, incremental export pagination not supported" + @@ -2536,7 +2595,7 @@ public void setPagedProperties(JsonNode responseNode, Class clazz) { setNextPage(null); } else { // Taking into account documentation found at https://developer.zendesk.com/rest_api/docs/core/incremental_export#polling-strategy - JsonNode countNode = responseNode.get(COUNT); + final JsonNode countNode = responseNode.get(COUNT); if (countNode == null) { if (logger.isDebugEnabled()) { logger.debug(COUNT + " property not found, incremental export pagination not supported" + @@ -2559,14 +2618,14 @@ public void setPagedProperties(JsonNode responseNode, Class clazz) { protected PagedAsyncCompletionHandler> handleSearchList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(Response response) throws Exception { + public List onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); + final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); setPagedProperties(responseNode, null); - List values = new ArrayList<>(); - for (JsonNode node : responseNode) { - Class clazz = searchResultTypes.get(node.get("result_type").asText()); + final List values = new ArrayList<>(); + for (final JsonNode node : responseNode) { + final Class clazz = searchResultTypes.get(node.get("result_type").asText()); if (clazz != null) { values.add(mapper.convertValue(node, clazz)); } @@ -2583,14 +2642,14 @@ public List onCompleted(Response response) throws Exception protected PagedAsyncCompletionHandler> handleTargetList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(Response response) throws Exception { + public List onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); setPagedProperties(responseNode, null); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { - Class clazz = targetTypes.get(node.get("type").asText()); + final List values = new ArrayList<>(); + for (final JsonNode node : responseNode.get(name)) { + final Class clazz = targetTypes.get(node.get("type").asText()); if (clazz != null) { values.add(mapper.convertValue(node, clazz)); } @@ -2608,12 +2667,12 @@ public List onCompleted(Response response) throws Exception { protected PagedAsyncCompletionHandler> handleArticleAttachmentsList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(Response response) throws Exception { + public List onCompleted(final Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { + final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + final List values = new ArrayList<>(); + for (final JsonNode node : responseNode.get(name)) { values.add(mapper.convertValue(node, ArticleAttachments.class)); } return values; @@ -2625,15 +2684,15 @@ public List onCompleted(Response response) throws Exception }; } - private TemplateUri tmpl(String template) { + private TemplateUri tmpl(final String template) { return new TemplateUri(url + template); } - private Uri cnst(String template) { + private Uri cnst(final String template) { return new FixedUri(url + template); } - private void logResponse(Response response) throws IOException { + private void logResponse(final Response response) throws IOException { if (logger.isDebugEnabled()) { logger.debug("Response HTTP/{} {}\n{}", response.getStatusCode(), response.getStatusText(), response.getResponseBody()); @@ -2645,23 +2704,23 @@ private void logResponse(Response response) throws IOException { private static final String UTF_8 = "UTF-8"; - private static String encodeUrl(String input) { + private static String encodeUrl(final String input) { try { return URLEncoder.encode(input, UTF_8); - } catch (UnsupportedEncodingException impossible) { + } catch (final UnsupportedEncodingException impossible) { return input; } } - private static long msToSeconds(long millis) { + private static long msToSeconds(final long millis) { return TimeUnit.MILLISECONDS.toSeconds(millis); } - private boolean isStatus2xx(Response response) { + private boolean isStatus2xx(final Response response) { return response.getStatusCode() / 100 == 2; } - private boolean isRateLimitResponse(Response response) { + private boolean isRateLimitResponse(final Response response) { return response.getStatusCode() == 429; } @@ -2669,12 +2728,12 @@ private boolean isRateLimitResponse(Response response) { // Static helper methods ////////////////////////////////////////////////////////////////////// - private static T complete(ListenableFuture future) { + private static T complete(final ListenableFuture future) { try { return future.get(); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { throw new ZendeskException(e.getMessage(), e); - } catch (ExecutionException e) { + } catch (final ExecutionException e) { if (e.getCause() instanceof ZendeskException) { if (e.getCause() instanceof ZendeskResponseRateLimitException) { throw new ZendeskResponseRateLimitException((ZendeskResponseRateLimitException) e.getCause()); @@ -2688,223 +2747,223 @@ private static T complete(ListenableFuture future) { } } - private static void checkHasId(Ticket ticket) { + private static void checkHasId(final Ticket ticket) { if (ticket.getId() == null) { throw new IllegalArgumentException("Ticket requires id"); } } - private static void checkHasId(org.zendesk.client.v2.model.Request request) { + private static void checkHasId(final org.zendesk.client.v2.model.Request request) { if (request.getId() == null) { throw new IllegalArgumentException("Request requires id"); } } - private static void checkHasId(Audit audit) { + private static void checkHasId(final Audit audit) { if (audit.getId() == null) { throw new IllegalArgumentException("Audit requires id"); } } - private static void checkHasId(Comment comment) { + private static void checkHasId(final Comment comment) { if (comment.getId() == null) { throw new IllegalArgumentException("Comment requires id"); } } - private static void checkHasId(Field field) { + private static void checkHasId(final Field field) { if (field.getId() == null) { throw new IllegalArgumentException("Field requires id"); } } - private static void checkHasId(Attachment attachment) { + private static void checkHasId(final Attachment attachment) { if (attachment.getId() == null) { throw new IllegalArgumentException("Attachment requires id"); } } - private static void checkHasId(ArticleAttachments attachments) { + private static void checkHasId(final ArticleAttachments attachments) { if (attachments.getId() == null) { throw new IllegalArgumentException("Attachment requires id"); } } - private static void checkHasId(User user) { + private static void checkHasId(final User user) { if (user.getId() == null) { throw new IllegalArgumentException("User requires id"); } } - private static void checkHasId(Identity identity) { + private static void checkHasId(final Identity identity) { if (identity.getId() == null) { throw new IllegalArgumentException("Identity requires id"); } } - private static void checkHasId(Organization organization) { + private static void checkHasId(final Organization organization) { if (organization.getId() == null) { throw new IllegalArgumentException("Organization requires id"); } } - private static void checkHasId(Group group) { + private static void checkHasId(final Group group) { if (group.getId() == null) { throw new IllegalArgumentException("Group requires id"); } } - private static void checkHasId(GroupMembership groupMembership) { + private static void checkHasId(final GroupMembership groupMembership) { if (groupMembership.getId() == null) { throw new IllegalArgumentException("GroupMembership requires id"); } } - private void checkHasId(Forum forum) { + private void checkHasId(final Forum forum) { if (forum.getId() == null) { throw new IllegalArgumentException("Forum requires id"); } } - private void checkHasId(Topic topic) { + private void checkHasId(final Topic topic) { if (topic.getId() == null) { throw new IllegalArgumentException("Topic requires id"); } } - private static void checkHasId(OrganizationMembership organizationMembership) { + private static void checkHasId(final OrganizationMembership organizationMembership) { if (organizationMembership.getId() == null) { throw new IllegalArgumentException("OrganizationMembership requires id"); } } - private static void checkHasId(Article article) { + private static void checkHasId(final Article article) { if (article.getId() == null) { throw new IllegalArgumentException("Article requires id"); } } - private static void checkHasId(DynamicContentItem item) { + private static void checkHasId(final DynamicContentItem item) { if (item.getId() == null) { throw new IllegalArgumentException("Item requires id"); } } - private static void checkHasId(DynamicContentItemVariant variant) { + private static void checkHasId(final DynamicContentItemVariant variant) { if (variant.getId() == null) { throw new IllegalArgumentException("Variant requires id"); } } - private static void checkHasItemId(Long itemId) { + private static void checkHasItemId(final Long itemId) { if (itemId == null) { throw new IllegalArgumentException("Variant requires item id"); } } - private static void checkHasSectionId(Article article) { + private static void checkHasSectionId(final Article article) { if (article.getSectionId() == null) { throw new IllegalArgumentException("Article requires section id"); } } - private static void checkHasArticleId(Long articleId) { + private static void checkHasArticleId(final Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires article id"); } } - private static void checkHasSectionId(Long articleId) { + private static void checkHasSectionId(final Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires section id"); } } - private static void checkHasCategoryId(Long articleId) { + private static void checkHasCategoryId(final Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires category id"); } } - private static void checkHasCategoryId(Section section) { + private static void checkHasCategoryId(final Section section) { if (section.getCategoryId() == null) { throw new IllegalArgumentException("Section requires category id"); } } - private static void checkHasId(Category category) { + private static void checkHasId(final Category category) { if (category.getId() == null) { throw new IllegalArgumentException("Category requires id"); } } - private static void checkHasId(Section section) { + private static void checkHasId(final Section section) { if (section.getId() == null) { throw new IllegalArgumentException("Section requires id"); } } - private static void checkHasId(SuspendedTicket ticket) { + private static void checkHasId(final SuspendedTicket ticket) { if (ticket == null || ticket.getId() == null) { throw new IllegalArgumentException("SuspendedTicket requires id"); } } - private static void checkHasId(Translation translation) { + private static void checkHasId(final Translation translation) { if (translation.getId() == null) { throw new IllegalArgumentException("Translation requires id"); } } - private static void checkHasId(Schedule schedule) { + private static void checkHasId(final Schedule schedule) { if (schedule == null || schedule.getId() == null) { throw new IllegalArgumentException("Schedule requires id"); } } - private static void checkHasId(Holiday holiday) { + private static void checkHasId(final Holiday holiday) { if (holiday == null || holiday.getId() == null) { throw new IllegalArgumentException("Holiday requires id"); } } - private static void checkHasId(PermissionGroup permissionGroup) { + private static void checkHasId(final PermissionGroup permissionGroup) { if (permissionGroup.getId() == null) { throw new IllegalArgumentException("PermissionGroup requires id"); } } - private static void checkHasId(UserSegment userSegment) { + private static void checkHasId(final UserSegment userSegment) { if (userSegment.getId() == null) { throw new IllegalArgumentException("UserSegment requires id"); } } - private static void checkHasToken(Attachment.Upload upload) { + private static void checkHasToken(final Attachment.Upload upload) { if (upload.getToken() == null) { throw new IllegalArgumentException("Upload requires token"); } } - private static List idArray(long id, long... ids) { - List result = new ArrayList<>(ids.length + 1); + private static List idArray(final long id, final long... ids) { + final List result = new ArrayList<>(ids.length + 1); result.add(id); - for (long i : ids) { + for (final long i : ids) { result.add(i); } return result; } - private static List statusArray(Status... statuses) { - List result = new ArrayList<>(statuses.length); - for (Status s : statuses) { + private static List statusArray(final Status... statuses) { + final List result = new ArrayList<>(statuses.length); + for (final Status s : statuses) { result.add(s.toString()); } return result; } public static ObjectMapper createMapper() { - ObjectMapper mapper = new ObjectMapper(); + final ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -2924,11 +2983,12 @@ private class PagedIterable implements Iterable { private final Uri url; private final PagedAsyncCompletionHandler> handler; - private PagedIterable(Uri url, PagedAsyncCompletionHandler> handler) { + private PagedIterable(final Uri url, final PagedAsyncCompletionHandler> handler) { this.handler = handler; this.url = url; } + @Override public Iterator iterator() { return new PagedIterator(url); } @@ -2938,22 +2998,24 @@ private class PagedIterator implements Iterator { private Iterator current; private String nextPage; - public PagedIterator(Uri url) { + public PagedIterator(final Uri url) { this.nextPage = url.toString(); } + @Override public boolean hasNext() { if (current == null || !current.hasNext()) { if (nextPage == null || nextPage.equalsIgnoreCase("null")) { return false; } - List values = complete(submit(req("GET", nextPage), handler)); + final List values = complete(submit(req("GET", nextPage), handler)); nextPage = handler.getNextPage(); current = values.iterator(); } return current.hasNext(); } + @Override public T next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -2961,6 +3023,7 @@ public T next() { return current.next(); } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -2977,22 +3040,22 @@ public static class Builder { private String oauthToken = null; private final Map headers; - public Builder(String url) { + public Builder(final String url) { this.url = url; this.headers = new HashMap<>(); } - public Builder setClient(AsyncHttpClient client) { + public Builder setClient(final AsyncHttpClient client) { this.client = client; return this; } - public Builder setUsername(String username) { + public Builder setUsername(final String username) { this.username = username; return this; } - public Builder setPassword(String password) { + public Builder setPassword(final String password) { this.password = password; if (password != null) { this.token = null; @@ -3001,7 +3064,7 @@ public Builder setPassword(String password) { return this; } - public Builder setToken(String token) { + public Builder setToken(final String token) { this.token = token; if (token != null) { this.password = null; @@ -3011,7 +3074,7 @@ public Builder setToken(String token) { } - public Builder setOauthToken(String oauthToken) { + public Builder setOauthToken(final String oauthToken) { this.oauthToken = oauthToken; if (oauthToken != null) { this.password = null; @@ -3021,11 +3084,11 @@ public Builder setOauthToken(String oauthToken) { } - public Builder setRetry(boolean retry) { + public Builder setRetry(final boolean retry) { return this; } - public Builder addHeader(String name, String value) { + public Builder addHeader(final String name, final String value) { Objects.requireNonNull(name, "Header name cannot be null"); Objects.requireNonNull(value, "Header value cannot be null"); headers.put(name, value); diff --git a/src/main/java/org/zendesk/client/v2/model/Page.java b/src/main/java/org/zendesk/client/v2/model/Page.java new file mode 100644 index 000000000..dfdb3910d --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/Page.java @@ -0,0 +1,41 @@ +package org.zendesk.client.v2.model; + +import java.io.Serializable; +import com.fasterxml.jackson.annotation.JsonProperty; + +public abstract class Page implements Serializable { + + private static final long serialVersionUID = 456807064715979598L; + + private @JsonProperty("next_page") String nextPage; + + private @JsonProperty("previous_page") String previousPage; + + private int count; + + public abstract Class getTargetClass(); + + public String getNextPage() { + return nextPage; + } + + public void setNextPage(final String nextPage) { + this.nextPage = nextPage; + } + + public String getPreviousPage() { + return previousPage; + } + + public void setPreviousPage(final String previousPage) { + this.previousPage = previousPage; + } + + public int getCount() { + return count; + } + + public void setCount(final int count) { + this.count = count; + } +} diff --git a/src/main/java/org/zendesk/client/v2/model/TicketPage.java b/src/main/java/org/zendesk/client/v2/model/TicketPage.java new file mode 100644 index 000000000..649eb82c1 --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/TicketPage.java @@ -0,0 +1,23 @@ +package org.zendesk.client.v2.model; + +import java.util.List; + +public class TicketPage extends Page { + + private static final long serialVersionUID = 434807064715979598L; + + private List results; + + public List getResults() { + return results; + } + + public void setResults(final List results) { + this.results = results; + } + + @Override + public Class getTargetClass() { + return Ticket.class; + } +} From e1852a8132431902b7be9815a17caeed0c06fe2f Mon Sep 17 00:00:00 2001 From: Naveen Reddy Alka Date: Mon, 20 Sep 2021 02:16:52 -0700 Subject: [PATCH 020/343] feat(refactor): remove method finals and pom changes --- pom.xml | 2 +- .../java/org/zendesk/client/v2/Zendesk.java | 944 +++++++++--------- 2 files changed, 471 insertions(+), 475 deletions(-) diff --git a/pom.xml b/pom.xml index 973dcb4a0..1f75a01e7 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.14.3-SNAPSHOT + 0.14.2-SNAPSHOT zendesk-java-client Java client for the Zendesk API diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 1a8c04dad..4ccf67601 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1,25 +1,13 @@ package org.zendesk.client.v2; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; @@ -72,10 +60,10 @@ import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.ArticleAttachments; import org.zendesk.client.v2.model.hc.Category; -import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; import org.zendesk.client.v2.model.hc.Translation; +import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.UserSegment; import org.zendesk.client.v2.model.schedules.Holiday; import org.zendesk.client.v2.model.schedules.Schedule; @@ -86,14 +74,27 @@ import org.zendesk.client.v2.model.targets.Target; import org.zendesk.client.v2.model.targets.TwitterTarget; import org.zendesk.client.v2.model.targets.UrlTarget; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.StdDateFormat; + +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; /** * @author stephenc @@ -114,7 +115,7 @@ public class Zendesk implements Closeable { private static final Map> targetTypes = targetTypes(); private static Map> searchResultTypes() { - final Map> result = new HashMap<>(); + Map> result = new HashMap<>(); result.put("ticket", Ticket.class); result.put("user", User.class); result.put("group", Group.class); @@ -123,9 +124,9 @@ private static Map> searchResultType result.put("article", Article.class); return Collections.unmodifiableMap(result); } - + private static Map> targetTypes() { - final Map> result = new HashMap<>(); + Map> result = new HashMap<>(); result.put("url_target", UrlTarget.class); result.put("email_target",EmailTarget.class); result.put("basecamp_target", BasecampTarget.class); @@ -142,7 +143,7 @@ private static Map> targetTypes() { return Collections.unmodifiableMap(result); } - private Zendesk(final AsyncHttpClient client, final String url, final String username, final String password, final Map headers) { + private Zendesk(AsyncHttpClient client, String url, String username, String password, Map headers) { this.logger = LoggerFactory.getLogger(Zendesk.class); this.closeClient = client == null; this.oauthToken = null; @@ -164,7 +165,7 @@ private Zendesk(final AsyncHttpClient client, final String url, final String use } - private Zendesk(final AsyncHttpClient client, final String url, final String oauthToken, final Map headers) { + private Zendesk(AsyncHttpClient client, String url, String oauthToken, Map headers) { this.logger = LoggerFactory.getLogger(Zendesk.class); this.closeClient = client == null; this.realm = null; @@ -189,12 +190,11 @@ public boolean isClosed() { return closed || client.isClosed(); } - @Override public void close() { if (closeClient && !client.isClosed()) { try { client.close(); - } catch (final IOException e) { + } catch (IOException e) { logger.warn("Unexpected error on client close", e); } } @@ -205,25 +205,25 @@ public void close() { // Action methods ////////////////////////////////////////////////////////////////////// - public JobStatus getJobStatus(final JobStatus status) { + public JobStatus getJobStatus(JobStatus status) { return complete(getJobStatusAsync(status)); } - public ListenableFuture getJobStatusAsync(final JobStatus status) { + public ListenableFuture getJobStatusAsync(JobStatus status) { return submit(req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())), handleJobStatus()); } - public List getJobStatuses(final List statuses) { + public List getJobStatuses(List statuses) { return complete(getJobStatusesAsync(statuses)); } - public ListenableFuture> getJobStatusesAsync(final List statuses) { - final List ids = new ArrayList<>(statuses.size()); - for (final JobStatus status : statuses) { + public ListenableFuture> getJobStatusesAsync(List statuses) { + List ids = new ArrayList<>(statuses.size()); + for (JobStatus status : statuses) { ids.add(status.getId()); } - final Class clazz = (Class) (Object) JobStatus.class; + Class clazz = (Class) (Object) JobStatus.class; return submit(req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)), handleList(clazz, "job_statuses")); } @@ -233,7 +233,7 @@ public List getBrands(){ "brands"))); } - public TicketForm getTicketForm(final long id) { + public TicketForm getTicketForm(long id) { return complete(submit(req("GET", tmpl("/ticket_forms/{id}.json").set("id", id)), handle(TicketForm.class, "ticket_form"))); } @@ -243,41 +243,41 @@ public List getTicketForms() { "ticket_forms"))); } - public TicketForm createTicketForm(final TicketForm ticketForm) { + public TicketForm createTicketForm(TicketForm ticketForm) { return complete(submit(req("POST", cnst("/ticket_forms.json"), JSON, json( Collections.singletonMap("ticket_form", ticketForm))), handle(TicketForm.class, "ticket_form"))); } - public Ticket importTicket(final TicketImport ticketImport) { + public Ticket importTicket(TicketImport ticketImport) { return complete(submit(req("POST", cnst("/imports/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticketImport))), handle(Ticket.class, "ticket"))); } - public JobStatus importTickets(final TicketImport... ticketImports) { + public JobStatus importTickets(TicketImport... ticketImports) { return importTickets(Arrays.asList(ticketImports)); } - public JobStatus importTickets(final List ticketImports) { + public JobStatus importTickets(List ticketImports) { return complete(importTicketsAsync(ticketImports)); } - public ListenableFuture importTicketsAsync(final List ticketImports) { + public ListenableFuture importTicketsAsync(List ticketImports) { return submit(req("POST", cnst("/imports/tickets/create_many.json"), JSON, json( Collections.singletonMap("tickets", ticketImports))), handleJobStatus()); } - public Ticket getTicket(final long id) { + public Ticket getTicket(long id) { return complete(submit(req("GET", tmpl("/tickets/{id}.json").set("id", id)), handle(Ticket.class, "ticket"))); } - public List getTicketIncidents(final long id) { + public List getTicketIncidents(long id) { return complete(submit(req("GET", tmpl("/tickets/{id}/incidents.json").set("id", id)), handleList(Ticket.class, "tickets"))); } - public List getTicketCollaborators(final long id) { + public List getTicketCollaborators(long id) { return complete(submit(req("GET", tmpl("/tickets/{id}/collaborators.json").set("id", id)), handleList(User.class, "users"))); } @@ -292,98 +292,98 @@ public Iterable getDeletedTickets() { /** * https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets */ - public Iterable getDeletedTickets(final String sortBy, final SortOrder sortOrder) { + public Iterable getDeletedTickets(String sortBy, SortOrder sortOrder) { return new PagedIterable<>(tmpl("/deleted_tickets.json?sort_by={sortBy}&sort_order={sortOrder}") .set("sortBy", sortBy) .set("sortOrder", sortOrder.getQueryParameter()), handleList(DeletedTicket.class, "deleted_tickets")); } - public void deleteTicket(final Ticket ticket) { + public void deleteTicket(Ticket ticket) { checkHasId(ticket); deleteTicket(ticket.getId()); } - public void deleteTicket(final long id) { + public void deleteTicket(long id) { complete(submit(req("DELETE", tmpl("/tickets/{id}.json").set("id", id)), handleStatus())); } - public JobStatus permanentlyDeleteTicket(final Ticket ticket) { + public JobStatus permanentlyDeleteTicket(Ticket ticket) { checkHasId(ticket); return permanentlyDeleteTicket(ticket.getId()); } - public JobStatus permanentlyDeleteTicket(final long id) { + public JobStatus permanentlyDeleteTicket(long id) { return complete(submit( req("DELETE", tmpl("/deleted_tickets/{id}.json").set("id", id)), handleJobStatus()) ); } - public ListenableFuture queueCreateTicketAsync(final Ticket ticket) { + public ListenableFuture queueCreateTicketAsync(Ticket ticket) { return submit(req("POST", cnst("/tickets.json?async=true"), JSON, json(Collections.singletonMap("ticket", ticket))), handleJobStatus()); } - public ListenableFuture createTicketAsync(final Ticket ticket) { + public ListenableFuture createTicketAsync(Ticket ticket) { return submit(req("POST", cnst("/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket")); } - public Ticket createTicket(final Ticket ticket) { + public Ticket createTicket(Ticket ticket) { return complete(createTicketAsync(ticket)); } - public JobStatus createTickets(final Ticket... tickets) { + public JobStatus createTickets(Ticket... tickets) { return createTickets(Arrays.asList(tickets)); } - public JobStatus createTickets(final List tickets) { + public JobStatus createTickets(List tickets) { return complete(createTicketsAsync(tickets)); } - public ListenableFuture createTicketsAsync(final List tickets) { + public ListenableFuture createTicketsAsync(List tickets) { return submit(req("POST", cnst("/tickets/create_many.json"), JSON, json( Collections.singletonMap("tickets", tickets))), handleJobStatus()); } - public Ticket updateTicket(final Ticket ticket) { + public Ticket updateTicket(Ticket ticket) { checkHasId(ticket); return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticket.getId()), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket"))); } - public JobStatus updateTickets(final Ticket... tickets) { + public JobStatus updateTickets(Ticket... tickets) { return updateTickets(Arrays.asList(tickets)); } - public JobStatus updateTickets(final List tickets) { + public JobStatus updateTickets(List tickets) { return complete(updateTicketsAsync(tickets)); } - public ListenableFuture updateTicketsAsync(final List tickets) { + public ListenableFuture updateTicketsAsync(List tickets) { return submit(req("PUT", cnst("/tickets/update_many.json"), JSON, json( Collections.singletonMap("tickets", tickets))), handleJobStatus()); } - public void markTicketAsSpam(final Ticket ticket) { + public void markTicketAsSpam(Ticket ticket) { checkHasId(ticket); markTicketAsSpam(ticket.getId()); } - public void markTicketAsSpam(final long id) { + public void markTicketAsSpam(long id) { complete(submit(req("PUT", tmpl("/tickets/{id}/mark_as_spam.json").set("id", id)), handleStatus())); } - public void deleteTickets(final long id, final long... ids) { + public void deleteTickets(long id, long... ids) { complete(submit(req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), handleStatus())); } - public JobStatus permanentlyDeleteTickets(final long id, final long... ids) { + public JobStatus permanentlyDeleteTickets(long id, long... ids) { return complete( submit( req("DELETE", tmpl("/deleted_tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), @@ -401,13 +401,13 @@ public Iterable getTickets() { * @return */ @Deprecated - public Iterable getTicketsByStatus(final Status... ticketStatus) { + public Iterable getTicketsByStatus(Status... ticketStatus) { return new PagedIterable<>(tmpl("/tickets.json{?status}").set("status", statusArray(ticketStatus)), handleList(Ticket.class, "tickets")); } - public Iterable getTicketsByExternalId(final String externalId, final boolean includeArchived) { - final Iterable results = + public Iterable getTicketsByExternalId(String externalId, boolean includeArchived) { + Iterable results = new PagedIterable<>(tmpl("/tickets.json{?external_id}").set("external_id", externalId), handleList(Ticket.class, "tickets")); @@ -419,41 +419,41 @@ public Iterable getTicketsByExternalId(final String externalId, final bo handleList(Ticket.class, "results")); } - public Iterable getTicketsByExternalId(final String externalId) { + public Iterable getTicketsByExternalId(String externalId) { return getTicketsByExternalId(externalId, false); } - public Iterable getTicketsFromSearch(final String searchTerm) { + public Iterable getTicketsFromSearch(String searchTerm) { return new PagedIterable<>(tmpl("/search.json{?query}").set("query", searchTerm + "+type:ticket"), handleList(Ticket.class, "results")); } - public Iterable
getArticleFromSearch(final String searchTerm) { + public Iterable
getArticleFromSearch(String searchTerm) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?query}").set("query", searchTerm), handleList(Article.class, "results")); } - public Iterable
getArticleFromSearch(final String searchTerm, final Long sectionId) { + public Iterable
getArticleFromSearch(String searchTerm, Long sectionId) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?section,query}") .set("query", searchTerm).set("section", sectionId), handleList(Article.class, "results")); } - public Iterable
getArticlesFromAnyLabels(final List labels) { + public Iterable
getArticlesFromAnyLabels(List labels) { return new PagedIterable<>(tmpl("/help_center/articles/search.json{?label_names}").set("label_names", labels), handleList(Article.class, "results")); } - public Iterable
getArticlesFromAllLabels(final List labels) { + public Iterable
getArticlesFromAllLabels(List labels) { return new PagedIterable<>(tmpl("/help_center/en-us/articles.json{?label_names}").set("label_names", labels), handleList(Article.class, "articles")); } - public List getAttachmentsFromArticle(final Long articleID) { + public List getAttachmentsFromArticle(Long articleID) { return complete(submit(req("GET", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleID)), handleArticleAttachmentsList("article_attachments"))); } - public List getTickets(final long id, final long... ids) { + public List getTickets(long id, long... ids) { return complete(submit(req("GET", tmpl("/tickets/show_many.json{?ids}").set("ids", idArray(id, ids))), handleList(Ticket.class, "tickets"))); } @@ -465,7 +465,7 @@ public Iterable getRecentTickets() { /** * https://developer.zendesk.com/rest_api/docs/support/incremental_export */ - public Iterable getTicketsIncrementally(final Date startTime) { + public Iterable getTicketsIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/tickets.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(Ticket.class, "tickets")); @@ -477,7 +477,7 @@ public Iterable getTicketsIncrementally(final Date startTime) { * @deprecated incremental export does not support an end_time parameter */ @Deprecated - public Iterable getTicketsIncrementally(final Date startTime, final Date endTime) { + public Iterable getTicketsIncrementally(Date startTime, Date endTime) { return new PagedIterable<>( tmpl("/incremental/tickets.json{?start_time,end_time}") .set("start_time", msToSeconds(startTime.getTime())) @@ -485,28 +485,28 @@ public Iterable getTicketsIncrementally(final Date startTime, final Date handleIncrementalList(Ticket.class, "tickets")); } - public Iterable getOrganizationTickets(final long organizationId) { + public Iterable getOrganizationTickets(long organizationId) { return new PagedIterable<>( tmpl("/organizations/{organizationId}/tickets.json").set("organizationId", organizationId), handleList(Ticket.class, "tickets")); } - public Iterable getUserRequestedTickets(final long userId) { + public Iterable getUserRequestedTickets(long userId) { return new PagedIterable<>(tmpl("/users/{userId}/tickets/requested.json").set("userId", userId), handleList(Ticket.class, "tickets")); } - public Iterable getComplianceDeletionStatuses(final long userId) { + public Iterable getComplianceDeletionStatuses(long userId) { return new PagedIterable<>(tmpl("/users/{userId}/compliance_deletion_statuses.json").set("userId", userId), handleList(ComplianceDeletionStatus.class, "compliance_deletion_statuses")); } - public Iterable getUserCCDTickets(final long userId) { + public Iterable getUserCCDTickets(long userId) { return new PagedIterable<>(tmpl("/users/{userId}/tickets/ccd.json").set("userId", userId), handleList(Ticket.class, "tickets")); } - public UserRelatedInfo getUserRelatedInfo(final long userId) { + public UserRelatedInfo getUserRelatedInfo(long userId) { return complete(submit(req("GET", tmpl("/users/{userId}/related.json").set("userId", userId)), handle(UserRelatedInfo.class, "user_related"))); } @@ -515,67 +515,67 @@ public Iterable getTicketMetrics() { return new PagedIterable<>(cnst("/ticket_metrics.json"), handleList(Metric.class, "ticket_metrics")); } - public Metric getTicketMetricByTicket(final long id) { + public Metric getTicketMetricByTicket(long id) { return complete(submit(req("GET", tmpl("/tickets/{ticketId}/metrics.json").set("ticketId", id)), handle(Metric.class, "ticket_metric"))); } - public Metric getTicketMetric(final long id) { + public Metric getTicketMetric(long id) { return complete(submit(req("GET", tmpl("/ticket_metrics/{ticketMetricId}.json").set("ticketMetricId", id)), handle(Metric.class, "ticket_metric"))); } - public Iterable getTicketAudits(final Ticket ticket) { + public Iterable getTicketAudits(Ticket ticket) { checkHasId(ticket); return getTicketAudits(ticket.getId()); } - public Iterable getTicketAudits(final Long id) { + public Iterable getTicketAudits(Long id) { return new PagedIterable<>(tmpl("/tickets/{ticketId}/audits.json").set("ticketId", id), handleList(Audit.class, "audits")); } - public Audit getTicketAudit(final Ticket ticket, final Audit audit) { + public Audit getTicketAudit(Ticket ticket, Audit audit) { checkHasId(audit); return getTicketAudit(ticket, audit.getId()); } - public Audit getTicketAudit(final Ticket ticket, final long id) { + public Audit getTicketAudit(Ticket ticket, long id) { checkHasId(ticket); return getTicketAudit(ticket.getId(), id); } - public Audit getTicketAudit(final long ticketId, final long auditId) { + public Audit getTicketAudit(long ticketId, long auditId) { return complete(submit(req("GET", tmpl("/tickets/{ticketId}/audits/{auditId}.json").set("ticketId", ticketId) .set("auditId", auditId)), handle(Audit.class, "audit"))); } - public void trustTicketAudit(final Ticket ticket, final Audit audit) { + public void trustTicketAudit(Ticket ticket, Audit audit) { checkHasId(audit); trustTicketAudit(ticket, audit.getId()); } - public void trustTicketAudit(final Ticket ticket, final long id) { + public void trustTicketAudit(Ticket ticket, long id) { checkHasId(ticket); trustTicketAudit(ticket.getId(), id); } - public void trustTicketAudit(final long ticketId, final long auditId) { + public void trustTicketAudit(long ticketId, long auditId) { complete(submit(req("PUT", tmpl("/tickets/{ticketId}/audits/{auditId}/trust.json").set("ticketId", ticketId) .set("auditId", auditId)), handleStatus())); } - public void makePrivateTicketAudit(final Ticket ticket, final Audit audit) { + public void makePrivateTicketAudit(Ticket ticket, Audit audit) { checkHasId(audit); makePrivateTicketAudit(ticket, audit.getId()); } - public void makePrivateTicketAudit(final Ticket ticket, final long id) { + public void makePrivateTicketAudit(Ticket ticket, long id) { checkHasId(ticket); makePrivateTicketAudit(ticket.getId(), id); } - public void makePrivateTicketAudit(final long ticketId, final long auditId) { + public void makePrivateTicketAudit(long ticketId, long auditId) { complete(submit(req("PUT", tmpl("/tickets/{ticketId}/audits/{auditId}/make_private.json").set("ticketId", ticketId) .set("auditId", auditId)), handleStatus())); @@ -585,28 +585,28 @@ public List getTicketFields() { return complete(submit(req("GET", cnst("/ticket_fields.json")), handleList(Field.class, "ticket_fields"))); } - public Field getTicketField(final long id) { + public Field getTicketField(long id) { return complete(submit(req("GET", tmpl("/ticket_fields/{id}.json").set("id", id)), handle(Field.class, "ticket_field"))); } - public Field createTicketField(final Field field) { + public Field createTicketField(Field field) { return complete(submit(req("POST", cnst("/ticket_fields.json"), JSON, json( Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); } - public Field updateTicketField(final Field field) { + public Field updateTicketField(Field field) { checkHasId(field); return complete(submit(req("PUT", tmpl("/ticket_fields/{id}.json").set("id", field.getId()), JSON, json(Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); } - public void deleteTicketField(final Field field) { + public void deleteTicketField(Field field) { checkHasId(field); deleteTicket(field.getId()); } - public void deleteTicketField(final long id) { + public void deleteTicketField(long id) { complete(submit(req("DELETE", tmpl("/ticket_fields/{id}.json").set("id", id)), handleStatus())); } @@ -615,25 +615,25 @@ public Iterable getSuspendedTickets() { handleList(SuspendedTicket.class, "suspended_tickets")); } - public void deleteSuspendedTicket(final SuspendedTicket ticket) { + public void deleteSuspendedTicket(SuspendedTicket ticket) { checkHasId(ticket); deleteSuspendedTicket(ticket.getId()); } - public void deleteSuspendedTicket(final long id) { + public void deleteSuspendedTicket(long id) { complete(submit(req("DELETE", tmpl("/suspended_tickets/{id}.json").set("id", id)), handleStatus())); } - public Attachment.Upload createUpload(final String fileName, final byte[] content) { + public Attachment.Upload createUpload(String fileName, byte[] content) { return createUpload(null, fileName, "application/binary", content); } - public Attachment.Upload createUpload(final String fileName, final String contentType, final byte[] content) { + public Attachment.Upload createUpload(String fileName, String contentType, byte[] content) { return createUpload(null, fileName, contentType, content); } - public Attachment.Upload createUpload(final String token, final String fileName, final String contentType, final byte[] content) { - final TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); + public Attachment.Upload createUpload(String token, String fileName, String contentType, byte[] content) { + TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); if (token != null) { uri.set("token", token); } @@ -642,10 +642,10 @@ public Attachment.Upload createUpload(final String token, final String fileName, content), handle(Attachment.Upload.class, "upload"))); } - public void associateAttachmentsToArticle(final String idArticle, final List attachments) { - final TemplateUri uri = tmpl("/help_center/articles/{article_id}/bulk_attachments.json").set("article_id", idArticle); - final List attachmentsIds = new ArrayList<>(); - for(final Attachment item : attachments){ + public void associateAttachmentsToArticle(String idArticle, List attachments) { + TemplateUri uri = tmpl("/help_center/articles/{article_id}/bulk_attachments.json").set("article_id", idArticle); + List attachmentsIds = new ArrayList<>(); + for(Attachment item : attachments){ attachmentsIds.add(item.getId()); } complete(submit(req("POST", uri, JSON, json(Collections.singletonMap("attachment_ids", attachmentsIds))), handleStatus())); @@ -654,12 +654,12 @@ public void associateAttachmentsToArticle(final String idArticle, final List getTargets() { return new PagedIterable<>(cnst("/targets.json"), handleTargetList("targets")); } - public Target getTarget(final long id) { + public Target getTarget(long id) { return complete(submit(req("GET", tmpl("/targets/{id}.json").set("id", id)), handle(Target.class, "target"))); } - public Target createTarget(final Target target) { + public Target createTarget(Target target) { return complete(submit(req("POST", cnst("/targets.json"), JSON, json(Collections.singletonMap("target", target))), handle(Target.class, "target"))); } - public void deleteTarget(final long targetId) { + public void deleteTarget(long targetId) { complete(submit(req("DELETE", tmpl("/targets/{id}.json").set("id", targetId)), handleStatus())); } @@ -720,21 +720,21 @@ public Iterable getTriggers() { return new PagedIterable<>(cnst("/triggers.json"), handleList(Trigger.class, "triggers")); } - public Trigger getTrigger(final long id) { + public Trigger getTrigger(long id) { return complete(submit(req("GET", tmpl("/triggers/{id}.json").set("id", id)), handle(Trigger.class, "trigger"))); } - public Trigger createTrigger(final Trigger trigger) { + public Trigger createTrigger(Trigger trigger) { return complete(submit(req("POST", cnst("/triggers.json"), JSON, json(Collections.singletonMap("trigger", trigger))), handle(Trigger.class, "trigger"))); } - public Trigger updateTrigger(final Long triggerId, final Trigger trigger) { + public Trigger updateTrigger(Long triggerId, Trigger trigger) { return complete(submit(req("PUT", tmpl("/triggers/{id}.json").set("id", triggerId), JSON, json(Collections.singletonMap("trigger", trigger))), handle(Trigger.class, "trigger"))); } - public void deleteTrigger(final long triggerId) { + public void deleteTrigger(long triggerId) { complete(submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); } @@ -745,26 +745,26 @@ public Iterable getAutomations() { handleList(Automation.class, "automations")); } - public Automation getAutomation(final long id) { + public Automation getAutomation(long id) { return complete(submit(req("GET", tmpl("/automations/{id}.json").set("id", id)), handle(Automation.class, "automation"))); } - public Automation createAutomation(final Automation automation) { + public Automation createAutomation(Automation automation) { return complete(submit( req("POST", cnst("/automations.json"), JSON, json(Collections.singletonMap("automation", automation))), handle(Automation.class, "automation"))); } - public Automation updateAutomation(final Long automationId, final Automation automation) { + public Automation updateAutomation(Long automationId, Automation automation) { return complete(submit( req("PUT", tmpl("/automations/{id}.json").set("id", automationId), JSON, json(Collections.singletonMap("automation", automation))), handle(Automation.class, "automation"))); } - public void deleteAutomation(final long automationId) { + public void deleteAutomation(long automationId) { complete(submit(req("DELETE", tmpl("/automations/{id}.json").set("id", automationId)), handleStatus())); } @@ -780,7 +780,7 @@ public Iterable getUsers() { return new PagedIterable<>(cnst("/users.json"), handleList(User.class, "users")); } - public Iterable getUsersByRole(final String role, final String... roles) { + public Iterable getUsersByRole(String role, String... roles) { // Going to have to build this URI manually, because the RFC6570 template spec doesn't support // variables like ?role[]=...role[]=..., which is what Zendesk requires. // See https://developer.zendesk.com/rest_api/docs/core/users#filters @@ -796,22 +796,22 @@ public Iterable getUsersByRole(final String role, final String... roles) { return new PagedIterable<>(cnst(uriBuilder.toString()), handleList(User.class, "users")); } - public Iterable getUsersIncrementally(final Date startTime) { + public Iterable getUsersIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(User.class, "users")); } - public Iterable getGroupUsers(final long id) { + public Iterable getGroupUsers(long id) { return new PagedIterable<>(tmpl("/groups/{id}/users.json").set("id", id), handleList(User.class, "users")); } - public Iterable getOrganizationUsers(final long id) { + public Iterable getOrganizationUsers(long id) { return new PagedIterable<>(tmpl("/organizations/{id}/users.json").set("id", id), handleList(User.class, "users")); } - public User getUser(final long id) { + public User getUser(long id) { return complete(submit(req("GET", tmpl("/users/{id}.json").set("id", id)), handle(User.class, "user"))); } @@ -824,105 +824,105 @@ public Iterable getUserFields() { handleList(UserField.class, "user_fields"))); } - public User createUser(final User user) { + public User createUser(User user) { return complete(submit(req("POST", cnst("/users.json"), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public User mergeUsers(final long userIdThatWillRemain, final long userIdThatWillBeMerged) { + public User mergeUsers(long userIdThatWillRemain, long userIdThatWillBeMerged) { return complete(submit(req("PUT", tmpl("/users/{id}/merge.json").set("id", userIdThatWillBeMerged), JSON, json( Collections.singletonMap("user", Collections.singletonMap("id", userIdThatWillRemain)))), handle(User.class, "user"))); } - public JobStatus createUsers(final User... users) { + public JobStatus createUsers(User... users) { return createUsers(Arrays.asList(users)); } - public JobStatus createUsers(final List users) { + public JobStatus createUsers(List users) { return complete(createUsersAsync(users)); } - public ListenableFuture createUsersAsync(final List users) { + public ListenableFuture createUsersAsync(List users) { return submit(req("POST", cnst("/users/create_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public User createOrUpdateUser(final User user) { + public User createOrUpdateUser(User user) { return complete(submit(req("POST", cnst("/users/create_or_update.json"), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public JobStatus createOrUpdateUsers(final User... users) { + public JobStatus createOrUpdateUsers(User... users) { return createOrUpdateUsers(Arrays.asList(users)); } - public JobStatus createOrUpdateUsers(final List users) { + public JobStatus createOrUpdateUsers(List users) { return complete(createOrUpdateUsersAsync(users)); } - public ListenableFuture createOrUpdateUsersAsync(final List users) { + public ListenableFuture createOrUpdateUsersAsync(List users) { return submit(req("POST", cnst("/users/create_or_update_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public User updateUser(final User user) { + public User updateUser(User user) { checkHasId(user); return complete(submit(req("PUT", tmpl("/users/{id}.json").set("id", user.getId()), JSON, json( Collections.singletonMap("user", user))), handle(User.class, "user"))); } - public JobStatus updateUsers(final User... users) { + public JobStatus updateUsers(User... users) { return updateUsers(Arrays.asList(users)); } - public JobStatus updateUsers(final List users) { + public JobStatus updateUsers(List users) { return complete(updateUsersAsync(users)); } - public ListenableFuture updateUsersAsync(final List users) { + public ListenableFuture updateUsersAsync(List users) { return submit(req("PUT", cnst("/users/update_many.json"), JSON, json( Collections.singletonMap("users", users))), handleJobStatus()); } - public void deleteUser(final User user) { + public void deleteUser(User user) { checkHasId(user); deleteUser(user.getId()); } - public void deleteUser(final long id) { + public void deleteUser(long id) { complete(submit(req("DELETE", tmpl("/users/{id}.json").set("id", id)), handleStatus())); } - public User permanentlyDeleteUser(final User user) { + public User permanentlyDeleteUser(User user) { checkHasId(user); return permanentlyDeleteUser(user.getId()); } - public User permanentlyDeleteUser(final long id) { + public User permanentlyDeleteUser(long id) { deleteUser(id); return complete(submit(req("DELETE", tmpl("/deleted_users/{id}.json").set("id", id)), handle(User.class))); } - public User suspendUser(final long id) { - final User user = new User(); + public User suspendUser(long id) { + User user = new User(); user.setId(id); user.setSuspended(true); return updateUser(user); } - public User unsuspendUser(final long id) { - final User user = new User(); + public User unsuspendUser(long id) { + User user = new User(); user.setId(id); user.setSuspended(false); return updateUser(user); } - public Iterable lookupUserByEmail(final String email) { + public Iterable lookupUserByEmail(String email) { return new PagedIterable<>(tmpl("/users/search.json{?query}").set("query", email), handleList(User.class, "users")); } - public Iterable lookupUserByExternalId(final String externalId) { + public Iterable lookupUserByExternalId(String externalId) { return new PagedIterable<>(tmpl("/users/search.json{?external_id}").set("external_id", externalId), handleList(User.class, "users")); } @@ -931,135 +931,135 @@ public User getCurrentUser() { return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); } - public void resetUserPassword(final User user, final String password) { + public void resetUserPassword(User user, String password) { checkHasId(user); resetUserPassword(user.getId(), password); } - public void resetUserPassword(final long id, final String password) { + public void resetUserPassword(long id, String password) { complete(submit(req("POST", tmpl("/users/{id}/password.json").set("id", id), JSON, json(Collections.singletonMap("password", password))), handleStatus())); } - public void changeUserPassword(final User user, final String oldPassword, final String newPassword) { + public void changeUserPassword(User user, String oldPassword, String newPassword) { checkHasId(user); - final Map req = new HashMap<>(); + Map req = new HashMap<>(); req.put("previous_password", oldPassword); req.put("password", newPassword); complete(submit(req("PUT", tmpl("/users/{id}/password.json").set("id", user.getId()), JSON, json(req)), handleStatus())); } - public List getUserIdentities(final User user) { + public List getUserIdentities(User user) { checkHasId(user); return getUserIdentities(user.getId()); } - public List getUserIdentities(final long userId) { + public List getUserIdentities(long userId) { return complete(submit(req("GET", tmpl("/users/{id}/identities.json").set("id", userId)), handleList(Identity.class, "identities"))); } - public Identity getUserIdentity(final User user, final Identity identity) { + public Identity getUserIdentity(User user, Identity identity) { checkHasId(identity); return getUserIdentity(user, identity.getId()); } - public Identity getUserIdentity(final User user, final long identityId) { + public Identity getUserIdentity(User user, long identityId) { checkHasId(user); return getUserIdentity(user.getId(), identityId); } - public Identity getUserIdentity(final long userId, final long identityId) { + public Identity getUserIdentity(long userId, long identityId) { return complete(submit(req("GET", tmpl("/users/{userId}/identities/{identityId}.json").set("userId", userId) .set("identityId", identityId)), handle( Identity.class, "identity"))); } - public List setUserPrimaryIdentity(final User user, final Identity identity) { + public List setUserPrimaryIdentity(User user, Identity identity) { checkHasId(identity); return setUserPrimaryIdentity(user, identity.getId()); } - public List setUserPrimaryIdentity(final User user, final long identityId) { + public List setUserPrimaryIdentity(User user, long identityId) { checkHasId(user); return setUserPrimaryIdentity(user.getId(), identityId); } - public List setUserPrimaryIdentity(final long userId, final long identityId) { + public List setUserPrimaryIdentity(long userId, long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/make_primary.json").set("userId", userId) .set("identityId", identityId), JSON, null), handleList(Identity.class, "identities"))); } - public Identity verifyUserIdentity(final User user, final Identity identity) { + public Identity verifyUserIdentity(User user, Identity identity) { checkHasId(identity); return verifyUserIdentity(user, identity.getId()); } - public Identity verifyUserIdentity(final User user, final long identityId) { + public Identity verifyUserIdentity(User user, long identityId) { checkHasId(user); return verifyUserIdentity(user.getId(), identityId); } - public Identity verifyUserIdentity(final long userId, final long identityId) { + public Identity verifyUserIdentity(long userId, long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/verify.json") .set("userId", userId) .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); } - public Identity requestVerifyUserIdentity(final User user, final Identity identity) { + public Identity requestVerifyUserIdentity(User user, Identity identity) { checkHasId(identity); return requestVerifyUserIdentity(user, identity.getId()); } - public Identity requestVerifyUserIdentity(final User user, final long identityId) { + public Identity requestVerifyUserIdentity(User user, long identityId) { checkHasId(user); return requestVerifyUserIdentity(user.getId(), identityId); } - public Identity requestVerifyUserIdentity(final long userId, final long identityId) { + public Identity requestVerifyUserIdentity(long userId, long identityId) { return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/request_verification.json") .set("userId", userId) .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); } - public Identity updateUserIdentity(final long userId, final Identity identity) { + public Identity updateUserIdentity(long userId, Identity identity) { checkHasId(identity); return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}.json") .set("userId", userId) .set("identityId", identity.getId()), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } - public Identity updateUserIdentity(final User user, final Identity identity) { + public Identity updateUserIdentity(User user, Identity identity) { checkHasId(user); return updateUserIdentity(user.getId(), identity); } - public void deleteUserIdentity(final User user, final Identity identity) { + public void deleteUserIdentity(User user, Identity identity) { checkHasId(identity); deleteUserIdentity(user, identity.getId()); } - public void deleteUserIdentity(final User user, final long identityId) { + public void deleteUserIdentity(User user, long identityId) { checkHasId(user); deleteUserIdentity(user.getId(), identityId); } - public void deleteUserIdentity(final long userId, final long identityId) { + public void deleteUserIdentity(long userId, long identityId) { complete(submit(req("DELETE", tmpl("/users/{userId}/identities/{identityId}.json") .set("userId", userId) .set("identityId", identityId) ), handleStatus())); } - public Identity createUserIdentity(final long userId, final Identity identity) { + public Identity createUserIdentity(long userId, Identity identity) { return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", userId), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } - public Identity createUserIdentity(final User user, final Identity identity) { + public Identity createUserIdentity(User user, Identity identity) { return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", user.getId()), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); } @@ -1089,49 +1089,49 @@ public Iterable getCCRequests() { handleList(org.zendesk.client.v2.model.Request.class, "requests")); } - public Iterable getUserRequests(final User user) { + public Iterable getUserRequests(User user) { checkHasId(user); return getUserRequests(user.getId()); } - public Iterable getUserRequests(final long id) { + public Iterable getUserRequests(long id) { return new PagedIterable<>(tmpl("/users/{id}/requests.json").set("id", id), handleList(org.zendesk.client.v2.model.Request.class, "requests")); } - public org.zendesk.client.v2.model.Request getRequest(final long id) { + public org.zendesk.client.v2.model.Request getRequest(long id) { return complete(submit(req("GET", tmpl("/requests/{id}.json").set("id", id)), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public org.zendesk.client.v2.model.Request createRequest(final org.zendesk.client.v2.model.Request request) { + public org.zendesk.client.v2.model.Request createRequest(org.zendesk.client.v2.model.Request request) { return complete(submit(req("POST", cnst("/requests.json"), JSON, json(Collections.singletonMap("request", request))), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public org.zendesk.client.v2.model.Request updateRequest(final org.zendesk.client.v2.model.Request request) { + public org.zendesk.client.v2.model.Request updateRequest(org.zendesk.client.v2.model.Request request) { checkHasId(request); return complete(submit(req("PUT", tmpl("/requests/{id}.json").set("id", request.getId()), JSON, json(Collections.singletonMap("request", request))), handle(org.zendesk.client.v2.model.Request.class, "request"))); } - public Iterable getRequestComments(final org.zendesk.client.v2.model.Request request) { + public Iterable getRequestComments(org.zendesk.client.v2.model.Request request) { checkHasId(request); return getRequestComments(request.getId()); } - public Iterable getRequestComments(final long id) { + public Iterable getRequestComments(long id) { return new PagedIterable<>(tmpl("/requests/{id}/comments.json").set("id", id), handleList(Comment.class, "comments")); } - public Iterable getTicketComments(final long id) { + public Iterable getTicketComments(long id) { return getTicketComments(id, SortOrder.ASCENDING); } - public Iterable getTicketComments(final long id, final SortOrder order) { + public Iterable getTicketComments(long id, SortOrder order) { return new PagedIterable<>( tmpl("/tickets/{id}/comments.json?sort_order={order}") .set("id", id) @@ -1139,33 +1139,33 @@ public Iterable getTicketComments(final long id, final SortOrder order) handleList(Comment.class, "comments")); } - public Comment getRequestComment(final org.zendesk.client.v2.model.Request request, final Comment comment) { + public Comment getRequestComment(org.zendesk.client.v2.model.Request request, Comment comment) { checkHasId(comment); return getRequestComment(request, comment.getId()); } - public Comment getRequestComment(final org.zendesk.client.v2.model.Request request, final long commentId) { + public Comment getRequestComment(org.zendesk.client.v2.model.Request request, long commentId) { checkHasId(request); return getRequestComment(request.getId(), commentId); } - public Comment getRequestComment(final long requestId, final long commentId) { + public Comment getRequestComment(long requestId, long commentId) { return complete(submit(req("GET", tmpl("/requests/{requestId}/comments/{commentId}.json") .set("requestId", requestId) .set("commentId", commentId)), handle(Comment.class, "comment"))); } - public Ticket createComment(final long ticketId, final Comment comment) { - final Ticket ticket = new Ticket(); + public Ticket createComment(long ticketId, Comment comment) { + Ticket ticket = new Ticket(); ticket.setComment(comment); return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticketId), JSON, json(Collections.singletonMap("ticket", ticket))), handle(Ticket.class, "ticket"))); } - public Ticket createTicketFromTweet(final long tweetId, final long monitorId) { - final Map map = new HashMap<>(); + public Ticket createTicketFromTweet(long tweetId, long monitorId) { + Map map = new HashMap<>(); map.put("twitter_status_message_id", tweetId); map.put("monitored_twitter_handle_id", monitorId); @@ -1179,7 +1179,7 @@ public Iterable getOrganizations() { handleList(Organization.class, "organizations")); } - public Iterable getOrganizationsIncrementally(final Date startTime) { + public Iterable getOrganizationsIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/organizations.json{?start_time}") .set("start_time", msToSeconds(startTime.getTime())), @@ -1192,7 +1192,7 @@ public Iterable getOrganizationFields() { handleList(OrganizationField.class, "organization_fields"))); } - public Iterable getAutoCompleteOrganizations(final String name) { + public Iterable getAutoCompleteOrganizations(String name) { if (name == null || name.length() < 2) { throw new IllegalArgumentException("Name must be at least 2 characters long"); } @@ -1202,58 +1202,58 @@ public Iterable getAutoCompleteOrganizations(final String name) { // TODO getOrganizationRelatedInformation - public Organization getOrganization(final long id) { + public Organization getOrganization(long id) { return complete(submit(req("GET", tmpl("/organizations/{id}.json").set("id", id)), handle(Organization.class, "organization"))); } - public Organization createOrganization(final Organization organization) { + public Organization createOrganization(Organization organization) { return complete(submit(req("POST", cnst("/organizations.json"), JSON, json( Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); } - public JobStatus createOrganizations(final Organization... organizations) { + public JobStatus createOrganizations(Organization... organizations) { return createOrganizations(Arrays.asList(organizations)); } - public JobStatus createOrganizations(final List organizations) { + public JobStatus createOrganizations(List organizations) { return complete(createOrganizationsAsync(organizations)); } - public ListenableFuture createOrganizationsAsync(final List organizations) { + public ListenableFuture createOrganizationsAsync(List organizations) { return submit(req("POST", cnst("/organizations/create_many.json"), JSON, json( Collections.singletonMap("organizations", organizations))), handleJobStatus()); } - public Organization updateOrganization(final Organization organization) { + public Organization updateOrganization(Organization organization) { checkHasId(organization); return complete(submit(req("PUT", tmpl("/organizations/{id}.json").set("id", organization.getId()), JSON, json( Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); } - public JobStatus updateOrganizations(final Organization... organizations) { + public JobStatus updateOrganizations(Organization... organizations) { return updateOrganizations(Arrays.asList(organizations)); } - public JobStatus updateOrganizations(final List organizations) { + public JobStatus updateOrganizations(List organizations) { return complete(updateOrganizationsAsync(organizations)); } - public ListenableFuture updateOrganizationsAsync(final List organizations) { + public ListenableFuture updateOrganizationsAsync(List organizations) { return submit(req("PUT", cnst("/organizations/update_many.json"), JSON, json( Collections.singletonMap("organizations", organizations))), handleJobStatus()); } - public void deleteOrganization(final Organization organization) { + public void deleteOrganization(Organization organization) { checkHasId(organization); deleteOrganization(organization.getId()); } - public void deleteOrganization(final long id) { + public void deleteOrganization(long id) { complete(submit(req("DELETE", tmpl("/organizations/{id}.json").set("id", id)), handleStatus())); } - public Iterable lookupOrganizationsByExternalId(final String externalId) { + public Iterable lookupOrganizationsByExternalId(String externalId) { if (externalId == null || externalId.length() < 2) { throw new IllegalArgumentException("Name must be at least 2 characters long"); } @@ -1267,30 +1267,30 @@ public Iterable getOrganizationMemberships() { handleList(OrganizationMembership.class, "organization_memberships")); } - public Iterable getOrganizationMembershipsForOrg(final long organization_id) { + public Iterable getOrganizationMembershipsForOrg(long organization_id) { return new PagedIterable<>(tmpl("/organizations/{organization_id}/organization_memberships.json") .set("organization_id", organization_id), handleList(OrganizationMembership.class, "organization_memberships")); } - public Iterable getOrganizationMembershipsForUser(final long user_id) { + public Iterable getOrganizationMembershipsForUser(long user_id) { return new PagedIterable<>(tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id), handleList(OrganizationMembership.class, "organization_memberships")); } - public OrganizationMembership getOrganizationMembershipForUser(final long user_id, final long id) { + public OrganizationMembership getOrganizationMembershipForUser(long user_id, long id) { return complete(submit(req("GET", tmpl("/users/{user_id}/organization_memberships/{id}.json").set("user_id", user_id).set("id", id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership getOrganizationMembership(final long id) { + public OrganizationMembership getOrganizationMembership(long id) { return complete(submit(req("GET", tmpl("/organization_memberships/{id}.json").set("id", id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership createOrganizationMembership(final OrganizationMembership organizationMembership) { + public OrganizationMembership createOrganizationMembership(OrganizationMembership organizationMembership) { return complete(submit(req("POST", cnst("/organization_memberships.json"), JSON, json( Collections.singletonMap("organization_membership", @@ -1300,14 +1300,14 @@ public OrganizationMembership createOrganizationMembership(final OrganizationMem /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships */ - public JobStatus createOrganizationMemberships(final OrganizationMembership... organizationMemberships) { + public JobStatus createOrganizationMemberships(OrganizationMembership... organizationMemberships) { return createOrganizationMemberships(Arrays.asList(organizationMemberships)); } /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships */ - public JobStatus createOrganizationMemberships(final List organizationMemberships) { + public JobStatus createOrganizationMemberships(List organizationMemberships) { return complete(createOrganizationMembershipsAsync(organizationMemberships)); } @@ -1315,19 +1315,19 @@ public JobStatus createOrganizationMemberships(final List createOrganizationMembershipsAsync( - final List organizationMemberships) { + List organizationMemberships) { return submit(req("POST", cnst("/organization_memberships/create_many.json"), JSON, json( Collections.singletonMap("organization_memberships", organizationMemberships))), handleJobStatus()); } - public void deleteOrganizationMembership(final long id) { + public void deleteOrganizationMembership(long id) { complete(submit(req("DELETE", tmpl("/organization_memberships/{id}.json").set("id", id)), handleStatus())); } /** * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#bulk-delete-memberships */ - public void deleteOrganizationMemberships(final long id, final long... ids) { + public void deleteOrganizationMemberships(long id, long... ids) { complete(submit(req("DELETE", tmpl("/organization_memberships/destroy_many.json{?ids}").set("ids", idArray(id, ids))), handleStatus())); } @@ -1342,12 +1342,12 @@ public Iterable getAssignableGroups() { handleList(Group.class, "groups")); } - public Group getGroup(final long id) { + public Group getGroup(long id) { return complete(submit(req("GET", tmpl("/groups/{id}.json").set("id", id)), handle(Group.class, "group"))); } - public Group createGroup(final Group group) { + public Group createGroup(Group group) { return complete(submit(req("POST", cnst("/groups.json"), JSON, json( Collections.singletonMap("group", group))), handle(Group.class, "group"))); } @@ -1359,7 +1359,7 @@ public Group createGroup(final Group group) { * @see Zendesk Java Client Issue #111 */ @Deprecated - public List createGroups(final Group... groups) { + public List createGroups(Group... groups) { return createGroups(Arrays.asList(groups)); } @@ -1370,22 +1370,22 @@ public List createGroups(final Group... groups) { * @see Zendesk Java Client Issue #111 */ @Deprecated - public List createGroups(final List groups) { + public List createGroups(List groups) { throw new ZendeskException("API Endpoint for createGroups does not exist."); } - public Group updateGroup(final Group group) { + public Group updateGroup(Group group) { checkHasId(group); return complete(submit(req("PUT", tmpl("/groups/{id}.json").set("id", group.getId()), JSON, json( Collections.singletonMap("group", group))), handle(Group.class, "group"))); } - public void deleteGroup(final Group group) { + public void deleteGroup(Group group) { checkHasId(group); deleteGroup(group.getId()); } - public void deleteGroup(final long id) { + public void deleteGroup(long id) { complete(submit(req("DELETE", tmpl("/groups/{id}.json").set("id", id)), handleStatus())); } @@ -1394,71 +1394,71 @@ public Iterable getMacros(){ handleList(Macro.class, "macros")); } - public Macro getMacro(final long macroId){ + public Macro getMacro(long macroId){ return complete(submit(req("GET", tmpl("/macros/{id}.json").set("id", macroId)), handle(Macro.class, "macro"))); } - public Macro createMacro(final Macro macro) { + public Macro createMacro(Macro macro) { return complete(submit( req("POST", cnst("/macros.json"), JSON, json(Collections.singletonMap("macro", macro))), handle(Macro.class, "macro"))); } - public Macro updateMacro(final Long macroId, final Macro macro) { + public Macro updateMacro(Long macroId, Macro macro) { return complete(submit(req("PUT", tmpl("/macros/{id}.json").set("id", macroId), JSON, json(Collections.singletonMap("macro", macro))), handle(Macro.class, "macro"))); } - public Ticket macrosShowChangesToTicket(final long macroId) { + public Ticket macrosShowChangesToTicket(long macroId) { return complete(submit(req("GET", tmpl("/macros/{id}/apply.json").set("id", macroId)), handle(TicketResult.class, "result"))).getTicket(); } - public Ticket macrosShowTicketAfterChanges(final long ticketId, final long macroId) { + public Ticket macrosShowTicketAfterChanges(long ticketId, long macroId) { return complete(submit(req("GET", tmpl("/tickets/{ticket_id}/macros/{id}/apply.json") .set("ticket_id", ticketId) .set("id", macroId)), handle(TicketResult.class, "result"))).getTicket(); } - public List addTagToTicket(final long id, final String... tags) { + public List addTagToTicket(long id, String... tags) { return complete(submit( req("PUT", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List addTagToTopics(final long id, final String... tags) { + public List addTagToTopics(long id, String... tags) { return complete(submit( req("PUT", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List addTagToOrganisations(final long id, final String... tags) { + public List addTagToOrganisations(long id, String... tags) { return complete(submit( req("PUT", tmpl("/organizations/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnTicket(final long id, final String... tags) { + public List setTagOnTicket(long id, String... tags) { return complete(submit( req("POST", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnTopics(final long id, final String... tags) { + public List setTagOnTopics(long id, String... tags) { return complete(submit( req("POST", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List setTagOnOrganisations(final long id, final String... tags) { + public List setTagOnOrganisations(long id, String... tags) { return complete(submit( req("POST", tmpl("/organizations/{id}/tags.json").set("id", id), @@ -1466,21 +1466,21 @@ JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromTicket(final long id, final String... tags) { + public List removeTagFromTicket(long id, String... tags) { return complete(submit( req("DELETE", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromTopics(final long id, final String... tags) { + public List removeTagFromTopics(long id, String... tags) { return complete(submit( req("DELETE", tmpl("/topics/{id}/tags.json").set("id", id), JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public List removeTagFromOrganisations(final long id, final String... tags) { + public List removeTagFromOrganisations(long id, String... tags) { return complete(submit( req("DELETE", tmpl("/organizations/{id}/tags.json").set("id", id), @@ -1488,7 +1488,7 @@ JSON, json(Collections.singletonMap("tags", tags))), handle(List.class, "tags"))); } - public Map getIncrementalTicketsResult(final long unixEpochTime) { + public Map getIncrementalTicketsResult(long unixEpochTime) { return complete(submit( req("GET", tmpl("/exports/tickets.json?start_time={time}").set( @@ -1500,12 +1500,12 @@ public Iterable getGroupMemberships() { handleList(GroupMembership.class, "group_memberships")); } - public List getGroupMembershipByUser(final long user_id) { + public List getGroupMembershipByUser(long user_id) { return complete(submit(req("GET", tmpl("/users/{user_id}/group_memberships.json").set("user_id", user_id)), handleList(GroupMembership.class, "group_memberships"))); } - public List getGroupMemberships(final long group_id) { + public List getGroupMemberships(long group_id) { return complete(submit(req("GET", tmpl("/groups/{group_id}/memberships.json").set("group_id", group_id)), handleList(GroupMembership.class, "group_memberships"))); } @@ -1515,55 +1515,55 @@ public Iterable getAssignableGroupMemberships() { handleList(GroupMembership.class, "group_memberships")); } - public List getAssignableGroupMemberships(final long group_id) { + public List getAssignableGroupMemberships(long group_id) { return complete(submit(req("GET", tmpl("/groups/{group_id}/memberships/assignable.json").set("group_id", group_id)), handleList(GroupMembership.class, "group_memberships"))); } - public GroupMembership getGroupMembership(final long id) { + public GroupMembership getGroupMembership(long id) { return complete(submit(req("GET", tmpl("/group_memberships/{id}.json").set("id", id)), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership getGroupMembership(final long user_id, final long group_membership_id) { + public GroupMembership getGroupMembership(long user_id, long group_membership_id) { return complete(submit(req("GET", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) .set("gmid", group_membership_id)), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership createGroupMembership(final GroupMembership groupMembership) { + public GroupMembership createGroupMembership(GroupMembership groupMembership) { return complete(submit(req("POST", cnst("/group_memberships.json"), JSON, json( Collections.singletonMap("group_membership", groupMembership))), handle(GroupMembership.class, "group_membership"))); } - public GroupMembership createGroupMembership(final long user_id, final GroupMembership groupMembership) { + public GroupMembership createGroupMembership(long user_id, GroupMembership groupMembership) { return complete(submit(req("POST", tmpl("/users/{id}/group_memberships.json").set("id", user_id), JSON, json(Collections.singletonMap("group_membership", groupMembership))), handle(GroupMembership.class, "group_membership"))); } - public void deleteGroupMembership(final GroupMembership groupMembership) { + public void deleteGroupMembership(GroupMembership groupMembership) { checkHasId(groupMembership); deleteGroupMembership(groupMembership.getId()); } - public void deleteGroupMembership(final long id) { + public void deleteGroupMembership(long id) { complete(submit(req("DELETE", tmpl("/group_memberships/{id}.json").set("id", id)), handleStatus())); } - public void deleteGroupMembership(final long user_id, final GroupMembership groupMembership) { + public void deleteGroupMembership(long user_id, GroupMembership groupMembership) { checkHasId(groupMembership); deleteGroupMembership(user_id, groupMembership.getId()); } - public void deleteGroupMembership(final long user_id, final long group_membership_id) { + public void deleteGroupMembership(long user_id, long group_membership_id) { complete(submit(req("DELETE", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) .set("gmid", group_membership_id)), handleStatus())); } - public List setGroupMembershipAsDefault(final long user_id, final GroupMembership groupMembership) { + public List setGroupMembershipAsDefault(long user_id, GroupMembership groupMembership) { checkHasId(groupMembership); return complete(submit(req("PUT", tmpl("/users/{uid}/group_memberships/{gmid}/make_default.json") .set("uid", user_id).set("gmid", groupMembership.getId()), JSON, json( @@ -1575,28 +1575,28 @@ public Iterable getForums() { return new PagedIterable<>(cnst("/forums.json"), handleList(Forum.class, "forums")); } - public List getForums(final long category_id) { + public List getForums(long category_id) { return complete(submit(req("GET", tmpl("/categories/{id}/forums.json").set("id", category_id)), handleList(Forum.class, "forums"))); } - public Forum getForum(final long id) { + public Forum getForum(long id) { return complete(submit(req("GET", tmpl("/forums/{id}.json").set("id", id)), handle(Forum.class, "forum"))); } - public Forum createForum(final Forum forum) { + public Forum createForum(Forum forum) { return complete(submit(req("POST", cnst("/forums.json"), JSON, json( Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); } - public Forum updateForum(final Forum forum) { + public Forum updateForum(Forum forum) { checkHasId(forum); return complete(submit(req("PUT", tmpl("/forums/{id}.json").set("id", forum.getId()), JSON, json( Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); } - public void deleteForum(final Forum forum) { + public void deleteForum(Forum forum) { checkHasId(forum); complete(submit(req("DELETE", tmpl("/forums/{id}.json").set("id", forum.getId())), handleStatus())); } @@ -1605,78 +1605,78 @@ public Iterable getTopics() { return new PagedIterable<>(cnst("/topics.json"), handleList(Topic.class, "topics")); } - public List getTopics(final long forum_id) { + public List getTopics(long forum_id) { return complete(submit(req("GET", tmpl("/forums/{id}/topics.json").set("id", forum_id)), handleList(Topic.class, "topics"))); } - public List getTopicsByUser(final long user_id) { + public List getTopicsByUser(long user_id) { return complete(submit(req("GET", tmpl("/users/{id}/topics.json").set("id", user_id)), handleList(Topic.class, "topics"))); } - public Topic getTopic(final long id) { + public Topic getTopic(long id) { return complete(submit(req("GET", tmpl("/topics/{id}.json").set("id", id)), handle(Topic.class, "topic"))); } - public Topic createTopic(final Topic topic) { + public Topic createTopic(Topic topic) { checkHasId(topic); return complete(submit(req("POST", cnst("/topics.json"), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public Topic importTopic(final Topic topic) { + public Topic importTopic(Topic topic) { checkHasId(topic); return complete(submit(req("POST", cnst("/import/topics.json"), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public List getTopics(final long id, final long... ids) { + public List getTopics(long id, long... ids) { return complete(submit(req("POST", tmpl("/topics/show_many.json{?ids}").set("ids", idArray(id, ids))), handleList(Topic.class, "topics"))); } - public Topic updateTopic(final Topic topic) { + public Topic updateTopic(Topic topic) { checkHasId(topic); return complete(submit(req("PUT", tmpl("/topics/{id}.json").set("id", topic.getId()), JSON, json( Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); } - public void deleteTopic(final Topic topic) { + public void deleteTopic(Topic topic) { checkHasId(topic); complete(submit(req("DELETE", tmpl("/topics/{id}.json").set("id", topic.getId())), handleStatus())); } // https://support.zendesk.com/hc/communities/public/posts/203464106-Managing-Organization-Memberships-via-the-Zendesk-API - public List getOrganizationMembershipByUser(final long user_id) { + public List getOrganizationMembershipByUser(long user_id) { return complete(submit(req("GET", tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id)), handleList(OrganizationMembership.class, "organization_memberships"))); } - public OrganizationMembership getGroupOrganization(final long user_id, final long organization_membership_id) { + public OrganizationMembership getGroupOrganization(long user_id, long organization_membership_id) { return complete(submit(req("GET", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) .set("oid", organization_membership_id)), handle(OrganizationMembership.class, "organization_membership"))); } - public OrganizationMembership createOrganizationMembership(final long user_id, final OrganizationMembership organizationMembership) { + public OrganizationMembership createOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { return complete(submit(req("POST", tmpl("/users/{id}/organization_memberships.json").set("id", user_id), JSON, json(Collections.singletonMap("organization_membership", organizationMembership))), handle(OrganizationMembership.class, "organization_membership"))); } - public void deleteOrganizationMembership(final long user_id, final OrganizationMembership organizationMembership) { + public void deleteOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { checkHasId(organizationMembership); deleteOrganizationMembership(user_id, organizationMembership.getId()); } - public void deleteOrganizationMembership(final long user_id, final long organization_membership_id) { + public void deleteOrganizationMembership(long user_id, long organization_membership_id) { complete(submit(req("DELETE", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) .set("oid", organization_membership_id)), handleStatus())); } - public List setOrganizationMembershipAsDefault(final long user_id, final OrganizationMembership organizationMembership) { + public List setOrganizationMembershipAsDefault(long user_id, OrganizationMembership organizationMembership) { checkHasId(organizationMembership); return complete(submit(req("PUT", tmpl("/users/{uid}/organization_memberships/{omid}/make_default.json") .set("uid", user_id).set("omid", organizationMembership.getId()), JSON, json( @@ -1685,12 +1685,12 @@ public List setOrganizationMembershipAsDefault(final lon } //-- END BETA - public Iterable getSearchResults(final String query) { + public Iterable getSearchResults(String query) { return new PagedIterable<>(tmpl("/search.json{?query}").set("query", query), handleSearchList("results")); } - public Iterable getSearchResults(final Class type, final String query) { + public Iterable getSearchResults(Class type, String query) { return getSearchResults(type, query, Collections.emptyMap()); } @@ -1698,21 +1698,21 @@ public Iterable getSearchResults(final Class Iterable getSearchResults(final Class type, final String query, final String params) { + public Iterable getSearchResults(Class type, String query, String params) { /* preserving backwards compatabile logic, this method will continue to do what it did before, which is "wrong" in that you can't really specify things like sort order via this method */ - final Map paramsMap = new HashMap<>(1); + Map paramsMap = new HashMap<>(1); paramsMap.put("params", params); return getSearchResults(type, query, paramsMap); } - public Iterable getSearchResults(final Class type, final String query, final String sortBy, final SortOrder sortOrder) { - final Map paramsMap = new HashMap<>(2); + public Iterable getSearchResults(Class type, String query, String sortBy, SortOrder sortOrder) { + Map paramsMap = new HashMap<>(2); paramsMap.put("sort_by", sortBy); paramsMap.put("sort_order", sortOrder.getQueryParameter()); @@ -1720,9 +1720,9 @@ public Iterable getSearchResults(final Class Iterable getSearchResults(final Class type, final String query, final Map params) { + public Iterable getSearchResults(Class type, String query, Map params) { String typeName = null; - for (final Map.Entry> entry : searchResultTypes.entrySet()) { + for (Map.Entry> entry : searchResultTypes.entrySet()) { if (type.equals(entry.getValue())) { typeName = entry.getKey(); break; @@ -1732,17 +1732,17 @@ public Iterable getSearchResults(final Class getSearchTicketPageResults( return getSearchPageResults(query, queryParams, sortBy, sortOrder, Ticket.class, TicketPage.class); } - - public void notifyApp(final String json) { + + public void notifyApp(String json) { complete(submit(req("POST", cnst("/apps/notify.json"), JSON, json.getBytes()), handleStatus())); } - public void updateInstallation(final int id, final String json) { + public void updateInstallation(int id, String json) { complete(submit(req("PUT", tmpl("/apps/installations/{id}.json").set("id", id), JSON, json.getBytes()), handleStatus())); } @@ -1822,19 +1822,19 @@ public Iterable getSatisfactionRatings() { handleList(SatisfactionRating.class, "satisfaction_ratings")); } - public SatisfactionRating getSatisfactionRating(final long id) { + public SatisfactionRating getSatisfactionRating(long id) { return complete(submit(req("GET", tmpl("/satisfaction_ratings/{id}.json").set("id", id)), handle(SatisfactionRating.class, "satisfaction_rating"))); } - public SatisfactionRating createSatisfactionRating(final long ticketId, final SatisfactionRating satisfactionRating) { + public SatisfactionRating createSatisfactionRating(long ticketId, SatisfactionRating satisfactionRating) { return complete(submit(req("POST", tmpl("/tickets/{ticketId}/satisfaction_rating.json") .set("ticketId", ticketId), JSON, json(Collections.singletonMap("satisfaction_rating", satisfactionRating))), handle(SatisfactionRating.class, "satisfaction_rating"))); } - public SatisfactionRating createSatisfactionRating(final Ticket ticket, final SatisfactionRating satisfactionRating) { + public SatisfactionRating createSatisfactionRating(Ticket ticket, SatisfactionRating satisfactionRating) { return createSatisfactionRating(ticket.getId(), satisfactionRating); } @@ -1846,22 +1846,22 @@ public Iterable getDynamicContentItems() { return new PagedIterable<>(cnst("/dynamic_content/items.json"), handleList(DynamicContentItem.class, "items")); } - public DynamicContentItem getDynamicContentItem(final long id) { + public DynamicContentItem getDynamicContentItem(long id) { return complete(submit(req("GET", tmpl("/dynamic_content/items/{id}.json").set("id", id)), handle(DynamicContentItem.class, "item"))); } - public DynamicContentItem createDynamicContentItem(final DynamicContentItem item) { + public DynamicContentItem createDynamicContentItem(DynamicContentItem item) { return complete(submit(req("POST", cnst("/dynamic_content/items.json"), JSON, json( Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); } - public DynamicContentItem updateDynamicContentItem(final DynamicContentItem item) { + public DynamicContentItem updateDynamicContentItem(DynamicContentItem item) { checkHasId(item); return complete(submit(req("PUT", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId()), JSON, json(Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); } - public void deleteDynamicContentItem(final DynamicContentItem item) { + public void deleteDynamicContentItem(DynamicContentItem item) { checkHasId(item); complete(submit(req("DELETE", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId())), handleStatus())); @@ -1869,32 +1869,32 @@ public void deleteDynamicContentItem(final DynamicContentItem item) { /** VARIANTS */ - public Iterable getDynamicContentItemVariants(final DynamicContentItem item) { + public Iterable getDynamicContentItemVariants(DynamicContentItem item) { checkHasId(item); return new PagedIterable<>( tmpl("/dynamic_content/items/{id}/variants.json").set("id", item.getId()), handleList(DynamicContentItemVariant.class, "variants")); } - public DynamicContentItemVariant getDynamicContentItemVariant(final Long itemId, final long id) { + public DynamicContentItemVariant getDynamicContentItemVariant(Long itemId, long id) { return complete(submit(req("GET", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", id)), handle(DynamicContentItemVariant.class, "variant"))); } - public DynamicContentItemVariant createDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { + public DynamicContentItemVariant createDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { checkHasItemId(itemId); return complete(submit(req("POST", tmpl("/dynamic_content/items/{id}/variants.json").set("id", itemId), JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); } - public DynamicContentItemVariant updateDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { + public DynamicContentItemVariant updateDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { checkHasItemId(itemId); checkHasId(variant); return complete(submit(req("PUT", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId()), JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); } - public void deleteDynamicContentItemVariant(final Long itemId, final DynamicContentItemVariant variant) { + public void deleteDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { checkHasItemId(itemId); checkHasId(variant); complete(submit(req("DELETE", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId())), handleStatus())); @@ -1919,7 +1919,7 @@ public Iterable getPermissionGroups() { * * @param id */ - public PermissionGroup getPermissionGroup(final long id) { + public PermissionGroup getPermissionGroup(long id) { return complete(submit(req("GET", tmpl("/guide/permission_groups/{id}.json").set("id", id)), handle(PermissionGroup.class, "permission_group"))); } @@ -1928,7 +1928,7 @@ public PermissionGroup getPermissionGroup(final long id) { * * @param permissionGroup */ - public PermissionGroup createPermissionGroup(final PermissionGroup permissionGroup) { + public PermissionGroup createPermissionGroup(PermissionGroup permissionGroup) { return complete(submit(req("POST", tmpl("/guide/permission_groups.json"), JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); } @@ -1937,7 +1937,7 @@ public PermissionGroup createPermissionGroup(final PermissionGroup permissionGro * * @param permissionGroup */ - public PermissionGroup updatePermissionGroup(final PermissionGroup permissionGroup) { + public PermissionGroup updatePermissionGroup(PermissionGroup permissionGroup) { checkHasId(permissionGroup); return complete(submit(req("PUT", tmpl("/guide/permission_groups/{id}.json").set("id", permissionGroup.getId()), JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); @@ -1947,7 +1947,7 @@ public PermissionGroup updatePermissionGroup(final PermissionGroup permissionGro * * @param permissionGroup */ - public void deletePermissionGroup(final PermissionGroup permissionGroup) { + public void deletePermissionGroup(PermissionGroup permissionGroup) { checkHasId(permissionGroup); deletePermissionGroup(permissionGroup.getId()); } @@ -1956,7 +1956,7 @@ public void deletePermissionGroup(final PermissionGroup permissionGroup) { * * @param id */ - public void deletePermissionGroup(final long id) { + public void deletePermissionGroup(long id) { complete(submit(req("DELETE", tmpl("/guide/permission_groups/{id}.json").set("id", id)), handleStatus())); } @@ -1974,7 +1974,7 @@ public Iterable getUserSegments() { * * @return List of User Segments */ - public Iterable getUserSegments(final long id) { + public Iterable getUserSegments(long id) { return new PagedIterable<>(tmpl("/help_center/users/{id}/user_segments.json").set("id", id), handleList(UserSegment.class, "user_segments")); } @@ -1992,7 +1992,7 @@ public Iterable getUserSegmentsApplicable() { * * @param id */ - public UserSegment getUserSegment(final long id) { + public UserSegment getUserSegment(long id) { return complete(submit(req("GET", tmpl("/help_center/user_segments/{id}.json").set("id", id)), handle(UserSegment.class, "user_segment"))); } @@ -2003,7 +2003,7 @@ public UserSegment getUserSegment(final long id) { * @param userSegment * @return List of Sections */ - public Iterable
getSections(final UserSegment userSegment) { + public Iterable
getSections(UserSegment userSegment) { checkHasId(userSegment); return new PagedIterable<>( tmpl("/help_center/user_segments/{id}/sections.json").set("id", userSegment.getId()), @@ -2016,7 +2016,7 @@ public Iterable
getSections(final UserSegment userSegment) { * @param userSegment * @return List of Topics */ - public Iterable getTopics(final UserSegment userSegment) { + public Iterable getTopics(UserSegment userSegment) { checkHasId(userSegment); return new PagedIterable<>( tmpl("/help_center/user_segments/{id}/topics.json").set("id", userSegment.getId()), @@ -2028,7 +2028,7 @@ public Iterable getTopics(final UserSegment userSegment) { * * @param userSegment */ - public UserSegment createUserSegment(final UserSegment userSegment) { + public UserSegment createUserSegment(UserSegment userSegment) { return complete(submit(req("POST", tmpl("/help_center/user_segments.json"), JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); } @@ -2037,7 +2037,7 @@ public UserSegment createUserSegment(final UserSegment userSegment) { * * @param userSegment */ - public UserSegment updateUserSegment(final UserSegment userSegment) { + public UserSegment updateUserSegment(UserSegment userSegment) { checkHasId(userSegment); return complete(submit(req("PUT", tmpl("/help_center/user_segments/{id}.json").set("id", userSegment.getId()), JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); @@ -2047,7 +2047,7 @@ public UserSegment updateUserSegment(final UserSegment userSegment) { * * @param userSegment */ - public void deleteUserSegment(final UserSegment userSegment) { + public void deleteUserSegment(UserSegment userSegment) { checkHasId(userSegment); deleteUserSegment(userSegment.getId()); } @@ -2057,7 +2057,7 @@ public void deleteUserSegment(final UserSegment userSegment) { * * @param id */ - public void deleteUserSegment(final long id) { + public void deleteUserSegment(long id) { complete(submit(req("DELETE", tmpl("/help_center/user_segments/{id}.json").set("id", id)), handleStatus())); } @@ -2078,58 +2078,58 @@ public Iterable
getArticles() { handleList(Article.class, "articles")); } - public Iterable
getArticles(final String locale) { + public Iterable
getArticles(String locale) { return new PagedIterable<>(tmpl("/help_center/{locale}/articles.json").set("locale", locale), handleList(Article.class, "articles")); } - public Iterable
getArticles(final Category category) { + public Iterable
getArticles(Category category) { checkHasId(category); return new PagedIterable<>( tmpl("/help_center/categories/{id}/articles.json").set("id", category.getId()), handleList(Article.class, "articles")); } - public Iterable
getArticles(final Section section) { + public Iterable
getArticles(Section section) { checkHasId(section); return new PagedIterable<>( tmpl("/help_center/sections/{id}/articles.json").set("id", section.getId()), handleList(Article.class, "articles")); } - public Iterable
getArticlesIncrementally(final Date startTime) { + public Iterable
getArticlesIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/help_center/incremental/articles.json{?start_time}") .set("start_time", msToSeconds(startTime.getTime())), handleIncrementalList(Article.class, "articles")); } - public List
getArticlesFromPage(final int page) { + public List
getArticlesFromPage(int page) { return complete(submit(req("GET", tmpl("/help_center/articles.json?page={page}").set("page", page)), handleList(Article.class, "articles"))); } - public Article getArticle(final long id) { + public Article getArticle(long id) { return complete(submit(req("GET", tmpl("/help_center/articles/{id}.json").set("id", id)), handle(Article.class, "article"))); } - public Iterable getArticleTranslations(final Long articleId) { + public Iterable getArticleTranslations(Long articleId) { return new PagedIterable<>( tmpl("/help_center/articles/{articleId}/translations.json").set("articleId", articleId), handleList(Translation.class, "translations")); } - public Article createArticle(final Article article) { + public Article createArticle(Article article) { checkHasSectionId(article); return complete(submit(req("POST", tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); } - public Article createArticle(final Article article, final boolean notifySubscribers) { + public Article createArticle(Article article, boolean notifySubscribers) { checkHasSectionId(article); - final Map map = new HashMap(); + Map map = new HashMap(); map.put("article", article); map.put("notify_subscribers", notifySubscribers ? String.valueOf("true") : String.valueOf("false")); @@ -2137,25 +2137,25 @@ public Article createArticle(final Article article, final boolean notifySubscrib JSON, json(Collections.unmodifiableMap(map))), handle(Article.class, "article"))); } - public Article updateArticle(final Article article) { + public Article updateArticle(Article article) { checkHasId(article); return complete(submit(req("PUT", tmpl("/help_center/articles/{id}.json").set("id", article.getId()), JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); } - public Translation createArticleTranslation(final Long articleId, final Translation translation) { + public Translation createArticleTranslation(Long articleId, Translation translation) { checkHasArticleId(articleId); return complete(submit(req("POST", tmpl("/help_center/articles/{id}/translations.json").set("id", articleId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateArticleTranslation(final Long articleId, final String locale, final Translation translation) { + public Translation updateArticleTranslation(Long articleId, String locale, Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/articles/{id}/translations/{locale}.json").set("id", articleId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteArticle(final Article article) { + public void deleteArticle(Article article) { checkHasId(article); complete(submit(req("DELETE", tmpl("/help_center/articles/{id}.json").set("id", article.getId())), handleStatus())); @@ -2165,7 +2165,7 @@ public void deleteArticle(final Article article) { * Delete translation. * @param translation */ - public void deleteTranslation(final Translation translation) { + public void deleteTranslation(Translation translation) { checkHasId(translation); deleteTranslation(translation.getId()); } @@ -2174,7 +2174,7 @@ public void deleteTranslation(final Translation translation) { * Delete translation. * @param translationId */ - public void deleteTranslation(final Long translationId) { + public void deleteTranslation(Long translationId) { complete(submit(req("DELETE", tmpl("/help_center/translations/{id}.json").set("id", translationId)), handleStatus())); } @@ -2183,7 +2183,7 @@ public void deleteTranslation(final Long translationId) { * Delete attachment from article. * @param attachment */ - public void deleteArticleAttachment(final ArticleAttachments attachment) { + public void deleteArticleAttachment(ArticleAttachments attachment) { checkHasId(attachment); deleteArticleAttachment(attachment.getId()); } @@ -2192,7 +2192,7 @@ public void deleteArticleAttachment(final ArticleAttachments attachment) { * Delete attachment from article. * @param id attachment identifier. */ - public void deleteArticleAttachment(final long id) { + public void deleteArticleAttachment(long id) { complete(submit(req("DELETE", tmpl("/help_center/articles/attachments/{id}.json").set("id", id)), handleStatus())); } @@ -2201,40 +2201,40 @@ public Iterable getCategories() { handleList(Category.class, "categories")); } - public Category getCategory(final long id) { + public Category getCategory(long id) { return complete(submit(req("GET", tmpl("/help_center/categories/{id}.json").set("id", id)), handle(Category.class, "category"))); } - public Iterable getCategoryTranslations(final Long categoryId) { + public Iterable getCategoryTranslations(Long categoryId) { return new PagedIterable<>( tmpl("/help_center/categories/{categoryId}/translations.json").set("categoryId", categoryId), handleList(Translation.class, "translations")); } - public Category createCategory(final Category category) { + public Category createCategory(Category category) { return complete(submit(req("POST", cnst("/help_center/categories.json"), JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); } - public Category updateCategory(final Category category) { + public Category updateCategory(Category category) { checkHasId(category); return complete(submit(req("PUT", tmpl("/help_center/categories/{id}.json").set("id", category.getId()), JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); } - public Translation createCategoryTranslation(final Long categoryId, final Translation translation) { + public Translation createCategoryTranslation(Long categoryId, Translation translation) { checkHasCategoryId(categoryId); return complete(submit(req("POST", tmpl("/help_center/categories/{id}/translations.json").set("id", categoryId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateCategoryTranslation(final Long categoryId, final String locale, final Translation translation) { + public Translation updateCategoryTranslation(Long categoryId, String locale, Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/categories/{id}/translations/{locale}.json").set("id", categoryId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteCategory(final Category category) { + public void deleteCategory(Category category) { checkHasId(category); complete(submit(req("DELETE", tmpl("/help_center/categories/{id}.json").set("id", category.getId())), handleStatus())); @@ -2245,80 +2245,80 @@ public Iterable
getSections() { cnst("/help_center/sections.json"), handleList(Section.class, "sections")); } - public Iterable
getSections(final Category category) { + public Iterable
getSections(Category category) { checkHasId(category); return new PagedIterable<>( tmpl("/help_center/categories/{id}/sections.json").set("id", category.getId()), handleList(Section.class, "sections")); } - public Section getSection(final long id) { + public Section getSection(long id) { return complete(submit(req("GET", tmpl("/help_center/sections/{id}.json").set("id", id)), handle(Section.class, "section"))); } - public Iterable getSectionTranslations(final Long sectionId) { + public Iterable getSectionTranslations(Long sectionId) { return new PagedIterable<>( tmpl("/help_center/sections/{sectionId}/translations.json").set("sectionId", sectionId), handleList(Translation.class, "translations")); } - public Section createSection(final Section section) { + public Section createSection(Section section) { checkHasCategoryId(section); return complete(submit(req("POST", tmpl("/help_center/categories/{id}/sections.json").set("id", section.getCategoryId()), JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); } - public Section updateSection(final Section section) { + public Section updateSection(Section section) { checkHasId(section); return complete(submit(req("PUT", tmpl("/help_center/sections/{id}.json").set("id", section.getId()), JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); } - public Translation createSectionTranslation(final Long sectionId, final Translation translation) { + public Translation createSectionTranslation(Long sectionId, Translation translation) { checkHasSectionId(sectionId); return complete(submit(req("POST", tmpl("/help_center/sections/{id}/translations.json").set("id", sectionId), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public Translation updateSectionTranslation(final Long sectionId, final String locale, final Translation translation) { + public Translation updateSectionTranslation(Long sectionId, String locale, Translation translation) { checkHasId(translation); return complete(submit(req("PUT", tmpl("/help_center/sections/{id}/translations/{locale}.json").set("id", sectionId).set("locale",locale), JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); } - public void deleteSection(final Section section) { + public void deleteSection(Section section) { checkHasId(section); complete(submit(req("DELETE", tmpl("/help_center/sections/{id}.json").set("id", section.getId())), handleStatus())); } - public Iterable getUserSubscriptions(final User user) { + public Iterable getUserSubscriptions(User user) { checkHasId(user); return getUserSubscriptions(user.getId()); } - public Iterable getUserSubscriptions(final Long userId) { + public Iterable getUserSubscriptions(Long userId) { return new PagedIterable<>( tmpl("/help_center/users/{userId}/subscriptions.json").set("userId", userId), handleList(Subscription.class, "subscriptions")); } - public Iterable getArticleSubscriptions(final Long articleId) { + public Iterable getArticleSubscriptions(Long articleId) { return getArticleSubscriptions(articleId, null); } - public Iterable getArticleSubscriptions(final Long articleId, final String locale) { + public Iterable getArticleSubscriptions(Long articleId, String locale) { return new PagedIterable<>( tmpl("/help_center{/locale}/articles/{articleId}/subscriptions.json").set("locale", locale) .set("articleId", articleId), handleList(Subscription.class, "subscriptions")); } - public Iterable getSectionSubscriptions(final Long sectionId) { + public Iterable getSectionSubscriptions(Long sectionId) { return getSectionSubscriptions(sectionId, null); } - public Iterable getSectionSubscriptions(final Long sectionId, final String locale) { + public Iterable getSectionSubscriptions(Long sectionId, String locale) { return new PagedIterable<>( tmpl("/help_center{/locale}/sections/{sectionId}/subscriptions.json").set("locale", locale) .set("sectionId", sectionId), @@ -2334,22 +2334,22 @@ public Iterable getSchedules() { handleList(Schedule.class, "schedules"))); } - public Schedule getSchedule(final Schedule schedule) { + public Schedule getSchedule(Schedule schedule) { checkHasId(schedule); return getSchedule(schedule.getId()); } - public Schedule getSchedule(final Long scheduleId) { + public Schedule getSchedule(Long scheduleId) { return complete(submit(req("GET", tmpl("/business_hours/schedules/{id}.json").set("id", scheduleId)), handle(Schedule.class, "schedule"))); } - public Iterable getHolidaysForSchedule(final Schedule schedule) { + public Iterable getHolidaysForSchedule(Schedule schedule) { checkHasId(schedule); return getHolidaysForSchedule(schedule.getId()); } - public Iterable getHolidaysForSchedule(final Long scheduleId) { + public Iterable getHolidaysForSchedule(Long scheduleId) { return complete(submit(req("GET", tmpl("/business_hours/schedules/{id}/holidays.json").set("id", scheduleId)), handleList(Holiday.class, "holidays"))); @@ -2359,15 +2359,15 @@ public Iterable getHolidaysForSchedule(final Long scheduleId) { // Helper methods ////////////////////////////////////////////////////////////////////// - private byte[] json(final Object object) { + private byte[] json(Object object) { try { return mapper.writeValueAsBytes(object); - } catch (final JsonProcessingException e) { + } catch (JsonProcessingException e) { throw new ZendeskException(e.getMessage(), e); } } - private ListenableFuture submit(final Request request, final ZendeskAsyncCompletionHandler handler) { + private ListenableFuture submit(Request request, ZendeskAsyncCompletionHandler handler) { if (logger.isDebugEnabled()) { if (request.getStringData() != null) { logger.debug("Request {} {}\n{}", request.getMethod(), request.getUrl(), request.getStringData()); @@ -2383,7 +2383,7 @@ private ListenableFuture submit(final Request request, final ZendeskAsync private static abstract class ZendeskAsyncCompletionHandler extends AsyncCompletionHandler { @Override - public void onThrowable(final Throwable t) { + public void onThrowable(Throwable t) { if (t instanceof IOException) { throw new ZendeskException(t); } else { @@ -2392,25 +2392,25 @@ public void onThrowable(final Throwable t) { } } - private Request req(final String method, final Uri template) { + private Request req(String method, Uri template) { return req(method, template.toString()); } private static final Pattern RESTRICTED_PATTERN = Pattern.compile("%2B", Pattern.LITERAL); - private Request req(final String method, final String url) { + private Request req(String method, String url) { return reqBuilder(method, url).build(); } - private Request req(final String method, final Uri template, final String contentType, final byte[] body) { - final RequestBuilder builder = reqBuilder(method, template.toString()); + private Request req(String method, Uri template, String contentType, byte[] body) { + RequestBuilder builder = reqBuilder(method, template.toString()); builder.addHeader("Content-type", contentType); builder.setBody(body); return builder.build(); } - private RequestBuilder reqBuilder(final String method, final String url) { - final RequestBuilder builder = new RequestBuilder(method); + private RequestBuilder reqBuilder(String method, String url) { + RequestBuilder builder = new RequestBuilder(method); if (realm != null) { builder.setRealm(realm); } else { @@ -2423,7 +2423,7 @@ private RequestBuilder reqBuilder(final String method, final String url) { protected ZendeskAsyncCompletionHandler handleStatus() { return new ZendeskAsyncCompletionHandler() { @Override - public Void onCompleted(final Response response) throws Exception { + public Void onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { return null; @@ -2439,7 +2439,7 @@ public Void onCompleted(final Response response) throws Exception { protected ZendeskAsyncCompletionHandler handle(final Class clazz) { return new ZendeskAsyncCompletionHandler() { @Override - public T onCompleted(final Response response) throws Exception { + public T onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { return (T) mapper.readerFor(clazz).readValue(response.getResponseBodyAsStream()); @@ -2459,18 +2459,18 @@ private class BasicAsyncCompletionHandler extends ZendeskAsyncCompletionHandl private final String name; private final Class[] typeParams; - public BasicAsyncCompletionHandler(final Class clazz, final String name, final Class... typeParams) { + public BasicAsyncCompletionHandler(Class clazz, String name, Class... typeParams) { this.clazz = clazz; this.name = name; this.typeParams = typeParams; } @Override - public T onCompleted(final Response response) throws Exception { + public T onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { if (typeParams.length > 0) { - final JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); + JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), type); } return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), clazz); @@ -2491,8 +2491,8 @@ protected ZendeskAsyncCompletionHandler handle(final Class clazz, fina protected ZendeskAsyncCompletionHandler handleJobStatus() { return new BasicAsyncCompletionHandler(JobStatus.class, "job_status") { @Override - public JobStatus onCompleted(final Response response) throws Exception { - final JobStatus result = super.onCompleted(response); + public JobStatus onCompleted(Response response) throws Exception { + JobStatus result = super.onCompleted(response); if (result == null) { // null is when we receive a 404 response. // For an async job we trigger an error @@ -2511,8 +2511,8 @@ public JobStatus onCompleted(final Response response) throws Exception { private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { private String nextPage; - public void setPagedProperties(final JsonNode responseNode, final Class clazz) { - final JsonNode node = responseNode.get(NEXT_PAGE); + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode node = responseNode.get(NEXT_PAGE); if (node == null) { this.nextPage = null; if (logger.isDebugEnabled()) { @@ -2528,7 +2528,7 @@ public String getNextPage() { return nextPage; } - public void setNextPage(final String nextPage) { + public void setNextPage(String nextPage) { this.nextPage = nextPage; } } @@ -2536,19 +2536,19 @@ public void setNextPage(final String nextPage) { private class PagedAsyncListCompletionHandler extends PagedAsyncCompletionHandler> { private final Class clazz; private final String name; - public PagedAsyncListCompletionHandler(final Class clazz, final String name) { + public PagedAsyncListCompletionHandler(Class clazz, String name) { this.clazz = clazz; this.name = name; } @Override - public List onCompleted(final Response response) throws Exception { + public List onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); setPagedProperties(responseNode, clazz); - final List values = new ArrayList<>(); - for (final JsonNode node : responseNode.get(name)) { + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { values.add(mapper.convertValue(node, clazz)); } return values; @@ -2568,8 +2568,8 @@ protected PagedAsyncCompletionHandler> handleList(final Class cla protected PagedAsyncCompletionHandler> handleIncrementalList(final Class clazz, final String name) { return new PagedAsyncListCompletionHandler(clazz, name) { @Override - public void setPagedProperties(final JsonNode responseNode, final Class clazz) { - final JsonNode node = responseNode.get(NEXT_PAGE); + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode node = responseNode.get(NEXT_PAGE); if (node == null) { if (logger.isDebugEnabled()) { logger.debug(NEXT_PAGE + " property not found, pagination not supported" + @@ -2578,7 +2578,7 @@ public void setPagedProperties(final JsonNode responseNode, final Class clazz setNextPage(null); return; } - final JsonNode endTimeNode = responseNode.get(END_TIME); + JsonNode endTimeNode = responseNode.get(END_TIME); if (endTimeNode == null || endTimeNode.asLong() == 0) { if (logger.isDebugEnabled()) { logger.debug(END_TIME + " property not found, incremental export pagination not supported" + @@ -2595,7 +2595,7 @@ public void setPagedProperties(final JsonNode responseNode, final Class clazz setNextPage(null); } else { // Taking into account documentation found at https://developer.zendesk.com/rest_api/docs/core/incremental_export#polling-strategy - final JsonNode countNode = responseNode.get(COUNT); + JsonNode countNode = responseNode.get(COUNT); if (countNode == null) { if (logger.isDebugEnabled()) { logger.debug(COUNT + " property not found, incremental export pagination not supported" + @@ -2618,14 +2618,14 @@ public void setPagedProperties(final JsonNode responseNode, final Class clazz protected PagedAsyncCompletionHandler> handleSearchList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(final Response response) throws Exception { + public List onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); setPagedProperties(responseNode, null); - final List values = new ArrayList<>(); - for (final JsonNode node : responseNode) { - final Class clazz = searchResultTypes.get(node.get("result_type").asText()); + List values = new ArrayList<>(); + for (JsonNode node : responseNode) { + Class clazz = searchResultTypes.get(node.get("result_type").asText()); if (clazz != null) { values.add(mapper.convertValue(node, clazz)); } @@ -2642,14 +2642,14 @@ public List onCompleted(final Response response) throws Exce protected PagedAsyncCompletionHandler> handleTargetList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(final Response response) throws Exception { + public List onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); setPagedProperties(responseNode, null); - final List values = new ArrayList<>(); - for (final JsonNode node : responseNode.get(name)) { - final Class clazz = targetTypes.get(node.get("type").asText()); + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { + Class clazz = targetTypes.get(node.get("type").asText()); if (clazz != null) { values.add(mapper.convertValue(node, clazz)); } @@ -2667,12 +2667,12 @@ public List onCompleted(final Response response) throws Exception { protected PagedAsyncCompletionHandler> handleArticleAttachmentsList(final String name) { return new PagedAsyncCompletionHandler>() { @Override - public List onCompleted(final Response response) throws Exception { + public List onCompleted(Response response) throws Exception { logResponse(response); if (isStatus2xx(response)) { - final JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); - final List values = new ArrayList<>(); - for (final JsonNode node : responseNode.get(name)) { + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { values.add(mapper.convertValue(node, ArticleAttachments.class)); } return values; @@ -2684,15 +2684,15 @@ public List onCompleted(final Response response) throws Exce }; } - private TemplateUri tmpl(final String template) { + private TemplateUri tmpl(String template) { return new TemplateUri(url + template); } - private Uri cnst(final String template) { + private Uri cnst(String template) { return new FixedUri(url + template); } - private void logResponse(final Response response) throws IOException { + private void logResponse(Response response) throws IOException { if (logger.isDebugEnabled()) { logger.debug("Response HTTP/{} {}\n{}", response.getStatusCode(), response.getStatusText(), response.getResponseBody()); @@ -2704,23 +2704,23 @@ private void logResponse(final Response response) throws IOException { private static final String UTF_8 = "UTF-8"; - private static String encodeUrl(final String input) { + private static String encodeUrl(String input) { try { return URLEncoder.encode(input, UTF_8); - } catch (final UnsupportedEncodingException impossible) { + } catch (UnsupportedEncodingException impossible) { return input; } } - private static long msToSeconds(final long millis) { + private static long msToSeconds(long millis) { return TimeUnit.MILLISECONDS.toSeconds(millis); } - private boolean isStatus2xx(final Response response) { + private boolean isStatus2xx(Response response) { return response.getStatusCode() / 100 == 2; } - private boolean isRateLimitResponse(final Response response) { + private boolean isRateLimitResponse(Response response) { return response.getStatusCode() == 429; } @@ -2728,12 +2728,12 @@ private boolean isRateLimitResponse(final Response response) { // Static helper methods ////////////////////////////////////////////////////////////////////// - private static T complete(final ListenableFuture future) { + private static T complete(ListenableFuture future) { try { return future.get(); - } catch (final InterruptedException e) { + } catch (InterruptedException e) { throw new ZendeskException(e.getMessage(), e); - } catch (final ExecutionException e) { + } catch (ExecutionException e) { if (e.getCause() instanceof ZendeskException) { if (e.getCause() instanceof ZendeskResponseRateLimitException) { throw new ZendeskResponseRateLimitException((ZendeskResponseRateLimitException) e.getCause()); @@ -2747,223 +2747,223 @@ private static T complete(final ListenableFuture future) { } } - private static void checkHasId(final Ticket ticket) { + private static void checkHasId(Ticket ticket) { if (ticket.getId() == null) { throw new IllegalArgumentException("Ticket requires id"); } } - private static void checkHasId(final org.zendesk.client.v2.model.Request request) { + private static void checkHasId(org.zendesk.client.v2.model.Request request) { if (request.getId() == null) { throw new IllegalArgumentException("Request requires id"); } } - private static void checkHasId(final Audit audit) { + private static void checkHasId(Audit audit) { if (audit.getId() == null) { throw new IllegalArgumentException("Audit requires id"); } } - private static void checkHasId(final Comment comment) { + private static void checkHasId(Comment comment) { if (comment.getId() == null) { throw new IllegalArgumentException("Comment requires id"); } } - private static void checkHasId(final Field field) { + private static void checkHasId(Field field) { if (field.getId() == null) { throw new IllegalArgumentException("Field requires id"); } } - private static void checkHasId(final Attachment attachment) { + private static void checkHasId(Attachment attachment) { if (attachment.getId() == null) { throw new IllegalArgumentException("Attachment requires id"); } } - private static void checkHasId(final ArticleAttachments attachments) { + private static void checkHasId(ArticleAttachments attachments) { if (attachments.getId() == null) { throw new IllegalArgumentException("Attachment requires id"); } } - private static void checkHasId(final User user) { + private static void checkHasId(User user) { if (user.getId() == null) { throw new IllegalArgumentException("User requires id"); } } - private static void checkHasId(final Identity identity) { + private static void checkHasId(Identity identity) { if (identity.getId() == null) { throw new IllegalArgumentException("Identity requires id"); } } - private static void checkHasId(final Organization organization) { + private static void checkHasId(Organization organization) { if (organization.getId() == null) { throw new IllegalArgumentException("Organization requires id"); } } - private static void checkHasId(final Group group) { + private static void checkHasId(Group group) { if (group.getId() == null) { throw new IllegalArgumentException("Group requires id"); } } - private static void checkHasId(final GroupMembership groupMembership) { + private static void checkHasId(GroupMembership groupMembership) { if (groupMembership.getId() == null) { throw new IllegalArgumentException("GroupMembership requires id"); } } - private void checkHasId(final Forum forum) { + private void checkHasId(Forum forum) { if (forum.getId() == null) { throw new IllegalArgumentException("Forum requires id"); } } - private void checkHasId(final Topic topic) { + private void checkHasId(Topic topic) { if (topic.getId() == null) { throw new IllegalArgumentException("Topic requires id"); } } - private static void checkHasId(final OrganizationMembership organizationMembership) { + private static void checkHasId(OrganizationMembership organizationMembership) { if (organizationMembership.getId() == null) { throw new IllegalArgumentException("OrganizationMembership requires id"); } } - private static void checkHasId(final Article article) { + private static void checkHasId(Article article) { if (article.getId() == null) { throw new IllegalArgumentException("Article requires id"); } } - private static void checkHasId(final DynamicContentItem item) { + private static void checkHasId(DynamicContentItem item) { if (item.getId() == null) { throw new IllegalArgumentException("Item requires id"); } } - private static void checkHasId(final DynamicContentItemVariant variant) { + private static void checkHasId(DynamicContentItemVariant variant) { if (variant.getId() == null) { throw new IllegalArgumentException("Variant requires id"); } } - private static void checkHasItemId(final Long itemId) { + private static void checkHasItemId(Long itemId) { if (itemId == null) { throw new IllegalArgumentException("Variant requires item id"); } } - private static void checkHasSectionId(final Article article) { + private static void checkHasSectionId(Article article) { if (article.getSectionId() == null) { throw new IllegalArgumentException("Article requires section id"); } } - private static void checkHasArticleId(final Long articleId) { + private static void checkHasArticleId(Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires article id"); } } - private static void checkHasSectionId(final Long articleId) { + private static void checkHasSectionId(Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires section id"); } } - private static void checkHasCategoryId(final Long articleId) { + private static void checkHasCategoryId(Long articleId) { if (articleId == null) { throw new IllegalArgumentException("Translation requires category id"); } } - private static void checkHasCategoryId(final Section section) { + private static void checkHasCategoryId(Section section) { if (section.getCategoryId() == null) { throw new IllegalArgumentException("Section requires category id"); } } - private static void checkHasId(final Category category) { + private static void checkHasId(Category category) { if (category.getId() == null) { throw new IllegalArgumentException("Category requires id"); } } - private static void checkHasId(final Section section) { + private static void checkHasId(Section section) { if (section.getId() == null) { throw new IllegalArgumentException("Section requires id"); } } - private static void checkHasId(final SuspendedTicket ticket) { + private static void checkHasId(SuspendedTicket ticket) { if (ticket == null || ticket.getId() == null) { throw new IllegalArgumentException("SuspendedTicket requires id"); } } - private static void checkHasId(final Translation translation) { + private static void checkHasId(Translation translation) { if (translation.getId() == null) { throw new IllegalArgumentException("Translation requires id"); } } - private static void checkHasId(final Schedule schedule) { + private static void checkHasId(Schedule schedule) { if (schedule == null || schedule.getId() == null) { throw new IllegalArgumentException("Schedule requires id"); } } - private static void checkHasId(final Holiday holiday) { + private static void checkHasId(Holiday holiday) { if (holiday == null || holiday.getId() == null) { throw new IllegalArgumentException("Holiday requires id"); } } - private static void checkHasId(final PermissionGroup permissionGroup) { + private static void checkHasId(PermissionGroup permissionGroup) { if (permissionGroup.getId() == null) { throw new IllegalArgumentException("PermissionGroup requires id"); } } - private static void checkHasId(final UserSegment userSegment) { + private static void checkHasId(UserSegment userSegment) { if (userSegment.getId() == null) { throw new IllegalArgumentException("UserSegment requires id"); } } - private static void checkHasToken(final Attachment.Upload upload) { + private static void checkHasToken(Attachment.Upload upload) { if (upload.getToken() == null) { throw new IllegalArgumentException("Upload requires token"); } } - private static List idArray(final long id, final long... ids) { - final List result = new ArrayList<>(ids.length + 1); + private static List idArray(long id, long... ids) { + List result = new ArrayList<>(ids.length + 1); result.add(id); - for (final long i : ids) { + for (long i : ids) { result.add(i); } return result; } - private static List statusArray(final Status... statuses) { - final List result = new ArrayList<>(statuses.length); - for (final Status s : statuses) { + private static List statusArray(Status... statuses) { + List result = new ArrayList<>(statuses.length); + for (Status s : statuses) { result.add(s.toString()); } return result; } public static ObjectMapper createMapper() { - final ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -2983,12 +2983,11 @@ private class PagedIterable implements Iterable { private final Uri url; private final PagedAsyncCompletionHandler> handler; - private PagedIterable(final Uri url, final PagedAsyncCompletionHandler> handler) { + private PagedIterable(Uri url, PagedAsyncCompletionHandler> handler) { this.handler = handler; this.url = url; } - @Override public Iterator iterator() { return new PagedIterator(url); } @@ -2998,24 +2997,22 @@ private class PagedIterator implements Iterator { private Iterator current; private String nextPage; - public PagedIterator(final Uri url) { + public PagedIterator(Uri url) { this.nextPage = url.toString(); } - @Override public boolean hasNext() { if (current == null || !current.hasNext()) { if (nextPage == null || nextPage.equalsIgnoreCase("null")) { return false; } - final List values = complete(submit(req("GET", nextPage), handler)); + List values = complete(submit(req("GET", nextPage), handler)); nextPage = handler.getNextPage(); current = values.iterator(); } return current.hasNext(); } - @Override public T next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -3023,7 +3020,6 @@ public T next() { return current.next(); } - @Override public void remove() { throw new UnsupportedOperationException(); } @@ -3040,22 +3036,22 @@ public static class Builder { private String oauthToken = null; private final Map headers; - public Builder(final String url) { + public Builder(String url) { this.url = url; this.headers = new HashMap<>(); } - public Builder setClient(final AsyncHttpClient client) { + public Builder setClient(AsyncHttpClient client) { this.client = client; return this; } - public Builder setUsername(final String username) { + public Builder setUsername(String username) { this.username = username; return this; } - public Builder setPassword(final String password) { + public Builder setPassword(String password) { this.password = password; if (password != null) { this.token = null; @@ -3064,7 +3060,7 @@ public Builder setPassword(final String password) { return this; } - public Builder setToken(final String token) { + public Builder setToken(String token) { this.token = token; if (token != null) { this.password = null; @@ -3074,7 +3070,7 @@ public Builder setToken(final String token) { } - public Builder setOauthToken(final String oauthToken) { + public Builder setOauthToken(String oauthToken) { this.oauthToken = oauthToken; if (oauthToken != null) { this.password = null; @@ -3084,11 +3080,11 @@ public Builder setOauthToken(final String oauthToken) { } - public Builder setRetry(final boolean retry) { + public Builder setRetry(boolean retry) { return this; } - public Builder addHeader(final String name, final String value) { + public Builder addHeader(String name, String value) { Objects.requireNonNull(name, "Header name cannot be null"); Objects.requireNonNull(value, "Header value cannot be null"); headers.put(name, value); From 67894b759018f35eeaa2cd00b278fc09d915cedc Mon Sep 17 00:00:00 2001 From: Naveen Reddy Alka Date: Mon, 20 Sep 2021 16:05:15 -0700 Subject: [PATCH 021/343] feat(refactor): add more java docs and refactoring page definition --- .../java/org/zendesk/client/v2/Zendesk.java | 42 ++++++++++++++----- .../org/zendesk/client/v2/model/Page.java | 15 +++++++ .../zendesk/client/v2/model/TicketPage.java | 11 ----- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 4ccf67601..0177c0bba 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; +import com.sun.istack.internal.NotNull; +import com.sun.istack.internal.Nullable; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; @@ -1751,14 +1753,24 @@ public Iterable getSearchResults(Class type return new PagedIterable<>(templateUri, handleList(type, "results")); } - + + /** + * Search API implementation with pagination support. + * + * @param String query string used filter a type given by searchType + * @param Map additional parameters other than filter string like per_page, page etc + * @param String name of any field of the searchType + * @param SortOrder + * @param Class type of search entity like Ticket, User etc + * @param Class page return type to which the search result will be deserialized + */ public Optional getSearchPageResults( - final String query, - final Map queryParams, - final String sortBy, - final SortOrder sortOrder, - final Class searchType, - final Class pageType + @NotNull final String query, + @Nullable final Map queryParams, + @Nullable final String sortBy, + @Nullable final SortOrder sortOrder, + @NotNull final Class searchType, + @NotNull final Class pageType ) { final Map paramsMap = new HashMap<>(); @@ -1800,11 +1812,19 @@ public Optional getSearchPageResults( return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType)))); } + /** + * Ticket Search API implementation with pagination support. + * + * @param String query string used filter a type given by searchType + * @param Map additional parameters other than filter string like per_page, page etc + * @param String name of any field of the searchType + * @param SortOrder + */ public Optional getSearchTicketPageResults( - final String query, - final Map queryParams, - final String sortBy, - final SortOrder sortOrder) { + @NotNull final String query, + @Nullable final Map queryParams, + @Nullable final String sortBy, + @Nullable final SortOrder sortOrder) { return getSearchPageResults(query, queryParams, sortBy, sortOrder, Ticket.class, TicketPage.class); } diff --git a/src/main/java/org/zendesk/client/v2/model/Page.java b/src/main/java/org/zendesk/client/v2/model/Page.java index dfdb3910d..6398daa17 100644 --- a/src/main/java/org/zendesk/client/v2/model/Page.java +++ b/src/main/java/org/zendesk/client/v2/model/Page.java @@ -1,8 +1,12 @@ package org.zendesk.client.v2.model; import java.io.Serializable; +import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; +/** + * This is the base class for implementing pagination on any SearchResultEntity + */ public abstract class Page implements Serializable { private static final long serialVersionUID = 456807064715979598L; @@ -10,10 +14,20 @@ public abstract class Page implements Serializable private @JsonProperty("next_page") String nextPage; private @JsonProperty("previous_page") String previousPage; + + private List results; private int count; public abstract Class getTargetClass(); + + public List getResults(){ + return results; + } + + public void setResults(final List results) { + this.results = results; + } public String getNextPage() { return nextPage; @@ -38,4 +52,5 @@ public int getCount() { public void setCount(final int count) { this.count = count; } + } diff --git a/src/main/java/org/zendesk/client/v2/model/TicketPage.java b/src/main/java/org/zendesk/client/v2/model/TicketPage.java index 649eb82c1..16a394322 100644 --- a/src/main/java/org/zendesk/client/v2/model/TicketPage.java +++ b/src/main/java/org/zendesk/client/v2/model/TicketPage.java @@ -1,21 +1,10 @@ package org.zendesk.client.v2.model; -import java.util.List; public class TicketPage extends Page { private static final long serialVersionUID = 434807064715979598L; - private List results; - - public List getResults() { - return results; - } - - public void setResults(final List results) { - this.results = results; - } - @Override public Class getTargetClass() { return Ticket.class; From 84d8ec218022eb5e70fed4fa6ab1e2c8226b1c79 Mon Sep 17 00:00:00 2001 From: Naveen Reddy Alka Date: Tue, 28 Sep 2021 19:19:55 -0700 Subject: [PATCH 022/343] refactor(Zendesk): updated for review comments --- .../java/org/zendesk/client/v2/Zendesk.java | 90 +++++++++---------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 0177c0bba..f0986385c 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1723,33 +1723,13 @@ public Iterable getSearchResults(Class type public Iterable getSearchResults(Class type, String query, Map params) { - String typeName = null; - for (Map.Entry> entry : searchResultTypes.entrySet()) { - if (type.equals(entry.getValue())) { - typeName = entry.getKey(); - break; - } - } + String typeName = getTypeName(type); + if (typeName == null) { return Collections.emptyList(); } - StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace - - //we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri - for (String paramName : params.keySet()) { - uriTemplate.append(",") - .append(paramName); - } - - uriTemplate.append("}"); - - TemplateUri templateUri = tmpl(uriTemplate.toString()) - .set("query", query + "+type:" + typeName); - - if(params != null) { - templateUri.set(params); - } + TemplateUri templateUri = getSearchUri(params, query, typeName); return new PagedIterable<>(templateUri, handleList(type, "results")); } @@ -1773,6 +1753,12 @@ public Optional getSearchPageResults( @NotNull final Class pageType ) { + String typeName = getTypeName(searchType); + + if (typeName == null) { + return Optional.empty(); + } + final Map paramsMap = new HashMap<>(); if(queryParams != null) { @@ -1784,30 +1770,7 @@ public Optional getSearchPageResults( paramsMap.put("sort_order", sortOrder.getQueryParameter()); } - - final StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); - - for (final String paramName : paramsMap.keySet()) { - uriTemplate.append(",") - .append(paramName); - } - - uriTemplate.append("}"); - - String typeName = null; - for (final Map.Entry> entry : searchResultTypes.entrySet()) { - if (searchType.equals(entry.getValue())) { - typeName = entry.getKey(); - break; - } - } - - final TemplateUri templateUri = tmpl(uriTemplate.toString()) - .set("query", query+ "+type:" + typeName); - - if(queryParams != null) { - templateUri.set(queryParams); - } + final TemplateUri templateUri = getSearchUri(paramsMap, query, typeName); return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType)))); } @@ -2981,7 +2944,40 @@ private static List statusArray(Status... statuses) { } return result; } + + private static String getTypeName(@NotNull final Class type) { + String typeName = null; + for (final Map.Entry> entry : searchResultTypes.entrySet()) { + if (type.equals(entry.getValue())) { + typeName = entry.getKey(); + break; + } + } + return typeName; + } + private TemplateUri getSearchUri(Map params, String query , String typeName) { + + StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace + + //we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri + for (String paramName : params.keySet()) { + uriTemplate.append(",") + .append(paramName); + } + + uriTemplate.append("}"); + + TemplateUri templateUri = tmpl(uriTemplate.toString()) + .set("query", query + "+type:" + typeName); + + if(params != null) { + templateUri.set(params); + } + + return templateUri; + } + public static ObjectMapper createMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); From cade7a70d2cc94a1d5a5e163f50c7df20d7996e5 Mon Sep 17 00:00:00 2001 From: Naveen Reddy Alka Date: Tue, 19 Oct 2021 12:55:01 -0700 Subject: [PATCH 023/343] refactor(Zendesk): remove usage of internal NotNull/Nullable and rename methods --- .../java/org/zendesk/client/v2/Zendesk.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index f0986385c..d6a864a52 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -8,8 +8,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.sun.istack.internal.NotNull; -import com.sun.istack.internal.Nullable; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; @@ -1744,13 +1742,13 @@ public Iterable getSearchResults(Class type * @param Class type of search entity like Ticket, User etc * @param Class page return type to which the search result will be deserialized */ - public Optional getSearchPageResults( - @NotNull final String query, - @Nullable final Map queryParams, - @Nullable final String sortBy, - @Nullable final SortOrder sortOrder, - @NotNull final Class searchType, - @NotNull final Class pageType + public Optional getSearchResults( + final Class searchType, + final Class pageType, + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder ) { String typeName = getTypeName(searchType); @@ -1783,13 +1781,13 @@ public Optional getSearchPageResults( * @param String name of any field of the searchType * @param SortOrder */ - public Optional getSearchTicketPageResults( - @NotNull final String query, - @Nullable final Map queryParams, - @Nullable final String sortBy, - @Nullable final SortOrder sortOrder) { + public Optional getSearchTicketResults( + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder) { - return getSearchPageResults(query, queryParams, sortBy, sortOrder, Ticket.class, TicketPage.class); + return getSearchResults(Ticket.class, TicketPage.class, query, queryParams, sortBy, sortOrder); } public void notifyApp(String json) { @@ -2945,7 +2943,7 @@ private static List statusArray(Status... statuses) { return result; } - private static String getTypeName(@NotNull final Class type) { + private static String getTypeName(final Class type) { String typeName = null; for (final Map.Entry> entry : searchResultTypes.entrySet()) { if (type.equals(entry.getValue())) { From 70c9e83f767206e037c87dcfc682190834a2f845 Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Wed, 20 Oct 2021 22:43:46 +0200 Subject: [PATCH 024/343] Bump from extra-enforcer-rules 1.3 to 1.4 https://github.com/mojohaus/extra-enforcer-rules/releases/tag/extra-enforcer-rules-1.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1f75a01e7..7527b47b2 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.3 + 1.4 From ba91e07e0255d0daa341ba3a75c552c83da48b76 Mon Sep 17 00:00:00 2001 From: Cott Lang Date: Mon, 12 Jul 2021 12:03:02 -0700 Subject: [PATCH 025/343] Add end_user_conditions to ticket form --- .../zendesk/client/v2/model/TicketForm.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/model/TicketForm.java b/src/main/java/org/zendesk/client/v2/model/TicketForm.java index a0856bcaf..447fec9a5 100644 --- a/src/main/java/org/zendesk/client/v2/model/TicketForm.java +++ b/src/main/java/org/zendesk/client/v2/model/TicketForm.java @@ -32,6 +32,8 @@ public class TicketForm implements SearchResultEntity, Serializable { private Date createdAt; @JsonProperty("updated_at") private Date updatedAt; + @JsonProperty("end_user_conditions") + private List endUserConditions; public String getName() { return name; @@ -105,4 +107,67 @@ public Long getId() { public void setId(Long id) { this.id = id; } + + public List getEndUserConditions() { + return endUserConditions; + } + + public void setEndUserConditions(List endUserConditions) { + this.endUserConditions = endUserConditions; + } + + public static class EndUserCondition implements Serializable { + private static final long serialVersionUID = 1L; + @JsonProperty("parent_field_id") + private String parentFieldId; + private String value; + @JsonProperty("child_fields") + private List childFields; + + public String getParentFieldId() { + return parentFieldId; + } + + public void setParentFieldId(String parentFieldId) { + this.parentFieldId = parentFieldId; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public List getChildFields() { + return childFields; + } + + public void setChildFields(List childFields) { + this.childFields = childFields; + } + } + + public static class ChildField implements Serializable { + private static final long serialVersionUID = 1L; + private String id; + private boolean isRequired; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isRequired() { + return isRequired; + } + + public void setRequired(boolean required) { + isRequired = required; + } + } } From 2c82d0786f29bb9a6ac4e5e945a0ea9fb003e742 Mon Sep 17 00:00:00 2001 From: Yusuke Yamamoto Date: Thu, 22 Apr 2021 15:25:17 +0900 Subject: [PATCH 026/343] Add support for recovering suspended tickets https://developer.zendesk.com/rest_api/docs/support/suspended_tickets#recover-multiple-suspended-tickets --- src/main/java/org/zendesk/client/v2/Zendesk.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 1de73d221..96458ac1c 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -93,6 +93,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; /** * @author stephenc @@ -613,6 +615,15 @@ public Iterable getSuspendedTickets() { handleList(SuspendedTicket.class, "suspended_tickets")); } + public Iterable recoverSuspendedTickets(List tickets) { + List ids = new ArrayList<>(); + for (SuspendedTicket ticket : tickets) { + ids.add(ticket.getId()); + } + return complete(submit(req("PUT", tmpl("/suspended_tickets/recover_many.json{?ids}").set("ids", ids)), + handleList(Ticket.class, "tickets"))); + } + public void deleteSuspendedTicket(SuspendedTicket ticket) { checkHasId(ticket); deleteSuspendedTicket(ticket.getId()); From 0179b8943ba7bc8bde051619e0172eedb118e6d7 Mon Sep 17 00:00:00 2001 From: Yusuke Yamamoto Date: Thu, 22 Apr 2021 15:29:50 +0900 Subject: [PATCH 027/343] remove unused imports --- src/main/java/org/zendesk/client/v2/Zendesk.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 96458ac1c..313883625 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -93,8 +93,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; /** * @author stephenc From fe6ca982739ae64e76121e78c9a38ca6a8080466 Mon Sep 17 00:00:00 2001 From: Yusuke Yamamoto Date: Tue, 4 May 2021 15:18:19 +0900 Subject: [PATCH 028/343] Throw IllegalArgumentException when the number of tickets exceeds 100, because the endpoint accepts up to 100 ticket ids: https://developer.zendesk.com/rest_api/docs/support/suspended_tickets#recover-multiple-suspended-tickets --- src/main/java/org/zendesk/client/v2/Zendesk.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 313883625..dcbdf8870 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -613,7 +613,18 @@ public Iterable getSuspendedTickets() { handleList(SuspendedTicket.class, "suspended_tickets")); } + /** + * Recover Multiple Suspended Tickets. Accepts up to 100 ticket ids. + * + * @throws IllegalArgumentException when the number of tickets exceeds 100 + * @param tickets tickets to be recovered + * @return recovered tickets + */ public Iterable recoverSuspendedTickets(List tickets) { + if (100 < tickets.size()) { + throw new IllegalArgumentException("This endpoint accepts up to 100 tickets. Provided " + tickets.size() + " tickets.\n" + + "https://developer.zendesk.com/rest_api/docs/support/suspended_tickets#recover-multiple-suspended-tickets"); + } List ids = new ArrayList<>(); for (SuspendedTicket ticket : tickets) { ids.add(ticket.getId()); From 27a20726195f626269b5b44d19bbb9c02432abad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Markovi=C4=8D?= Date: Wed, 29 Sep 2021 17:03:10 +0200 Subject: [PATCH 029/343] issue-387 - remove @JsonFormat form Date getters --- .../java/org/zendesk/client/v2/model/hc/PermissionGroup.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/model/hc/PermissionGroup.java b/src/main/java/org/zendesk/client/v2/model/hc/PermissionGroup.java index fb74faff6..7fb1be63e 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/PermissionGroup.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/PermissionGroup.java @@ -1,6 +1,5 @@ package org.zendesk.client.v2.model.hc; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import org.zendesk.client.v2.model.SearchResultEntity; @@ -24,11 +23,9 @@ public class PermissionGroup implements SearchResultEntity { private List publish; /** When the permission group was created */ @JsonProperty("created_at") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss Z") private Date createdAt; /** When the permission group was last updated */ @JsonProperty("updated_at") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss Z") private Date updatedAt; /** Whether the permission group is built-in. Built-in permission groups cannot be modified */ @JsonProperty("built_in") From a3dc3a05b3a6acea00bf3e8c0ee4b892816694b9 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 09:37:03 +0200 Subject: [PATCH 030/343] Fix unit tests for #387 --- .../client/v2/model/hc/PermissionGroupTest.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/model/hc/PermissionGroupTest.java b/src/test/java/org/zendesk/client/v2/model/hc/PermissionGroupTest.java index 5d1e0b0f9..9e7ace7e5 100644 --- a/src/test/java/org/zendesk/client/v2/model/hc/PermissionGroupTest.java +++ b/src/test/java/org/zendesk/client/v2/model/hc/PermissionGroupTest.java @@ -35,8 +35,8 @@ public void testParsePermissionGroup() throws ParseException { " \"name\": \"ApiGroup\",\n" + " \"built_in\": false,\n" + " \"publish\": [360001413871],\n" + - " \"created_at\": \"2019-06-10 12:39:23 +0000\",\n" + - " \"updated_at\": \"2019-06-10 12:39:23 +0000\",\n" + + " \"created_at\": \"2019-06-10T12:39:25Z\",\n" + + " \"updated_at\": \"2020-11-04T11:30:42Z\",\n" + " \"edit\": [360001413871]\n" + "}"; PermissionGroup pg = parseJson(json.getBytes()); @@ -51,10 +51,11 @@ public void testParsePermissionGroup() throws ParseException { assertEquals(ids, pg.getPublish()); assertEquals(ids, pg.getEdit()); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z"); - Date date = simpleDateFormat.parse("2019-06-10 12:39:23 +0000"); - assertEquals(date, pg.getCreatedAt()); - assertEquals(date, pg.getUpdatedAt()); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); + Date created = simpleDateFormat.parse("2019-06-10 12:39:25 +0000"); + assertEquals(created, pg.getCreatedAt()); + Date updated = simpleDateFormat.parse("2020-11-04 11:30:42 +0000"); + assertEquals(updated, pg.getUpdatedAt()); } } From b5e87a09547fa1bf0fdb5b18959899f1d448e02a Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 09:37:19 +0200 Subject: [PATCH 031/343] Add integration tests for #387 --- .../org/zendesk/client/v2/RealSmokeTest.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 8a9ee5b62..bed19b03a 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -41,6 +41,7 @@ import org.zendesk.client.v2.model.events.Event; import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; import org.zendesk.client.v2.model.hc.Translation; @@ -77,9 +78,10 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; @@ -1245,6 +1247,49 @@ public void getGroups() throws Exception { } } + @Test + public void getPermissionGroups() throws Exception { + createClientWithTokenOrPassword(); + int count = 0; + for (PermissionGroup pg : instance.getPermissionGroups()) { + assertThat(pg.getId(), notNullValue()); + assertThat(pg.getName(), notNullValue()); + assertThat(pg.getBuiltIn(), notNullValue()); + assertThat(pg.getCreatedAt(), notNullValue()); + assertThat(pg.getUpdatedAt(), notNullValue()); + if (++count > 1) { + break; + } + } + } + + @Test + public void permissionGroupCRUD() throws Exception { + createClientWithTokenOrPassword(); + PermissionGroup pg = new PermissionGroup(); + pg.setName("[zendesk-java-client] This is a creation test " + UUID.randomUUID()); + pg = instance.createPermissionGroup(pg); + Long pgId = pg.getId(); + try { + assertThat(pg.getId(), notNullValue()); + assertThat(pg.getName(), containsString("[zendesk-java-client] This is a creation test")); + assertThat(pg.getCreatedAt(), notNullValue()); + assertThat(pg.getUpdatedAt(), notNullValue()); + assertThat(pg.getCreatedAt(), is(pg.getUpdatedAt())); + pg.setName("[zendesk-java-client] This is an update test" + UUID.randomUUID()); + pg = instance.updatePermissionGroup(pg); + assertThat(pg.getId(), is(pgId)); + assertThat(pg.getName(), containsString("[zendesk-java-client] This is an update test")); + assertThat(pg.getCreatedAt(), notNullValue()); + assertThat(pg.getUpdatedAt(), notNullValue()); + assertThat(pg.getCreatedAt(), lessThanOrEqualTo(pg.getUpdatedAt())); + } finally { + instance.deletePermissionGroup(pg); + } + PermissionGroup ghost = instance.getPermissionGroup(pgId); + assertThat(ghost, nullValue()); + } + @Test public void getArticles() throws Exception { createClientWithTokenOrPassword(); From 857200ad193c2d80986e28fac5460d4b3b2e6d8b Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Thu, 21 Oct 2021 10:10:59 +0200 Subject: [PATCH 032/343] [chore] Add GitHub discussions link --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4304ab1ad..46d47731c 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,11 @@ all records have been fetched, so e.g. will iterate through *all* tickets. Most likely you will want to implement your own cut-off process to stop iterating when you have got enough data. -Mailing lists +Community ------------- * [Users list](https://groups.google.com/forum/#!forum/zendesk-java-client-users) +* [GitHub discussions](https://github.com/cloudbees-oss/zendesk-java-client/discussions) Status ------ From 2f08c4f500eaebdceee1d922eb0eca9e05b253d0 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Thu, 21 Oct 2021 11:43:06 +0200 Subject: [PATCH 033/343] Add the Close Stale issue action --- .github/workflows/close-stale-items.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/close-stale-items.yml diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml new file mode 100644 index 000000000..bf3c21a57 --- /dev/null +++ b/.github/workflows/close-stale-items.yml @@ -0,0 +1,16 @@ +name: "Close stale issues and PRs" +on: + schedule: + - cron: "0 8 * * *" + +jobs: + default: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4.0.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + only-pr-labels: 'needs-fix' + exempt-draft-pr: true + stale-issue-message: 'This issue/PR is stale because it has been opened 60 days with no activity. Remove stale label or comment or this will be closed in 7 days' + From abf9ed6498a778df72f54d651aaa6d5e9905a0b6 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 12:32:05 +0200 Subject: [PATCH 034/343] [chore] Travis/Jenkins not used anymore (GitHub action instead) --- .travis.yml | 1 - Jenkinsfile | 33 --------------------------------- 2 files changed, 34 deletions(-) delete mode 100644 .travis.yml delete mode 100644 Jenkinsfile diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f5c99a7f6..000000000 --- a/.travis.yml +++ /dev/null @@ -1 +0,0 @@ -language: java \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index d6c28779a..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,33 +0,0 @@ -// For Reference Only -pipeline { - environment { - ZENDESK_JAVA_CLIENT_TEST_URL = credentials('ZENDESK_JAVA_CLIENT_TEST_URL') - ZENDESK_JAVA_CLIENT_TEST_USERNAME = credentials('ZENDESK_JAVA_CLIENT_TEST_USERNAME') - ZENDESK_JAVA_CLIENT_TEST_PASSWORD = credentials('ZENDESK_JAVA_CLIENT_TEST_PASSWORD') - ZENDESK_JAVA_CLIENT_TEST_TOKEN = credentials('ZENDESK_JAVA_CLIENT_TEST_TOKEN') - ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL = credentials('ZENDESK_JAVA_CLIENT_TEST_REQUESTER.EMAIL') - ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME = credentials('ZENDESK_JAVA_CLIENT_TEST_REQUESTER.NAME') - } - agent { - label "standard" - } - stages { - stage("Build") { - steps { - withSonarQubeEnv('sonarcloud.io') { - withMaven( - mavenOpts: '-Xmx512m -Djava.awt.headless=true' - ) { - sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent ${env.BRANCH_NAME == 'master' && readMavenPom().version.contains('-SNAPSHOT') ? 'deploy -DdeployAtEnd=true' : 'verify'} sonar:sonar -Dsonar.organization=cloudbees -Dsonar.branch.name=\"${env.BRANCH_NAME}\" -Dmaven.test.failure.ignore=true" - } - } - } - } - } - options { - // Keep 10 builds at a time - buildDiscarder(logRotator(numToKeepStr: '10')) - // Be sure that this build doesn't hang forever - timeout(time: 5, unit: 'MINUTES') - } -} From 30e0e7d5de9408e400549aff2bf20511e03fde01 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 12:32:33 +0200 Subject: [PATCH 035/343] [chore] Activate the release profile to not discover issues when releasing But disable GPG --- .github/workflows/ci-master.yml | 2 +- .github/workflows/ci-pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index e1ecc45ac..131e5fa0c 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -23,7 +23,7 @@ jobs: distribution: 'adopt' java-version: 8 - name: Build with Maven - run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage + run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage,cloudbees-oss-release -Dgpg.skip=true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ZENDESK_JAVA_CLIENT_TEST_URL: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_URL }} diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index dc10c395c..5a9883d14 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -23,6 +23,6 @@ jobs: distribution: 'adopt' java-version: 8 - name: Build with Maven - run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage + run: mvn --show-version --no-transfer-progress verify --file pom.xml -Pcoverage,cloudbees-oss-release -Dgpg.skip=true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9184362b818921aa0bf3b0e93b0f8ae5747775ce Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 12:45:38 +0200 Subject: [PATCH 036/343] [chore] Fix javadocs errors introduced in #394 --- .../java/org/zendesk/client/v2/Zendesk.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 3b977ab4f..8ef99f7fa 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -60,10 +60,10 @@ import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.ArticleAttachments; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; import org.zendesk.client.v2.model.hc.Translation; -import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.UserSegment; import org.zendesk.client.v2.model.schedules.Holiday; import org.zendesk.client.v2.model.schedules.Schedule; @@ -1754,13 +1754,13 @@ public Iterable getSearchResults(Class type /** * Search API implementation with pagination support. - * - * @param String query string used filter a type given by searchType - * @param Map additional parameters other than filter string like per_page, page etc - * @param String name of any field of the searchType - * @param SortOrder - * @param Class type of search entity like Ticket, User etc - * @param Class page return type to which the search result will be deserialized + * + * @param searchType type of search entity like Ticket, User etc + * @param pageType page return type to which the search result will be deserialized + * @param query string used filter a type given by searchType + * @param queryParams additional parameters other than filter string like per_page, page etc + * @param sortBy name of any field of the searchType + * @param sortOrder sort order */ public Optional getSearchResults( final Class searchType, @@ -1796,10 +1796,10 @@ public Optional getSearchResults( /** * Ticket Search API implementation with pagination support. * - * @param String query string used filter a type given by searchType - * @param Map additional parameters other than filter string like per_page, page etc - * @param String name of any field of the searchType - * @param SortOrder + * @param query string used filter a type given by searchType + * @param queryParams additional parameters other than filter string like per_page, page etc + * @param sortBy name of any field of the searchType + * @param sortOrder sort order */ public Optional getSearchTicketResults( final String query, From 604ad76b0c7de667eea124845b97ede8601f0fc6 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 13:25:16 +0200 Subject: [PATCH 037/343] [maven-release-plugin] prepare release zendesk-java-client-0.15.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 69b2f9e5d..ce9e01ad3 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.14.2-SNAPSHOT + 0.15.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.15.0 From 9427c0632bda256d942432658e3f9152aec56872 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Thu, 21 Oct 2021 13:25:19 +0200 Subject: [PATCH 038/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ce9e01ad3..f2ffb9bb8 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.15.0 + 0.15.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.15.0 + HEAD From d2720f7b8cf2fcdf47175870cc602caedc0c478d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Oct 2021 20:03:26 +0000 Subject: [PATCH 039/343] Bump awaitility from 4.1.0 to 4.1.1 Bumps [awaitility](https://github.com/awaitility/awaitility) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/awaitility/awaitility/releases) - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.1.0...awaitility-4.1.1) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2ffb9bb8..41c021b50 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ org.awaitility awaitility - 4.1.0 + 4.1.1 test From 11889b81ec400bcb1bd5010437710826ee54db6c Mon Sep 17 00:00:00 2001 From: Bernhard Schandl Date: Mon, 8 Nov 2021 22:18:54 +0100 Subject: [PATCH 040/343] Add type attribute to Comment model --- .../java/org/zendesk/client/v2/model/Comment.java | 11 +++++++++++ .../org/zendesk/client/v2/model/CommentType.java | 13 +++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/org/zendesk/client/v2/model/CommentType.java diff --git a/src/main/java/org/zendesk/client/v2/model/Comment.java b/src/main/java/org/zendesk/client/v2/model/Comment.java index 4ec6c2b46..64dbf27f4 100644 --- a/src/main/java/org/zendesk/client/v2/model/Comment.java +++ b/src/main/java/org/zendesk/client/v2/model/Comment.java @@ -23,6 +23,8 @@ public class Comment implements Serializable { private List attachments; private Date createdAt; private Boolean publicComment; + private CommentType type; + public Comment() { } @@ -104,6 +106,15 @@ public void setPublic(Boolean isPublic) { this.publicComment = isPublic; } + @JsonProperty("type") + public CommentType getType() { + return type; + } + + public void setType(CommentType type) { + this.type = type; + } + @Override public String toString() { return "Comment{" + "id=" + id + diff --git a/src/main/java/org/zendesk/client/v2/model/CommentType.java b/src/main/java/org/zendesk/client/v2/model/CommentType.java new file mode 100644 index 000000000..7dcca09ac --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/CommentType.java @@ -0,0 +1,13 @@ +package org.zendesk.client.v2.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_comments/ + */ +public enum CommentType { + + @JsonProperty("Comment") COMMENT, + @JsonProperty("VoiceComment") VOICE_COMMENT; + +} From 6af821d52f1152d238a0e4350525a85e4b22d17d Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Fri, 12 Nov 2021 14:41:24 +0100 Subject: [PATCH 041/343] [fix] Configure the DefaultAsyncHttpClient to follow redirects It seems that Zendesk started to emit some redirects when iterating on multi-pages results. Maybe because we use a custom domain? The problem started yesterday. ``` Exception in thread "main" org.zendesk.client.v2.ZendeskResponseException: HTTP/302: Found - You are being redirected to https://foo.zendesk.com/access/return_to?challenge=XXXXXXX&locale=en-US-x-1&return_to=https%3A%2F%2Fsupport.foo.com%2Fapi%2Fv2%2Ftickets%2F210487%2Fcomments.json%3Fsort_order%3Dasc at org.zendesk.client.v2.Zendesk.complete(Zendesk.java:2539) at org.zendesk.client.v2.Zendesk.access$1400(Zendesk.java:100) at org.zendesk.client.v2.Zendesk$PagedIterable$PagedIterator.hasNext(Zendesk.java:2805) ``` --- src/main/java/org/zendesk/client/v2/Zendesk.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 8ef99f7fa..0c11906b6 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -11,6 +11,7 @@ import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; +import org.asynchttpclient.DefaultAsyncHttpClientConfig; import org.asynchttpclient.ListenableFuture; import org.asynchttpclient.Realm; import org.asynchttpclient.Request; @@ -102,6 +103,8 @@ */ public class Zendesk implements Closeable { private static final String JSON = "application/json; charset=UTF-8"; + private static final DefaultAsyncHttpClientConfig DEFAULT_ASYNC_HTTP_CLIENT_CONFIG = + new DefaultAsyncHttpClientConfig.Builder().setFollowRedirect(true).build(); private final boolean closeClient; private final AsyncHttpClient client; private final Realm realm; @@ -147,7 +150,7 @@ private Zendesk(AsyncHttpClient client, String url, String username, String pass this.logger = LoggerFactory.getLogger(Zendesk.class); this.closeClient = client == null; this.oauthToken = null; - this.client = client == null ? new DefaultAsyncHttpClient() : client; + this.client = client == null ? new DefaultAsyncHttpClient(DEFAULT_ASYNC_HTTP_CLIENT_CONFIG) : client; this.url = url.endsWith("/") ? url + "api/v2" : url + "/api/v2"; if (username != null) { this.realm = new Realm.Builder(username, password) @@ -169,7 +172,7 @@ private Zendesk(AsyncHttpClient client, String url, String oauthToken, Map Date: Fri, 12 Nov 2021 15:32:37 +0100 Subject: [PATCH 042/343] [chore] Configure the polling interval/delay to be less aggressive It avoids APIRateLimitExceeded errors --- .../java/org/zendesk/client/v2/RealSmokeTest.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index bed19b03a..387957cb3 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1,6 +1,7 @@ package org.zendesk.client.v2; import org.apache.commons.lang3.time.DateUtils; +import org.awaitility.Awaitility; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; import org.hamcrest.core.IsCollectionContaining; @@ -81,7 +82,6 @@ import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; @@ -120,6 +120,9 @@ public static void loadConfig() { config = ZendeskConfig.load(); assumeThat("We have a configuration", config, notNullValue()); assumeThat("Configuration has an url", config.getProperty("url"), not(isEmptyString())); + Awaitility.setDefaultTimeout(2, TimeUnit.MINUTES); + Awaitility.setDefaultPollDelay(10, TimeUnit.SECONDS); + Awaitility.setDefaultPollInterval(20, TimeUnit.SECONDS); } public void assumeHaveToken() { @@ -1874,8 +1877,8 @@ private JobStatus waitJobCompletion(final JobStatus result) { assertNotNull(result.getId()); assertNotNull(result.getStatus()); - // Let's wait for its completion (5 seconds max) - await().atMost(10, TimeUnit.SECONDS).until(() -> + // Let's wait for its completion (30 seconds max) + await().until(() -> instance.getJobStatus(result).getStatus() == JobStatus.JobStatusEnum.completed); // Let's validate and return the completed result @@ -1894,7 +1897,7 @@ private JobStatus waitJobCompletion(final JobStatus result) { */ private void waitTicketDeleted(long ticketId) { // Wait for the confirmation - await().atMost(10, TimeUnit.SECONDS).until(() -> StreamSupport + await().until(() -> StreamSupport .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) .map(DeletedTicket::getId) .collect(Collectors.toList()) @@ -1908,7 +1911,7 @@ private void waitTicketDeleted(long ticketId) { */ private void waitTicketsDeleted(Long[] ticketsIds) { // Wait for the confirmation - await().atMost(10, TimeUnit.SECONDS).until(() -> StreamSupport + await().until(() -> StreamSupport .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) .map(DeletedTicket::getId) .collect(Collectors.toList()) From fbd099a74b89997d866a756cf19fedcfedc96b99 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Fri, 12 Nov 2021 15:48:40 +0100 Subject: [PATCH 043/343] [feature] Allow to delete TicketForm And use it in ITs to delete the created ones (we reached the limit of 300 forms) --- .../java/org/zendesk/client/v2/Zendesk.java | 15 +++++++++++++ .../org/zendesk/client/v2/RealSmokeTest.java | 22 ++++++++++++------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 8ef99f7fa..f616220ea 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -248,6 +248,15 @@ public TicketForm createTicketForm(TicketForm ticketForm) { Collections.singletonMap("ticket_form", ticketForm))), handle(TicketForm.class, "ticket_form"))); } + public void deleteTicketForm(TicketForm ticketForm) { + checkHasId(ticketForm); + deleteTicketForm(ticketForm.getId()); + } + + public void deleteTicketForm(long id) { + complete(submit(req("DELETE", tmpl("/ticket_forms/{id}.json").set("id", id)), handleStatus())); + } + public Ticket importTicket(TicketImport ticketImport) { return complete(submit(req("POST", cnst("/imports/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticketImport))), @@ -2754,6 +2763,12 @@ private static void checkHasId(Ticket ticket) { } } + private static void checkHasId(TicketForm ticketForm) { + if (ticketForm.getId() == null) { + throw new IllegalArgumentException("TicketForm requires id"); + } + } + private static void checkHasId(org.zendesk.client.v2.model.Request request) { if (request.getId() == null) { throw new IllegalArgumentException("Request requires id"); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index bed19b03a..e2fac1c85 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1589,20 +1589,26 @@ public void createOrUpdateUser() throws Exception { public void createTicketForm() throws Exception { createClientWithTokenOrPassword(); TicketForm form = new TicketForm(); + TicketForm createdForm = null; form.setActive(true); final String givenName = "Test ticket form"; form.setName(givenName); form.setDisplayName(givenName); form.setRawName(givenName); form.setRawDisplayName(givenName); - - final TicketForm createdForm = instance.createTicketForm(form); - assertNotNull(createdForm); - assertNotNull(createdForm.getId()); - assertEquals(givenName, createdForm.getName()); - assertEquals(givenName, createdForm.getDisplayName()); - assertEquals(givenName, createdForm.getRawName()); - assertEquals(givenName, createdForm.getRawDisplayName()); + try { + createdForm = instance.createTicketForm(form); + assertNotNull(createdForm); + assertNotNull(createdForm.getId()); + assertEquals(givenName, createdForm.getName()); + assertEquals(givenName, createdForm.getDisplayName()); + assertEquals(givenName, createdForm.getRawName()); + assertEquals(givenName, createdForm.getRawDisplayName()); + } finally { + if (createdForm != null) { + instance.deleteTicketForm(createdForm); + } + } } @Test From e8243dbb6285c65d937c71dd9aeee1152bef4cd0 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Fri, 12 Nov 2021 16:06:09 +0100 Subject: [PATCH 044/343] [fix] A @JsonProperty cannot be used for enums I applied the same pattern than others enum --- .../org/zendesk/client/v2/model/CommentType.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/model/CommentType.java b/src/main/java/org/zendesk/client/v2/model/CommentType.java index 7dcca09ac..c5d550d23 100644 --- a/src/main/java/org/zendesk/client/v2/model/CommentType.java +++ b/src/main/java/org/zendesk/client/v2/model/CommentType.java @@ -1,13 +1,21 @@ package org.zendesk.client.v2.model; -import com.fasterxml.jackson.annotation.JsonProperty; - /** * https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_comments/ */ public enum CommentType { - @JsonProperty("Comment") COMMENT, - @JsonProperty("VoiceComment") VOICE_COMMENT; + COMMENT("Comment"), + VOICE_COMMENT("VoiceComment"); + + private final String name; + + CommentType(String name) { + this.name = name; + } + @Override + public String toString() { + return name; + } } From 7b190bb071f260a0e41d45a9f64f539232e0c34d Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Fri, 12 Nov 2021 16:10:12 +0100 Subject: [PATCH 045/343] [chore] Update existing integration tests to validate the comment type We can write/read the field --- .../java/org/zendesk/client/v2/RealSmokeTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index bed19b03a..6c43a8eaf 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -17,6 +17,7 @@ import org.zendesk.client.v2.model.Brand; import org.zendesk.client.v2.model.Collaborator; import org.zendesk.client.v2.model.Comment; +import org.zendesk.client.v2.model.CommentType; import org.zendesk.client.v2.model.ComplianceDeletionStatus; import org.zendesk.client.v2.model.DeletedTicket; import org.zendesk.client.v2.model.Field; @@ -1646,14 +1647,18 @@ public void getTicketCommentsShouldBeAscending() throws Exception { Ticket ticket = null; try { ticket = instance.createTicket(t); - instance.createComment(ticket.getId(), new Comment(TICKET_COMMENT2)); + final Comment comment = new Comment(TICKET_COMMENT2); + comment.setType(CommentType.COMMENT); + instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId()); List comments = new ArrayList<>(); ticketCommentsIt.forEach(comments::add); assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT1)); + assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT2)); + assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); @@ -1669,14 +1674,18 @@ public void getTicketCommentsDescending() throws Exception { Ticket ticket = null; try { ticket = instance.createTicket(t); - instance.createComment(ticket.getId(), new Comment(TICKET_COMMENT2)); + final Comment comment = new Comment(TICKET_COMMENT2); + comment.setType(CommentType.COMMENT); + instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId(), SortOrder.DESCENDING); List comments = new ArrayList<>(); ticketCommentsIt.forEach(comments::add); assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT2)); + assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT1)); + assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); From ebb6aa479d822f89314b712df47ef0199b7e371a Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Fri, 12 Nov 2021 16:18:57 +0100 Subject: [PATCH 046/343] Fix comment Co-authored-by: Pierre Beitz --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 387957cb3..a5925af31 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1877,7 +1877,7 @@ private JobStatus waitJobCompletion(final JobStatus result) { assertNotNull(result.getId()); assertNotNull(result.getStatus()); - // Let's wait for its completion (30 seconds max) + // Let's wait for its completion (2 minutes max) await().until(() -> instance.getJobStatus(result).getStatus() == JobStatus.JobStatusEnum.completed); From c92ae7ff9843797063ec133e8cadfe43ee3d739f Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Sat, 13 Nov 2021 17:19:39 +0100 Subject: [PATCH 047/343] [chore] Few docs about ITs --- CONTRIBUTING.adoc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 76e9a58d6..d70589520 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -166,3 +166,21 @@ public void setWidgetCount(int widgetCount) { **** import all other imports **** blank line **** import static all other imports + +== Integration Tests + +This library has a set of integration tests in the class `src/test/java/org/zendesk/client/v2/RealSmokeTest.java`. These tests are used to validate the API calls with a real Zendesk instance. The project never got access to a specific sandbox provided by @zendesk thus we are using the sandbox used by CloudBees. + +Some of these tests are sadly relying on some specific data of this instance (ex: https://github.com/cloudbees-oss/zendesk-java-client/blob/master/src/test/java/org/zendesk/client/v2/RealSmokeTest.java#L102-L103) and thus you cannot expect to execute all of them in a different instance. + +To execute these tests you have to pass several settings in the file `src/test/resources/zendesk.properties`: + +``` +url=#A ZENDESK SANDBOX URL# +username=#A EMAIL OF AN ACCOUNT HAVING ACCESS TO THE INSTANCE# +password=#THE PASSWORD OF THE ACCOUNT# +token=#A TOKEN TO ACCESS TO THE INSTANCE# +requester.email=#A EMAIL - can be like username - TO CREATE THE REPORTER# +requester.name=#A NAME FOR THE REPORTER# +``` + From 058242b5550af19bea7cb62286e859f7fa82c1a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 20:21:44 +0000 Subject: [PATCH 048/343] Bump actions/stale from 4.0.0 to 4.1.0 Bumps [actions/stale](https://github.com/actions/stale) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale-items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml index bf3c21a57..268364b91 100644 --- a/.github/workflows/close-stale-items.yml +++ b/.github/workflows/close-stale-items.yml @@ -7,7 +7,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4.0.0 + - uses: actions/stale@v4.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-pr-labels: 'needs-fix' From 79d50a5cd4da6927ac854d0d809f33b7b9d48fc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 20:03:58 +0000 Subject: [PATCH 049/343] Bump extra-enforcer-rules from 1.4 to 1.5.1 Bumps [extra-enforcer-rules](https://github.com/mojohaus/extra-enforcer-rules) from 1.4 to 1.5.1. - [Release notes](https://github.com/mojohaus/extra-enforcer-rules/releases) - [Commits](https://github.com/mojohaus/extra-enforcer-rules/compare/extra-enforcer-rules-1.4...extra-enforcer-rules-1.5.1) --- updated-dependencies: - dependency-name: org.codehaus.mojo:extra-enforcer-rules dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 41c021b50..92d1cdb59 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.4 + 1.5.1 From c1cce36b9300b713abdeb5a16fd89cf13422b0f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Dec 2021 20:03:31 +0000 Subject: [PATCH 050/343] Bump jackson-bom from 2.13.0 to 2.13.1 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.13.0 to 2.13.1. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.13.0...jackson-bom-2.13.1) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 41c021b50..fb9a68ca4 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.13.0 + 2.13.1 pom import From dd1e21809e6506c3a58c1d530a7ea05f4616a703 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Dec 2021 20:20:38 +0000 Subject: [PATCH 051/343] Bump actions/setup-java from 2.3.1 to 2.5.0 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.3.1 to 2.5.0. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2.3.1...v2.5.0) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-master.yml | 4 ++-- .github/workflows/ci-pr.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index 131e5fa0c..dcc88ac9c 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v2.3.1 + uses: actions/setup-java@v2.5.0 with: distribution: 'adopt' java-version: 8 @@ -33,7 +33,7 @@ jobs: ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL }} ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME }} - name: Set up JDK 11 - uses: actions/setup-java@v2.3.1 + uses: actions/setup-java@v2.5.0 with: distribution: 'adopt' java-version: 11 diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 5a9883d14..ea1ce3b0d 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v2.3.1 + uses: actions/setup-java@v2.5.0 with: distribution: 'adopt' java-version: 8 From 13426e589e2129f1f3d97ca496fa477245da2b4c Mon Sep 17 00:00:00 2001 From: Nataliia Kharabaruk Date: Sun, 2 Jan 2022 23:45:54 +0200 Subject: [PATCH 052/343] add update ticket form endpoint --- src/main/java/org/zendesk/client/v2/Zendesk.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index c51f4c468..ab1d93631 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -251,6 +251,13 @@ public TicketForm createTicketForm(TicketForm ticketForm) { Collections.singletonMap("ticket_form", ticketForm))), handle(TicketForm.class, "ticket_form"))); } + public TicketForm updateTicketForm(TicketForm ticketForm) { + checkHasId(ticketForm); + return complete(submit(req("PUT", tmpl("/ticket_forms/{id}.json").set("id", ticketForm.getId()), + JSON, json(Collections.singletonMap("ticket_form", ticketForm))), + handle(TicketForm.class, "ticket_form"))); + } + public void deleteTicketForm(TicketForm ticketForm) { checkHasId(ticketForm); deleteTicketForm(ticketForm.getId()); From 1d0bf9fccc560cd3f05a1f633a5fbcc3f6070724 Mon Sep 17 00:00:00 2001 From: Nataliia Kharabaruk Date: Sun, 2 Jan 2022 23:47:00 +0200 Subject: [PATCH 053/343] add update ticket form test --- .../org/zendesk/client/v2/RealSmokeTest.java | 88 ++++++++++++++----- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 173165e22..d6ba32055 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -82,7 +82,7 @@ import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; @@ -120,26 +120,26 @@ public class RealSmokeTest { public static void loadConfig() { config = ZendeskConfig.load(); assumeThat("We have a configuration", config, notNullValue()); - assumeThat("Configuration has an url", config.getProperty("url"), not(isEmptyString())); + assumeThat("Configuration has an url", config.getProperty("url"), not(isEmptyOrNullString())); Awaitility.setDefaultTimeout(2, TimeUnit.MINUTES); Awaitility.setDefaultPollDelay(10, TimeUnit.SECONDS); Awaitility.setDefaultPollInterval(20, TimeUnit.SECONDS); } public void assumeHaveToken() { - assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); - assumeThat("We have a token", config.getProperty("token"), not(isEmptyString())); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); + assumeThat("We have a token", config.getProperty("token"), not(isEmptyOrNullString())); } public void assumeHavePassword() { - assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); - assumeThat("We have a password", config.getProperty("password"), not(isEmptyString())); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); + assumeThat("We have a password", config.getProperty("password"), not(isEmptyOrNullString())); } public void assumeHaveTokenOrPassword() { - assumeThat("We have a username", config.getProperty("username"), not(isEmptyString())); - assumeThat("We have a token or password", config.getProperty("token") != null || config.getProperty("password") != null, is( - true)); + assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); + assumeThat("We have a token or password", config.getProperty("token") != null + || config.getProperty("password") != null, is(true)); } @After @@ -1592,22 +1592,12 @@ public void createOrUpdateUser() throws Exception { @Test public void createTicketForm() throws Exception { createClientWithTokenOrPassword(); - TicketForm form = new TicketForm(); + String givenName = "Test create ticket form"; + TicketForm form = newTicketForm(givenName); TicketForm createdForm = null; - form.setActive(true); - final String givenName = "Test ticket form"; - form.setName(givenName); - form.setDisplayName(givenName); - form.setRawName(givenName); - form.setRawDisplayName(givenName); try { createdForm = instance.createTicketForm(form); - assertNotNull(createdForm); - assertNotNull(createdForm.getId()); - assertEquals(givenName, createdForm.getName()); - assertEquals(givenName, createdForm.getDisplayName()); - assertEquals(givenName, createdForm.getRawName()); - assertEquals(givenName, createdForm.getRawDisplayName()); + checkFields(createdForm, givenName); } finally { if (createdForm != null) { instance.deleteTicketForm(createdForm); @@ -1615,6 +1605,32 @@ public void createTicketForm() throws Exception { } } + @Test + public void updateTicketForm() throws Exception { + createClientWithTokenOrPassword(); + + String name1 = "Test update ticket form 1"; + TicketForm form1 = newTicketForm(name1); + + String name2 = "Test update ticket form 2"; + TicketForm form2 = newTicketForm(name2); + + TicketForm updatedForm = null; + try { + updatedForm = instance.createTicketForm(form1); + checkFields(updatedForm, name1); + + form2.setId(updatedForm.getId()); + + updatedForm = instance.updateTicketForm(form2); + checkFields(updatedForm, name2); + } finally { + if (updatedForm != null) { + instance.deleteTicketForm(updatedForm); + } + } + } + @Test public void getDynamicContentItems() throws Exception { createClientWithTokenOrPassword(); @@ -1944,4 +1960,32 @@ private long[] otherElements(Long[] array) { .toArray(); } + /** + * Creates a new ticket form + * @param givenName provided name of the form + * @return created form object + */ + private TicketForm newTicketForm(String givenName) { + TicketForm form = new TicketForm(); + form.setActive(true); + form.setName(givenName); + form.setDisplayName(givenName); + form.setRawName(givenName); + form.setRawDisplayName(givenName); + return form; + } + + /** + * Verifies field on the ticket form + * @param form the ticket form to verify fields in + * @param name expected name of the form + */ + private void checkFields(TicketForm form, String name) { + assertNotNull(form); + assertNotNull(form.getId()); + assertEquals(name, form.getName()); + assertEquals(name, form.getDisplayName()); + assertEquals(name, form.getRawName()); + assertEquals(name, form.getRawDisplayName()); + } } From c45ba768b1a434aa0e22907d0442b3aa8e0cc2f2 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Mon, 3 Jan 2022 12:35:48 +0100 Subject: [PATCH 054/343] [chore] Increate ITs timeout to 60s They are failing on CI and locally with 30s --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 173165e22..2a1e4eaab 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -114,7 +114,7 @@ public class RealSmokeTest { * Global timeout applied on each test to avoid to wait forever if something goes wrong with the remote server */ @Rule - public Timeout globalTimeout = Timeout.seconds(30); + public Timeout globalTimeout = Timeout.seconds(60); @BeforeClass public static void loadConfig() { From a836a154d02b90829e3c305107c211d955a97206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jan 2022 20:02:31 +0000 Subject: [PATCH 055/343] Bump assertj-core from 3.21.0 to 3.22.0 Bumps [assertj-core](https://github.com/assertj/assertj-core) from 3.21.0 to 3.22.0. - [Release notes](https://github.com/assertj/assertj-core/releases) - [Commits](https://github.com/assertj/assertj-core/compare/assertj-core-3.21.0...assertj-core-3.22.0) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6607517dc..65541f288 100644 --- a/pom.xml +++ b/pom.xml @@ -157,7 +157,7 @@ org.assertj assertj-core - 3.21.0 + 3.22.0 test From 5a007ed2a3c0ee8b5c2335b5d0d2d397fbca4321 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Thu, 6 Jan 2022 17:26:23 +0100 Subject: [PATCH 056/343] [bug] fix an issue preventing searching tickets with email aliases (+) --- .../java/org/zendesk/client/v2/Zendesk.java | 8 +- .../org/zendesk/client/v2/RealSmokeTest.java | 349 ++++++++++-------- 2 files changed, 191 insertions(+), 166 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index ab1d93631..0d3b9f81d 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -443,7 +443,7 @@ public Iterable getTicketsByExternalId(String externalId) { } public Iterable getTicketsFromSearch(String searchTerm) { - return new PagedIterable<>(tmpl("/search.json{?query}").set("query", searchTerm + "+type:ticket"), + return new PagedIterable<>(tmpl("/search.json{?query}").set("query", searchTerm + " type:ticket"), handleList(Ticket.class, "results")); } @@ -2416,8 +2416,6 @@ private Request req(String method, Uri template) { return req(method, template.toString()); } - private static final Pattern RESTRICTED_PATTERN = Pattern.compile("%2B", Pattern.LITERAL); - private Request req(String method, String url) { return reqBuilder(method, url).build(); } @@ -2437,7 +2435,7 @@ private RequestBuilder reqBuilder(String method, String url) { builder.addHeader("Authorization", "Bearer " + oauthToken); } headers.forEach(builder::setHeader); - return builder.setUrl(RESTRICTED_PATTERN.matcher(url).replaceAll("+")); // replace out %2B with + due to API restriction + return builder.setUrl(url); } protected ZendeskAsyncCompletionHandler handleStatus() { @@ -3012,7 +3010,7 @@ private TemplateUri getSearchUri(Map params, String query , Stri uriTemplate.append("}"); TemplateUri templateUri = tmpl(uriTemplate.toString()) - .set("query", query + "+type:" + typeName); + .set("query", query + " type:" + typeName); if(params != null) { templateUri.set(params); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 99d9a193f..2e6a69bf6 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -70,6 +70,7 @@ import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.awaitility.Awaitility.await; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.hasItems; @@ -138,8 +139,8 @@ public void assumeHavePassword() { public void assumeHaveTokenOrPassword() { assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); - assumeThat("We have a token or password", config.getProperty("token") != null - || config.getProperty("password") != null, is(true)); + assumeThat("We have a token or password", config.getProperty("token") != null || config.getProperty("password") != null, is( + true)); } @After @@ -154,16 +155,16 @@ public void closeClient() { public void createClientWithToken() throws Exception { assumeHaveToken(); instance = new Zendesk.Builder(config.getProperty("url")) - .setUsername(config.getProperty("username")) - .setToken(config.getProperty("token")) - .build(); + .setUsername(config.getProperty("username")) + .setToken(config.getProperty("token")) + .build(); } @Test public void createClientWithTokenOrPassword() throws Exception { assumeHaveTokenOrPassword(); final Zendesk.Builder builder = new Zendesk.Builder(config.getProperty("url")) - .setUsername(config.getProperty("username")); + .setUsername(config.getProperty("username")); if (config.getProperty("token") != null) { builder.setToken(config.getProperty("token")); } else if (config.getProperty("password") != null) { @@ -177,7 +178,7 @@ public void getBrands() throws Exception { createClientWithTokenOrPassword(); List brands = instance.getBrands(); assertTrue(brands.iterator().hasNext()); - for(Brand brand : brands){ + for (Brand brand : brands) { assertThat(brand, notNullValue()); } } @@ -202,8 +203,8 @@ public void getTicketForms() throws Exception { createClientWithTokenOrPassword(); Iterable ticketForms = instance.getTicketForms(); assertTrue(ticketForms.iterator().hasNext()); - for(TicketForm ticketForm : ticketForms){ - assertThat(ticketForm, notNullValue()); + for (TicketForm ticketForm : ticketForms) { + assertThat(ticketForm, notNullValue()); } } @@ -211,7 +212,7 @@ public void getTicketForms() throws Exception { public void getTicketFieldsOnForm() throws Exception { createClientWithTokenOrPassword(); TicketForm ticketForm = instance.getTicketForm(PUBLIC_FORM_ID); - for(Long id :ticketForm.getTicketFieldIds()){ + for (Long id : ticketForm.getTicketFieldIds()) { Field f = instance.getTicketField(id); assertNotNull(f); } @@ -325,9 +326,9 @@ public void getTicketFields() throws Exception { public void createClientWithPassword() throws Exception { assumeHavePassword(); instance = new Zendesk.Builder(config.getProperty("url")) - .setUsername(config.getProperty("username")) - .setPassword(config.getProperty("password")) - .build(); + .setUsername(config.getProperty("username")) + .setPassword(config.getProperty("password")) + .build(); Ticket t = instance.getTicket(1); assertThat(t, notNullValue()); } @@ -335,7 +336,7 @@ public void createClientWithPassword() throws Exception { @Test public void createAnonymousClient() { instance = new Zendesk.Builder(config.getProperty("url")) - .build(); + .build(); assertThat("An instance is created", instance, Matchers.notNullValue()); } @@ -355,7 +356,7 @@ public void createDeleteTicket() throws Exception { List ticketCollaborators = instance.getTicketCollaborators(ticket.getId()); assertThat("Collaborators", ticketCollaborators.size(), is(2)); assertThat("First Collaborator", ticketCollaborators.get(0).getEmail(), - anyOf(is("alice@example.org"), is("bob@example.org"))); + anyOf(is("alice@example.org"), is("bob@example.org"))); } finally { instance.deleteTicket(ticket.getId()); } @@ -385,8 +386,8 @@ public void createTaskTicketWithDueDate() throws Exception { // then assertThat("The ticket now has an ID", ticket.getId(), notNullValue()); assertThat("The Due Date must be the same (rounded at the second)", - DateUtils.truncate(ticket.getDueAt(),Calendar.SECOND) , - is(DateUtils.truncate(dueDate,Calendar.SECOND))); + DateUtils.truncate(ticket.getDueAt(), Calendar.SECOND), + is(DateUtils.truncate(dueDate, Calendar.SECOND))); } finally { instance.deleteTicket(ticket.getId()); } @@ -424,8 +425,8 @@ public void createPermanentlyDeleteTickets() throws Exception { waitTicketsDeleted(ticketsIds); // We permanently delete them JobStatus jobStatus = - waitJobCompletion( - instance.permanentlyDeleteTickets(firstElement(ticketsIds), otherElements(ticketsIds))); + waitJobCompletion( + instance.permanentlyDeleteTickets(firstElement(ticketsIds), otherElements(ticketsIds))); // then assertThat("Job is completed", jobStatus.getStatus(), is(JobStatus.JobStatusEnum.completed)); jobStatus.getResults().forEach(jobResult -> { @@ -441,7 +442,7 @@ public void createPermanentlyDeleteTickets() throws Exception { assertThat("The job result has a success entry", jobResult.getSuccess(), is(TRUE)); }); assumeThat("We cannot find them anymore", - instance.getTickets(firstElement(ticketsIds), otherElements(ticketsIds)), empty()); + instance.getTickets(firstElement(ticketsIds), otherElements(ticketsIds)), empty()); } @Test @@ -480,10 +481,10 @@ public void createTickets() throws Exception { // then final Long[] createdTicketsIds = - status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); + status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); try { final List createdTickets = - instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); + instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); assertThat("We have the same number of tickets", status.getResults(), hasSize(ticketsToCreate.length)); @@ -501,16 +502,16 @@ public void createTickets() throws Exception { }); assertThat("All tickets are created (we verify that all titles are present)", - createdTickets - .stream() - .map(Ticket::getSubject) - .collect(Collectors.toList()), - containsInAnyOrder( - Arrays.stream(ticketsToCreate) - .map(Ticket::getSubject) - .toArray())); + createdTickets + .stream() + .map(Ticket::getSubject) + .collect(Collectors.toList()), + containsInAnyOrder( + Arrays.stream(ticketsToCreate) + .map(Ticket::getSubject) + .toArray())); createdTickets.stream().map(Ticket::getId).forEach(id -> - assertThat("A unique ID must be set", id, notNullValue())); + assertThat("A unique ID must be set", id, notNullValue())); } finally { // cleanup instance.deleteTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); @@ -540,8 +541,8 @@ public void updateTickets() throws Exception { assertThat("The good number of tickets were processed", status.getTotal(), is(ticketsIds.length)); assertThat("We have a result for each ticket", status.getResults(), hasSize(ticketsIds.length)); assertThat("Each ticket has a result", - status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), - containsInAnyOrder(ticketsIds)); + status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), + containsInAnyOrder(ticketsIds)); status.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); assertThat("The job result has an action entry", jobResult.getAction(), is("update")); @@ -574,12 +575,12 @@ public void importTicket() throws Exception { // then assertThat("The imported ticket has an ID", importedTicket.getId(), notNullValue()); assertThat("The imported ticket has a subject", importedTicket.getSubject(), - CoreMatchers.containsString("[zendesk-java-client] This is a test")); + CoreMatchers.containsString("[zendesk-java-client] This is a test")); assertThat("The imported ticket is closed", importedTicket.getStatus(), is(Status.CLOSED)); assertThat("The imported ticket has a createdAt value", importedTicket.getCreatedAt(), notNullValue()); assertThat("The imported ticket has an updatedAt value", importedTicket.getUpdatedAt(), notNullValue()); assertThat("The imported ticket has tags", importedTicket.getTags(), - containsInAnyOrder("zendesk-java-client", "smoke-test")); + containsInAnyOrder("zendesk-java-client", "smoke-test")); } finally { // cleanup instance.deleteTicket(importedTicket); @@ -597,11 +598,11 @@ public void importTickets() throws Exception { // when JobStatus status = waitJobCompletion(instance.importTickets(ticketsToImport)); final Long[] createdTicketsIds = - status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); + status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); try { final List createdTickets = - instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); + instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); assertThat("We have the same number of tickets", status.getResults(), hasSize(ticketsToImport.length)); @@ -619,23 +620,23 @@ public void importTickets() throws Exception { }); assertThat("All tickets are created (we verify that all titles are present)", - createdTickets - .stream() - .map(Ticket::getSubject) - .collect(Collectors.toList()), - containsInAnyOrder( - Arrays.stream(ticketsToImport) - .map(Ticket::getSubject) - .toArray())); + createdTickets + .stream() + .map(Ticket::getSubject) + .collect(Collectors.toList()), + containsInAnyOrder( + Arrays.stream(ticketsToImport) + .map(Ticket::getSubject) + .toArray())); createdTickets.forEach(importedTicket -> { assertThat("The imported ticket has an ID", importedTicket.getId(), notNullValue()); assertThat("The imported ticket has a subject", importedTicket.getSubject(), - CoreMatchers.containsString("[zendesk-java-client] This is a test")); + CoreMatchers.containsString("[zendesk-java-client] This is a test")); assertThat("The imported ticket is closed", importedTicket.getStatus(), is(Status.CLOSED)); assertThat("The imported ticket has a createdAt value", importedTicket.getCreatedAt(), notNullValue()); assertThat("The imported ticket has an updatedAt value", importedTicket.getUpdatedAt(), notNullValue()); assertThat("The imported ticket has tags", importedTicket.getTags(), - containsInAnyOrder("zendesk-java-client", "smoke-test")); + containsInAnyOrder("zendesk-java-client", "smoke-test")); }); @@ -661,7 +662,7 @@ public void searchUserByEmail() throws Exception { createClientWithTokenOrPassword(); String requesterEmail = config.getProperty("requester.email"); assumeThat("Must have a requester email", requesterEmail, notNullValue()); - for (User user : instance.getSearchResults(User.class, "requester:"+requesterEmail)) { + for (User user : instance.getSearchResults(User.class, "requester:" + requesterEmail)) { assertThat(user.getEmail(), is(requesterEmail)); } } @@ -677,10 +678,10 @@ public void createUsers() throws Exception { // then final Long[] createdUsersIds = - status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); + status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); try { final List createdUsers = - Arrays.stream(createdUsersIds).map(instance::getUser).collect(Collectors.toList()); + Arrays.stream(createdUsersIds).map(instance::getUser).collect(Collectors.toList()); assertThat("We have the same number of users", status.getResults(), hasSize(usersToCreate.length)); @@ -698,16 +699,16 @@ public void createUsers() throws Exception { }); assertThat("All users are created (we verify that all names are present)", - createdUsers - .stream() - .map(User::getName) - .collect(Collectors.toList()), - containsInAnyOrder( - Arrays.stream(usersToCreate) - .map(User::getName) - .toArray())); + createdUsers + .stream() + .map(User::getName) + .collect(Collectors.toList()), + containsInAnyOrder( + Arrays.stream(usersToCreate) + .map(User::getName) + .toArray())); createdUsers.stream().map(User::getId).forEach(id -> - assertThat("A unique ID must be set", id, notNullValue())); + assertThat("A unique ID must be set", id, notNullValue())); } finally { // cleanup Arrays.stream(createdUsersIds).forEach(instance::deleteUser); @@ -734,8 +735,8 @@ public void updateUsers() throws Exception { assertThat("The good number of users were processed", status.getTotal(), is(usersIds.length)); assertThat("We have a result for each user", status.getResults(), hasSize(usersIds.length)); assertThat("Each user has a result", - status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), - containsInAnyOrder(usersIds)); + status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), + containsInAnyOrder(usersIds)); status.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); assertThat("The job result has an action entry", jobResult.getAction(), is("update")); @@ -772,18 +773,18 @@ public void createOrUpdateUsers() throws Exception { // We update them allUsers.forEach(user -> user.setNotes("This user was updated")); final JobStatus status = - waitJobCompletion(instance.createOrUpdateUsers(allUsers)); + waitJobCompletion(instance.createOrUpdateUsers(allUsers)); // then assertThat("Job is completed", status.getStatus(), is(JobStatus.JobStatusEnum.completed)); assertThat("The good number of users were processed", status.getTotal(), is(allUsers.size())); assertThat("We have a result for each user", status.getResults(), hasSize(allUsers.size())); assertThat("Each existing user has a result", - status.getResults() - .stream() - .map(JobResult::getId) - .collect(Collectors.toList()), - hasItems(existingUsersIds)); + status.getResults() + .stream() + .map(JobResult::getId) + .collect(Collectors.toList()), + hasItems(existingUsersIds)); status.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); assertThat("The job result has an action entry", jobResult.getAction(), nullValue()); @@ -797,26 +798,26 @@ public void createOrUpdateUsers() throws Exception { assertThat("The job result has a success entry", jobResult.getSuccess(), nullValue()); }); assertThat("Existing users are updated", - status.getResults() - .stream() - .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Updated")) - .map(JobResult::getId) - .collect(Collectors.toList()), - containsInAnyOrder(existingUsersIds) + status.getResults() + .stream() + .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Updated")) + .map(JobResult::getId) + .collect(Collectors.toList()), + containsInAnyOrder(existingUsersIds) ); assertThat("New users are created", - status.getResults() - .stream() - .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Created")) - .map(JobResult::getExternalId) - .collect(Collectors.toList()), - containsInAnyOrder(newUsers.stream().map(User::getExternalId).toArray()) + status.getResults() + .stream() + .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Created")) + .map(JobResult::getExternalId) + .collect(Collectors.toList()), + containsInAnyOrder(newUsers.stream().map(User::getExternalId).toArray()) ); newUsersIds = status.getResults() - .stream() - .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Created")) - .map(JobResult::getId) - .toArray(Long[]::new); + .stream() + .filter(jobResult -> Objects.equals(jobResult.getStatus(), "Created")) + .map(JobResult::getId) + .toArray(Long[]::new); } finally { // cleanup Arrays.stream(existingUsersIds).forEach(instance::deleteUser); @@ -872,7 +873,7 @@ public void suspendUser() throws Exception { String externalId = "testSuspendUser"; // Clean up to avoid conflicts - for (User u: instance.lookupUserByExternalId(externalId)){ + for (User u : instance.lookupUserByExternalId(externalId)) { instance.deleteUser(u.getId()); } @@ -942,16 +943,16 @@ public void showUserComplianceDeletionStatusExpectValidCompletionStatus() throws // for different applications and they are described in compliance_deletion_statuses final Iterable complianceDeletionStatuses = - instance.getComplianceDeletionStatuses(user.getId()); + instance.getComplianceDeletionStatuses(user.getId()); // Let's validate assertThat("There is at least one entry", - StreamSupport.stream(complianceDeletionStatuses.spliterator(), false).count(), greaterThan(0L)); + StreamSupport.stream(complianceDeletionStatuses.spliterator(), false).count(), greaterThan(0L)); assertTrue("There is at least an entry for the application \"all\"", - StreamSupport.stream(complianceDeletionStatuses.spliterator(), false) - .anyMatch(complianceDeletionStatus -> "all".equals(complianceDeletionStatus.getApplication()))); + StreamSupport.stream(complianceDeletionStatuses.spliterator(), false) + .anyMatch(complianceDeletionStatus -> "all".equals(complianceDeletionStatus.getApplication()))); complianceDeletionStatuses.forEach(status -> { LOGGER.info("Compliance Deletion Status : {}", status); @@ -968,7 +969,7 @@ public void permanentlyDeleteUser() throws Exception { String externalId = "testSuspendUser"; // Clean up to avoid conflicts - for (User u: instance.lookupUserByExternalId(externalId)){ + for (User u : instance.lookupUserByExternalId(externalId)) { instance.deleteUser(u.getId()); } @@ -1093,10 +1094,10 @@ public void createOrganizations() throws Exception { // then final Long[] createdOrgsIds = - status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); + status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); try { final List createdOrgs = - Arrays.stream(createdOrgsIds).map(instance::getOrganization).collect(Collectors.toList()); + Arrays.stream(createdOrgsIds).map(instance::getOrganization).collect(Collectors.toList()); assertThat("We have the same number of organizations", status.getResults(), hasSize(orgsToCreate.length)); @@ -1114,16 +1115,16 @@ public void createOrganizations() throws Exception { }); assertThat("All organizations are created (we verify that all names are present)", - createdOrgs - .stream() - .map(Organization::getName) - .collect(Collectors.toList()), - containsInAnyOrder( - Arrays.stream(orgsToCreate) - .map(Organization::getName) - .toArray())); + createdOrgs + .stream() + .map(Organization::getName) + .collect(Collectors.toList()), + containsInAnyOrder( + Arrays.stream(orgsToCreate) + .map(Organization::getName) + .toArray())); createdOrgs.stream().map(Organization::getId).forEach(id -> - assertThat("A unique ID must be set", id, notNullValue())); + assertThat("A unique ID must be set", id, notNullValue())); } finally { // cleanup Arrays.stream(createdOrgsIds).forEach(instance::deleteOrganization); @@ -1144,15 +1145,15 @@ public void updateOrganizations() throws Exception { // We update them organizations.forEach(organization -> organization.setNotes("This organization was updated")); final JobStatus status = - waitJobCompletion(instance.updateOrganizations(organizations)); + waitJobCompletion(instance.updateOrganizations(organizations)); // then assertThat("Job is completed", status.getStatus(), is(JobStatus.JobStatusEnum.completed)); assertThat("The good number of organizations were processed", status.getTotal(), is(orgsIds.length)); assertThat("We have a result for each organization", status.getResults(), hasSize(orgsIds.length)); assertThat("Each organization has a result", - status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), - containsInAnyOrder(orgsIds)); + status.getResults().stream().map(JobResult::getId).collect(Collectors.toList()), + containsInAnyOrder(orgsIds)); status.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); assertThat("The job result has an action entry", jobResult.getAction(), is("update")); @@ -1194,29 +1195,29 @@ public void createOrganizationMemberships() throws Exception { }); // We add them in others orgs too Arrays.stream(otherElements(orgsIds)).forEach(orgId -> { - users.forEach(user -> { - OrganizationMembership organizationMembership = new OrganizationMembership(); - organizationMembership.setOrganizationId(orgId); - organizationMembership.setUserId(user.getId()); - organizationMembership.setDefault(FALSE); - organizationMemberships.add(organizationMembership); - }); - } + users.forEach(user -> { + OrganizationMembership organizationMembership = new OrganizationMembership(); + organizationMembership.setOrganizationId(orgId); + organizationMembership.setUserId(user.getId()); + organizationMembership.setDefault(FALSE); + organizationMemberships.add(organizationMembership); + }); + } ); // when // We create them final JobStatus status = - waitJobCompletion(instance.createOrganizationMemberships(organizationMemberships)); + waitJobCompletion(instance.createOrganizationMemberships(organizationMemberships)); // then final Long[] orgMembershipsIds = - status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); + status.getResults().stream().map(JobResult::getId).toArray(Long[]::new); try { assertThat("We have the same number of memberships", status.getResults(), - hasSize(organizationMemberships.size())); + hasSize(organizationMemberships.size())); status.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); @@ -1423,7 +1424,7 @@ public void getCategoryTranslations() throws Exception { if (++categoryCount > 10) { break; } - for (Translation t: instance.getCategoryTranslations(cat.getId())) { + for (Translation t : instance.getCategoryTranslations(cat.getId())) { assertNotNull(t.getId()); assertNotNull(t.getTitle()); // body is not mandatory @@ -1438,7 +1439,7 @@ public void getCategoryTranslations() throws Exception { @Test public void getArticlesIncrementally() throws Exception { createClientWithTokenOrPassword(); - final long ONE_WEEK = 7*24*60*60*1000; + final long ONE_WEEK = 7 * 24 * 60 * 60 * 1000; int count = 0; try { for (Article t : instance.getArticlesIncrementally(new Date(new Date().getTime() - ONE_WEEK))) { @@ -1557,7 +1558,7 @@ public void createOrUpdateUser() throws Exception { String externalId = "testCreateOrUpdateUser"; // Clean up to avoid conflicts - for (User u: instance.lookupUserByExternalId(externalId)){ + for (User u : instance.lookupUserByExternalId(externalId)) { instance.deleteUser(u.getId()); } @@ -1658,7 +1659,7 @@ public void getDynamicContentItems() throws Exception { assertEquals(v.getId(), fetch.getId()); if (++secondaryCount > 10) { - break; + break; } } } @@ -1718,6 +1719,32 @@ public void getTicketCommentsDescending() throws Exception { } } + @Test + public void getTicketsFromSearch() throws Exception { + createClientWithTokenOrPassword(); + + Ticket t = newTestTicket(); + t.setRequester(new Ticket.Requester("a name", "email+alias@acme.org")); + Ticket ticket = null; + try { + ticket = instance.createTicket(t); + // according to the doc, it takes about 1 minute for the ticket to be indexed + // running several time, it seems that the actual value is around 30-40s + Awaitility.with() + .pollDelay(20, SECONDS).and() + .pollInterval(10, SECONDS).await() + .timeout(90, SECONDS) + .until(() -> { + Iterable tickets = instance.getTicketsFromSearch("requester:email+alias@acme.org"); + return StreamSupport.stream(tickets.spliterator(), false).findAny().isPresent(); + }); + } finally { + if (ticket != null) { + instance.deleteTicket(ticket.getId()); + } + } + } + // UTILITIES /** @@ -1728,17 +1755,17 @@ public void getTicketCommentsDescending() throws Exception { private List createTestOrganizationsInZendesk() { final Organization[] orgsToCreate = newTestOrganizations(); final Long[] createdOrgsIds = waitJobCompletion(instance.createOrganizations(orgsToCreate)) - .getResults() - .stream() - .map(JobResult::getId) - .toArray(Long[]::new); + .getResults() + .stream() + .map(JobResult::getId) + .toArray(Long[]::new); assumeThat("All created organizations should have an ID", createdOrgsIds.length, is(orgsToCreate.length)); final List createdOrganizations = Arrays.stream(createdOrgsIds) - .map(instance::getOrganization) - .collect(Collectors.toList()); + .map(instance::getOrganization) + .collect(Collectors.toList()); assumeThat("All created organizations are found in zendesk", - createdOrganizations.stream().map(Organization::getId).collect(Collectors.toList()), - containsInAnyOrder(createdOrgsIds)); + createdOrganizations.stream().map(Organization::getId).collect(Collectors.toList()), + containsInAnyOrder(createdOrgsIds)); LOGGER.info("Test organizations: {}", Arrays.toString(createdOrgsIds)); return createdOrganizations; } @@ -1775,17 +1802,17 @@ private Organization newTestOrganization() { private List createTestUsersInZendesk() { final User[] usersToCreate = newTestUsers(); final Long[] createdUsersIds = waitJobCompletion(instance.createUsers(usersToCreate)) - .getResults() - .stream() - .map(JobResult::getId) - .toArray(Long[]::new); + .getResults() + .stream() + .map(JobResult::getId) + .toArray(Long[]::new); assumeThat("All created users should have an ID", createdUsersIds.length, is(usersToCreate.length)); final List createdUsers = Arrays.stream(createdUsersIds) - .map(instance::getUser) - .collect(Collectors.toList()); + .map(instance::getUser) + .collect(Collectors.toList()); assumeThat("All created users are found in zendesk", - createdUsers.stream().map(User::getId).collect(Collectors.toList()), - containsInAnyOrder(createdUsersIds)); + createdUsers.stream().map(User::getId).collect(Collectors.toList()), + containsInAnyOrder(createdUsersIds)); LOGGER.info("Test users: {}", Arrays.toString(createdUsersIds)); return createdUsers; } @@ -1823,16 +1850,16 @@ private User newTestUser() { private List createTestTicketsInZendesk() { final Ticket[] ticketsToCreate = newTestTickets(); final Long[] createdTicketsIds = waitJobCompletion(instance.createTickets(ticketsToCreate)) - .getResults() - .stream() - .map(JobResult::getId) - .toArray(Long[]::new); + .getResults() + .stream() + .map(JobResult::getId) + .toArray(Long[]::new); assumeThat("All created tickets should have an ID", createdTicketsIds.length, is(ticketsToCreate.length)); final List createdTickets = - instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); + instance.getTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); assumeThat("All created tickets are found in zendesk", - createdTickets.stream().map(Ticket::getId).collect(Collectors.toList()), - containsInAnyOrder(createdTicketsIds)); + createdTickets.stream().map(Ticket::getId).collect(Collectors.toList()), + containsInAnyOrder(createdTicketsIds)); LOGGER.info("Test tickets: {}", Arrays.toString(createdTicketsIds)); return createdTickets; } @@ -1855,11 +1882,11 @@ private Ticket newTestTicket() { assumeThat("Must have a requester email", config.getProperty("requester.email"), notNullValue()); assumeThat("Must have a requester name", config.getProperty("requester.name"), notNullValue()); final Ticket ticket = new Ticket( - new Ticket.Requester(config.getProperty("requester.name"), config.getProperty("requester.email")), - "[zendesk-java-client] This is a test " + UUID.randomUUID().toString(), - new Comment(TICKET_COMMENT1)); + new Ticket.Requester(config.getProperty("requester.name"), config.getProperty("requester.email")), + "[zendesk-java-client] This is a test " + UUID.randomUUID().toString(), + new Comment(TICKET_COMMENT1)); ticket.setCollaborators(Arrays.asList(new Collaborator("Bob Example", "bob@example.org"), - new Collaborator("Alice Example", "alice@example.org"))); + new Collaborator("Alice Example", "alice@example.org"))); ticket.setTags(Arrays.asList("zendesk-java-client", "smoke-test")); return ticket; } @@ -1883,11 +1910,11 @@ private TicketImport newTestTicketImport() { assumeThat("Must have a requester name", config.getProperty("requester.name"), notNullValue()); Date now = Calendar.getInstance().getTime(); final TicketImport ticketImport = new TicketImport( - new Ticket.Requester(config.getProperty("requester.name"), config.getProperty("requester.email")), - "[zendesk-java-client] This is a test " + UUID.randomUUID().toString(), - Collections.singletonList(new Comment(TICKET_COMMENT1))); + new Ticket.Requester(config.getProperty("requester.name"), config.getProperty("requester.email")), + "[zendesk-java-client] This is a test " + UUID.randomUUID().toString(), + Collections.singletonList(new Comment(TICKET_COMMENT1))); ticketImport.setCollaborators(Arrays.asList(new Collaborator("Bob Example", "bob@example.org"), - new Collaborator("Alice Example", "alice@example.org"))); + new Collaborator("Alice Example", "alice@example.org"))); ticketImport.setTags(Arrays.asList("zendesk-java-client", "smoke-test")); ticketImport.setStatus(Status.CLOSED); ticketImport.setCreatedAt(now); @@ -1910,7 +1937,7 @@ private JobStatus waitJobCompletion(final JobStatus result) { // Let's wait for its completion (2 minutes max) await().until(() -> - instance.getJobStatus(result).getStatus() == JobStatus.JobStatusEnum.completed); + instance.getJobStatus(result).getStatus() == JobStatus.JobStatusEnum.completed); // Let's validate and return the completed result final JobStatus completedResult = instance.getJobStatus(result); @@ -1929,10 +1956,10 @@ private JobStatus waitJobCompletion(final JobStatus result) { private void waitTicketDeleted(long ticketId) { // Wait for the confirmation await().until(() -> StreamSupport - .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) - .map(DeletedTicket::getId) - .collect(Collectors.toList()) - .contains(ticketId)); + .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) + .map(DeletedTicket::getId) + .collect(Collectors.toList()) + .contains(ticketId)); } /** @@ -1943,10 +1970,10 @@ private void waitTicketDeleted(long ticketId) { private void waitTicketsDeleted(Long[] ticketsIds) { // Wait for the confirmation await().until(() -> StreamSupport - .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) - .map(DeletedTicket::getId) - .collect(Collectors.toList()) - .containsAll(Arrays.asList(ticketsIds))); + .stream(instance.getDeletedTickets("id", SortOrder.DESCENDING).spliterator(), false) + .map(DeletedTicket::getId) + .collect(Collectors.toList()) + .containsAll(Arrays.asList(ticketsIds))); } private long firstElement(Long[] array) { @@ -1955,9 +1982,9 @@ private long firstElement(Long[] array) { private long[] otherElements(Long[] array) { return Arrays.stream(Arrays.copyOfRange(array, 1, array.length)) - .filter(Objects::nonNull) - .mapToLong(Long::longValue) - .toArray(); + .filter(Objects::nonNull) + .mapToLong(Long::longValue) + .toArray(); } /** From 490bb3424c3e6e70bc6cb9cf92ca0c5d18c09b0a Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 7 Jan 2022 15:18:42 +0100 Subject: [PATCH 057/343] [maven-release-plugin] prepare release zendesk-java-client-0.16.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6607517dc..808b4ec68 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.15.1-SNAPSHOT + 0.16.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.16.0 From 3044cbca5f72c7b33650a5270607c1082edee76e Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 7 Jan 2022 15:18:48 +0100 Subject: [PATCH 058/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 808b4ec68..af099ad27 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.16.0 + 0.16.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.16.0 + HEAD From f7b4c5af8d6adbef0cec2054329c3771cb855108 Mon Sep 17 00:00:00 2001 From: Arnaud Heritier Date: Tue, 18 Jan 2022 08:49:52 +0100 Subject: [PATCH 059/343] Bump Netty from 4.1.60.Final to 4.1.73.Final Fixes #436 --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index af099ad27..a5dd96f19 100644 --- a/pom.xml +++ b/pom.xml @@ -102,6 +102,13 @@ pom import + + io.netty + netty-bom + 4.1.73.Final + pom + import + From 216dcfd919808d7d53ed9ed4bc9ff159956ecf1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jan 2022 20:03:24 +0000 Subject: [PATCH 060/343] Bump slf4j-simple from 1.7.32 to 1.7.35 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 1.7.32 to 1.7.35. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.32...v_1.7.35) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af099ad27..08fc8210f 100644 --- a/pom.xml +++ b/pom.xml @@ -144,7 +144,7 @@ org.slf4j slf4j-simple - 1.7.32 + 1.7.35 test From c613ccf2bd39e5c7d03e06f0d46c7b702016808e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jan 2022 20:03:27 +0000 Subject: [PATCH 061/343] Bump slf4j-api from 1.7.32 to 1.7.35 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 1.7.32 to 1.7.35. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.32...v_1.7.35) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af099ad27..98d7dba2b 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ org.slf4j slf4j-api - 1.7.32 + 1.7.35 org.asynchttpclient From 231284e9c006df39ba2f9a7cec4925797161ed95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Feb 2022 20:03:27 +0000 Subject: [PATCH 062/343] Bump animal-sniffer-enforcer-rule from 1.20 to 1.21 Bumps [animal-sniffer-enforcer-rule](https://github.com/mojohaus/animal-sniffer) from 1.20 to 1.21. - [Release notes](https://github.com/mojohaus/animal-sniffer/releases) - [Commits](https://github.com/mojohaus/animal-sniffer/compare/animal-sniffer-parent-1.20...animal-sniffer-parent-1.21) --- updated-dependencies: - dependency-name: org.codehaus.mojo:animal-sniffer-enforcer-rule dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af099ad27..4590d928d 100644 --- a/pom.xml +++ b/pom.xml @@ -233,7 +233,7 @@ org.codehaus.mojo animal-sniffer-enforcer-rule - 1.20 + 1.21 org.codehaus.mojo From 75691a767f3a70219936f6611c5626ede539d5db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 20:20:57 +0000 Subject: [PATCH 063/343] Bump release-drafter/release-drafter from 5.15.0 to 5.18.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.15.0 to 5.18.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.15.0...v5.18.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index f55b27f10..947181326 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.15.0 + - uses: release-drafter/release-drafter@v5.18.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9bd6959f7ce10043e2a2d6da471b911cc1565cea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 20:37:08 +0000 Subject: [PATCH 064/343] Bump release-drafter/release-drafter from 5.18.0 to 5.18.1 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.18.0 to 5.18.1. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.18.0...v5.18.1) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 947181326..d15158c4d 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.18.0 + - uses: release-drafter/release-drafter@v5.18.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From bc1bfe719d6e976d7ecdd166c694bf33e02b7b68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:02:47 +0000 Subject: [PATCH 065/343] Bump slf4j-api from 1.7.35 to 1.7.36 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 1.7.35 to 1.7.36. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.35...v_1.7.36) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7692558a..2dfa54086 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.slf4j slf4j-api - 1.7.35 + 1.7.36 org.asynchttpclient From a11024c8a41f0e10ef9fbe0eca6303a5767ea16f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:02:50 +0000 Subject: [PATCH 066/343] Bump netty-bom from 4.1.73.Final to 4.1.74.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.73.Final to 4.1.74.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.73.Final...netty-4.1.74.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7692558a..f8b9bae08 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.73.Final + 4.1.74.Final pom import From e7cc552a01f6f7d9e723e89ecfa630e14dd058b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:02:54 +0000 Subject: [PATCH 067/343] Bump slf4j-simple from 1.7.35 to 1.7.36 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 1.7.35 to 1.7.36. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.35...v_1.7.36) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7692558a..9de897215 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ org.slf4j slf4j-simple - 1.7.35 + 1.7.36 test From 3973d68f38cfd18517d3e087aeed228983275f6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Feb 2022 20:24:44 +0000 Subject: [PATCH 068/343] Bump actions/setup-java from 2.5.0 to 3 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.5.0 to 3. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2.5.0...v3) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-master.yml | 4 ++-- .github/workflows/ci-pr.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index dcc88ac9c..208e8256d 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v2.5.0 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 8 @@ -33,7 +33,7 @@ jobs: ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_EMAIL }} ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME: ${{ secrets.ZENDESK_JAVA_CLIENT_TEST_REQUESTER_NAME }} - name: Set up JDK 11 - uses: actions/setup-java@v2.5.0 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 11 diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index ea1ce3b0d..bf53467af 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -18,7 +18,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 - name: Set up JDK 1.8 - uses: actions/setup-java@v2.5.0 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 8 From f56de2da7bdfedd2929ac0bea135c662d7457723 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:21:13 +0000 Subject: [PATCH 069/343] Bump actions/stale from 4.1.0 to 5 Bumps [actions/stale](https://github.com/actions/stale) from 4.1.0 to 5. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v4.1.0...v5) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale-items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml index 268364b91..9dcd86db5 100644 --- a/.github/workflows/close-stale-items.yml +++ b/.github/workflows/close-stale-items.yml @@ -7,7 +7,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4.1.0 + - uses: actions/stale@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-pr-labels: 'needs-fix' From 1d0c173a6165f13be556be30c9f649bddb4e0ae1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:21:14 +0000 Subject: [PATCH 070/343] Bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-master.yml | 2 +- .github/workflows/ci-pr.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index dcc88ac9c..8b993e48f 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index ea1ce3b0d..1dc23abe0 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: # Disabling shallow clone is recommended for improving relevancy of reporting with SonarCloud fetch-depth: 0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 636cede1c..808cd10c7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -39,7 +39,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL From b6c65537e93d7d8e487cc2fb3eb25e9159149dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 20:02:56 +0000 Subject: [PATCH 071/343] Bump awaitility from 4.1.1 to 4.2.0 Bumps [awaitility](https://github.com/awaitility/awaitility) from 4.1.1 to 4.2.0. - [Release notes](https://github.com/awaitility/awaitility/releases) - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.1.1...awaitility-4.2.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 11671fdab..f0655f430 100644 --- a/pom.xml +++ b/pom.xml @@ -176,7 +176,7 @@ org.awaitility awaitility - 4.1.1 + 4.2.0 test From f32348fee6667d9850f4ea0fe04f855aa3affcc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Mar 2022 20:25:32 +0000 Subject: [PATCH 072/343] Bump release-drafter/release-drafter from 5.18.1 to 5.19.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.18.1 to 5.19.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.18.1...v5.19.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index d15158c4d..4b065d545 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.18.1 + - uses: release-drafter/release-drafter@v5.19.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 260d30598439e5c8102bb4e6f6f77d62e45a9dc9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 20:04:05 +0000 Subject: [PATCH 073/343] Bump netty-bom from 4.1.74.Final to 4.1.75.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.74.Final to 4.1.75.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.74.Final...netty-4.1.75.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 11671fdab..d0ad53b1a 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.74.Final + 4.1.75.Final pom import From 24c11c66da7b9ff171de4f7491c39470b4259d52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 20:02:46 +0000 Subject: [PATCH 074/343] Bump jackson-bom from 2.13.1 to 2.13.2.20220328 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.13.1 to 2.13.2.20220328. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.13.1...jackson-bom-2.13.2.20220328) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 11671fdab..2ab4265bf 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.13.1 + 2.13.2.20220328 pom import From 9d22463975cea896c0e1b8402fc2bde29f278b62 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Tue, 5 Apr 2022 12:14:39 +0200 Subject: [PATCH 075/343] [feature] Triggers management improvements New methods * Zendesk#getTriggers(categoryId,active,sortBy,sortOrder) * Zendesk#getActiveTriggers() * Zendesk#searchTriggers(query) * Zendesk#searchTriggers(query,active,sortBy,sortOrder) New categoryId for triggers Add various integration tests --- .../java/org/zendesk/client/v2/Zendesk.java | 46 +++++- .../org/zendesk/client/v2/model/Trigger.java | 10 ++ .../org/zendesk/client/v2/RealSmokeTest.java | 139 ++++++++++++++++++ .../triggerWithComplexActions.json | 2 +- .../triggerWithMultilineAction.json | 2 +- 5 files changed, 190 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 0d3b9f81d..027ce2b63 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -759,22 +759,54 @@ public Iterable getTriggers() { return new PagedIterable<>(cnst("/triggers.json"), handleList(Trigger.class, "triggers")); } + public Iterable getTriggers(String categoryId, boolean active, String sortBy, SortOrder sortOrder) { + return new PagedIterable<>( + tmpl("/triggers.json{?category_id,active,sort_by,sort_order}") + .set("category_id", categoryId) + .set("active", active) + .set("sort_by", sortBy) + .set("sort_order", sortOrder.getQueryParameter()), + handleList(Trigger.class, "triggers")); + } + + public Iterable getActiveTriggers() { + return new PagedIterable<>(cnst("/triggers/active.json"), handleList(Trigger.class, "triggers")); + } + + public Iterable searchTriggers(String query) { + return new PagedIterable<>(tmpl("/triggers/search.json{?query}").set("query", query), + handleList(Trigger.class, "triggers")); + } + + public Iterable searchTriggers(String query, boolean active, String sortBy, SortOrder sortOrder) { + return new PagedIterable<>( + tmpl("/triggers/search.json{?query,active,sort_by,sort_order}") + .set("query", query) + .set("active", active) + .set("sort_by", sortBy) + .set("sort_order", sortOrder.getQueryParameter()), + handleList(Trigger.class, "triggers")); + } + public Trigger getTrigger(long id) { - return complete(submit(req("GET", tmpl("/triggers/{id}.json").set("id", id)), handle(Trigger.class, "trigger"))); + return complete( + submit(req("GET", tmpl("/triggers/{id}.json").set("id", id)), handle(Trigger.class, "trigger"))); } public Trigger createTrigger(Trigger trigger) { - return complete(submit(req("POST", cnst("/triggers.json"), JSON, json(Collections.singletonMap("trigger", trigger))), - handle(Trigger.class, "trigger"))); + return complete( + submit(req("POST", cnst("/triggers.json"), JSON, json(Collections.singletonMap("trigger", trigger))), + handle(Trigger.class, "trigger"))); } public Trigger updateTrigger(Long triggerId, Trigger trigger) { - return complete(submit(req("PUT", tmpl("/triggers/{id}.json").set("id", triggerId), JSON, json(Collections.singletonMap("trigger", trigger))), - handle(Trigger.class, "trigger"))); - } + return complete(submit(req("PUT", tmpl("/triggers/{id}.json").set("id", triggerId), JSON, + json(Collections.singletonMap("trigger", trigger))), + handle(Trigger.class, "trigger"))); + } public void deleteTrigger(long triggerId) { - complete(submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); + complete(submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); } diff --git a/src/main/java/org/zendesk/client/v2/model/Trigger.java b/src/main/java/org/zendesk/client/v2/model/Trigger.java index 6a868f3cf..dafe4225b 100644 --- a/src/main/java/org/zendesk/client/v2/model/Trigger.java +++ b/src/main/java/org/zendesk/client/v2/model/Trigger.java @@ -22,6 +22,7 @@ public class Trigger implements Serializable { private List actions; private Date createdAt; private Date updatedAt; + private String categoryId; public Long getId() { return id; @@ -31,6 +32,14 @@ public void setId(Long id) { this.id = id; } + public String getCategoryId() { + return categoryId; + } + + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + public String getTitle() { return title; } @@ -91,6 +100,7 @@ public void setUpdatedAt(Date updatedAt) { public String toString() { return "Trigger" + "{id=" + id + + ", categoryId=" + categoryId + ", title=" + title + ", active=" + active + ", position=" + position + diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 2e6a69bf6..aa9aced2c 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -13,6 +13,7 @@ import org.junit.rules.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.zendesk.client.v2.model.Action; import org.zendesk.client.v2.model.AgentRole; import org.zendesk.client.v2.model.Audit; import org.zendesk.client.v2.model.Brand; @@ -36,6 +37,7 @@ import org.zendesk.client.v2.model.Ticket; import org.zendesk.client.v2.model.TicketForm; import org.zendesk.client.v2.model.TicketImport; +import org.zendesk.client.v2.model.Trigger; import org.zendesk.client.v2.model.Type; import org.zendesk.client.v2.model.User; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; @@ -234,6 +236,143 @@ public void getTargets() throws Exception { } } + @Test + public void getTriggers() throws Exception { + createClientWithTokenOrPassword(); + int count = 0; + for (Trigger t : instance.getTriggers()) { + assertThat(t.getTitle(), notNullValue()); + if (++count > 10) { + break; + } + } + } + + @Test + public void getTriggersWithParameters() throws Exception { + createClientWithTokenOrPassword(); + int count = 0; + for (Trigger t : instance.getTriggers(null,true,"title",SortOrder.ASCENDING)) { + assertThat(t.getTitle(), notNullValue()); + if (++count > 10) { + break; + } + } + } + + @Test + public void getActiveTriggers() throws Exception { + createClientWithTokenOrPassword(); + int count = 0; + for (Trigger t : instance.getActiveTriggers()) { + assertThat(t.getTitle(), notNullValue()); + assertTrue(t.isActive()); + if (++count > 10) { + break; + } + } + } + + @Test + public void createTrigger() throws Exception { + createClientWithTokenOrPassword(); + Trigger trigger = createTestTrigger(); + try { + trigger = instance.createTrigger(trigger); + assertThat(trigger.getId(), notNullValue()); + } finally { + if (trigger.getId() != null) { + instance.deleteTrigger(trigger.getId()); + } + } + } + + @Test + public void updateTrigger() throws Exception { + createClientWithTokenOrPassword(); + Trigger trigger = createTestTrigger(); + try { + trigger = instance.createTrigger(trigger); + assertThat(trigger.getId(), notNullValue()); + trigger.setTitle(trigger.getTitle() + " Updated"); + trigger = instance.updateTrigger(trigger.getId(), trigger); + assertTrue(trigger.getTitle().contains("Updated")); + } finally { + if (trigger.getId() != null) { + instance.deleteTrigger(trigger.getId()); + } + } + } + + @Test + public void searchTrigger() throws Exception { + createClientWithTokenOrPassword(); + List triggers = new ArrayList<>(); + final String title = "[zendesk-java-client] SearchTriggerTest " + UUID.randomUUID(); + for (int i = 0; i < 3; i++) { + triggers.add(instance.createTrigger(createTestTrigger(title + " " + i))); + } + // It's taking a while before the search returns them + Awaitility.with() + .pollDelay(45, SECONDS).and() + .pollInterval(5, SECONDS).await() + .timeout(60, SECONDS) + .until(() -> StreamSupport.stream(instance.searchTriggers(title).spliterator(), false).count()==3L); + try { + assertThat(StreamSupport.stream(instance.searchTriggers(title).spliterator(), false).count(), + is(3L)); + } finally { + triggers.stream().map(Trigger::getId).forEach(instance::deleteTrigger); + } + } + + @Test + public void searchTriggerWithParameters() throws Exception { + createClientWithTokenOrPassword(); + List triggers = new ArrayList<>(); + final String title = "[zendesk-java-client] SearchTriggerTestWithParams " + UUID.randomUUID(); + for (int i = 0; i < 3; i++) { + triggers.add(instance.createTrigger(createTestTrigger(title + " " + i))); + } + // It's taking a while before the search returns them + Awaitility.with() + .pollDelay(45, SECONDS).and() + .pollInterval(5, SECONDS).await() + .timeout(60, SECONDS) + .until(() -> StreamSupport.stream(instance.searchTriggers(title).spliterator(), false).count()==3L); + try { + assertThat(StreamSupport.stream( + instance.searchTriggers(title, true, "title", SortOrder.ASCENDING) + .spliterator(), + false).count(), + is(3L)); + } finally { + triggers.stream().map(Trigger::getId).forEach(instance::deleteTrigger); + } + } + + private Trigger createTestTrigger() { + return createTestTrigger("[zendesk-java-client] Test trigger: " + UUID.randomUUID()); + } + + private Trigger createTestTrigger(String title) { + Trigger.Condition condition = new Trigger.Condition(); + condition.setField("status"); + condition.setOperator("is"); + condition.setValue("solved"); + Trigger.Conditions conditions = new Trigger.Conditions(); + conditions.setAll(Collections.singletonList(condition)); + Trigger trigger = new Trigger(); + trigger.setTitle(title); + trigger.setActive(true); + trigger.setConditions(conditions); + Action action = new Action(); + action.setField("status"); + action.setValue(new String[]{"solved"}); + trigger.setActions(Collections.singletonList(action)); + return trigger; + } + @Test public void getTicketsPagesRequests() throws Exception { createClientWithTokenOrPassword(); diff --git a/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithComplexActions.json b/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithComplexActions.json index a70b5be3a..fd3215093 100644 --- a/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithComplexActions.json +++ b/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithComplexActions.json @@ -1 +1 @@ -{"id":12345678,"title":"Test Trigger","active":true,"position":45,"conditions":{"all":[],"any":[{"field":"comment_includes_word","operator":"includes","value":"@triggerTest"}]},"actions":[{"field":"notification_target","value":["1234567890",[["key1","value1"],["key2","value2"]]]}],"createdAt":null,"updatedAt":null} \ No newline at end of file +{"id":12345678,"title":"Test Trigger","active":true,"position":45,"conditions":{"all":[],"any":[{"field":"comment_includes_word","operator":"includes","value":"@triggerTest"}]},"actions":[{"field":"notification_target","value":["1234567890",[["key1","value1"],["key2","value2"]]]}],"createdAt":null,"updatedAt":null,"categoryId":null} diff --git a/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithMultilineAction.json b/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithMultilineAction.json index cfff0b808..60b3952fd 100644 --- a/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithMultilineAction.json +++ b/src/test/resources/org/zendesk/client/v2/model/TriggerTest/triggerWithMultilineAction.json @@ -1 +1 @@ -{"id":12345678,"title":"Test Trigger","active":true,"position":45,"conditions":{"all":[],"any":[{"field":"comment_includes_word","operator":"includes","value":"@triggerTest"}]},"actions":[{"field":"notification_user","value":["09876543","Trigger Target 1 {{ticket.title}}","Test Multiline\n\n{{ticket.comments_formatted}}\n\n--------------------------"]},{"field":"notification_target","value":["98765432","{\n \"color\":\"purple\",\n \"message_format\":\"text\",\n \"message\":\"Trigger Target 2 {{ticket.title}}.\"\n}"]}],"createdAt":null,"updatedAt":null} \ No newline at end of file +{"id":12345678,"title":"Test Trigger","active":true,"position":45,"conditions":{"all":[],"any":[{"field":"comment_includes_word","operator":"includes","value":"@triggerTest"}]},"actions":[{"field":"notification_user","value":["09876543","Trigger Target 1 {{ticket.title}}","Test Multiline\n\n{{ticket.comments_formatted}}\n\n--------------------------"]},{"field":"notification_target","value":["98765432","{\n \"color\":\"purple\",\n \"message_format\":\"text\",\n \"message\":\"Trigger Target 2 {{ticket.title}}.\"\n}"]}],"createdAt":null,"updatedAt":null,"categoryId":null} From e215235a40db9418caadea4c3ac0c13a309b7967 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 20:03:43 +0000 Subject: [PATCH 076/343] Bump jacoco-maven-plugin from 0.8.7 to 0.8.8 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.7 to 0.8.8. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.7...v0.8.8) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aae5e30f8..c52a5aeb3 100644 --- a/pom.xml +++ b/pom.xml @@ -260,7 +260,7 @@ org.jacoco jacoco-maven-plugin - 0.8.7 + 0.8.8 prepare-agent From a99b6481ed3a6fd51c9ac61abf281a698b9fd6bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 20:27:02 +0000 Subject: [PATCH 077/343] Bump github/codeql-action from 1 to 2 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v1...v2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 808cd10c7..95f9385f9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -43,7 +43,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -54,7 +54,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # â„šī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -68,4 +68,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From dd4db9edbe67327d05df14a5c8ea76bda990f9e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 20:02:50 +0000 Subject: [PATCH 078/343] Bump netty-bom from 4.1.75.Final to 4.1.77.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.75.Final to 4.1.77.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.75.Final...netty-4.1.77.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c52a5aeb3..fc986bce4 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.75.Final + 4.1.77.Final pom import From 0aa5a548e96c0f1878a5238f3a8a0b9236927352 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 May 2022 20:22:55 +0000 Subject: [PATCH 079/343] Bump release-drafter/release-drafter from 5.19.0 to 5.20.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.19.0 to 5.20.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.19.0...v5.20.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 4b065d545..7a013b36f 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.19.0 + - uses: release-drafter/release-drafter@v5.20.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 690912cb2cefabd4d75e88b00bd0e6d37d0773d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 20:04:29 +0000 Subject: [PATCH 080/343] Bump jackson-bom from 2.13.2.20220328 to 2.13.3 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.13.2.20220328 to 2.13.3. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.13.2.20220328...jackson-bom-2.13.3) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c52a5aeb3..464839c99 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.13.2.20220328 + 2.13.3 pom import From 2a4c37f85412c0ee94138dc16eacc2f78c684b48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 20:03:37 +0000 Subject: [PATCH 081/343] Bump assertj-core from 3.22.0 to 3.23.1 Bumps [assertj-core](https://github.com/assertj/assertj-core) from 3.22.0 to 3.23.1. - [Release notes](https://github.com/assertj/assertj-core/releases) - [Commits](https://github.com/assertj/assertj-core/compare/assertj-core-3.22.0...assertj-core-3.23.1) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c52a5aeb3..3f4edc0a8 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ org.assertj assertj-core - 3.22.0 + 3.23.1 test From a475a90f079175006974c56a773e78de4c1d447b Mon Sep 17 00:00:00 2001 From: Carolin Brandt Date: Tue, 7 Jun 2022 10:40:40 +0200 Subject: [PATCH 082/343] Add test for Action.toString --- src/test/java/org/zendesk/client/v2/model/ActionTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/org/zendesk/client/v2/model/ActionTest.java b/src/test/java/org/zendesk/client/v2/model/ActionTest.java index 43862109b..bd406ed8b 100644 --- a/src/test/java/org/zendesk/client/v2/model/ActionTest.java +++ b/src/test/java/org/zendesk/client/v2/model/ActionTest.java @@ -42,4 +42,11 @@ public void testActionWithValues() throws Exception { assertEquals("huu", action.getValue()[0]); assertEquals("haa", action.getValue()[1]); } + + @Test + public void testToString() { + String json = "{ \"field\": 21337631753, \"value\": \"huuhaa\" }"; + Action action = parseJson(json.getBytes()); + assertEquals("Action{field=\'21337631753\', value=[huuhaa]}", action.toString()); + } } From 88a03b5af18aa03008f41cd54a34a8e750f5b22d Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 15:02:03 +0200 Subject: [PATCH 083/343] [feature] New method getOrganizationRequests(id) --- src/main/java/org/zendesk/client/v2/Zendesk.java | 6 ++++++ .../java/org/zendesk/client/v2/RealSmokeTest.java | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 027ce2b63..920870487 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -510,6 +510,12 @@ public Iterable getOrganizationTickets(long organizationId) { handleList(Ticket.class, "tickets")); } + public Iterable getOrganizationRequests(long organizationId) { + return new PagedIterable<>( + tmpl("/organizations/{organizationId}/requests.json").set("organizationId", organizationId), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } + public Iterable getUserRequestedTickets(long userId) { return new PagedIterable<>(tmpl("/users/{userId}/tickets/requested.json").set("userId", userId), handleList(Ticket.class, "tickets")); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index aa9aced2c..5af92fa72 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -438,6 +438,18 @@ public void getOrganizationTickets() throws Exception { } } + @Test + public void getOrganizationRequests() throws Exception { + createClientWithTokenOrPassword(); + int count = 0; + for (Request request : instance.getOrganizationRequests(CLOUDBEES_ORGANIZATION_ID)) { + assertThat(request.getId(), notNullValue()); + if (++count > 10) { + break; + } + } + } + @Test public void getTicketAudits() throws Exception { createClientWithTokenOrPassword(); From b4b80ed0a7fa24a99fcec947bc409d2a0e6b580a Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 15:00:58 +0200 Subject: [PATCH 084/343] [feature] New method getUsers(id,ids) --- src/main/java/org/zendesk/client/v2/Zendesk.java | 5 +++++ .../java/org/zendesk/client/v2/RealSmokeTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 027ce2b63..f3e6b3bb1 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -867,6 +867,11 @@ public Iterable getUsersByRole(String role, String... roles) { return new PagedIterable<>(cnst(uriBuilder.toString()), handleList(User.class, "users")); } + public List getUsers(long id, long... ids) { + return complete(submit(req("GET", tmpl("/users/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(User.class, "users"))); + } + public Iterable getUsersIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index aa9aced2c..8c9a1e697 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1154,6 +1154,21 @@ public void getUsers() throws Exception { } } + @Test + public void getUsersById() throws Exception { + createClientWithTokenOrPassword(); + + Long[] usersIds = StreamSupport.stream(instance.getUsers().spliterator(), false) + .limit(5) + .map(User::getId) + .toArray(Long[]::new); + + for (User user : instance.getUsers(usersIds[0], usersIds[1], usersIds[2], usersIds[3], usersIds[4])) { + assertThat(user.getId(), notNullValue()); + assertThat(user.getName(), notNullValue()); + } + } + @Test public void getUsersIncrementally() throws Exception { createClientWithTokenOrPassword(); From ae80853be6d05401d603fc36b24e2cab21f39f52 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 16:31:28 +0200 Subject: [PATCH 085/343] [feature] New methods get*TicketsCount*() --- .../java/org/zendesk/client/v2/Zendesk.java | 37 ++++++++++++++++++ .../zendesk/client/v2/model/TicketCount.java | 30 +++++++++++++++ .../org/zendesk/client/v2/RealSmokeTest.java | 38 +++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 src/main/java/org/zendesk/client/v2/model/TicketCount.java diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 027ce2b63..fcb346ff2 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -46,6 +46,7 @@ import org.zendesk.client.v2.model.Status; import org.zendesk.client.v2.model.SuspendedTicket; import org.zendesk.client.v2.model.Ticket; +import org.zendesk.client.v2.model.TicketCount; import org.zendesk.client.v2.model.TicketForm; import org.zendesk.client.v2.model.TicketImport; import org.zendesk.client.v2.model.TicketPage; @@ -286,6 +287,42 @@ public ListenableFuture importTicketsAsync(List ticketI Collections.singletonMap("tickets", ticketImports))), handleJobStatus()); } + public TicketCount getTicketsCount(){ + return complete( + submit( + req("GET", cnst("/tickets/count.json")), + handle(TicketCount.class, "count") + ) + ); + } + + public TicketCount getTicketsCountForOrganization(long id){ + return complete( + submit( + req("GET", tmpl("/organizations/{id}/tickets/count.json").set("id", id)), + handle(TicketCount.class, "count") + ) + ); + } + + public TicketCount getCcdTicketsCountForUser(long id){ + return complete( + submit( + req("GET", tmpl("/users/{id}/tickets/ccd/count.json").set("id", id)), + handle(TicketCount.class, "count") + ) + ); + } + + public TicketCount getAssignedTicketsCountForUser(long id){ + return complete( + submit( + req("GET", tmpl("/users/{id}/tickets/assigned/count.json").set("id", id)), + handle(TicketCount.class, "count") + ) + ); + } + public Ticket getTicket(long id) { return complete(submit(req("GET", tmpl("/tickets/{id}.json").set("id", id)), handle(Ticket.class, "ticket"))); diff --git a/src/main/java/org/zendesk/client/v2/model/TicketCount.java b/src/main/java/org/zendesk/client/v2/model/TicketCount.java new file mode 100644 index 000000000..02c00910f --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/TicketCount.java @@ -0,0 +1,30 @@ +package org.zendesk.client.v2.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Date; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class TicketCount { + + private Long value; + private Date refreshedAt; + + public Long getValue() { + return value; + } + + public void setValue(Long value) { + this.value = value; + } + + @JsonProperty("refreshed_at") + public Date getRefreshedAt() { + return refreshedAt; + } + + public void setRefreshedAt(Date refreshedAt) { + this.refreshedAt = refreshedAt; + } +} diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index aa9aced2c..558141f0e 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -35,6 +35,7 @@ import org.zendesk.client.v2.model.Status; import org.zendesk.client.v2.model.SuspendedTicket; import org.zendesk.client.v2.model.Ticket; +import org.zendesk.client.v2.model.TicketCount; import org.zendesk.client.v2.model.TicketForm; import org.zendesk.client.v2.model.TicketImport; import org.zendesk.client.v2.model.Trigger; @@ -104,6 +105,7 @@ public class RealSmokeTest { // TODO: Find a better way to manage our test environment (this is the PUBLIC_FORM_ID of the cloudbees org) private static final long CLOUDBEES_ORGANIZATION_ID = 360507899132L; + private static final long USER_ID = 381626101132L; // Pierre B private static final long PUBLIC_FORM_ID = 360000434032L; private static final Random RANDOM = new Random(); private static final String TICKET_COMMENT1 = "Please ignore this ticket"; @@ -185,6 +187,42 @@ public void getBrands() throws Exception { } } + @Test + public void getTicketsCount() throws Exception { + createClientWithTokenOrPassword(); + TicketCount ticketCount = instance.getTicketsCount(); + assertThat(ticketCount, notNullValue()); + assertThat(ticketCount.getValue(), greaterThan(0L)); + assertThat(ticketCount.getRefreshedAt(), notNullValue()); + } + + @Test + public void getTicketsCountForOrganization() throws Exception { + createClientWithTokenOrPassword(); + TicketCount ticketCount = instance.getTicketsCountForOrganization(CLOUDBEES_ORGANIZATION_ID); + assertThat(ticketCount, notNullValue()); + assertThat(ticketCount.getValue(), greaterThan(0L)); + assertThat(ticketCount.getRefreshedAt(), notNullValue()); + } + + @Test + public void getCcdTicketsCountForUser() throws Exception { + createClientWithTokenOrPassword(); + TicketCount ticketCount = instance.getCcdTicketsCountForUser(USER_ID); + assertThat(ticketCount, notNullValue()); + assertThat(ticketCount.getValue(), greaterThan(0L)); + assertThat(ticketCount.getRefreshedAt(), notNullValue()); + } + + @Test + public void getAssignedTicketsCountForUser() throws Exception { + createClientWithTokenOrPassword(); + TicketCount ticketCount = instance.getAssignedTicketsCountForUser(USER_ID); + assertThat(ticketCount, notNullValue()); + assertThat(ticketCount.getValue(), greaterThan(0L)); + assertThat(ticketCount.getRefreshedAt(), notNullValue()); + } + @Test public void getTicket() throws Exception { createClientWithTokenOrPassword(); From 9319910688752c537ac7facc7c157826feeb9c14 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 16:44:09 +0200 Subject: [PATCH 086/343] [feature] New method getOrganizations(id,ids) --- src/main/java/org/zendesk/client/v2/Zendesk.java | 5 +++++ .../java/org/zendesk/client/v2/RealSmokeTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 027ce2b63..b6e7fa412 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1250,6 +1250,11 @@ public Iterable getOrganizations() { handleList(Organization.class, "organizations")); } + public List getOrganizations(long id, long... ids) { + return complete(submit(req("GET", tmpl("/organizations/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(Organization.class, "organizations"))); + } + public Iterable getOrganizationsIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/organizations.json{?start_time}") diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index aa9aced2c..fba8c8f1a 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1190,6 +1190,21 @@ public void getOrganizations() throws Exception { } } + @Test + public void getOrganizationsById() throws Exception { + createClientWithTokenOrPassword(); + + Long[] orgIds = StreamSupport.stream(instance.getOrganizations().spliterator(), false) + .limit(5) + .map(Organization::getId) + .toArray(Long[]::new); + + for (Organization org : instance.getOrganizations(orgIds[0], orgIds[1], orgIds[2], orgIds[3], orgIds[4])) { + assertThat(org.getId(), notNullValue()); + assertThat(org.getName(), notNullValue()); + } + } + @Test public void getOrganizationsIncrementally() throws Exception { createClientWithTokenOrPassword(); From 4873835b781706eccc22a67ec016672e4c3b9be0 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 17:28:42 +0200 Subject: [PATCH 087/343] [feature] New method getUsersByExternalIds(id,ids) similar to #484 and fixes #470 --- src/main/java/org/zendesk/client/v2/Zendesk.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 8c3fadd2d..af6cb0079 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -878,6 +878,11 @@ public List getUsers(long id, long... ids) { handleList(User.class, "users"))); } + public List getUsersByExternalIds(long external_id, long... external_ids) { + return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(external_id, external_ids))), + handleList(User.class, "users"))); + } + public Iterable getUsersIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), From 384935df11d2209d89bf8b3489a745337b1aef07 Mon Sep 17 00:00:00 2001 From: Scott Murphy Date: Sun, 6 Mar 2022 11:50:49 -0500 Subject: [PATCH 088/343] Make Metric serializable --- src/main/java/org/zendesk/client/v2/model/Metric.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/model/Metric.java b/src/main/java/org/zendesk/client/v2/model/Metric.java index 8d10e9e23..111abcc39 100644 --- a/src/main/java/org/zendesk/client/v2/model/Metric.java +++ b/src/main/java/org/zendesk/client/v2/model/Metric.java @@ -10,7 +10,7 @@ */ public class Metric implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -847290591071406141L; @JsonProperty("id") protected Long id; @@ -247,7 +247,7 @@ public String toString() { '}'; } - public class ZendeskComboMinutes { + public class ZendeskComboMinutes implements Serializable { @JsonProperty("calendar") protected Long calendarMinutes; From 40cfe4d8168153a1a0c2add5d68c4d8ad420d539 Mon Sep 17 00:00:00 2001 From: Scott Murphy Date: Fri, 18 Mar 2022 10:25:33 -0400 Subject: [PATCH 089/343] Add serialVersionUID to ZendeskComboMinutes --- src/main/java/org/zendesk/client/v2/model/Metric.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/model/Metric.java b/src/main/java/org/zendesk/client/v2/model/Metric.java index 111abcc39..9a65f0164 100644 --- a/src/main/java/org/zendesk/client/v2/model/Metric.java +++ b/src/main/java/org/zendesk/client/v2/model/Metric.java @@ -249,6 +249,8 @@ public String toString() { public class ZendeskComboMinutes implements Serializable { + private static final long serialVersionUID = 295719113530420878L; + @JsonProperty("calendar") protected Long calendarMinutes; @JsonProperty("business") From 0261983d7807580d2f94faa6c2278caa51c8e6ac Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 18:27:32 +0200 Subject: [PATCH 090/343] Fix local variable name --- src/main/java/org/zendesk/client/v2/Zendesk.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index b20a0e68b..20397e2ec 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -915,8 +915,8 @@ public List getUsers(long id, long... ids) { handleList(User.class, "users"))); } - public List getUsersByExternalIds(long external_id, long... external_ids) { - return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(external_id, external_ids))), + public List getUsersByExternalIds(long externalId, long... externalIds) { + return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(externalId, externalIds))), handleList(User.class, "users"))); } From 1311dfa78ff15819cd215f37d90a96133c3b4537 Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 18:49:51 +0200 Subject: [PATCH 091/343] [maven-release-plugin] prepare release zendesk-java-client-0.17.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5a97881f4..66671a127 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.16.1-SNAPSHOT + 0.17.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.17.0 From c8b4c033f9bca02c27e98466a4a5119cc93b43de Mon Sep 17 00:00:00 2001 From: Arnaud HERITIER Date: Wed, 8 Jun 2022 18:49:55 +0200 Subject: [PATCH 092/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 66671a127..261b9a1d2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.17.0 + 0.17.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.17.0 + HEAD From a18ea74022f77a77767841667f8f88c088ccca11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Jun 2022 20:03:22 +0000 Subject: [PATCH 093/343] Bump maven-enforcer-plugin from 3.0.0 to 3.1.0 Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.0.0...enforcer-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 261b9a1d2..10e5b09d6 100644 --- a/pom.xml +++ b/pom.xml @@ -186,7 +186,7 @@ maven-enforcer-plugin - 3.0.0 + 3.1.0 org.apache.maven.plugins From 4631a9581e00896a4edbab3782e2ab5bf92225bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jun 2022 20:03:18 +0000 Subject: [PATCH 094/343] Bump netty-bom from 4.1.77.Final to 4.1.78.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.77.Final to 4.1.78.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.77.Final...netty-4.1.78.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 261b9a1d2..327d37a2b 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.77.Final + 4.1.78.Final pom import From d7c031b9f533f7095a270a6e8b274130d3880233 Mon Sep 17 00:00:00 2001 From: bob Date: Wed, 22 Jun 2022 15:01:53 -0400 Subject: [PATCH 095/343] Add basic View support - List the Views; List the tickets in a View Provide basic functionality for views. Support getting a list of the Views. Then, using the view id, we can get a list of the Tickets in the View. --- pom.xml | 2 +- .../java/org/zendesk/client/v2/Zendesk.java | 14 +- .../org/zendesk/client/v2/model/View.java | 142 ++++++++++++++++++ 3 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/zendesk/client/v2/model/View.java diff --git a/pom.xml b/pom.xml index 261b9a1d2..07aee0071 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.17.1-SNAPSHOT + 0.17.2-SNAPSHOT zendesk-java-client Java client for the Zendesk API diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 20397e2ec..d5215765c 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -57,6 +57,7 @@ import org.zendesk.client.v2.model.User; import org.zendesk.client.v2.model.UserField; import org.zendesk.client.v2.model.UserRelatedInfo; +import org.zendesk.client.v2.model.View; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.hc.Article; @@ -853,7 +854,18 @@ public void deleteTrigger(long triggerId) { } - // Automations + // Views + public Iterable getViews() { + return new PagedIterable<>(cnst("/views.json"), handleList(View.class, "views")); + + } + + public Iterable getView(long id) { + return new PagedIterable<>(tmpl("/views/{id}/tickets.json").set("id", id), + handleList(Ticket.class, "tickets")); + } + + // Automations public Iterable getAutomations() { return new PagedIterable<>(cnst("/automations.json"), handleList(Automation.class, "automations")); diff --git a/src/main/java/org/zendesk/client/v2/model/View.java b/src/main/java/org/zendesk/client/v2/model/View.java new file mode 100644 index 000000000..2f72577a4 --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/View.java @@ -0,0 +1,142 @@ +package org.zendesk.client.v2.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class View implements Serializable { + +<<<<<<< HEAD + private static final long serialVersionUID = 1L; +======= + private static final long serialVersionUID = 8162172428393948830L; + +>>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View + private long id; + private String title; + private boolean active; + private String updatedAt; + private String createdAt; + private long position; + private String description; + private Conditions conditions; + private boolean watchable; +<<<<<<< HEAD + private String rawTitle; +======= +>>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View + + public void setId(long id) { + this.id = id; + } + + @JsonProperty("id") + public long getId() { + return this.id; + } + + public void setTitle(String title) { + this.title = title; + } + + @JsonProperty("title") + public String getTitle() { + return this.title; + } + + public void setActive(boolean active) { + this.active = active; + } + + @JsonProperty("active") + public boolean getActive() { + return this.active; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + @JsonProperty("updated_at") + public String getUpdatedAt() { + return this.updatedAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + @JsonProperty("created_at") + public String getCreatedAt() { + return this.createdAt; + } + + public void setPosition(long position) { + this.position = position; + } + + @JsonProperty("position") + public long getPosition() { + return this.position; + } + + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty("description") + public String getDescription() { + return this.description; + } + + public void setConditions(Conditions conditions) { + this.conditions = conditions; + } + + @JsonProperty("conditions") + public Conditions getConditions() { + return this.conditions; + } + + public void setWatchable(boolean watchable) { + this.watchable = watchable; + } + + @JsonProperty("watchable") + public boolean getWatchable() { + return this.watchable; + } + +<<<<<<< HEAD + public void setRawTitle(String rawTitle) { + this.rawTitle = rawTitle; + } + + @JsonProperty("raw_title") + public String getRawTitle() { + return this.rawTitle; + } + +======= +>>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View + //TODO: fix this. + public String toString() { + return "View " + + "{id=" + id + + ", title=" + title + + ", active=" + active + + ", updatedAt=" + updatedAt + + ", createdAt=" + createdAt + + ", position=" + position + + ", description=" + description + + ", conditions=" + conditions + + ", watchable=" + watchable + +<<<<<<< HEAD + ", rawTitle=" + rawTitle + +======= +>>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View + "}"; + } +} From 8e3da4ab6a79b01e06e850f1a8553299c49ceb60 Mon Sep 17 00:00:00 2001 From: bob Date: Wed, 22 Jun 2022 15:01:53 -0400 Subject: [PATCH 096/343] Add basic View support - List the Views; List the tickets in a View Provide basic functionality for views. Support getting a list of the Views. Then, using the view id, we can get a list of the Tickets in the View. --- pom.xml | 2 +- .../org/zendesk/client/v2/model/View.java | 25 ------------------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 07aee0071..261b9a1d2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.17.2-SNAPSHOT + 0.17.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API diff --git a/src/main/java/org/zendesk/client/v2/model/View.java b/src/main/java/org/zendesk/client/v2/model/View.java index 2f72577a4..d5f2d64fb 100644 --- a/src/main/java/org/zendesk/client/v2/model/View.java +++ b/src/main/java/org/zendesk/client/v2/model/View.java @@ -8,12 +8,8 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class View implements Serializable { -<<<<<<< HEAD - private static final long serialVersionUID = 1L; -======= private static final long serialVersionUID = 8162172428393948830L; ->>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View private long id; private String title; private boolean active; @@ -23,10 +19,6 @@ public class View implements Serializable { private String description; private Conditions conditions; private boolean watchable; -<<<<<<< HEAD - private String rawTitle; -======= ->>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View public void setId(long id) { this.id = id; @@ -109,19 +101,6 @@ public boolean getWatchable() { return this.watchable; } -<<<<<<< HEAD - public void setRawTitle(String rawTitle) { - this.rawTitle = rawTitle; - } - - @JsonProperty("raw_title") - public String getRawTitle() { - return this.rawTitle; - } - -======= ->>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View - //TODO: fix this. public String toString() { return "View " + "{id=" + id + @@ -133,10 +112,6 @@ public String toString() { ", description=" + description + ", conditions=" + conditions + ", watchable=" + watchable + -<<<<<<< HEAD - ", rawTitle=" + rawTitle + -======= ->>>>>>> 954b71b... Add basic View support - List the Views; List the tickets in a View "}"; } } From c519a806eefb0e75a406a40edd46057d55f660e1 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 1 Jul 2022 16:40:14 +0200 Subject: [PATCH 097/343] Add integration tests for the view support dev --- .../org/zendesk/client/v2/RealSmokeTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 438028a5a..fe09324f2 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -41,6 +41,7 @@ import org.zendesk.client.v2.model.Trigger; import org.zendesk.client.v2.model.Type; import org.zendesk.client.v2.model.User; +import org.zendesk.client.v2.model.View; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.events.Event; @@ -63,6 +64,7 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Properties; import java.util.Random; import java.util.Set; @@ -107,6 +109,7 @@ public class RealSmokeTest { private static final long CLOUDBEES_ORGANIZATION_ID = 360507899132L; private static final long USER_ID = 381626101132L; // Pierre B private static final long PUBLIC_FORM_ID = 360000434032L; + private static final long UNRESOLVED_TICKETS_VIEW_ID = 360094600471L; private static final Random RANDOM = new Random(); private static final String TICKET_COMMENT1 = "Please ignore this ticket"; private static final String TICKET_COMMENT2 = "Yes ignore this ticket"; @@ -1964,6 +1967,31 @@ public void getTicketsFromSearch() throws Exception { } } + @Test + public void getUnresolvedViewReturnsANewlyCreatedTicket() throws Exception { + createClientWithTokenOrPassword(); + Ticket ticket = instance.createTicket(newTestTicket()); + try { + assertThat(ticket.getId(), notNullValue()); + + Optional maybeTicket = StreamSupport.stream(instance.getView(UNRESOLVED_TICKETS_VIEW_ID).spliterator(), false) + .filter(t -> Objects.equals(t.getId(), ticket.getId())) + .findFirst(); + assertTrue(maybeTicket.isPresent()); + } finally { + instance.deleteTicket(ticket.getId()); + } + } + + @Test + public void getViewReturnsTheUnresolvedView() throws Exception { + createClientWithTokenOrPassword(); + Optional maybeView = StreamSupport.stream(instance.getViews().spliterator(),false) + .filter(v -> Objects.equals(v.getId(), UNRESOLVED_TICKETS_VIEW_ID)) + .findFirst(); + assertTrue(maybeView.isPresent()); + } + // UTILITIES /** From 8eef788175d9f6d6fa79db5ac3352ceca45ee137 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 1 Jul 2022 17:03:46 +0200 Subject: [PATCH 098/343] [maven-release-plugin] prepare release zendesk-java-client-0.18.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 478abda4b..1db7186e3 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.17.1-SNAPSHOT + 0.18.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.18.0 From cac78dbb0ab7c38bec2a526c1b5906aba00b88a0 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 1 Jul 2022 17:03:51 +0200 Subject: [PATCH 099/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1db7186e3..cf8fd07fb 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.18.0 + 0.18.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.18.0 + HEAD From e5254b122c9f3d97765128610d6c420578750095 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Jul 2022 20:07:24 +0000 Subject: [PATCH 100/343] Bump extra-enforcer-rules from 1.5.1 to 1.6.1 Bumps [extra-enforcer-rules](https://github.com/mojohaus/extra-enforcer-rules) from 1.5.1 to 1.6.1. - [Release notes](https://github.com/mojohaus/extra-enforcer-rules/releases) - [Commits](https://github.com/mojohaus/extra-enforcer-rules/compare/extra-enforcer-rules-1.5.1...extra-enforcer-rules-1.6.1) --- updated-dependencies: - dependency-name: org.codehaus.mojo:extra-enforcer-rules dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf8fd07fb..fbb53a285 100644 --- a/pom.xml +++ b/pom.xml @@ -245,7 +245,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.5.1 + 1.6.1 From a2ef1404a5000bc4379054ddbb76872bd7896975 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Aug 2022 20:03:31 +0000 Subject: [PATCH 101/343] Bump animal-sniffer-enforcer-rule from 1.21 to 1.22 Bumps [animal-sniffer-enforcer-rule](https://github.com/mojohaus/animal-sniffer) from 1.21 to 1.22. - [Release notes](https://github.com/mojohaus/animal-sniffer/releases) - [Commits](https://github.com/mojohaus/animal-sniffer/compare/animal-sniffer-parent-1.21...animal-sniffer-parent-1.22) --- updated-dependencies: - dependency-name: org.codehaus.mojo:animal-sniffer-enforcer-rule dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf8fd07fb..9a5cbb1e0 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.codehaus.mojo animal-sniffer-enforcer-rule - 1.21 + 1.22 org.codehaus.mojo From 96db79427dbd1b9ac7783c60da370adc676a1688 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 20:25:13 +0000 Subject: [PATCH 102/343] Bump release-drafter/release-drafter from 5.20.0 to 5.21.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.20.0 to 5.21.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.20.0...v5.21.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 7a013b36f..e5a3b2489 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.20.0 + - uses: release-drafter/release-drafter@v5.21.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3e7fcb0ea4a31d854c2b8255c7f5431ab841dfa6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Sep 2022 20:38:35 +0000 Subject: [PATCH 103/343] Bump actions/stale from 5 to 6 Bumps [actions/stale](https://github.com/actions/stale) from 5 to 6. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale-items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml index 9dcd86db5..86a63d87c 100644 --- a/.github/workflows/close-stale-items.yml +++ b/.github/workflows/close-stale-items.yml @@ -7,7 +7,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/stale@v5 + - uses: actions/stale@v6 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-pr-labels: 'needs-fix' From 9333c778c39e7b8a3afb312ec2931458cd6e146d Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Mon, 26 Sep 2022 13:44:49 -0400 Subject: [PATCH 104/343] Add Automatic-Module-Name to manifest. --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index cf8fd07fb..6702e7388 100644 --- a/pom.xml +++ b/pom.xml @@ -249,6 +249,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + org.zendesk.client.v2 + + + + From 85998af55e489fe237eb927381a885ad608e26e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:05:05 +0000 Subject: [PATCH 105/343] Bump slf4j-api from 1.7.36 to 2.0.3 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 1.7.36 to 2.0.3. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.36...v_2.0.3) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf8fd07fb..ca21e94b6 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.slf4j slf4j-api - 1.7.36 + 2.0.3 org.asynchttpclient From e94a260b197395fc35aab7d128fe1289ed8fc3fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:07:16 +0000 Subject: [PATCH 106/343] Bump slf4j-simple from 1.7.36 to 2.0.3 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 1.7.36 to 2.0.3. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.36...v_2.0.3) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf8fd07fb..4ae1ec0ee 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ org.slf4j slf4j-simple - 1.7.36 + 2.0.3 test From 882ea3f4b7be454d49f223bd32a24a3ca6e871df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Oct 2022 20:05:16 +0000 Subject: [PATCH 107/343] Bump netty-bom from 4.1.78.Final to 4.1.84.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.78.Final to 4.1.84.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.78.Final...netty-4.1.84.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf8fd07fb..cf76d2985 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.78.Final + 4.1.84.Final pom import From 56f86ee8d450e3c0a0434191cd1c7d25b9a6f497 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 14 Oct 2022 16:47:43 +0200 Subject: [PATCH 108/343] [maven-release-plugin] prepare release zendesk-java-client-0.18.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e61696006..a7bd2821d 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.18.1-SNAPSHOT + 0.18.1 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.18.1 From ee08ec658e83f31f821255685cc856ecce835df4 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Fri, 14 Oct 2022 16:47:50 +0200 Subject: [PATCH 109/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a7bd2821d..bbb11c334 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.18.1 + 0.18.2-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.18.1 + HEAD From d1be55de3a2a28a67b50d47e5f50fbe7555dd861 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 20:02:29 +0000 Subject: [PATCH 110/343] Bump maven-jar-plugin from 3.2.0 to 3.3.0 Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.0...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bbb11c334..552079e0e 100644 --- a/pom.xml +++ b/pom.xml @@ -252,7 +252,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 From 4c44444df415d0f4e003f1ca90e6453dd39550d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 20:02:32 +0000 Subject: [PATCH 111/343] Bump jackson-bom from 2.13.3 to 2.13.4.20221013 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.13.3 to 2.13.4.20221013. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.13.3...jackson-bom-2.13.4.20221013) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bbb11c334..6c08bf8b2 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.13.3 + 2.13.4.20221013 pom import From 1c211c0541d5e08982bdc943ab416a9d6abe4172 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 20:04:34 +0000 Subject: [PATCH 112/343] Bump commons-text from 1.9 to 1.10.0 Bumps commons-text from 1.9 to 1.10.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-text dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bbb11c334..6dbd1b812 100644 --- a/pom.xml +++ b/pom.xml @@ -170,7 +170,7 @@ org.apache.commons commons-text - 1.9 + 1.10.0 test From 80933aae0d293c9d3d02695faf62fe914c89a766 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 20:23:41 +0000 Subject: [PATCH 113/343] Bump release-drafter/release-drafter from 5.21.0 to 5.21.1 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.21.0 to 5.21.1. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.21.0...v5.21.1) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index e5a3b2489..4e784dc0d 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.21.0 + - uses: release-drafter/release-drafter@v5.21.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 18cf3c2a1788100a3302234cc29b35acdf18b4f9 Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Mon, 24 Oct 2022 17:19:32 -0700 Subject: [PATCH 114/343] add Via to Comment class according to Zendesk API spec --- .../org/zendesk/client/v2/model/Comment.java | 8 ++++++++ .../org/zendesk/client/v2/RealSmokeTest.java | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/model/Comment.java b/src/main/java/org/zendesk/client/v2/model/Comment.java index 64dbf27f4..bf1b41165 100644 --- a/src/main/java/org/zendesk/client/v2/model/Comment.java +++ b/src/main/java/org/zendesk/client/v2/model/Comment.java @@ -24,6 +24,7 @@ public class Comment implements Serializable { private Date createdAt; private Boolean publicComment; private CommentType type; + private Via via; public Comment() { @@ -115,6 +116,13 @@ public void setType(CommentType type) { this.type = type; } + @JsonProperty("via") + public Via getVia() { + return via; + } + + public void setVia(Via via) { this.via = via; } + @Override public String toString() { return "Comment{" + "id=" + id + diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index fe09324f2..0cf99cabc 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -42,6 +42,7 @@ import org.zendesk.client.v2.model.Type; import org.zendesk.client.v2.model.User; import org.zendesk.client.v2.model.View; +import org.zendesk.client.v2.model.Via; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.events.Event; @@ -62,12 +63,14 @@ import java.util.Collections; import java.util.Date; import java.util.HashSet; +import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Properties; import java.util.Random; import java.util.Set; +import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -113,6 +116,9 @@ public class RealSmokeTest { private static final Random RANDOM = new Random(); private static final String TICKET_COMMENT1 = "Please ignore this ticket"; private static final String TICKET_COMMENT2 = "Yes ignore this ticket"; + private static final String VIA_CHANNEL = "chat"; + private static final Map VIA_SOURCE = new HashMap<>(); + private static final Via VIA = new Via(); private static Properties config; @@ -134,6 +140,12 @@ public static void loadConfig() { Awaitility.setDefaultPollInterval(20, TimeUnit.SECONDS); } + @BeforeClass + public static void initializeVia() { + VIA.setChannel(VIA_CHANNEL); + VIA.setSource(VIA_SOURCE); + } + public void assumeHaveToken() { assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); assumeThat("We have a token", config.getProperty("token"), not(isEmptyOrNullString())); @@ -1897,6 +1909,7 @@ public void getTicketCommentsShouldBeAscending() throws Exception { ticket = instance.createTicket(t); final Comment comment = new Comment(TICKET_COMMENT2); comment.setType(CommentType.COMMENT); + comment.setVia(VIA); instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId()); List comments = new ArrayList<>(); @@ -1924,6 +1937,7 @@ public void getTicketCommentsDescending() throws Exception { ticket = instance.createTicket(t); final Comment comment = new Comment(TICKET_COMMENT2); comment.setType(CommentType.COMMENT); + comment.setVia(VIA); instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId(), SortOrder.DESCENDING); List comments = new ArrayList<>(); @@ -1932,8 +1946,10 @@ public void getTicketCommentsDescending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); + assertThat(comments.get(0).getVia(), is(VIA)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); + assertThat(comments.get(1).getVia(), is(VIA)); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); From 0488b2c80173f4eaaf744aad0ba06da43b7d89b4 Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Mon, 24 Oct 2022 17:58:06 -0700 Subject: [PATCH 115/343] add missing Via to test --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 0cf99cabc..532bacd29 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1918,8 +1918,10 @@ public void getTicketCommentsShouldBeAscending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); + assertThat(comments.get(0).getVia(), is(VIA)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); + assertThat(comments.get(1).getVia(), is(VIA)); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); From adb7e7f6d86e04355d87368d0014d4db8a33ef5b Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Mon, 24 Oct 2022 18:25:31 -0700 Subject: [PATCH 116/343] remove check for the Via in first comment --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 532bacd29..7e9ae0d17 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1918,7 +1918,6 @@ public void getTicketCommentsShouldBeAscending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); - assertThat(comments.get(0).getVia(), is(VIA)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); assertThat(comments.get(1).getVia(), is(VIA)); @@ -1948,7 +1947,6 @@ public void getTicketCommentsDescending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); - assertThat(comments.get(0).getVia(), is(VIA)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); assertThat(comments.get(1).getVia(), is(VIA)); From 0f87b8dee5d82f515efa101080e48eb1027502f9 Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Mon, 24 Oct 2022 19:03:15 -0700 Subject: [PATCH 117/343] change order for Via in descending test --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 7e9ae0d17..271c96941 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1947,9 +1947,9 @@ public void getTicketCommentsDescending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); + assertThat(comments.get(0).getVia(), is(VIA)); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); - assertThat(comments.get(1).getVia(), is(VIA)); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); From d8d775c8297f1d4e0492e2a7552e1a23e062c33d Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Tue, 25 Oct 2022 10:15:22 -0700 Subject: [PATCH 118/343] test Via object against zendesk instance, correct the tests --- .../org/zendesk/client/v2/RealSmokeTest.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 271c96941..0559c4e7b 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -42,7 +42,6 @@ import org.zendesk.client.v2.model.Type; import org.zendesk.client.v2.model.User; import org.zendesk.client.v2.model.View; -import org.zendesk.client.v2.model.Via; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.events.Event; @@ -63,14 +62,12 @@ import java.util.Collections; import java.util.Date; import java.util.HashSet; -import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Properties; import java.util.Random; import java.util.Set; -import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -116,9 +113,6 @@ public class RealSmokeTest { private static final Random RANDOM = new Random(); private static final String TICKET_COMMENT1 = "Please ignore this ticket"; private static final String TICKET_COMMENT2 = "Yes ignore this ticket"; - private static final String VIA_CHANNEL = "chat"; - private static final Map VIA_SOURCE = new HashMap<>(); - private static final Via VIA = new Via(); private static Properties config; @@ -140,11 +134,6 @@ public static void loadConfig() { Awaitility.setDefaultPollInterval(20, TimeUnit.SECONDS); } - @BeforeClass - public static void initializeVia() { - VIA.setChannel(VIA_CHANNEL); - VIA.setSource(VIA_SOURCE); - } public void assumeHaveToken() { assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); @@ -1909,7 +1898,6 @@ public void getTicketCommentsShouldBeAscending() throws Exception { ticket = instance.createTicket(t); final Comment comment = new Comment(TICKET_COMMENT2); comment.setType(CommentType.COMMENT); - comment.setVia(VIA); instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId()); List comments = new ArrayList<>(); @@ -1918,9 +1906,12 @@ public void getTicketCommentsShouldBeAscending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); + assertNotNull(comments.get(0).getVia()); + assertThat(comments.get(0).getVia().getChannel(), is("api")); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); - assertThat(comments.get(1).getVia(), is(VIA)); + assertNotNull(comments.get(1).getVia()); + assertThat(comments.get(1).getVia().getChannel(), is("api")); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); @@ -1938,7 +1929,6 @@ public void getTicketCommentsDescending() throws Exception { ticket = instance.createTicket(t); final Comment comment = new Comment(TICKET_COMMENT2); comment.setType(CommentType.COMMENT); - comment.setVia(VIA); instance.createComment(ticket.getId(), comment); Iterable ticketCommentsIt = instance.getTicketComments(ticket.getId(), SortOrder.DESCENDING); List comments = new ArrayList<>(); @@ -1947,9 +1937,12 @@ public void getTicketCommentsDescending() throws Exception { assertThat(comments.size(), is(2)); assertThat(comments.get(0).getBody(), containsString(TICKET_COMMENT2)); assertThat(comments.get(0).getType(), is(CommentType.COMMENT)); - assertThat(comments.get(0).getVia(), is(VIA)); + assertNotNull(comments.get(0).getVia()); + assertThat(comments.get(0).getVia().getChannel(), is("api")); assertThat(comments.get(1).getBody(), containsString(TICKET_COMMENT1)); assertThat(comments.get(1).getType(), is(CommentType.COMMENT)); + assertNotNull(comments.get(1).getVia()); + assertThat(comments.get(1).getVia().getChannel(), is("api")); } finally { if (ticket != null) { instance.deleteTicket(ticket.getId()); From 0129abb70bce801e01717546a1949ee70ce5d480 Mon Sep 17 00:00:00 2001 From: Vvenediktov Date: Tue, 25 Oct 2022 10:19:42 -0700 Subject: [PATCH 119/343] remove extra blank line between methods --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 0559c4e7b..f9d4221d3 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -134,7 +134,6 @@ public static void loadConfig() { Awaitility.setDefaultPollInterval(20, TimeUnit.SECONDS); } - public void assumeHaveToken() { assumeThat("We have a username", config.getProperty("username"), not(isEmptyOrNullString())); assumeThat("We have a token", config.getProperty("token"), not(isEmptyOrNullString())); From 9ec287aaa055094ee3f1b099ac96a49c1ed69774 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Thu, 27 Oct 2022 12:07:50 +0200 Subject: [PATCH 120/343] Add via to the toString method --- src/main/java/org/zendesk/client/v2/model/Comment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/zendesk/client/v2/model/Comment.java b/src/main/java/org/zendesk/client/v2/model/Comment.java index bf1b41165..4c347e9d4 100644 --- a/src/main/java/org/zendesk/client/v2/model/Comment.java +++ b/src/main/java/org/zendesk/client/v2/model/Comment.java @@ -131,6 +131,7 @@ public String toString() { ", attachments=" + attachments + ", createdAt=" + createdAt + ", uploads=" + uploads + + ", via=" + via + '}'; } -} +} \ No newline at end of file From 3f54c579028ecdab6d300ca68b93f32a2598423c Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Thu, 27 Oct 2022 12:34:00 +0200 Subject: [PATCH 121/343] [maven-release-plugin] prepare release zendesk-java-client-0.19.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 879170818..59ada423c 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.18.2-SNAPSHOT + 0.19.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.19.0 From 5b633c37a9587c33ed45b6b87a359f7ed56c205d Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Thu, 27 Oct 2022 12:34:06 +0200 Subject: [PATCH 122/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 59ada423c..24541633a 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.19.0 + 0.19.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.19.0 + HEAD From 047355c846d5f16b333fb35290b93407897a56bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 20:00:54 +0000 Subject: [PATCH 123/343] Bump slf4j-api from 2.0.3 to 2.0.6 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 2.0.3 to 2.0.6. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.3...v_2.0.6) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24541633a..2f407fd10 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.slf4j slf4j-api - 2.0.3 + 2.0.6 org.asynchttpclient From 089f3a3a2f51c371937a30bd13718a13147e6b2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 20:00:59 +0000 Subject: [PATCH 124/343] Bump slf4j-simple from 2.0.3 to 2.0.6 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 2.0.3 to 2.0.6. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.3...v_2.0.6) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24541633a..c34df2ca0 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ org.slf4j slf4j-simple - 2.0.3 + 2.0.6 test From 28f8aab9f0c91c98de981e8153d26a198399a826 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Dec 2022 20:04:01 +0000 Subject: [PATCH 125/343] Bump actions/stale from 6 to 7 Bumps [actions/stale](https://github.com/actions/stale) from 6 to 7. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale-items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml index 86a63d87c..9d20a8f98 100644 --- a/.github/workflows/close-stale-items.yml +++ b/.github/workflows/close-stale-items.yml @@ -7,7 +7,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/stale@v6 + - uses: actions/stale@v7 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-pr-labels: 'needs-fix' From cbc94ebfdc1f4ea98643943e29ef67d3200e13a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 20:00:47 +0000 Subject: [PATCH 126/343] Bump assertj-core from 3.23.1 to 3.24.2 Bumps assertj-core from 3.23.1 to 3.24.2. --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24541633a..49434c084 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ org.assertj assertj-core - 3.23.1 + 3.24.2 test From 1df67fbcf7f6e5ff02c6df2622005dcdc4cd6f22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 20:02:23 +0000 Subject: [PATCH 127/343] Bump jackson-bom from 2.13.4.20221013 to 2.14.2 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.13.4.20221013 to 2.14.2. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.13.4.20221013...jackson-bom-2.14.2) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24541633a..d4537f274 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.13.4.20221013 + 2.14.2 pom import From f90d1d13ff5894e79158ea93f536094c3299b702 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 20:56:54 +0000 Subject: [PATCH 128/343] Bump netty-bom from 4.1.84.Final to 4.1.89.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.84.Final to 4.1.89.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.84.Final...netty-4.1.89.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24541633a..ff19ac2ba 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.84.Final + 4.1.89.Final pom import From 56e7a282a43630c0320e34de85242725c50a204b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:58:15 +0000 Subject: [PATCH 129/343] Bump release-drafter/release-drafter from 5.21.1 to 5.23.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.21.1 to 5.23.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.21.1...v5.23.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 4e784dc0d..58efdb9b1 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.21.1 + - uses: release-drafter/release-drafter@v5.23.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From e6d1c779143db4531cc7a441dd64f55ce72770d2 Mon Sep 17 00:00:00 2001 From: Florian Waltenberger Date: Thu, 2 Mar 2023 16:20:30 +0100 Subject: [PATCH 130/343] implemented getCategoryTranslation, getSectionTranslation and getArticleTranslation. --- .../java/org/zendesk/client/v2/Zendesk.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index d5215765c..792f0a568 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -2242,6 +2242,13 @@ public Iterable getArticleTranslations(Long articleId) { handleList(Translation.class, "translations")); } + public Translation getArticleTranslation(long articleId, String locale) { + return complete(submit(req("GET", + tmpl("/help_center/articles/{articleId}/translations/{locale}.json") + .set("articleId", articleId).set("locale", locale)), + handle(Translation.class, "translation"))); + } + public Article createArticle(Article article) { checkHasSectionId(article); return complete(submit(req("POST", tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), @@ -2333,6 +2340,14 @@ public Iterable getCategoryTranslations(Long categoryId) { tmpl("/help_center/categories/{categoryId}/translations.json").set("categoryId", categoryId), handleList(Translation.class, "translations")); } + + public Translation getCategoryTranslation(long categoryId, String locale) { + return complete(submit(req("GET", + tmpl("/help_center/categories/{categoryId}/translations/{locale}.json") + .set("categoryId", categoryId).set("locale", locale)), + handle(Translation.class, "translation"))); + } + public Category createCategory(Category category) { return complete(submit(req("POST", cnst("/help_center/categories.json"), JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); @@ -2384,6 +2399,14 @@ public Iterable getSectionTranslations(Long sectionId) { tmpl("/help_center/sections/{sectionId}/translations.json").set("sectionId", sectionId), handleList(Translation.class, "translations")); } + + public Translation getSectionTranslation(long sectionId, String locale) { + return complete(submit(req("GET", + tmpl("/help_center/sections/{sectionId}/translations/{locale}.json") + .set("sectionId", sectionId).set("locale", locale)), + handle(Translation.class, "translation"))); + } + public Section createSection(Section section) { checkHasCategoryId(section); return complete(submit(req("POST", tmpl("/help_center/categories/{id}/sections.json").set("id", section.getCategoryId()), From bc165881d0a863eebd8a920c6de4e0843875d99f Mon Sep 17 00:00:00 2001 From: Florian Waltenberger Date: Fri, 3 Mar 2023 13:42:23 +0100 Subject: [PATCH 131/343] pr feedback and tests --- .../java/org/zendesk/client/v2/Zendesk.java | 6 +- .../org/zendesk/client/v2/RealSmokeTest.java | 96 +++++++++++++++++++ 2 files changed, 99 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 792f0a568..a4141db77 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -2242,7 +2242,7 @@ public Iterable getArticleTranslations(Long articleId) { handleList(Translation.class, "translations")); } - public Translation getArticleTranslation(long articleId, String locale) { + public Translation showArticleTranslation(long articleId, String locale) { return complete(submit(req("GET", tmpl("/help_center/articles/{articleId}/translations/{locale}.json") .set("articleId", articleId).set("locale", locale)), @@ -2341,7 +2341,7 @@ public Iterable getCategoryTranslations(Long categoryId) { handleList(Translation.class, "translations")); } - public Translation getCategoryTranslation(long categoryId, String locale) { + public Translation showCategoryTranslation(long categoryId, String locale) { return complete(submit(req("GET", tmpl("/help_center/categories/{categoryId}/translations/{locale}.json") .set("categoryId", categoryId).set("locale", locale)), @@ -2400,7 +2400,7 @@ public Iterable getSectionTranslations(Long sectionId) { handleList(Translation.class, "translations")); } - public Translation getSectionTranslation(long sectionId, String locale) { + public Translation showSectionTranslation(long sectionId, String locale) { return complete(submit(req("GET", tmpl("/help_center/sections/{sectionId}/translations/{locale}.json") .set("sectionId", sectionId).set("locale", locale)), diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index f9d4221d3..1b834cce2 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1614,6 +1614,38 @@ public void getArticleTranslations() throws Exception { } } + @Test + public void showArticleTranslation() throws Exception { + createClientWithTokenOrPassword(); + List locales = instance.getHelpCenterLocales(); + + int articleCount = 0; + + for (Article article : instance.getArticles()) { + assertNotNull(article.getId()); + + if (++articleCount > 10) { + break; + } + + int translationCount = 0; + + for (String locale : locales) { + Translation translation = instance.showArticleTranslation(article.getId(), locale); + + // if there is no translation for the given locale the endpoint will return null + if (translation != null) { + assertNotNull(translation.getId()); + assertNotNull(translation.getTitle()); + } + + if (++translationCount > 3) { + break; + } + } + } + } + @Test public void getSectionTranslations() throws Exception { createClientWithTokenOrPassword(); @@ -1636,6 +1668,38 @@ public void getSectionTranslations() throws Exception { } } + @Test + public void showSectionTranslation() throws Exception { + createClientWithTokenOrPassword(); + List locales = instance.getHelpCenterLocales(); + + int sectionCount = 0; + + for (Section section : instance.getSections()) { + assertNotNull(section.getId()); + + if (++sectionCount > 10) { + break; + } + + int translationCount = 0; + + for (String locale : locales) { + Translation translation = instance.showSectionTranslation(section.getId(), locale); + + // if there is no translation for the given locale the endpoint will return null + if (translation != null) { + assertNotNull(translation.getId()); + assertNotNull(translation.getTitle()); + } + + if (++translationCount > 3) { + break; + } + } + } + } + @Test public void getCategoryTranslations() throws Exception { createClientWithTokenOrPassword(); @@ -1658,6 +1722,38 @@ public void getCategoryTranslations() throws Exception { } } + @Test + public void showCategoryTranslation() throws Exception { + createClientWithTokenOrPassword(); + List locales = instance.getHelpCenterLocales(); + + int categoryCount = 0; + + for (Category category : instance.getCategories()) { + assertNotNull(category.getId()); + + if (++categoryCount > 10) { + break; + } + + int translationCount = 0; + + for (String locale : locales) { + Translation translation = instance.showCategoryTranslation(category.getId(), locale); + + // if there is no translation for the given locale the endpoint will return null + if (translation != null) { + assertNotNull(translation.getId()); + assertNotNull(translation.getTitle()); + } + + if (++translationCount > 3) { + break; + } + } + } + } + @Test public void getArticlesIncrementally() throws Exception { createClientWithTokenOrPassword(); From 063facc896050bcf55cfe6d526386200efa242f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 20:56:49 +0000 Subject: [PATCH 132/343] Bump maven-enforcer-plugin from 3.1.0 to 3.2.1 Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.1.0 to 3.2.1. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.1.0...enforcer-3.2.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e6373f15..73541aee2 100644 --- a/pom.xml +++ b/pom.xml @@ -186,7 +186,7 @@ maven-enforcer-plugin - 3.1.0 + 3.2.1 org.apache.maven.plugins From 0e0ce0a46112a4ed9d61d2f476fed52e5b3af444 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 6 Mar 2023 10:12:57 +0100 Subject: [PATCH 133/343] [maven-release-plugin] prepare release zendesk-java-client-0.20.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 73541aee2..6bfea0c0a 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.19.1-SNAPSHOT + 0.20.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.20.0 From 8f66331c9627faac3a7adf1014f9bc0dbec8d394 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 6 Mar 2023 10:13:05 +0100 Subject: [PATCH 134/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6bfea0c0a..6b503d45a 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.20.0 + 0.20.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.20.0 + HEAD From a590b6cf132077803921fa7b32cc3c6845461eb7 Mon Sep 17 00:00:00 2001 From: Florian Waltenberger Date: Tue, 7 Mar 2023 12:06:41 +0100 Subject: [PATCH 135/343] implemented list help center locales --- .../java/org/zendesk/client/v2/Zendesk.java | 15 ++++++++-- .../zendesk/client/v2/model/hc/Locales.java | 28 +++++++++++++++++++ .../org/zendesk/client/v2/RealSmokeTest.java | 21 ++++++++++++-- 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/zendesk/client/v2/model/hc/Locales.java diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index a4141db77..3f041bf50 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -63,6 +63,7 @@ import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.ArticleAttachments; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.Locales; import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; @@ -2184,10 +2185,18 @@ public void deleteUserSegment(long id) { handleStatus())); } - public List getHelpCenterLocales() { + public Locales listHelpCenterLocales() { return complete(submit( - req("GET", cnst("/help_center/locales.json")), - handle(List.class, "locales"))); + req("GET", cnst("/help_center/locales.json")), + handle(Locales.class))); + } + + /** + * @deprecated Use {@link Zendesk#listHelpCenterLocales()} instead + */ + @Deprecated + public List getHelpCenterLocales() { + return listHelpCenterLocales().getLocales(); } /** diff --git a/src/main/java/org/zendesk/client/v2/model/hc/Locales.java b/src/main/java/org/zendesk/client/v2/model/hc/Locales.java new file mode 100644 index 000000000..28abb2c24 --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/hc/Locales.java @@ -0,0 +1,28 @@ +package org.zendesk.client.v2.model.hc; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +public class Locales { + + @JsonProperty("default_locale") + private String defaultLocale; + + private List locales; + + public String getDefaultLocale() { + return defaultLocale; + } + + public void setDefaultLocale(String defaultLocale) { + this.defaultLocale = defaultLocale; + } + + public List getLocales() { + return locales; + } + + public void setLocales(List locales) { + this.locales = locales; + } +} diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 1b834cce2..844f71a6d 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -47,6 +47,7 @@ import org.zendesk.client.v2.model.events.Event; import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.Locales; import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; import org.zendesk.client.v2.model.hc.Subscription; @@ -95,6 +96,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; import static org.junit.Assume.assumeThat; /** @@ -1592,6 +1594,19 @@ public void getArticleSubscriptions() throws Exception { } } + @Test + public void listHelpCenterLocales() throws Exception { + createClientWithTokenOrPassword(); + + Locales locales = instance.listHelpCenterLocales(); + + assertNotNull(locales); + assertNotNull(locales.getDefaultLocale()); + assertNotNull(locales.getLocales()); + assertFalse(locales.getLocales().isEmpty()); + assertTrue(locales.getLocales().contains(locales.getDefaultLocale())); + } + @Test public void getArticleTranslations() throws Exception { createClientWithTokenOrPassword(); @@ -1617,7 +1632,7 @@ public void getArticleTranslations() throws Exception { @Test public void showArticleTranslation() throws Exception { createClientWithTokenOrPassword(); - List locales = instance.getHelpCenterLocales(); + List locales = instance.listHelpCenterLocales().getLocales(); int articleCount = 0; @@ -1671,7 +1686,7 @@ public void getSectionTranslations() throws Exception { @Test public void showSectionTranslation() throws Exception { createClientWithTokenOrPassword(); - List locales = instance.getHelpCenterLocales(); + List locales = instance.listHelpCenterLocales().getLocales(); int sectionCount = 0; @@ -1725,7 +1740,7 @@ public void getCategoryTranslations() throws Exception { @Test public void showCategoryTranslation() throws Exception { createClientWithTokenOrPassword(); - List locales = instance.getHelpCenterLocales(); + List locales = instance.listHelpCenterLocales().getLocales(); int categoryCount = 0; From 45328f11846054e908bbb3abdc87ca0883c7bb2f Mon Sep 17 00:00:00 2001 From: Andy May Date: Tue, 7 Mar 2023 13:49:11 +0000 Subject: [PATCH 136/343] Implement getUsersByExternalIds(String, String...) - resolves #548 User external IDs are Strings in the Zendesk API, but the existing getUsersByExternalId implementation only allowed getting users by an externalId that was a long. --- .../java/org/zendesk/client/v2/Zendesk.java | 14 +++++ .../org/zendesk/client/v2/model/User.java | 36 +++++++++++ .../java/org/zendesk/client/v2/UserTest.java | 60 ++++++++++++++++--- 3 files changed, 103 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index a4141db77..32f5dc5d7 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -932,6 +932,11 @@ public List getUsersByExternalIds(long externalId, long... externalIds) { handleList(User.class, "users"))); } + public List getUsersByExternalIds(String externalId, String... externalIds) { + return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(externalId, externalIds))), + handleList(User.class, "users"))); + } + public Iterable getUsersIncrementally(Date startTime) { return new PagedIterable<>( tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), @@ -3103,6 +3108,15 @@ private static List idArray(long id, long... ids) { return result; } + private static List idArray(String id, String... ids) { + List result = new ArrayList<>(ids.length + 1); + result.add(id); + for (String i : ids) { + result.add(i); + } + return result; + } + private static List statusArray(Status... statuses) { List result = new ArrayList<>(statuses.length); for (Status s : statuses) { diff --git a/src/main/java/org/zendesk/client/v2/model/User.java b/src/main/java/org/zendesk/client/v2/model/User.java index ba25333be..260c436fa 100644 --- a/src/main/java/org/zendesk/client/v2/model/User.java +++ b/src/main/java/org/zendesk/client/v2/model/User.java @@ -8,6 +8,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author stephenc @@ -396,4 +397,39 @@ public void setReportCsv(Boolean reportCsv) { this.reportCsv = reportCsv; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(url, user.url) && + Objects.equals(externalId, user.externalId) && Objects.equals(alias, user.alias) && + Objects.equals(createdAt, user.createdAt) && Objects.equals(updatedAt, user.updatedAt) && + Objects.equals(active, user.active) && Objects.equals(verified, user.verified) && + Objects.equals(shared, user.shared) && Objects.equals(localeId, user.localeId) && + Objects.equals(locale, user.locale) && Objects.equals(timeZone, user.timeZone) && + Objects.equals(lastLoginAt, user.lastLoginAt) && Objects.equals(phone, user.phone) && + Objects.equals(restrictedAgent, user.restrictedAgent) && Objects.equals(signature, user.signature) && + Objects.equals(details, user.details) && Objects.equals(notes, user.notes) && + Objects.equals(organizationId, user.organizationId) && role == user.role && + Objects.equals(customRoleId, user.customRoleId) && Objects.equals(moderator, user.moderator) && + ticketRestriction == user.ticketRestriction && + Objects.equals(onlyPrivateComments, user.onlyPrivateComments) && + Objects.equals(tags, user.tags) && Objects.equals(suspended, user.suspended) && + Objects.equals(photo, user.photo) && Objects.equals(identities, user.identities) && + Objects.equals(remotePhotoUrl, user.remotePhotoUrl) && Objects.equals(userFields, user.userFields) && + Objects.equals(chatOnly, user.chatOnly) && Objects.equals(sharedPhoneNumber, user.sharedPhoneNumber) && + Objects.equals(defaultGroupId, user.defaultGroupId) && Objects.equals(roleType, user.roleType) && + Objects.equals(twoFactorAuthEnabled, user.twoFactorAuthEnabled) && + Objects.equals(reportCsv, user.reportCsv); + } + + @Override + public int hashCode() { + return Objects.hash(id, url, externalId, alias, createdAt, updatedAt, active, verified, shared, localeId, + locale, timeZone, lastLoginAt, phone, restrictedAgent, signature, details, notes, organizationId, + role, customRoleId, moderator, ticketRestriction, onlyPrivateComments, tags, suspended, photo, + identities, remotePhotoUrl, userFields, chatOnly, sharedPhoneNumber, defaultGroupId, roleType, + twoFactorAuthEnabled, reportCsv); + } } diff --git a/src/test/java/org/zendesk/client/v2/UserTest.java b/src/test/java/org/zendesk/client/v2/UserTest.java index 5a380253a..b56b23274 100644 --- a/src/test/java/org/zendesk/client/v2/UserTest.java +++ b/src/test/java/org/zendesk/client/v2/UserTest.java @@ -1,12 +1,6 @@ package org.zendesk.client.v2; -import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; -import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; -import static com.github.tomakehurst.wiremock.client.WireMock.ok; -import static com.github.tomakehurst.wiremock.client.WireMock.put; -import static com.github.tomakehurst.wiremock.client.WireMock.putRequestedFor; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; import static io.netty.handler.codec.http.HttpHeaders.Values.APPLICATION_JSON; import static org.assertj.core.api.Assertions.assertThat; @@ -14,7 +8,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; + +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.List; + import org.apache.commons.text.RandomStringGenerator; import org.junit.After; import org.junit.Before; @@ -108,4 +107,51 @@ public void mergeUsers() throws JsonProcessingException { .isEqualToComparingFieldByField(userObjectInResponse); } + + @Test + public void getUsersByExternalIds_canBeCalledWithEitherLongsOrStrings() throws JsonProcessingException { + + User user123 = new User(); + user123.setId(1L); + user123.setExternalId("123"); + user123.setName("user123"); + User user456 = new User(); + user456.setId(2L); + user456.setExternalId("456"); + user456.setName("user456"); + User user789 = new User(); + user789.setId(3L); + user789.setExternalId("789"); + user789.setName("user789"); + + String expectedJsonResponse = objectMapper.writeValueAsString( + Collections.singletonMap("users", Arrays.asList(user123, user456, user789))); + + zendeskApiMock.stubFor( + get( + urlPathEqualTo("/api/v2/users/show_many.json")) + .withQueryParam("external_ids", equalTo("123,456,789")) + .willReturn(ok() + .withBody(expectedJsonResponse) + ) + ); + + List usersByLongExternalIds = client.getUsersByExternalIds(123, 456, 789); + + zendeskApiMock.verify(getRequestedFor( + urlPathEqualTo("/api/v2/users/show_many.json")) + .withQueryParam("external_ids", equalTo("123,456,789")) + ); + + assertThat(usersByLongExternalIds).containsExactly(user123, user456, user789); + + List usersByStringExternalIds = client.getUsersByExternalIds("123", "456", "789"); + + zendeskApiMock.verify(getRequestedFor( + urlPathEqualTo("/api/v2/users/show_many.json")) + .withQueryParam("external_ids", equalTo("123,456,789")) + ); + + assertThat(usersByStringExternalIds).containsExactly(user123, user456, user789); + } } From cec624961df59051f8b3c980edb2ce30135826bc Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Tue, 7 Mar 2023 15:21:08 +0100 Subject: [PATCH 137/343] [maven-release-plugin] prepare release zendesk-java-client-0.21.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6b503d45a..50c6edc48 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.20.1-SNAPSHOT + 0.21.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.21.0 From 91b123ef7e6f5a71fe7112da9b73222933b17265 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Tue, 7 Mar 2023 15:21:14 +0100 Subject: [PATCH 138/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 50c6edc48..869481a5d 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.21.0 + 0.21.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.21.0 + HEAD From 2b72f45afaf8484edb86041f0a6dc23cab5ff5b7 Mon Sep 17 00:00:00 2001 From: Andy May Date: Tue, 7 Mar 2023 16:15:49 +0000 Subject: [PATCH 139/343] Deprecate getUsersByExternalIds(long, long...) --- src/main/java/org/zendesk/client/v2/Zendesk.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 32f5dc5d7..ef5d56822 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -927,6 +927,11 @@ public List getUsers(long id, long... ids) { handleList(User.class, "users"))); } + /** + * @deprecated - User externalIds are Strings in Zendesk API, not longs. + * Use {@link #getUsersByExternalIds(String, String...)} instead + */ + @Deprecated public List getUsersByExternalIds(long externalId, long... externalIds) { return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(externalId, externalIds))), handleList(User.class, "users"))); From 540d9cfb4e8f4caffb7e45f38ad0baa39b20fbba Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Tue, 7 Mar 2023 13:46:40 -0700 Subject: [PATCH 140/343] Fix and enable createOrUpdateUser test --- .../org/zendesk/client/v2/RealSmokeTest.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 844f71a6d..0013f7d18 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1882,8 +1882,9 @@ public void getCustomAgentRoles() throws Exception { } @Test - @Ignore("Failing and I don't know why - caching issue ?") - // TODO: Fix this test + // Zendesk api behavior note - When update is used to change a phone number, a second phone number + // is added to the record. An update works as expected for non-identify fields, additional + // constraints exist for identify field updates public void createOrUpdateUser() throws Exception { createClientWithTokenOrPassword(); @@ -1895,30 +1896,30 @@ public void createOrUpdateUser() throws Exception { instance.deleteUser(u.getId()); } - String phoneAtCreation = "5555551234"; + String detailsAtCreation = "details at creation"; User user = new User(true, name); user.setExternalId(externalId); - user.setPhone(phoneAtCreation); + user.setDetails(detailsAtCreation); User createResult = instance.createOrUpdateUser(user); assertNotNull(createResult); assertNotNull(createResult.getId()); assertEquals(name, createResult.getName()); assertEquals(externalId, createResult.getExternalId()); - assertEquals(phoneAtCreation, createResult.getPhone()); + assertEquals(detailsAtCreation, createResult.getDetails()); - String phoneAtUpdate = "5555551235"; + String detailsAtUpdate = "details at update"; User updateUser = new User(true, name); updateUser.setId(createResult.getId()); updateUser.setExternalId(externalId); - updateUser.setPhone(phoneAtUpdate); + updateUser.setDetails(detailsAtUpdate); User updateResult = instance.createOrUpdateUser(updateUser); assertNotNull(updateResult); assertEquals(createResult.getId(), updateResult.getId()); assertEquals(name, updateResult.getName()); assertEquals(externalId, updateResult.getExternalId()); - assertEquals(phoneAtUpdate, updateResult.getPhone()); + assertEquals(detailsAtUpdate, updateResult.getDetails()); instance.deleteUser(updateResult); } From eb9e56b78c3b890630109aa147640afb5a65df74 Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Tue, 7 Mar 2023 14:09:19 -0700 Subject: [PATCH 141/343] Cursor based pagination added for getUsers --- src/main/java/org/zendesk/client/v2/Zendesk.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 3f041bf50..7ba7dcdee 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -904,7 +904,7 @@ public Iterable getTwitterMonitors() { public Iterable getUsers() { - return new PagedIterable<>(cnst("/users.json"), handleList(User.class, "users")); + return new PagedIterable<>(cnst("/users.json?page[size]=100"), handleList(User.class, "users")); } public Iterable getUsersByRole(String role, String... roles) { @@ -2655,6 +2655,8 @@ public JobStatus onCompleted(Response response) throws Exception { }; } + private static final String CURSOR_LINKS = "links"; + private static final String CURSOR_NEXT_PAGE = "next"; private static final String NEXT_PAGE = "next_page"; private static final String END_TIME = "end_time"; private static final String COUNT = "count"; @@ -2664,7 +2666,15 @@ private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncComple private String nextPage; public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode node = responseNode.get(NEXT_PAGE); + JsonNode node = responseNode.get(CURSOR_LINKS); + + // Attempt to use cursor pagination if possible + if (node != null) { + node = node.get(CURSOR_NEXT_PAGE); + } else { + node = responseNode.get(NEXT_PAGE); + } + if (node == null) { this.nextPage = null; if (logger.isDebugEnabled()) { From a18fcafb295b77e01976047ae6c22b9cf5739c15 Mon Sep 17 00:00:00 2001 From: Andy May Date: Wed, 8 Mar 2023 11:00:11 +0000 Subject: [PATCH 142/343] Don't rely on auto type conversion in UserTest --- src/test/java/org/zendesk/client/v2/UserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/UserTest.java b/src/test/java/org/zendesk/client/v2/UserTest.java index b56b23274..51c47e892 100644 --- a/src/test/java/org/zendesk/client/v2/UserTest.java +++ b/src/test/java/org/zendesk/client/v2/UserTest.java @@ -136,7 +136,7 @@ public void getUsersByExternalIds_canBeCalledWithEitherLongsOrStrings() throws J ) ); - List usersByLongExternalIds = client.getUsersByExternalIds(123, 456, 789); + List usersByLongExternalIds = client.getUsersByExternalIds(123L, 456L, 789L); zendeskApiMock.verify(getRequestedFor( urlPathEqualTo("/api/v2/users/show_many.json")) From e3c895f9e03c21eb6a21e40601ebd7d49c6dd664 Mon Sep 17 00:00:00 2001 From: Andy May Date: Wed, 8 Mar 2023 14:50:08 +0000 Subject: [PATCH 143/343] Add support for Article.contentTagIds field - resolves #557 --- .../org/zendesk/client/v2/model/hc/Article.java | 13 +++++++++++++ .../org/zendesk/client/v2/model/ArticleTest.java | 3 +++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/model/hc/Article.java b/src/main/java/org/zendesk/client/v2/model/hc/Article.java index 6743d707d..e2e8745fa 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/Article.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/Article.java @@ -40,6 +40,10 @@ public class Article implements SearchResultEntity { @JsonProperty("comments_disabled") private Boolean commentsDisabled; + /** The list of content tags attached to the article */ + @JsonProperty("content_tag_ids") + private List contentTagIds; + /** Whether the source (default) translation of the article is out of date */ private Boolean outdated; @@ -166,6 +170,14 @@ public void setCommentsDisabled(Boolean commentsDisabled) { this.commentsDisabled = commentsDisabled; } + public List getContentTagIds() { + return contentTagIds; + } + + public void setContentTagIds(List contentTagIds) { + this.contentTagIds = contentTagIds; + } + public Boolean getOutdated() { return outdated; } @@ -290,6 +302,7 @@ public String toString() { ", sourceLocale='" + sourceLocale + '\'' + ", authorId=" + authorId + ", commentsDisabled=" + commentsDisabled + + ", contentTagIds=" + contentTagIds + ", outdated=" + outdated + ", outdatedLocales=" + outdatedLocales + ", labelNames=" + labelNames + diff --git a/src/test/java/org/zendesk/client/v2/model/ArticleTest.java b/src/test/java/org/zendesk/client/v2/model/ArticleTest.java index 969318ec3..2234d694a 100644 --- a/src/test/java/org/zendesk/client/v2/model/ArticleTest.java +++ b/src/test/java/org/zendesk/client/v2/model/ArticleTest.java @@ -5,6 +5,7 @@ import org.zendesk.client.v2.model.hc.Article; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import static org.junit.Assert.assertEquals; @@ -31,6 +32,7 @@ public void testParseArticle() { "\"html_url\":\"https://example.zendesk.com/hc/en-us/articles/918273645013-Welcome-to-your-Help-Center-\"," + "\"author_id\":2314596780," + "\"comments_disabled\":false," + + "\"content_tag_ids\": [335, 7104]," + "\"draft\":false," + "\"promoted\":false," + "\"position\":0," + @@ -57,6 +59,7 @@ public void testParseArticle() { assertEquals("https://example.zendesk.com/hc/en-us/articles/918273645013-Welcome-to-your-Help-Center-", article.getHtmlUrl()); assertEquals((Long) 2314596780L, article.getAuthorId()); assertEquals(false, article.getCommentsDisabled()); + assertEquals(Arrays.asList(335L, 7104L), article.getContentTagIds()); assertEquals(false, article.getDraft()); assertEquals(false, article.getPromoted()); assertEquals((Long) 0L, article.getPosition()); From 2404943ddd9c651073c28ac199a49ca3b2057248 Mon Sep 17 00:00:00 2001 From: Andy May Date: Thu, 9 Mar 2023 15:02:09 +0000 Subject: [PATCH 144/343] Remove wildcard import in UserTest --- src/test/java/org/zendesk/client/v2/UserTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/zendesk/client/v2/UserTest.java b/src/test/java/org/zendesk/client/v2/UserTest.java index 51c47e892..b208eb5cd 100644 --- a/src/test/java/org/zendesk/client/v2/UserTest.java +++ b/src/test/java/org/zendesk/client/v2/UserTest.java @@ -1,6 +1,15 @@ package org.zendesk.client.v2; -import static com.github.tomakehurst.wiremock.client.WireMock.*; + +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.put; +import static com.github.tomakehurst.wiremock.client.WireMock.putRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; import static io.netty.handler.codec.http.HttpHeaders.Values.APPLICATION_JSON; import static org.assertj.core.api.Assertions.assertThat; @@ -9,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; -import java.util.ArrayList; + import java.util.Arrays; import java.util.Collections; import java.util.List; From ab60adeaea5682e7aa1613256ba008e86ebda5d7 Mon Sep 17 00:00:00 2001 From: Andy May Date: Thu, 9 Mar 2023 15:07:13 +0000 Subject: [PATCH 145/343] Remove blank line in UserTest --- src/test/java/org/zendesk/client/v2/UserTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/UserTest.java b/src/test/java/org/zendesk/client/v2/UserTest.java index b208eb5cd..ab07468cc 100644 --- a/src/test/java/org/zendesk/client/v2/UserTest.java +++ b/src/test/java/org/zendesk/client/v2/UserTest.java @@ -1,6 +1,5 @@ package org.zendesk.client.v2; - import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; import static com.github.tomakehurst.wiremock.client.WireMock.get; From 460c5b864bb05987adf11733ab2726d35dd0cbc4 Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Fri, 10 Mar 2023 15:00:38 -0700 Subject: [PATCH 146/343] Add bulk delete users by id --- .../java/org/zendesk/client/v2/Zendesk.java | 5 +++++ .../org/zendesk/client/v2/RealSmokeTest.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 3f041bf50..9763db315 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1030,6 +1030,11 @@ public void deleteUser(long id) { complete(submit(req("DELETE", tmpl("/users/{id}.json").set("id", id)), handleStatus())); } + public JobStatus deleteUsers(long... ids) { + return complete(submit(req("DELETE", tmpl("/users/destroy_many.json{?ids}").set("ids", ids)), + handleJobStatus())); + } + public User permanentlyDeleteUser(User user) { checkHasId(user); return permanentlyDeleteUser(user.getId()); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 844f71a6d..843aee1d0 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -949,6 +949,25 @@ public void updateUsers() throws Exception { } } + @Test + public void deleteUsersById() throws Exception { + createClientWithTokenOrPassword(); + + final List users = createTestUsersInZendesk(); + final long[] ids = users.stream().mapToLong(User::getId).toArray(); + final JobStatus status = waitJobCompletion(instance.deleteUsers(ids)); + + assertThat("Job is completed", status.getStatus(), is(JobStatus.JobStatusEnum.completed)); + assertThat("The good number of users were processed", status.getTotal(), is(users.size())); + assertThat("We have a result for each user", status.getResults(), hasSize(users.size())); + assertThat("Job reports that the same users requested to be deleted were deleted", + status.getResults() + .stream() + .map(JobResult::getId) + .collect(Collectors.toList()), + containsInAnyOrder(Arrays.stream(ids).boxed().toArray())); + } + @Test public void createOrUpdateUsers() throws Exception { createClientWithTokenOrPassword(); From 261a1fe355f5e00ce73601cee14a0fd20b47d428 Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Mon, 13 Mar 2023 14:42:33 -0600 Subject: [PATCH 147/343] Update links --- README.md | 76 +++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 46d47731c..a7214ef96 100644 --- a/README.md +++ b/README.md @@ -44,56 +44,54 @@ Status Here is the status of the various API components: -* [Tickets](http://developer.zendesk.com/documentation/rest_api/tickets.html) ✓ -* [Ticket Audits](http://developer.zendesk.com/documentation/rest_api/ticket_audits.html) ✓ -* [Incremental Export](https://developer.zendesk.com/rest_api/docs/core/incremental_export) - Partial (tickets, users, organizations only) -* [Ticket Fields](http://developer.zendesk.com/documentation/rest_api/ticket_fields.html) ✓ -* [Ticket Import](http://developer.zendesk.com/documentation/rest_api/ticket_import.html) ✓ -* [Ticket Metrics](http://developer.zendesk.com/documentation/rest_api/ticket_metrics.html) ✓ -* [Ticket Forms](http://developer.zendesk.com/documentation/rest_api/ticket_forms.html) *getTicketForm() and getTicketForms()* -* [Views](http://developer.zendesk.com/documentation/rest_api/views.html) -* [Users](http://developer.zendesk.com/documentation/rest_api/users.html) ✓ - * [User Related Information](https://developer.zendesk.com/rest_api/docs/core/users#user-related-information) ✓ -* [User Fields](https://developer.zendesk.com/rest_api/docs/core/user_fields.html) - Partial - List User Fields (`getUserField()`) -* [Requests](http://developer.zendesk.com/documentation/rest_api/requests.html) ✓ -* [User Identities](http://developer.zendesk.com/documentation/rest_api/user_identities.html) ✓ -* [Groups](http://developer.zendesk.com/documentation/rest_api/groups.html) ✓ -* [Group Membership](http://developer.zendesk.com/documentation/rest_api/group_memberships.html) ✓ -* [Custom Agent Roles](http://developer.zendesk.com/documentation/rest_api/custom_roles.html) ✓ -* [Organizations](http://developer.zendesk.com/documentation/rest_api/organizations.html) ✓ *except for related info* -* [Search](http://developer.zendesk.com/documentation/rest_api/search.html) ✓ *except for topics and sort ordering* -* [Tags](http://developer.zendesk.com/documentation/rest_api/tags.html) +* [Tickets](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/) ✓ +* [Ticket Audits](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_audits/) ✓ +* [Incremental Export](https://developer.zendesk.com/api-reference/ticketing/ticket-management/incremental_exports/) - Partial (tickets, users, organizations only) +* [Ticket Fields](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_fields/) ✓ +* [Ticket Import](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_import/) ✓ +* [Ticket Metrics](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_metrics/) ✓ +* [Ticket Forms](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_forms/) *getTicketForm() and getTicketForms()* +* [Views](https://developer.zendesk.com/api-reference/ticketing/business-rules/views/) +* [Users](https://developer.zendesk.com/api-reference/ticketing/users/users/) ✓ + * [User Related Information](https://developer.zendesk.com/api-reference/ticketing/users/users/#show-user-related-information) ✓ +* [User Fields](https://developer.zendesk.com/api-reference/ticketing/users/user_fields/) - Partial - List User Fields (`getUserField()`) +* [Requests](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-requests/) ✓ +* [User Identities](https://developer.zendesk.com/api-reference/ticketing/users/user_identities/) ✓ +* [Groups](https://developer.zendesk.com/api-reference/ticketing/groups/groups/) ✓ +* [Group Membership](https://developer.zendesk.com/api-reference/ticketing/groups/group_memberships/) ✓ +* [Custom Agent Roles](https://developer.zendesk.com/api-reference/ticketing/account-configuration/custom_roles/) ✓ +* [Organizations](https://developer.zendesk.com/api-reference/ticketing/organizations/organizations/) ✓ *except for related info* +* [Search](https://developer.zendesk.com/api-reference/ticketing/ticket-management/search/) ✓ *except for topics and sort ordering* +* [Tags](https://developer.zendesk.com/api-reference/ticketing/ticket-management/tags/) * [Forums](http://developer.zendesk.com/documentation/rest_api/forums.html) ✓ * [Forum Subscriptions](http://developer.zendesk.com/documentation/rest_api/forum_subscriptions.html) * [Categories](http://developer.zendesk.com/documentation/rest_api/categories.html) -* [Topics](http://developer.zendesk.com/documentation/rest_api/topics.html) ✓ -* [Topic Comments](http://developer.zendesk.com/documentation/rest_api/topic_comments.html) -* [Topic Subscriptions](http://developer.zendesk.com/documentation/rest_api/topic_subscriptions.html) +* [Topics](https://developer.zendesk.com/api-reference/help_center/help-center-api/topics/) ✓ +* [Post Comments](https://developer.zendesk.com/api-reference/help_center/help-center-api/post_comments/) +* [Content Subscriptions](https://developer.zendesk.com/api-reference/help_center/help-center-api/content_subscriptions/) * [Help Center Categories](https://developer.zendesk.com/rest_api/docs/help_center/categories) ✓ * [Help Center Sections](https://developer.zendesk.com/rest_api/docs/help_center/sections) ✓ -* [Help Center Articles](https://developer.zendesk.com/rest_api/docs/help_center/articles) ✓ -* [Help Center Translations](https://developer.zendesk.com/rest_api/docs/help_center/translations) - Partial (List Translations, Update Translation, Delete Translation) +* [Help Center Articles](https://developer.zendesk.com/api-reference/help_center/help-center-api/articles/) ✓ +* [Help Center Translations](https://developer.zendesk.com/api-reference/help_center/help-center-api/translations/) - Partial (List Translations, Update Translation, Delete Translation) * [Help Center Subscriptions](https://developer.zendesk.com/rest_api/docs/help_center/subscriptions) * [Help Center Management Permission Groups](https://developer.zendesk.com/rest_api/docs/help_center/permission_groups) * [Help Center User Segments](https://developer.zendesk.com/rest_api/docs/help_center/user_segments) -* [Topic Votes](http://developer.zendesk.com/documentation/rest_api/topic_votes.html) -* [Account Settings](http://developer.zendesk.com/documentation/rest_api/account_settings.html) -* [Activity Stream](http://developer.zendesk.com/documentation/rest_api/activity_stream.html) -* [Attachments](http://developer.zendesk.com/documentation/rest_api/attachments.html) ✓ -* [Autocompletion](http://developer.zendesk.com/documentation/rest_api/autocomplete.html) -* [Automations](http://developer.zendesk.com/documentation/rest_api/automations.html) ✓ -* [Job Statuses](http://developer.zendesk.com/documentation/rest_api/job_statuses.html) -* [Locales](http://developer.zendesk.com/documentation/rest_api/locales.html) -* [Macros](http://developer.zendesk.com/documentation/rest_api/macros.html) ✓ *except for restrictions* -* [Restrictions and Responsibilities](http://developer.zendesk.com/documentation/rest_api/restrictions.html) -* [Satisfaction Ratings](http://developer.zendesk.com/documentation/rest_api/satisfaction_ratings.html) ✓ -* [Sharing Agreements](http://developer.zendesk.com/documentation/rest_api/sharing_agreements.html) -* [Suspended Tickets](http://developer.zendesk.com/documentation/rest_api/suspended_tickets.html) -* [Triggers](http://developer.zendesk.com/documentation/rest_api/triggers.html) ✓ +* [Topic Votes](https://developer.zendesk.com/api-reference/help_center/help-center-api/votes/) +* [Account Settings](https://developer.zendesk.com/api-reference/ticketing/account-configuration/account_settings/) +* [Activity Stream](https://developer.zendesk.com/api-reference/ticketing/tickets/activity_stream/) +* [Attachments](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-attachments/) ✓ +* [Automations](https://developer.zendesk.com/api-reference/ticketing/business-rules/automations/) ✓ +* [Job Statuses](https://developer.zendesk.com/api-reference/ticketing/ticket-management/job_statuses/) ✓ +* [Locales](https://developer.zendesk.com/api-reference/ticketing/account-configuration/locales/) +* [Macros](https://developer.zendesk.com/api-reference/ticketing/business-rules/macros/) ✓ *except for restrictions* +* [Satisfaction Ratings](https://developer.zendesk.com/api-reference/ticketing/ticket-management/satisfaction_ratings/) ✓ +* [Sharing Agreements](https://developer.zendesk.com/api-reference/ticketing/account-configuration/sharing_agreements/) +* [Suspended Tickets](https://developer.zendesk.com/api-reference/ticketing/tickets/suspended_tickets/) +* [Triggers](https://developer.zendesk.com/api-reference/ticketing/business-rules/triggers/) ✓ History ------- * See [releases](https://github.com/cloudbees/zendesk-java-client/releases) - [zd]: http://zendesk.com + [zd]: https://zendesk.com From c0d8669428654fae4fbb0cb80fd38119f0eb4ebc Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Tue, 14 Mar 2023 08:46:43 -0600 Subject: [PATCH 148/343] Add getUsersByRole unitTest --- .../org/zendesk/client/v2/RealSmokeTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 8e68006e9..a0d830169 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -31,6 +31,7 @@ import org.zendesk.client.v2.model.OrganizationMembership; import org.zendesk.client.v2.model.Priority; import org.zendesk.client.v2.model.Request; +import org.zendesk.client.v2.model.Role; import org.zendesk.client.v2.model.SortOrder; import org.zendesk.client.v2.model.Status; import org.zendesk.client.v2.model.SuspendedTicket; @@ -90,6 +91,7 @@ import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; @@ -1228,6 +1230,28 @@ public void getUsers() throws Exception { } } + @Test + public void getUsersByRole() throws Exception { + // Try to fetch a few pages with max 100 results per page to exercise pagination + final int maxResults = 250; + createClientWithTokenOrPassword(); + + StreamSupport.stream(instance.getUsersByRole(Role.ADMIN.toString()).spliterator(), false) + .limit(maxResults) + .forEach( + user -> assertNotEquals("A request for admins does not return end-users", user.getRole(), Role.END_USER)); + + StreamSupport.stream(instance.getUsersByRole(Role.END_USER.toString()).spliterator(), false) + .limit(maxResults) + .forEach( + user -> assertEquals("A request for end-users only returns end-users", user.getRole(), Role.END_USER)); + + StreamSupport.stream(instance.getUsersByRole(Role.END_USER.toString(), Role.ADMIN.toString()).spliterator(), false) + .limit(maxResults) + .forEach( + user -> assertThat("Multiple roles can be requested together", user.getRole(), isOneOf(Role.END_USER, Role.ADMIN))); + } + @Test public void getUsersById() throws Exception { createClientWithTokenOrPassword(); @@ -2402,3 +2426,4 @@ private void checkFields(TicketForm form, String name) { assertEquals(name, form.getRawDisplayName()); } } + From 382104b4d79d74db39d23a74e4e53c89e1a709d3 Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Tue, 7 Mar 2023 14:57:05 -0700 Subject: [PATCH 149/343] RG-22532 Add cursor pagination to getUsersByRole --- src/main/java/org/zendesk/client/v2/Zendesk.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 5324fcd8b..4ab412a12 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -911,11 +911,11 @@ public Iterable getUsersByRole(String role, String... roles) { // Going to have to build this URI manually, because the RFC6570 template spec doesn't support // variables like ?role[]=...role[]=..., which is what Zendesk requires. // See https://developer.zendesk.com/rest_api/docs/core/users#filters - final StringBuilder uriBuilder = new StringBuilder("/users.json"); + final StringBuilder uriBuilder = new StringBuilder("/users.json?page[size]=100"); if (roles.length == 0) { - uriBuilder.append("?role=").append(encodeUrl(role)); + uriBuilder.append("&role=").append(encodeUrl(role)); } else { - uriBuilder.append("?role[]=").append(encodeUrl(role)); + uriBuilder.append("&role[]=").append(encodeUrl(role)); } for (final String curRole : roles) { uriBuilder.append("&role[]=").append(encodeUrl(curRole)); From 6f5bcf814b5718e34f2fdb8c08bf68d720906646 Mon Sep 17 00:00:00 2001 From: Colby Ackerfield Date: Tue, 14 Mar 2023 09:31:54 -0600 Subject: [PATCH 150/343] Add delete many, and create or update support for organziations --- .../java/org/zendesk/client/v2/Zendesk.java | 10 ++++ .../org/zendesk/client/v2/RealSmokeTest.java | 60 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 5324fcd8b..fef3b565c 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1382,6 +1382,11 @@ public ListenableFuture createOrganizationsAsync(List o Collections.singletonMap("organizations", organizations))), handleJobStatus()); } + public Organization createOrUpdateOrganization(Organization organization) { + return complete(submit(req("POST", cnst("/organizations/create_or_update.json"), JSON, json( + Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); + } + public Organization updateOrganization(Organization organization) { checkHasId(organization); return complete(submit(req("PUT", tmpl("/organizations/{id}.json").set("id", organization.getId()), JSON, json( @@ -1410,6 +1415,11 @@ public void deleteOrganization(long id) { complete(submit(req("DELETE", tmpl("/organizations/{id}.json").set("id", id)), handleStatus())); } + public JobStatus deleteOrganizations(long... ids) { + return complete(submit(req("DELETE", tmpl("/organizations/destroy_many.json{?ids}").set("ids", ids)), + handleJobStatus())); + } + public Iterable lookupOrganizationsByExternalId(String externalId) { if (externalId == null || externalId.length() < 2) { throw new IllegalArgumentException("Name must be at least 2 characters long"); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 8e68006e9..fa1ecf11b 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1415,6 +1415,66 @@ public void updateOrganizations() throws Exception { } } + @Test + public void deleteOrganizationsById() throws Exception { + createClientWithTokenOrPassword(); + + final List organizations = createTestOrganizationsInZendesk(); + final long[] ids = organizations.stream().mapToLong(Organization::getId).toArray(); + final JobStatus status = waitJobCompletion(instance.deleteOrganizations(ids)); + + assertThat("Job is completed", status.getStatus(), is(JobStatus.JobStatusEnum.completed)); + assertThat("The good number of organizations were processed", status.getTotal(), is(organizations.size())); + assertThat("We have a result for each organization", status.getResults(), hasSize(organizations.size())); + assertThat("Job reports that the same organization requested to be deleted were deleted", + status.getResults() + .stream() + .map(JobResult::getId) + .collect(Collectors.toList()), + containsInAnyOrder(Arrays.stream(ids).boxed().toArray())); + } + + @Test + public void createOrUpdateOrganization() throws Exception { + createClientWithTokenOrPassword(); + + String name = "testCreateOrUpdateOrganization"; + String externalId = "testCreateOrUpdateOrganization"; + + // Clean up to avoid conflicts + for (Organization o : instance.lookupOrganizationsByExternalId(externalId)) { + instance.deleteOrganization(o.getId()); + } + + String noteAtCreation = "This is the initial organization note."; + Organization org = new Organization(); + org.setExternalId(externalId); + org.setName(name); + org.setNotes(noteAtCreation); + + Organization createResult = instance.createOrUpdateOrganization(org); + assertNotNull(createResult); + assertNotNull(createResult.getId()); + assertEquals(name, createResult.getName()); + assertEquals(externalId, createResult.getExternalId()); + assertEquals(noteAtCreation, createResult.getNotes()); + + String noteAtUpdate = "This is the updated organization note."; + Organization updateOrg = new Organization(); + updateOrg.setId(createResult.getId()); + updateOrg.setExternalId(externalId); + updateOrg.setNotes(noteAtUpdate); + + Organization updateResult = instance.createOrUpdateOrganization(updateOrg); + assertNotNull(updateResult); + assertEquals(createResult.getId(), updateResult.getId()); + assertEquals(name, updateResult.getName()); + assertEquals(externalId, updateResult.getExternalId()); + assertEquals(noteAtUpdate, updateResult.getNotes()); + + instance.deleteOrganization(updateResult); + } + @Test public void createOrganizationMemberships() throws Exception { createClientWithTokenOrPassword(); From c6642f93c3616d04ced03a53a4aa26f690bd2462 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 20:56:47 +0000 Subject: [PATCH 151/343] Bump netty-bom from 4.1.89.Final to 4.1.90.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.89.Final to 4.1.90.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.89.Final...netty-4.1.90.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 869481a5d..308c17741 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.89.Final + 4.1.90.Final pom import From 44620286aa255c5f24ec71f8986fcec636bbc4a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 20:08:10 +0000 Subject: [PATCH 152/343] Bump slf4j-api from 2.0.6 to 2.0.7 Bumps [slf4j-api](https://github.com/qos-ch/slf4j) from 2.0.6 to 2.0.7. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/commits) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 869481a5d..a1a1b9bc5 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.slf4j slf4j-api - 2.0.6 + 2.0.7 org.asynchttpclient From 624488975ecff819086456c013aed2d98e3f9938 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 20:08:12 +0000 Subject: [PATCH 153/343] Bump slf4j-simple from 2.0.6 to 2.0.7 Bumps [slf4j-simple](https://github.com/qos-ch/slf4j) from 2.0.6 to 2.0.7. - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/commits) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 869481a5d..950ca9317 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ org.slf4j slf4j-simple - 2.0.6 + 2.0.7 test From 4e944cbdae04e0be204aaf434965f2884e34834b Mon Sep 17 00:00:00 2001 From: Florian Waltenberger Date: Wed, 22 Mar 2023 12:09:10 +0100 Subject: [PATCH 154/343] added parent section id to section --- .../java/org/zendesk/client/v2/model/hc/Section.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/model/hc/Section.java b/src/main/java/org/zendesk/client/v2/model/hc/Section.java index a80f0664e..057591112 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/Section.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/Section.java @@ -33,6 +33,10 @@ public class Section { @JsonProperty("category_id") private Long categoryId; + /** The id of the section to which this section belongs. Only writable for Guide Enterprise customers */ + @JsonProperty("parent_section_id") + private Long parentSectionId; + /** Whether the section is out of date */ private Boolean outdated; @@ -115,6 +119,14 @@ public void setCategoryId(Long categoryId) { this.categoryId = categoryId; } + public Long getParentSectionId() { + return parentSectionId; + } + + public void setParentSectionId(Long parentSectionId) { + this.parentSectionId = parentSectionId; + } + public Boolean getOutdated() { return outdated; } From 0d21b31d73ee956d941bfb18add5815574fec82c Mon Sep 17 00:00:00 2001 From: Andy May Date: Wed, 8 Mar 2023 16:09:18 +0000 Subject: [PATCH 155/343] Add model for Content Tag resource --- .../client/v2/model/hc/ContentTag.java | 85 +++++++++++++++++++ .../client/v2/model/hc/ContentTagTest.java | 47 ++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java create mode 100644 src/test/java/org/zendesk/client/v2/model/hc/ContentTagTest.java diff --git a/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java new file mode 100644 index 000000000..cf432ea27 --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java @@ -0,0 +1,85 @@ +package org.zendesk.client.v2.model.hc; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Date; +import java.util.Objects; + +/** + * You can assign a content tag to posts and articles to loosely group them together. + *

+ * For more information, see About Content tags + * in Zendesk help. + */ +public class ContentTag { + + /** Automatically assigned when the content tag is created. + * N.B. unlike many other entities, the id field is a String, not a Long */ + private String id; + + /** The name of the content tag */ + private String name; + + /** The time the content tag was created */ + @JsonProperty("created_at") + private Date createdAt; + + /** The time the content tag was last updated */ + @JsonProperty("updated_at") + private Date updatedAt; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ContentTag that = (ContentTag) o; + return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.equals(createdAt, that.createdAt) && Objects.equals(updatedAt, that.updatedAt); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, createdAt, updatedAt); + } + + @Override + public String toString() { + return "ContentTag{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + '}'; + } +} diff --git a/src/test/java/org/zendesk/client/v2/model/hc/ContentTagTest.java b/src/test/java/org/zendesk/client/v2/model/hc/ContentTagTest.java new file mode 100644 index 000000000..ff9b0a05a --- /dev/null +++ b/src/test/java/org/zendesk/client/v2/model/hc/ContentTagTest.java @@ -0,0 +1,47 @@ +package org.zendesk.client.v2.model.hc; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ContentTagTest { + + private ContentTag parseJson(byte[] json) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.readValue(json, ContentTag.class); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Test + public void testParsePermissionGroup() throws ParseException { + String json = "{\n" + + " \"created_at\": \"2022-10-13T12:34:56.000Z\",\n" + + " \"id\": \"01GFXGBX7YZ9ASWTCVMASTK8ZS\",\n" + + " \"name\": \"feature request\",\n" + + " \"updated_at\": \"2022-10-13T13:44:55.000Z\"\n" + + "}"; + ContentTag ct = parseJson(json.getBytes()); + + assertNotNull(ct); + assertEquals(ContentTag.class, ct.getClass()); + assertEquals("01GFXGBX7YZ9ASWTCVMASTK8ZS", ct.getId()); + assertEquals("feature request", ct.getName()); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); + Date created = simpleDateFormat.parse("2022-10-13 12:34:56 +0000"); + assertEquals(created, ct.getCreatedAt()); + Date updated = simpleDateFormat.parse("2022-10-13 13:44:55 +0000"); + assertEquals(updated, ct.getUpdatedAt()); + } + +} From 0620db75d7ec58af2d7de8fa5a9a87e90246c06d Mon Sep 17 00:00:00 2001 From: Andy May Date: Mon, 13 Mar 2023 11:02:34 +0000 Subject: [PATCH 156/343] Implement CRUD for Content Tags --- .../java/org/zendesk/client/v2/Zendesk.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index e8679f871..9a83f1d96 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -63,6 +63,7 @@ import org.zendesk.client.v2.model.hc.Article; import org.zendesk.client.v2.model.hc.ArticleAttachments; import org.zendesk.client.v2.model.hc.Category; +import org.zendesk.client.v2.model.hc.ContentTag; import org.zendesk.client.v2.model.hc.Locales; import org.zendesk.client.v2.model.hc.PermissionGroup; import org.zendesk.client.v2.model.hc.Section; @@ -2534,6 +2535,32 @@ public Iterable getHolidaysForSchedule(Long scheduleId) { handleList(Holiday.class, "holidays"))); } + public ContentTag getContentTag(String contentTagId) { + return complete(submit(req("GET", tmpl("/guide/content_tags/{id}").set("id", contentTagId)), + handle(ContentTag.class, "content_tag"))); + } + + public ContentTag createContentTag(ContentTag contentTag) { + checkHasName(contentTag); + return complete(submit(req("POST", tmpl("/guide/content_tags"), + JSON, json(Collections.singletonMap("content_tag", contentTag))), + handle(ContentTag.class, "content_tag"))); + } + + public ContentTag updateContentTag(ContentTag contentTag) { + checkHasId(contentTag); + checkHasName(contentTag); + return complete(submit(req("PUT", tmpl("/guide/content_tags/{id}").set("id", contentTag.getId()), + JSON, json(Collections.singletonMap("content_tag", contentTag))), + handle(ContentTag.class, "content_tag"))); + } + + public void deleteContentTag(ContentTag contentTag) { + checkHasId(contentTag); + complete(submit(req("DELETE", tmpl("/guide/content_tags/{id}").set("id", contentTag.getId())), + handleStatus())); + } + ////////////////////////////////////////////////////////////////////// // Helper methods ////////////////////////////////////////////////////////////////////// @@ -3132,6 +3159,18 @@ private static void checkHasId(UserSegment userSegment) { } } + private static void checkHasId(ContentTag contentTag) { + if (contentTag.getId() == null) { + throw new IllegalArgumentException("Content Tag requires id"); + } + } + + private static void checkHasName(ContentTag contentTag) { + if (contentTag.getName() == null || contentTag.getName().trim().isEmpty()) { + throw new IllegalArgumentException("Content Tag requires name"); + } + } + private static void checkHasToken(Attachment.Upload upload) { if (upload.getToken() == null) { throw new IllegalArgumentException("Upload requires token"); From 8f764129b879252cfb84adcc8c324a49cfd9b36e Mon Sep 17 00:00:00 2001 From: Andy May Date: Wed, 15 Mar 2023 17:08:02 +0000 Subject: [PATCH 157/343] Implement search for Content Tags ContentTag pagination sadly doesn't conform to Zendesk's standards. It uses cursor pagination, but doesn't include a `links.next` node in the response (which would normally hold the URL of the next page of results). Because of this, we have to build the 'next page URL' ourselves by extracting the `meta.after_cursor` node value & using it to add a `&page[after]=` parameter to the original query URL --- .../java/org/zendesk/client/v2/Zendesk.java | 68 +++++++++- .../client/v2/model/hc/ContentTag.java | 10 ++ .../zendesk/client/v2/ContentTagsTest.java | 117 ++++++++++++++++++ .../content_tag_search_first_page.json | 21 ++++ .../content_tag_search_second_page.json | 21 ++++ .../content_tag_search_third_page.json | 15 +++ 6 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/zendesk/client/v2/ContentTagsTest.java create mode 100644 src/test/resources/wiremock/__files/content_tags/content_tag_search_first_page.json create mode 100644 src/test/resources/wiremock/__files/content_tags/content_tag_search_second_page.json create mode 100644 src/test/resources/wiremock/__files/content_tags/content_tag_search_third_page.json diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 9a83f1d96..5914b125f 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -99,7 +99,7 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; +import java.util.function.Function; /** * @author stephenc @@ -2542,7 +2542,7 @@ public ContentTag getContentTag(String contentTagId) { public ContentTag createContentTag(ContentTag contentTag) { checkHasName(contentTag); - return complete(submit(req("POST", tmpl("/guide/content_tags"), + return complete(submit(req("POST", cnst("/guide/content_tags"), JSON, json(Collections.singletonMap("content_tag", contentTag))), handle(ContentTag.class, "content_tag"))); } @@ -2561,6 +2561,33 @@ public void deleteContentTag(ContentTag contentTag) { handleStatus())); } + public Iterable getContentTags() { + int defaultPageSize = 10; + return getContentTags(defaultPageSize, null); + } + + public Iterable getContentTags(int pageSize) { + return getContentTags(pageSize, null); + } + + public Iterable getContentTags(int pageSize, String namePrefix) { + Function afterCursorUriBuilder = (String afterCursor) -> buildContentTagsSearchUrl(pageSize, namePrefix, afterCursor); + return new PagedIterable<>(afterCursorUriBuilder.apply(null), + handleListWithAfterCursorButNoLinks(ContentTag.class, afterCursorUriBuilder, "records")); + } + + private Uri buildContentTagsSearchUrl(int pageSize, String namePrefixFilter, String afterCursor) { + final StringBuilder uriBuilder = new StringBuilder("/guide/content_tags?page[size]=").append(pageSize); + + if (namePrefixFilter != null) { + uriBuilder.append("&filter[name_prefix]=").append(encodeUrl(namePrefixFilter)); + } + if (afterCursor != null) { + uriBuilder.append("&page[after]=").append(encodeUrl(afterCursor)); + } + return cnst(uriBuilder.toString()); + } + ////////////////////////////////////////////////////////////////////// // Helper methods ////////////////////////////////////////////////////////////////////// @@ -2714,6 +2741,7 @@ public JobStatus onCompleted(Response response) throws Exception { private static final String COUNT = "count"; private static final int INCREMENTAL_EXPORT_MAX_COUNT_BY_REQUEST = 1000; + private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { private String nextPage; @@ -2898,6 +2926,42 @@ public List onCompleted(Response response) throws Exception }; } + /** + * For a resource (e.g. ContentTag) which supports cursor based pagination for multiple results, + * but where the response does not have a `links.next` node (which would hold the URL of the next page) + * So we need to build the next page URL from the original URL and the meta.after_cursor node value + * + * @param The class of the resource + * @param afterCursorUriBuilder a function to build the URL for the next page `fn(after_cursor_value) => URL_of_next_page` + * @param name the name of the Json node that contains the resources entities (e.g. 'records' for ContentTag) + */ + private PagedAsyncCompletionHandler> handleListWithAfterCursorButNoLinks( + Class clazz, Function afterCursorUriBuilder, String name) { + + return new PagedAsyncListCompletionHandler(clazz, name) { + @Override + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode metaNode = responseNode.get("meta"); + String nextPage = null; + if (metaNode == null) { + if (logger.isDebugEnabled()) { + logger.debug("meta" + " property not found, pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); + } + } else { + JsonNode afterCursorNode = metaNode.get("after_cursor"); + if (afterCursorNode != null) { + JsonNode hasMoreNode = metaNode.get("has_more"); + if (hasMoreNode != null && hasMoreNode.asBoolean()) { + nextPage = afterCursorUriBuilder.apply(afterCursorNode.asText()).toString(); + } + } + } + setNextPage(nextPage); + } + }; + } + private TemplateUri tmpl(String template) { return new TemplateUri(url + template); } diff --git a/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java index cf432ea27..56290fd01 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java @@ -28,6 +28,16 @@ public class ContentTag { @JsonProperty("updated_at") private Date updatedAt; + public ContentTag() { + } + + public ContentTag(String id, String name, Date createdAt, Date updatedAt) { + this.id = id; + this.name = name; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + public String getId() { return id; } diff --git a/src/test/java/org/zendesk/client/v2/ContentTagsTest.java b/src/test/java/org/zendesk/client/v2/ContentTagsTest.java new file mode 100644 index 000000000..f641734d5 --- /dev/null +++ b/src/test/java/org/zendesk/client/v2/ContentTagsTest.java @@ -0,0 +1,117 @@ +package org.zendesk.client.v2; + +import com.github.tomakehurst.wiremock.junit.WireMockClassRule; +import org.apache.commons.text.RandomStringGenerator; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.zendesk.client.v2.model.hc.ContentTag; + +import java.text.SimpleDateFormat; +import java.util.TimeZone; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static org.assertj.core.api.Assertions.assertThat; + + +public class ContentTagsTest { + + private static final String MOCK_URL_FORMATTED_STRING = "http://localhost:%d"; + public static final RandomStringGenerator RANDOM_STRING_GENERATOR = + new RandomStringGenerator.Builder().withinRange('a', 'z').build(); + private static final String MOCK_API_TOKEN = RANDOM_STRING_GENERATOR.generate(15); + private static final String MOCK_USERNAME = RANDOM_STRING_GENERATOR.generate(10).toLowerCase() + "@cloudbees.com"; + + @ClassRule + public static WireMockClassRule zendeskApiClass = new WireMockClassRule(options() + .dynamicPort() + .dynamicHttpsPort() + .usingFilesUnderClasspath("wiremock") + ); + + @Rule + public WireMockClassRule zendeskApiMock = zendeskApiClass; + + private Zendesk client; + + @Before + public void setUp() throws Exception { + int ephemeralPort = zendeskApiMock.port(); + + String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); + + client = new Zendesk.Builder(hostname) + .setUsername(MOCK_USERNAME) + .setToken(MOCK_API_TOKEN) + .build(); + } + + @After + public void closeClient() { + if (client != null) { + client.close(); + } + client = null; + } + + @Test + public void getContentTags_willPageOverMultiplePages() throws Exception { + zendeskApiMock.stubFor( + get( + urlPathEqualTo("/api/v2/guide/content_tags")) + .withQueryParam("page%5Bsize%5D", equalTo("2")) + .willReturn(ok() + .withBodyFile("content_tags/content_tag_search_first_page.json") + ) + ); + zendeskApiMock.stubFor( + get( + urlPathEqualTo("/api/v2/guide/content_tags")) + .withQueryParam("page%5Bsize%5D", equalTo("2")) + .withQueryParam("page%5Bafter%5D", equalTo("first_after_cursor")) + .willReturn(ok() + .withBodyFile("content_tags/content_tag_search_second_page.json") + ) + ); + zendeskApiMock.stubFor( + get( + urlPathEqualTo("/api/v2/guide/content_tags")) + .withQueryParam("page%5Bsize%5D", equalTo("2")) + .withQueryParam("page%5Bafter%5D", equalTo("second_after_cursor")) + .willReturn(ok() + .withBodyFile("content_tags/content_tag_search_third_page.json") + ) + ); + + Iterable actualResults = client.getContentTags(2); + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + assertThat(actualResults).containsExactly( + new ContentTag("11111111111111111111111111", "first name", + df.parse("2023-03-13 10:01:00"), + df.parse("2023-03-13 10:01:01") + ), + new ContentTag("22222222222222222222222222", "second name", + df.parse("2023-03-13 10:02:00"), + df.parse("2023-03-13 10:02:02") + ), + new ContentTag("33333333333333333333333333", "third name", + df.parse("2023-03-13 10:03:00"), + df.parse("2023-03-13 10:03:03") + ), + new ContentTag("44444444444444444444444444", "fourth name", + df.parse("2023-03-13 10:04:00"), + df.parse("2023-03-13 10:04:04") + ), + new ContentTag("55555555555555555555555555", "fifth name", + df.parse("2023-03-13 10:05:00"), + df.parse("2023-03-13 10:05:05") + ) + ); + } +} diff --git a/src/test/resources/wiremock/__files/content_tags/content_tag_search_first_page.json b/src/test/resources/wiremock/__files/content_tags/content_tag_search_first_page.json new file mode 100644 index 000000000..7cd64670e --- /dev/null +++ b/src/test/resources/wiremock/__files/content_tags/content_tag_search_first_page.json @@ -0,0 +1,21 @@ +{ + "records": [ + { + "id": "11111111111111111111111111", + "name": "first name", + "created_at": "2023-03-13T10:01:00.000Z", + "updated_at": "2023-03-13T10:01:01.000Z" + }, + { + "id": "22222222222222222222222222", + "name": "second name", + "created_at": "2023-03-13T10:02:00.000Z", + "updated_at": "2023-03-13T10:02:02.000Z" + } + ], + "meta": { + "has_more": true, + "after_cursor": "first_after_cursor", + "before_cursor": "first_before_cursor" + } +} \ No newline at end of file diff --git a/src/test/resources/wiremock/__files/content_tags/content_tag_search_second_page.json b/src/test/resources/wiremock/__files/content_tags/content_tag_search_second_page.json new file mode 100644 index 000000000..2e3418334 --- /dev/null +++ b/src/test/resources/wiremock/__files/content_tags/content_tag_search_second_page.json @@ -0,0 +1,21 @@ +{ + "records": [ + { + "id": "33333333333333333333333333", + "name": "third name", + "created_at": "2023-03-13T10:03:00.000Z", + "updated_at": "2023-03-13T10:03:03.000Z" + }, + { + "id": "44444444444444444444444444", + "name": "fourth name", + "created_at": "2023-03-13T10:04:00.000Z", + "updated_at": "2023-03-13T10:04:04.000Z" + } + ], + "meta": { + "has_more": true, + "after_cursor": "second_after_cursor", + "before_cursor": "second_before_cursor" + } +} \ No newline at end of file diff --git a/src/test/resources/wiremock/__files/content_tags/content_tag_search_third_page.json b/src/test/resources/wiremock/__files/content_tags/content_tag_search_third_page.json new file mode 100644 index 000000000..61ba654ef --- /dev/null +++ b/src/test/resources/wiremock/__files/content_tags/content_tag_search_third_page.json @@ -0,0 +1,15 @@ +{ + "records": [ + { + "id": "55555555555555555555555555", + "name": "fifth name", + "created_at": "2023-03-13T10:05:00.000Z", + "updated_at": "2023-03-13T10:05:05.000Z" + } + ], + "meta": { + "has_more": false, + "after_cursor": "third_after_cursor", + "before_cursor": "third_before_cursor" + } +} \ No newline at end of file From c72412227328d34dd9dd196f5f5ceab0148e7f28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 20:58:59 +0000 Subject: [PATCH 158/343] Bump actions/stale from 7 to 8 Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale-items.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-items.yml b/.github/workflows/close-stale-items.yml index 9d20a8f98..41e5c2a70 100644 --- a/.github/workflows/close-stale-items.yml +++ b/.github/workflows/close-stale-items.yml @@ -7,7 +7,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/stale@v7 + - uses: actions/stale@v8 with: repo-token: ${{ secrets.GITHUB_TOKEN }} only-pr-labels: 'needs-fix' From 2dac87e6afabc3bdb8807382ab6bfd86cadf4fba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 20:56:44 +0000 Subject: [PATCH 159/343] Bump animal-sniffer-enforcer-rule from 1.22 to 1.23 Bumps [animal-sniffer-enforcer-rule](https://github.com/mojohaus/animal-sniffer) from 1.22 to 1.23. - [Release notes](https://github.com/mojohaus/animal-sniffer/releases) - [Commits](https://github.com/mojohaus/animal-sniffer/compare/animal-sniffer-parent-1.22...1.23) --- updated-dependencies: - dependency-name: org.codehaus.mojo:animal-sniffer-enforcer-rule dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 229abb311..8b3f0dca2 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.codehaus.mojo animal-sniffer-enforcer-rule - 1.22 + 1.23 org.codehaus.mojo From f2a2d86d4a98efd6759b8df89864ae52e8d1c72e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 20:56:55 +0000 Subject: [PATCH 160/343] Bump extra-enforcer-rules from 1.6.1 to 1.6.2 Bumps [extra-enforcer-rules](https://github.com/mojohaus/extra-enforcer-rules) from 1.6.1 to 1.6.2. - [Release notes](https://github.com/mojohaus/extra-enforcer-rules/releases) - [Commits](https://github.com/mojohaus/extra-enforcer-rules/compare/extra-enforcer-rules-1.6.1...1.6.2) --- updated-dependencies: - dependency-name: org.codehaus.mojo:extra-enforcer-rules dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 229abb311..e81faa0e6 100644 --- a/pom.xml +++ b/pom.xml @@ -245,7 +245,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.6.1 + 1.6.2
From e7976c8dae29cfd3610da3227bede40d17d49db0 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 3 Apr 2023 12:09:21 +0200 Subject: [PATCH 161/343] Update src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java --- src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java index 56290fd01..25992fd6d 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/ContentTag.java @@ -7,7 +7,6 @@ /** * You can assign a content tag to posts and articles to loosely group them together. - *

* For more information, see About Content tags * in Zendesk help. */ From 761d2754d9e65a3d20e5d75843b783c7750d1333 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 3 Apr 2023 12:26:34 +0200 Subject: [PATCH 162/343] [maven-release-plugin] prepare release zendesk-java-client-0.22.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 674ad9afc..7a13629c6 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.21.1-SNAPSHOT + 0.22.0 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.22.0 From 4d2e6aab55a45d585f11f53a029513db8cecf43f Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 3 Apr 2023 12:26:47 +0200 Subject: [PATCH 163/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7a13629c6..6b0469d3b 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.22.0 + 0.22.1-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.22.0 + HEAD From 47c83b4f66de432c5246c90d75d2044e5f05f1a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:56:41 +0000 Subject: [PATCH 164/343] Bump maven-enforcer-plugin from 3.2.1 to 3.3.0 Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.2.1 to 3.3.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.2.1...enforcer-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6b0469d3b..eceb9cb9f 100644 --- a/pom.xml +++ b/pom.xml @@ -186,7 +186,7 @@ maven-enforcer-plugin - 3.2.1 + 3.3.0 org.apache.maven.plugins From d135eab7afcb57a83fd27d424ff95f2659a11a3e Mon Sep 17 00:00:00 2001 From: Andy May Date: Wed, 19 Apr 2023 11:59:13 +0100 Subject: [PATCH 165/343] Bugfix - Article.contentTagIds field now List - resolves #581 The Article.contentTagIds field had been added with the incorrect type of List (because of misleading Zendesk documentation), but the IDs are actually `String`s & so can't be deserialised to Longs --- src/main/java/org/zendesk/client/v2/model/hc/Article.java | 6 +++--- src/test/java/org/zendesk/client/v2/model/ArticleTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/model/hc/Article.java b/src/main/java/org/zendesk/client/v2/model/hc/Article.java index e2e8745fa..0d20126bb 100644 --- a/src/main/java/org/zendesk/client/v2/model/hc/Article.java +++ b/src/main/java/org/zendesk/client/v2/model/hc/Article.java @@ -42,7 +42,7 @@ public class Article implements SearchResultEntity { /** The list of content tags attached to the article */ @JsonProperty("content_tag_ids") - private List contentTagIds; + private List contentTagIds; /** Whether the source (default) translation of the article is out of date */ private Boolean outdated; @@ -170,11 +170,11 @@ public void setCommentsDisabled(Boolean commentsDisabled) { this.commentsDisabled = commentsDisabled; } - public List getContentTagIds() { + public List getContentTagIds() { return contentTagIds; } - public void setContentTagIds(List contentTagIds) { + public void setContentTagIds(List contentTagIds) { this.contentTagIds = contentTagIds; } diff --git a/src/test/java/org/zendesk/client/v2/model/ArticleTest.java b/src/test/java/org/zendesk/client/v2/model/ArticleTest.java index 2234d694a..693a6776e 100644 --- a/src/test/java/org/zendesk/client/v2/model/ArticleTest.java +++ b/src/test/java/org/zendesk/client/v2/model/ArticleTest.java @@ -32,7 +32,7 @@ public void testParseArticle() { "\"html_url\":\"https://example.zendesk.com/hc/en-us/articles/918273645013-Welcome-to-your-Help-Center-\"," + "\"author_id\":2314596780," + "\"comments_disabled\":false," + - "\"content_tag_ids\": [335, 7104]," + + "\"content_tag_ids\": [\"01GMAGH6KPDHEY79MN3S4H8V7D\", \"01GFXGBX7YZ9ASWTCVMASTK8ZS\"]," + "\"draft\":false," + "\"promoted\":false," + "\"position\":0," + @@ -59,7 +59,7 @@ public void testParseArticle() { assertEquals("https://example.zendesk.com/hc/en-us/articles/918273645013-Welcome-to-your-Help-Center-", article.getHtmlUrl()); assertEquals((Long) 2314596780L, article.getAuthorId()); assertEquals(false, article.getCommentsDisabled()); - assertEquals(Arrays.asList(335L, 7104L), article.getContentTagIds()); + assertEquals(Arrays.asList("01GMAGH6KPDHEY79MN3S4H8V7D","01GFXGBX7YZ9ASWTCVMASTK8ZS"), article.getContentTagIds()); assertEquals(false, article.getDraft()); assertEquals(false, article.getPromoted()); assertEquals((Long) 0L, article.getPosition()); From aa30ba19bdd3aeca36cb8de63bbe3164525a8bd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 20:57:38 +0000 Subject: [PATCH 166/343] Bump jackson-bom from 2.14.2 to 2.15.0 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.14.2 to 2.15.0. - [Release notes](https://github.com/FasterXML/jackson-bom/releases) - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.14.2...jackson-bom-2.15.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eceb9cb9f..b09342074 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.14.2 + 2.15.0 pom import From a2d26cef397d5eaf9711e41a5a9df4fd86babe93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 20:56:37 +0000 Subject: [PATCH 167/343] Bump jacoco-maven-plugin from 0.8.8 to 0.8.10 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.8 to 0.8.10. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.8...v0.8.10) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eceb9cb9f..d5b875ab4 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.10 prepare-agent From 064d40413688e40f7103ec4cabafc71a2785a1f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 20:56:44 +0000 Subject: [PATCH 168/343] Bump netty-bom from 4.1.90.Final to 4.1.92.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.90.Final to 4.1.92.Final. - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.1.90.Final...netty-4.1.92.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eceb9cb9f..4334dc7ab 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.90.Final + 4.1.92.Final pom import From 8bef6a5e81e1e82233431fb6b2b1133f40794e70 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 15 May 2023 15:42:48 +0200 Subject: [PATCH 169/343] [maven-release-plugin] prepare release zendesk-java-client-0.22.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b94b6f34c..e0e2f8ac4 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.22.1-SNAPSHOT + 0.22.1 zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - HEAD + zendesk-java-client-0.22.1 From 4a42efe70d0d357ea98b24c34f195eb1c359c9c7 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 15 May 2023 15:42:55 +0200 Subject: [PATCH 170/343] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e0e2f8ac4..2c74873c4 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ com.cloudbees.thirdparty zendesk-java-client - 0.22.1 + 0.22.2-SNAPSHOT zendesk-java-client Java client for the Zendesk API @@ -75,7 +75,7 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ - zendesk-java-client-0.22.1 + HEAD From 8c5dec397d75bacb6e14ddd96d4717c9473cec8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 May 2023 20:02:04 +0000 Subject: [PATCH 171/343] Bump netty-bom from 4.1.92.Final to 4.1.93.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.92.Final to 4.1.93.Final. - [Commits](https://github.com/netty/netty/compare/netty-4.1.92.Final...netty-4.1.93.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c74873c4..23eb3b549 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.92.Final + 4.1.93.Final pom import From 9bb7239a9e6eb3eea5135484be488a6b884d761a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 20:56:36 +0000 Subject: [PATCH 172/343] Bump extra-enforcer-rules from 1.6.2 to 1.7.0 Bumps [extra-enforcer-rules](https://github.com/mojohaus/extra-enforcer-rules) from 1.6.2 to 1.7.0. - [Release notes](https://github.com/mojohaus/extra-enforcer-rules/releases) - [Commits](https://github.com/mojohaus/extra-enforcer-rules/compare/1.6.2...1.7.0) --- updated-dependencies: - dependency-name: org.codehaus.mojo:extra-enforcer-rules dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 23eb3b549..fa4295c08 100644 --- a/pom.xml +++ b/pom.xml @@ -245,7 +245,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.6.2 + 1.7.0 From f6d6abaa0f0cf7700161eb2bd56e55f923c46a47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:57:13 +0000 Subject: [PATCH 173/343] Bump netty-bom from 4.1.93.Final to 4.1.94.Final Bumps [netty-bom](https://github.com/netty/netty) from 4.1.93.Final to 4.1.94.Final. - [Commits](https://github.com/netty/netty/compare/netty-4.1.93.Final...netty-4.1.94.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 23eb3b549..6113b73d7 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.93.Final + 4.1.94.Final pom import From 662368c3e1638b4b62d7af870c012cdf6a680f5e Mon Sep 17 00:00:00 2001 From: nkharabaruk Date: Thu, 22 Jun 2023 22:12:51 +0300 Subject: [PATCH 174/343] Add GET timezones endpoint, add ianaTimeZone field to User --- .../java/org/zendesk/client/v2/Zendesk.java | 43 ++------- .../org/zendesk/client/v2/model/TimeZone.java | 85 +++++++++++++++++ .../org/zendesk/client/v2/model/User.java | 24 +++-- .../org/zendesk/client/v2/RealSmokeTest.java | 18 +++- .../zendesk/client/v2/model/TimeZoneTest.java | 95 +++++++++++++++++++ 5 files changed, 220 insertions(+), 45 deletions(-) create mode 100644 src/main/java/org/zendesk/client/v2/model/TimeZone.java create mode 100644 src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 5914b125f..7e75bdca0 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -21,43 +21,7 @@ import org.asynchttpclient.request.body.multipart.StringPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.zendesk.client.v2.model.AgentRole; -import org.zendesk.client.v2.model.Attachment; -import org.zendesk.client.v2.model.Audit; -import org.zendesk.client.v2.model.Automation; -import org.zendesk.client.v2.model.Brand; -import org.zendesk.client.v2.model.Comment; -import org.zendesk.client.v2.model.ComplianceDeletionStatus; -import org.zendesk.client.v2.model.DeletedTicket; -import org.zendesk.client.v2.model.Field; -import org.zendesk.client.v2.model.Forum; -import org.zendesk.client.v2.model.Group; -import org.zendesk.client.v2.model.GroupMembership; -import org.zendesk.client.v2.model.Identity; -import org.zendesk.client.v2.model.JobStatus; -import org.zendesk.client.v2.model.Macro; -import org.zendesk.client.v2.model.Metric; -import org.zendesk.client.v2.model.Organization; -import org.zendesk.client.v2.model.OrganizationField; -import org.zendesk.client.v2.model.OrganizationMembership; -import org.zendesk.client.v2.model.SatisfactionRating; -import org.zendesk.client.v2.model.SearchResultEntity; -import org.zendesk.client.v2.model.SortOrder; -import org.zendesk.client.v2.model.Status; -import org.zendesk.client.v2.model.SuspendedTicket; -import org.zendesk.client.v2.model.Ticket; -import org.zendesk.client.v2.model.TicketCount; -import org.zendesk.client.v2.model.TicketForm; -import org.zendesk.client.v2.model.TicketImport; -import org.zendesk.client.v2.model.TicketPage; -import org.zendesk.client.v2.model.TicketResult; -import org.zendesk.client.v2.model.Topic; -import org.zendesk.client.v2.model.Trigger; -import org.zendesk.client.v2.model.TwitterMonitor; -import org.zendesk.client.v2.model.User; -import org.zendesk.client.v2.model.UserField; -import org.zendesk.client.v2.model.UserRelatedInfo; -import org.zendesk.client.v2.model.View; +import org.zendesk.client.v2.model.*; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.hc.Article; @@ -2588,6 +2552,11 @@ private Uri buildContentTagsSearchUrl(int pageSize, String namePrefixFilter, Str return cnst(uriBuilder.toString()); } + public List getTimeZones(){ + return complete(submit(req("GET", cnst("/time_zones.json")), handleList(TimeZone.class, + "time_zones"))); + } + ////////////////////////////////////////////////////////////////////// // Helper methods ////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/org/zendesk/client/v2/model/TimeZone.java b/src/main/java/org/zendesk/client/v2/model/TimeZone.java new file mode 100644 index 000000000..db2bbd9c7 --- /dev/null +++ b/src/main/java/org/zendesk/client/v2/model/TimeZone.java @@ -0,0 +1,85 @@ +package org.zendesk.client.v2.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * @author nkharabaruk + * @since 22/06/2023 22:00 + */ +public class TimeZone { + + private String translatedName; + private String name; + private String ianaName; + private String url; + private int offset; + private String formattedOffset; + + @JsonProperty("translated_name") + public String getTranslatedName() { + return translatedName; + } + + public void setTranslatedName(String translatedName) { + this.translatedName = translatedName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonProperty("iana_name") + public String getIanaName() { + return ianaName; + } + + public void setIanaName(String ianaName) { + this.ianaName = ianaName; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + @JsonProperty("formatted_offset") + public String getFormattedOffset() { + return formattedOffset; + } + + public void setFormattedOffset(String formattedOffset) { + this.formattedOffset = formattedOffset; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TimeZone timeZone = (TimeZone) o; + return offset == timeZone.offset && Objects.equals(translatedName, timeZone.translatedName) && + Objects.equals(name, timeZone.name) && Objects.equals(ianaName, timeZone.ianaName) && + Objects.equals(url, timeZone.url) && Objects.equals(formattedOffset, timeZone.formattedOffset); + } + + @Override + public int hashCode() { + return Objects.hash(translatedName, name, ianaName, url, offset, formattedOffset); + } +} diff --git a/src/main/java/org/zendesk/client/v2/model/User.java b/src/main/java/org/zendesk/client/v2/model/User.java index 260c436fa..a5dfc6e85 100644 --- a/src/main/java/org/zendesk/client/v2/model/User.java +++ b/src/main/java/org/zendesk/client/v2/model/User.java @@ -30,6 +30,7 @@ public class User extends Collaborator implements SearchResultEntity, Serializab private Long localeId; private String locale; private String timeZone; + private String ianaTimeZone; private Date lastLoginAt; private String phone; private Boolean restrictedAgent; @@ -291,6 +292,15 @@ public void setTimeZone(String timeZone) { this.timeZone = timeZone; } + @JsonProperty("iana_time_zone") + public String getIanaTimeZone() { + return ianaTimeZone; + } + + public void setIanaTimeZone(String ianaTimeZone) { + this.ianaTimeZone = ianaTimeZone; + } + @JsonProperty("updated_at") public Date getUpdatedAt() { return updatedAt; @@ -408,12 +418,12 @@ public boolean equals(Object o) { Objects.equals(active, user.active) && Objects.equals(verified, user.verified) && Objects.equals(shared, user.shared) && Objects.equals(localeId, user.localeId) && Objects.equals(locale, user.locale) && Objects.equals(timeZone, user.timeZone) && - Objects.equals(lastLoginAt, user.lastLoginAt) && Objects.equals(phone, user.phone) && - Objects.equals(restrictedAgent, user.restrictedAgent) && Objects.equals(signature, user.signature) && - Objects.equals(details, user.details) && Objects.equals(notes, user.notes) && - Objects.equals(organizationId, user.organizationId) && role == user.role && - Objects.equals(customRoleId, user.customRoleId) && Objects.equals(moderator, user.moderator) && - ticketRestriction == user.ticketRestriction && + Objects.equals(ianaTimeZone, user.ianaTimeZone) && Objects.equals(lastLoginAt, user.lastLoginAt) && + Objects.equals(phone, user.phone) && Objects.equals(restrictedAgent, user.restrictedAgent) && + Objects.equals(signature, user.signature) && Objects.equals(details, user.details) && + Objects.equals(notes, user.notes) && Objects.equals(organizationId, user.organizationId) + && role == user.role && Objects.equals(customRoleId, user.customRoleId) + && Objects.equals(moderator, user.moderator) && ticketRestriction == user.ticketRestriction && Objects.equals(onlyPrivateComments, user.onlyPrivateComments) && Objects.equals(tags, user.tags) && Objects.equals(suspended, user.suspended) && Objects.equals(photo, user.photo) && Objects.equals(identities, user.identities) && @@ -427,7 +437,7 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash(id, url, externalId, alias, createdAt, updatedAt, active, verified, shared, localeId, - locale, timeZone, lastLoginAt, phone, restrictedAgent, signature, details, notes, organizationId, + locale, timeZone, ianaTimeZone, lastLoginAt, phone, restrictedAgent, signature, details, notes, organizationId, role, customRoleId, moderator, ticketRestriction, onlyPrivateComments, tags, suspended, photo, identities, remotePhotoUrl, userFields, chatOnly, sharedPhoneNumber, defaultGroupId, roleType, twoFactorAuthEnabled, reportCsv); diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 440bcf978..3c033f94a 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -911,6 +911,22 @@ public void createUsers() throws Exception { } } + @Test + public void createUser() throws Exception { + // given + createClientWithTokenOrPassword(); + final User userToCreate = newTestUser(); + userToCreate.setTimeZone("Pacific Time (US & Canada)"); + + // when + User createdUser = instance.createUser(userToCreate); + + // then + assertThat("A unique ID must be set", createdUser.getId(), notNullValue()); + assertEquals("Time Zone must be set", userToCreate.getTimeZone(), createdUser.getTimeZone()); + assertEquals("Iana Time Zone must be automatically set", "America/Los_Angeles", createdUser.getIanaTimeZone()); + } + @Test public void updateUsers() throws Exception { createClientWithTokenOrPassword(); @@ -1266,7 +1282,7 @@ public void getUsersById() throws Exception { assertThat(user.getName(), notNullValue()); } } - + @Test public void getUsersIncrementally() throws Exception { createClientWithTokenOrPassword(); diff --git a/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java b/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java new file mode 100644 index 000000000..bf4e43f23 --- /dev/null +++ b/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java @@ -0,0 +1,95 @@ +package org.zendesk.client.v2.model; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.junit.WireMockClassRule; +import org.apache.commons.text.RandomStringGenerator; +import org.junit.*; +import org.zendesk.client.v2.Zendesk; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static org.assertj.core.api.Assertions.assertThat; + +public class TimeZoneTest { + + private static final String MOCK_URL_FORMATTED_STRING = "http://localhost:%d"; + public static final RandomStringGenerator RANDOM_STRING_GENERATOR = + new RandomStringGenerator.Builder().withinRange('a', 'z').build(); + private static final String MOCK_API_TOKEN = RANDOM_STRING_GENERATOR.generate(15); + private static final String MOCK_USERNAME = RANDOM_STRING_GENERATOR.generate(10).toLowerCase() + "@cloudbees.com"; + + @ClassRule + public static WireMockClassRule zendeskApiClass = new WireMockClassRule(options() + .dynamicPort() + .dynamicHttpsPort() + .usingFilesUnderClasspath("wiremock") + ); + + @Rule + public WireMockClassRule zendeskApiMock = zendeskApiClass; + private final int ephemeralPort = zendeskApiMock.port(); + private final String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); + + private Zendesk client; + private final ObjectMapper objectMapper = Zendesk.createMapper(); + + @Before + public void setUp() { + client = new Zendesk.Builder(hostname) + .setUsername(MOCK_USERNAME) + .setToken(MOCK_API_TOKEN) + .build(); + } + + @After + public void closeClient() { + if (client != null) { + client.close(); + } + client = null; + } + + @Test + public void getTimeZones() throws JsonProcessingException { + + TimeZone timeZone1 = new TimeZone(); + timeZone1.setTranslatedName("Pacific Time (US & Canada)"); + timeZone1.setName("Pacific Time (US & Canada)"); + timeZone1.setIanaName("America/Los_Angeles"); + timeZone1.setUrl(hostname + "/api/v2/time_zones/Pacific%20Time%20(US%20&%20Canada).json"); + timeZone1.setOffset(-420); + timeZone1.setFormattedOffset("GMT-07:00"); + + TimeZone timeZone2 = new TimeZone(); + timeZone1.setTranslatedName("Kyiv"); + timeZone1.setName("Kyiv"); + timeZone1.setIanaName("Europe/Kiev"); + timeZone1.setUrl(hostname + "/api/v2/time_zones/Kyiv.json"); + timeZone1.setOffset(180); + timeZone1.setFormattedOffset("GMT+03:00"); + + String expectedJsonResponse = objectMapper.writeValueAsString( + Collections.singletonMap("time_zones", Arrays.asList(timeZone1, timeZone2))); + + zendeskApiMock.stubFor( + get( + urlPathEqualTo("/api/v2/time_zones.json")) + .willReturn(ok() + .withBody(expectedJsonResponse) + ) + ); + + List timeZones = client.getTimeZones(); + + zendeskApiMock.verify(getRequestedFor( + urlPathEqualTo("/api/v2/time_zones.json")) + ); + + assertThat(timeZones).containsExactly(timeZone1, timeZone2); + } +} From fc46306745da2cf8804395eddc3512b5784ba194 Mon Sep 17 00:00:00 2001 From: Ray Soto Date: Sat, 24 Jun 2023 19:18:42 -0700 Subject: [PATCH 175/343] fix: removed duplicate class variables. type, priority, and customFields were defined both here in Ticket and in it's parent class, Request. The fact that these had different access modifers in each definition led to serialiation/marshalling problems in some libraries (GSON for instance). Relying now on the definition in the parent class and fix is seamless. --- .../org/zendesk/client/v2/model/Ticket.java | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/model/Ticket.java b/src/main/java/org/zendesk/client/v2/model/Ticket.java index 5300df042..6af168d64 100644 --- a/src/main/java/org/zendesk/client/v2/model/Ticket.java +++ b/src/main/java/org/zendesk/client/v2/model/Ticket.java @@ -16,8 +16,6 @@ public class Ticket extends Request implements SearchResultEntity { private static final long serialVersionUID = 1L; private String externalId; - private Type type; - private Priority priority; private String recipient; private Long submitterId; private Long assigneeId; @@ -29,7 +27,6 @@ public class Ticket extends Request implements SearchResultEntity { private boolean hasIncidents; private Date dueAt; private List tags; - private List customFields; private SatisfactionRating satisfactionRating; private List sharingAgreementIds; private List followupIds; @@ -79,15 +76,6 @@ public void setCollaborators(List collaborators) { this.collaborators = collaborators; } - @JsonProperty("custom_fields") - public List getCustomFields() { - return customFields; - } - - public void setCustomFields(List customFields) { - this.customFields = customFields; - } - @JsonProperty("due_at") public Date getDueAt() { return dueAt; @@ -142,14 +130,6 @@ public void setHasIncidents(boolean hasIncidents) { this.hasIncidents = hasIncidents; } - public Priority getPriority() { - return priority; - } - - public void setPriority(Priority priority) { - this.priority = priority; - } - @JsonProperty("problem_id") public Long getProblemId() { return problemId; @@ -231,14 +211,6 @@ public void setTicketFormId(Long ticketFormId) { this.ticketFormId = ticketFormId; } - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - @JsonProperty("is_public") public Boolean getIsPublic() { return isPublic; From 8d01420833184f859922a98a1e479de822a5993b Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 26 Jun 2023 11:27:21 +0200 Subject: [PATCH 176/343] Update src/main/java/org/zendesk/client/v2/model/Ticket.java --- src/main/java/org/zendesk/client/v2/model/Ticket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/zendesk/client/v2/model/Ticket.java b/src/main/java/org/zendesk/client/v2/model/Ticket.java index 6af168d64..5df657bc7 100644 --- a/src/main/java/org/zendesk/client/v2/model/Ticket.java +++ b/src/main/java/org/zendesk/client/v2/model/Ticket.java @@ -13,7 +13,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Ticket extends Request implements SearchResultEntity { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -7559199410302237012L; private String externalId; private String recipient; From ebff1378fa44c25368757df57f4a57b7c049b060 Mon Sep 17 00:00:00 2001 From: nkharabaruk Date: Mon, 26 Jun 2023 13:50:05 +0300 Subject: [PATCH 177/343] remove url from Timezone, replace wildcard import --- .../java/org/zendesk/client/v2/Zendesk.java | 39 ++++++++++++++++++- .../org/zendesk/client/v2/model/TimeZone.java | 13 +------ .../zendesk/client/v2/model/TimeZoneTest.java | 6 +-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 7e75bdca0..9d91178f3 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -21,7 +21,44 @@ import org.asynchttpclient.request.body.multipart.StringPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.zendesk.client.v2.model.*; +import org.zendesk.client.v2.model.AgentRole; +import org.zendesk.client.v2.model.Attachment; +import org.zendesk.client.v2.model.Audit; +import org.zendesk.client.v2.model.Automation; +import org.zendesk.client.v2.model.Brand; +import org.zendesk.client.v2.model.Comment; +import org.zendesk.client.v2.model.ComplianceDeletionStatus; +import org.zendesk.client.v2.model.DeletedTicket; +import org.zendesk.client.v2.model.Field; +import org.zendesk.client.v2.model.Forum; +import org.zendesk.client.v2.model.Group; +import org.zendesk.client.v2.model.GroupMembership; +import org.zendesk.client.v2.model.Identity; +import org.zendesk.client.v2.model.JobStatus; +import org.zendesk.client.v2.model.Macro; +import org.zendesk.client.v2.model.Metric; +import org.zendesk.client.v2.model.Organization; +import org.zendesk.client.v2.model.OrganizationField; +import org.zendesk.client.v2.model.OrganizationMembership; +import org.zendesk.client.v2.model.SatisfactionRating; +import org.zendesk.client.v2.model.SearchResultEntity; +import org.zendesk.client.v2.model.SortOrder; +import org.zendesk.client.v2.model.Status; +import org.zendesk.client.v2.model.SuspendedTicket; +import org.zendesk.client.v2.model.Ticket; +import org.zendesk.client.v2.model.TicketCount; +import org.zendesk.client.v2.model.TicketForm; +import org.zendesk.client.v2.model.TicketImport; +import org.zendesk.client.v2.model.TicketPage; +import org.zendesk.client.v2.model.TicketResult; +import org.zendesk.client.v2.model.TimeZone; +import org.zendesk.client.v2.model.Topic; +import org.zendesk.client.v2.model.Trigger; +import org.zendesk.client.v2.model.TwitterMonitor; +import org.zendesk.client.v2.model.User; +import org.zendesk.client.v2.model.UserField; +import org.zendesk.client.v2.model.UserRelatedInfo; +import org.zendesk.client.v2.model.View; import org.zendesk.client.v2.model.dynamic.DynamicContentItem; import org.zendesk.client.v2.model.dynamic.DynamicContentItemVariant; import org.zendesk.client.v2.model.hc.Article; diff --git a/src/main/java/org/zendesk/client/v2/model/TimeZone.java b/src/main/java/org/zendesk/client/v2/model/TimeZone.java index db2bbd9c7..f4cdeb63a 100644 --- a/src/main/java/org/zendesk/client/v2/model/TimeZone.java +++ b/src/main/java/org/zendesk/client/v2/model/TimeZone.java @@ -13,7 +13,6 @@ public class TimeZone { private String translatedName; private String name; private String ianaName; - private String url; private int offset; private String formattedOffset; @@ -43,14 +42,6 @@ public void setIanaName(String ianaName) { this.ianaName = ianaName; } - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - public int getOffset() { return offset; } @@ -75,11 +66,11 @@ public boolean equals(Object o) { TimeZone timeZone = (TimeZone) o; return offset == timeZone.offset && Objects.equals(translatedName, timeZone.translatedName) && Objects.equals(name, timeZone.name) && Objects.equals(ianaName, timeZone.ianaName) && - Objects.equals(url, timeZone.url) && Objects.equals(formattedOffset, timeZone.formattedOffset); + Objects.equals(formattedOffset, timeZone.formattedOffset); } @Override public int hashCode() { - return Objects.hash(translatedName, name, ianaName, url, offset, formattedOffset); + return Objects.hash(translatedName, name, ianaName, offset, formattedOffset); } } diff --git a/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java b/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java index bf4e43f23..3fc09691f 100644 --- a/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java +++ b/src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java @@ -32,14 +32,14 @@ public class TimeZoneTest { @Rule public WireMockClassRule zendeskApiMock = zendeskApiClass; - private final int ephemeralPort = zendeskApiMock.port(); - private final String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); private Zendesk client; private final ObjectMapper objectMapper = Zendesk.createMapper(); @Before public void setUp() { + int ephemeralPort = zendeskApiMock.port(); + String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); client = new Zendesk.Builder(hostname) .setUsername(MOCK_USERNAME) .setToken(MOCK_API_TOKEN) @@ -61,7 +61,6 @@ public void getTimeZones() throws JsonProcessingException { timeZone1.setTranslatedName("Pacific Time (US & Canada)"); timeZone1.setName("Pacific Time (US & Canada)"); timeZone1.setIanaName("America/Los_Angeles"); - timeZone1.setUrl(hostname + "/api/v2/time_zones/Pacific%20Time%20(US%20&%20Canada).json"); timeZone1.setOffset(-420); timeZone1.setFormattedOffset("GMT-07:00"); @@ -69,7 +68,6 @@ public void getTimeZones() throws JsonProcessingException { timeZone1.setTranslatedName("Kyiv"); timeZone1.setName("Kyiv"); timeZone1.setIanaName("Europe/Kiev"); - timeZone1.setUrl(hostname + "/api/v2/time_zones/Kyiv.json"); timeZone1.setOffset(180); timeZone1.setFormattedOffset("GMT+03:00"); From 8c179e6c6455ddda62ab8219724670902c0467e9 Mon Sep 17 00:00:00 2001 From: Enis Mustafaj Date: Tue, 27 Jun 2023 00:16:53 +0200 Subject: [PATCH 178/343] fix: Remove length constraint from organization external id lookup --- src/main/java/org/zendesk/client/v2/Zendesk.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 5914b125f..98a0e3144 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1422,8 +1422,8 @@ public JobStatus deleteOrganizations(long... ids) { } public Iterable lookupOrganizationsByExternalId(String externalId) { - if (externalId == null || externalId.length() < 2) { - throw new IllegalArgumentException("Name must be at least 2 characters long"); + if (externalId == null) { + throw new IllegalArgumentException("External ID must not be null"); } return new PagedIterable<>( tmpl("/organizations/search.json{?external_id}").set("external_id", externalId), From 992c7d7f4b41d68d47ad0fe7dd440de32b027d28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 20:47:45 +0000 Subject: [PATCH 179/343] Bump release-drafter/release-drafter from 5.23.0 to 5.24.0 Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.23.0 to 5.24.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.23.0...v5.24.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 58efdb9b1..26a0dadfe 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5.23.0 + - uses: release-drafter/release-drafter@v5.24.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From cf25d4ca1ea137887d6e550b470cb3d7682f4fb5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 08:47:54 +0000 Subject: [PATCH 180/343] Bump jackson-bom from 2.15.0 to 2.15.2 Bumps [jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.15.0 to 2.15.2. - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.15.0...jackson-bom-2.15.2) --- updated-dependencies: - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fce5dd797..ef380618a 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.fasterxml.jackson jackson-bom - 2.15.0 + 2.15.2 pom import From f6cde7fd4eff10a9b77fa2f9bb74e1d4e35c2b29 Mon Sep 17 00:00:00 2001 From: enis Date: Fri, 7 Jul 2023 15:57:49 +0200 Subject: [PATCH 181/343] test: Add test case for empty external Id --- src/main/java/org/zendesk/client/v2/Zendesk.java | 4 ++-- .../org/zendesk/client/v2/RealSmokeTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 56396fe81..502e3e7a4 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -1423,8 +1423,8 @@ public JobStatus deleteOrganizations(long... ids) { } public Iterable lookupOrganizationsByExternalId(String externalId) { - if (externalId == null) { - throw new IllegalArgumentException("External ID must not be null"); + if (externalId == null || externalId.length() == 0) { + throw new IllegalArgumentException("External ID must not be null or length 0"); } return new PagedIterable<>( tmpl("/organizations/search.json{?external_id}").set("external_id", externalId), diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 3c033f94a..2f9fbe8f6 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -97,6 +97,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assume.assumeThat; @@ -1583,6 +1584,21 @@ public void createOrganizationMemberships() throws Exception { } } + @Test + public void lookupOrganizationByExternalId() throws Exception { + createClientWithTokenOrPassword(); + + Organization newOrganization = newTestOrganization(); + newOrganization.setExternalId("i"); + Organization resultOrganization = instance.createOrganization(newOrganization); + assertNotNull(resultOrganization); + + Iterable or = instance.lookupOrganizationsByExternalId("i"); + assertTrue(or.iterator().hasNext()); + + assertThrows(IllegalArgumentException.class, () -> instance.lookupOrganizationsByExternalId("")); + } + @Test public void getGroups() throws Exception { createClientWithTokenOrPassword(); From 159443b333407b9ad0e495f375c1a0c9e5bdded7 Mon Sep 17 00:00:00 2001 From: hamdanis Date: Wed, 12 Jul 2023 23:46:40 +0200 Subject: [PATCH 182/343] Bulk Delete Tickets method returns JobStatus --- src/main/java/org/zendesk/client/v2/Zendesk.java | 6 +++--- .../org/zendesk/client/v2/RealSmokeTest.java | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index 9d91178f3..58734e0f8 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -438,9 +438,9 @@ public void markTicketAsSpam(long id) { complete(submit(req("PUT", tmpl("/tickets/{id}/mark_as_spam.json").set("id", id)), handleStatus())); } - public void deleteTickets(long id, long... ids) { - complete(submit(req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), - handleStatus())); + public JobStatus deleteTickets(long id, long... ids) { + return complete(submit(req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), + handleJobStatus())); } public JobStatus permanentlyDeleteTickets(long id, long... ids) { diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 3c033f94a..4c4e64a0e 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -617,15 +617,15 @@ public void createPermanentlyDeleteTickets() throws Exception { final Long[] ticketsIds = tickets.stream().map(Ticket::getId).toArray(Long[]::new); // when // We soft delete them - instance.deleteTickets(firstElement(ticketsIds), otherElements(ticketsIds)); - waitTicketsDeleted(ticketsIds); + JobStatus softDeleteJobStatus = waitJobCompletion(instance.deleteTickets(firstElement(ticketsIds), otherElements(ticketsIds))); + assertThat("Soft Delete Job is completed", softDeleteJobStatus.getStatus(), is(JobStatus.JobStatusEnum.completed)); // We permanently delete them - JobStatus jobStatus = + JobStatus permDeleteJobStatus = waitJobCompletion( instance.permanentlyDeleteTickets(firstElement(ticketsIds), otherElements(ticketsIds))); // then - assertThat("Job is completed", jobStatus.getStatus(), is(JobStatus.JobStatusEnum.completed)); - jobStatus.getResults().forEach(jobResult -> { + assertThat("Job is completed", permDeleteJobStatus.getStatus(), is(JobStatus.JobStatusEnum.completed)); + permDeleteJobStatus.getResults().forEach(jobResult -> { assertThat("The job result has no account_id entry", jobResult.getAccountId(), nullValue()); assertThat("The job result has no action entry", jobResult.getAction(), nullValue()); assertThat("The job result has no details entry", jobResult.getDetails(), nullValue()); @@ -710,7 +710,7 @@ public void createTickets() throws Exception { assertThat("A unique ID must be set", id, notNullValue())); } finally { // cleanup - instance.deleteTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); + waitJobCompletion(instance.deleteTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds))); } } @@ -752,7 +752,7 @@ public void updateTickets() throws Exception { assertThat("The job result has a success entry", jobResult.getSuccess(), is(TRUE)); }); } finally { - instance.deleteTickets(firstElement(ticketsIds), otherElements(ticketsIds)); + waitJobCompletion(instance.deleteTickets(firstElement(ticketsIds), otherElements(ticketsIds))); } } @@ -839,7 +839,7 @@ public void importTickets() throws Exception { // then } finally { // cleanup - instance.deleteTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds)); + waitJobCompletion(instance.deleteTickets(firstElement(createdTicketsIds), otherElements(createdTicketsIds))); } } From fa9a190909cf78006b411d1b99c1b5bc987343d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:48:28 +0000 Subject: [PATCH 183/343] Bump io.netty:netty-bom from 4.1.94.Final to 4.1.95.Final Bumps [io.netty:netty-bom](https://github.com/netty/netty) from 4.1.94.Final to 4.1.95.Final. - [Commits](https://github.com/netty/netty/compare/netty-4.1.94.Final...netty-4.1.95.Final) --- updated-dependencies: - dependency-name: io.netty:netty-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ef380618a..f3ed36d78 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ io.netty netty-bom - 4.1.94.Final + 4.1.95.Final pom import From 4319ff457e05d4629b77ba1433702fd252f65fd7 Mon Sep 17 00:00:00 2001 From: enis Date: Mon, 24 Jul 2023 15:26:46 +0200 Subject: [PATCH 184/343] chore: Refactor test --- src/test/java/org/zendesk/client/v2/RealSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java index 2f9fbe8f6..b9e347ba2 100644 --- a/src/test/java/org/zendesk/client/v2/RealSmokeTest.java +++ b/src/test/java/org/zendesk/client/v2/RealSmokeTest.java @@ -1594,7 +1594,7 @@ public void lookupOrganizationByExternalId() throws Exception { assertNotNull(resultOrganization); Iterable or = instance.lookupOrganizationsByExternalId("i"); - assertTrue(or.iterator().hasNext()); + assertEquals(1, StreamSupport.stream(or.spliterator(), false).count()); assertThrows(IllegalArgumentException.class, () -> instance.lookupOrganizationsByExternalId("")); } From 1facfb58077664e25656f53e2e02376ff2f1ce73 Mon Sep 17 00:00:00 2001 From: Pierre Beitz Date: Mon, 24 Jul 2023 16:09:56 +0200 Subject: [PATCH 185/343] [chore] Add automatic formatting --- CONTRIBUTING.adoc | 75 +- pom.xml | 100 +- .../java/org/zendesk/client/v2/FixedUri.java | 16 +- .../org/zendesk/client/v2/TemplateUri.java | 47 +- src/main/java/org/zendesk/client/v2/Uri.java | 4 +- .../java/org/zendesk/client/v2/Zendesk.java | 6370 ++++++++++------- .../zendesk/client/v2/ZendeskException.java | 23 +- .../client/v2/ZendeskResponseException.java | 77 +- .../v2/ZendeskResponseRateLimitException.java | 39 +- .../org/zendesk/client/v2/model/Action.java | 58 +- .../zendesk/client/v2/model/AgentRole.java | 119 +- .../zendesk/client/v2/model/Attachment.java | 92 +- .../org/zendesk/client/v2/model/Audit.java | 173 +- .../zendesk/client/v2/model/Automation.java | 45 +- .../org/zendesk/client/v2/model/Brand.java | 294 +- .../zendesk/client/v2/model/Collaborator.java | 48 +- .../org/zendesk/client/v2/model/Comment.java | 254 +- .../zendesk/client/v2/model/CommentType.java | 25 +- .../v2/model/ComplianceDeletionStatus.java | 196 +- .../zendesk/client/v2/model/Condition.java | 8 +- .../zendesk/client/v2/model/Conditions.java | 8 +- .../client/v2/model/CustomFieldValue.java | 60 +- .../client/v2/model/DeletedTicket.java | 229 +- .../org/zendesk/client/v2/model/Field.java | 580 +- .../org/zendesk/client/v2/model/Forum.java | 297 +- .../org/zendesk/client/v2/model/Group.java | 153 +- .../client/v2/model/GroupMembership.java | 146 +- .../org/zendesk/client/v2/model/Identity.java | 230 +- .../zendesk/client/v2/model/JobResult.java | 157 +- .../zendesk/client/v2/model/JobStatus.java | 190 +- .../org/zendesk/client/v2/model/Macro.java | 158 +- .../org/zendesk/client/v2/model/Metric.java | 487 +- .../zendesk/client/v2/model/Organization.java | 314 +- .../client/v2/model/OrganizationField.java | 236 +- .../v2/model/OrganizationMembership.java | 164 +- .../org/zendesk/client/v2/model/Page.java | 15 +- .../org/zendesk/client/v2/model/Photo.java | 232 +- .../org/zendesk/client/v2/model/Priority.java | 17 +- .../org/zendesk/client/v2/model/Request.java | 345 +- .../org/zendesk/client/v2/model/Role.java | 23 +- .../client/v2/model/SatisfactionRating.java | 237 +- .../client/v2/model/SearchResultEntity.java | 3 +- .../zendesk/client/v2/model/SortOrder.java | 20 +- .../org/zendesk/client/v2/model/Status.java | 23 +- .../client/v2/model/SuspendedTicket.java | 221 +- .../org/zendesk/client/v2/model/Ticket.java | 635 +- .../zendesk/client/v2/model/TicketCount.java | 31 +- .../zendesk/client/v2/model/TicketForm.java | 381 +- .../zendesk/client/v2/model/TicketImport.java | 182 +- .../zendesk/client/v2/model/TicketPage.java | 3 +- .../client/v2/model/TicketRestriction.java | 24 +- .../zendesk/client/v2/model/TicketResult.java | 23 +- .../org/zendesk/client/v2/model/TimeZone.java | 129 +- .../org/zendesk/client/v2/model/Topic.java | 382 +- .../zendesk/client/v2/model/TopicType.java | 24 +- .../org/zendesk/client/v2/model/Trigger.java | 354 +- .../client/v2/model/TwitterMonitor.java | 204 +- .../org/zendesk/client/v2/model/Type.java | 17 +- .../org/zendesk/client/v2/model/User.java | 902 +-- .../zendesk/client/v2/model/UserField.java | 234 +- .../client/v2/model/UserRelatedInfo.java | 249 +- .../java/org/zendesk/client/v2/model/Via.java | 53 +- .../org/zendesk/client/v2/model/View.java | 222 +- .../v2/model/dynamic/DynamicContentItem.java | 438 +- .../dynamic/DynamicContentItemVariant.java | 451 +- .../events/AgentMacroReferenceEvent.java | 83 +- .../events/AttachmentRedactionEvent.java | 21 +- .../client/v2/model/events/CcEvent.java | 44 +- .../client/v2/model/events/ChangeEvent.java | 111 +- .../client/v2/model/events/CommentEvent.java | 130 +- .../events/CommentPrivacyChangeEvent.java | 28 +- .../model/events/CommentRedactionEvent.java | 13 +- .../client/v2/model/events/CreateEvent.java | 128 +- .../client/v2/model/events/ErrorEvent.java | 28 +- .../zendesk/client/v2/model/events/Event.java | 73 +- .../client/v2/model/events/ExternalEvent.java | 82 +- .../client/v2/model/events/FacebookEvent.java | 105 +- .../model/events/LogMeInTranscriptEvent.java | 26 +- .../v2/model/events/NotificationEvent.java | 53 +- .../events/OrganizationActivityEvent.java | 34 +- .../v2/model/events/PublicPrivateEvent.java | 26 +- .../client/v2/model/events/PushEvent.java | 62 +- .../client/v2/model/events/SMSEvent.java | 85 +- .../model/events/SatisfactionRatingEvent.java | 83 +- .../v2/model/events/TicketSharingEvent.java | 61 +- .../client/v2/model/events/TweetEvent.java | 83 +- .../client/v2/model/events/UnknownEvent.java | 27 +- .../v2/model/events/VoiceCommentEvent.java | 197 +- .../zendesk/client/v2/model/hc/Article.java | 648 +- .../v2/model/hc/ArticleAttachments.java | 305 +- .../zendesk/client/v2/model/hc/Category.java | 301 +- .../client/v2/model/hc/ContentTag.java | 175 +- .../client/v2/model/hc/PermissionGroup.java | 194 +- .../zendesk/client/v2/model/hc/Section.java | 349 +- .../client/v2/model/hc/Subscription.java | 246 +- .../client/v2/model/hc/Translation.java | 146 +- .../client/v2/model/hc/UserSegment.java | 294 +- .../zendesk/client/v2/model/hc/UserType.java | 26 +- .../client/v2/model/schedules/Holiday.java | 93 +- .../client/v2/model/schedules/Interval.java | 57 +- .../client/v2/model/schedules/Schedule.java | 158 +- .../v2/model/targets/BasecampTarget.java | 214 +- .../v2/model/targets/CampfireTarget.java | 124 +- .../client/v2/model/targets/EmailTarget.java | 80 +- .../v2/model/targets/PivotalTarget.java | 197 +- .../client/v2/model/targets/Target.java | 100 +- .../v2/model/targets/TwitterTarget.java | 81 +- .../client/v2/model/targets/UrlTarget.java | 121 +- .../zendesk/client/v2/ContentTagsTest.java | 177 +- .../org/zendesk/client/v2/RealSmokeTest.java | 5064 ++++++------- .../org/zendesk/client/v2/SearchTest.java | 166 +- .../zendesk/client/v2/TemplateUriTest.java | 84 +- .../java/org/zendesk/client/v2/UserTest.java | 229 +- .../java/org/zendesk/client/v2/Utils.java | 10 +- .../org/zendesk/client/v2/ZendeskConfig.java | 69 +- .../org/zendesk/client/v2/junit/UTCRule.java | 18 +- .../zendesk/client/v2/model/ActionTest.java | 84 +- .../zendesk/client/v2/model/ArticleTest.java | 144 +- .../zendesk/client/v2/model/EventTest.java | 79 +- .../client/v2/model/SearchResults.java | 70 +- .../zendesk/client/v2/model/StatusTest.java | 32 +- .../client/v2/model/TicketResultTest.java | 37 +- .../zendesk/client/v2/model/TimeZoneTest.java | 146 +- .../zendesk/client/v2/model/TriggerTest.java | 121 +- .../client/v2/model/hc/ContentTagTest.java | 71 +- .../v2/model/hc/PermissionGroupTest.java | 88 +- .../client/v2/model/hc/UserSegmentTest.java | 90 +- .../client/v2/model/hc/UserTypeTest.java | 16 +- 128 files changed, 15746 insertions(+), 14087 deletions(-) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index d70589520..d3a75ac08 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -26,8 +26,9 @@ Unless code has shipped to users, the initial value of the `serialVersionUID` fi == Indentation -1. **Use spaces.** Tabs are banned. -2. **Java blocks are 4 spaces.** JavaScript blocks as for Java. **XML nesting is 2 spaces** +The project relies on [https://github.com/diffplug/spotless/tree/main/plugin-maven](the Spotless Maven Plugin) to manage its formatting. +The [https://github.com/google/google-java-format](google-java-format) project was chosen, check it, it contains links to plugins for various IDEs. +You can also run the formatter from command line: `mvn spotless:apply`. == Field Naming Conventions @@ -41,42 +42,6 @@ If you need more than three, you are likely doing something wrong and as such yo 6. It is acceptable to use `e` for the exception in a `try...catch` block. 7. You shall never use `l` (i.e. lower case `L`) as a variable name. -== Line Length - -To the greatest extent possible, please wrap lines to ensure that they do not exceed 120 characters. - -== Maven POM file layout - -* The `pom.xml` file shall use the sequencing of elements as defined by the `mvn tidy:pom` command (after any indenting fix-up). -* If you are introducing a property to the `pom.xml` the property must be used in at least two distinct places in the model or a comment justifying the use of a property shall be provided. -* If the `` is in the groupId `org.apache.maven.plugins` you shall omit the ``. -* All `` entries shall have an explicit version defined unless inherited from the parent. - -== Java code style - -=== Modifiers - -* For fields, the order is: - . `public` / `protected` / `private` - . `static` - . `final` - . `transient` - . `volatile` -* For methods, the order is: - . `public` / `protected` / `private` - . `abstract` - . `static` - . `final` - . `synchronized` - . `native` - . `strictfp` -* For classes, the order is: - . `public` / `protected` / `private` - . `abstract` - . `static` - . `final` - . `strictfp` - === Imports * For code in `src/main`: @@ -89,11 +54,6 @@ To the greatest extent possible, please wrap lines to ensure that they do not ex . `import static org.hamcrest.Matchers.*`, `import static org.junit.Assert.*`, `import static org.junit.Assume.*` are expressly encouraged and permitted. Any other `static` `*` imports are discouraged unless code readability is significantly enhanced and the import is restricted to a single class. -=== Annotation placement - -* Annotations on classes, interfaces, annotations, enums, methods, fields and local variables shall be on the lines immediately preceding the line where modifier(s) (e.g. `public` / `protected` / `private` / `final`, etc) would be appropriate. -* Annotations on method arguments shall, to the largest extent possible, be on the same line as the method argument (and, if present, before the `final` modifier) - === Javadoc * Each class shall have a Javadoc comment. @@ -138,35 +98,6 @@ public void setWidgetCount(int widgetCount) { The version shall be `FIXME` to indicate that the person merging the change should replace the `FIXME` with the next release version number. The fields and methods within a class/interface (but not nested classes) will be assumed to have the `@since` annotation of their class/interface unless a different `@since` annotation is present. -=== IDE Configuration - -* Eclipse, by and large the IDE defaults are acceptable with the following changes: -** Tab policy to `Spaces only` -** Indent statements within `switch` body -** Maximum line width `120` -** Line wrapping, ensure all to `wrap where necessary` -** Organize imports alphabetically, no grouping -* NetBeans, by and large the IDE defaults are acceptable with the following changes: -** Tabs and Indents -*** Change Right Margin to `120` -*** Indent case statements in switch -** Wrapping -*** Change all the `Never` values to `If Long` -*** Select the checkbox for Wrap After Assignment Operators -* IntelliJ, by and large the IDE defaults are acceptable with the following changes: -** Wrapping and Braces -*** Change `Do not wrap` to `Wrap if long` -*** Change `Do not force` to `Always` -** Javadoc -*** Disable generating `

` on empty lines -** Imports -*** Class count to use import with '*': `9999` -*** Names count to use static import with '*': `99999` -*** Import Layout -**** import all other imports -**** blank line -**** import static all other imports - == Integration Tests This library has a set of integration tests in the class `src/test/java/org/zendesk/client/v2/RealSmokeTest.java`. These tests are used to validate the API calls with a real Zendesk instance. The project never got access to a specific sandbox provided by @zendesk thus we are using the sandbox used by CloudBees. diff --git a/pom.xml b/pom.xml index f3ed36d78..779e3285f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,3 +1,4 @@ + - 4.0.0 @@ -74,8 +74,8 @@ scm:git:git://github.com/cloudbees-oss/zendesk-java-client.git scm:git:git@github.com:cloudbees-oss/zendesk-java-client.git - http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ HEAD + http://github.com/cloudbees-oss/zendesk-java-client/tree/master/ @@ -91,6 +91,7 @@ 1.8 1.8 + 2.37.0 @@ -108,7 +109,7 @@ 4.1.95.Final pom import - + @@ -155,10 +156,10 @@ test - com.github.tomakehurst - wiremock - 2.27.2 - test + com.github.tomakehurst + wiremock + 2.27.2 + test org.assertj @@ -203,6 +204,18 @@ true + + + org.codehaus.mojo + animal-sniffer-enforcer-rule + 1.23 + + + org.codehaus.mojo + extra-enforcer-rules + 1.7.0 + + check-java-compat @@ -236,34 +249,59 @@ - - - org.codehaus.mojo - animal-sniffer-enforcer-rule - 1.23 - - - org.codehaus.mojo - extra-enforcer-rules - 1.7.0 - - - org.apache.maven.plugins - maven-jar-plugin - 3.3.0 - - - - org.zendesk.client.v2 - - - + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + org.zendesk.client.v2 + + + + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + @formatter:off + @formatter:on + + + + + + + + + false + + + + + + + check + + + + + + org.apache.maven.plugins + maven-release-plugin + + spotless:apply verify + spotless:apply verify + - + coverage @@ -291,6 +329,6 @@ - + diff --git a/src/main/java/org/zendesk/client/v2/FixedUri.java b/src/main/java/org/zendesk/client/v2/FixedUri.java index 004ef59cb..7af1da180 100644 --- a/src/main/java/org/zendesk/client/v2/FixedUri.java +++ b/src/main/java/org/zendesk/client/v2/FixedUri.java @@ -6,14 +6,14 @@ */ class FixedUri extends Uri { - private final String uri; + private final String uri; - FixedUri(String uri) { - this.uri = uri; - } + FixedUri(String uri) { + this.uri = uri; + } - @Override - public String toString() { - return uri; - } + @Override + public String toString() { + return uri; + } } diff --git a/src/main/java/org/zendesk/client/v2/TemplateUri.java b/src/main/java/org/zendesk/client/v2/TemplateUri.java index 81280bf38..f01c5b94f 100644 --- a/src/main/java/org/zendesk/client/v2/TemplateUri.java +++ b/src/main/java/org/zendesk/client/v2/TemplateUri.java @@ -1,7 +1,6 @@ package org.zendesk.client.v2; import com.damnhandy.uri.template.UriTemplate; - import java.util.Date; import java.util.Map; @@ -11,33 +10,33 @@ */ class TemplateUri extends Uri { - private final UriTemplate uri; + private final UriTemplate uri; - public TemplateUri(UriTemplate uri) { - this.uri = uri; - } + public TemplateUri(UriTemplate uri) { + this.uri = uri; + } - public TemplateUri(String uri) { - this.uri = UriTemplate.fromTemplate(uri); - } + public TemplateUri(String uri) { + this.uri = UriTemplate.fromTemplate(uri); + } - public TemplateUri set(Map values) { - uri.set(values); - return this; - } + public TemplateUri set(Map values) { + uri.set(values); + return this; + } - public TemplateUri set(String variableName, Date value) { - uri.set(variableName, value); - return this; - } + public TemplateUri set(String variableName, Date value) { + uri.set(variableName, value); + return this; + } - public TemplateUri set(String variableName, Object value) { - uri.set(variableName, value); - return this; - } + public TemplateUri set(String variableName, Object value) { + uri.set(variableName, value); + return this; + } - @Override - public String toString() { - return uri.expand(); - } + @Override + public String toString() { + return uri.expand(); + } } diff --git a/src/main/java/org/zendesk/client/v2/Uri.java b/src/main/java/org/zendesk/client/v2/Uri.java index aa186304a..70605bca3 100644 --- a/src/main/java/org/zendesk/client/v2/Uri.java +++ b/src/main/java/org/zendesk/client/v2/Uri.java @@ -5,6 +5,6 @@ * @since 05/04/2013 10:05 */ abstract class Uri { - @Override - public abstract String toString(); + @Override + public abstract String toString(); } diff --git a/src/main/java/org/zendesk/client/v2/Zendesk.java b/src/main/java/org/zendesk/client/v2/Zendesk.java index bb808f8f2..adf6db32f 100644 --- a/src/main/java/org/zendesk/client/v2/Zendesk.java +++ b/src/main/java/org/zendesk/client/v2/Zendesk.java @@ -8,6 +8,26 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; @@ -81,3367 +101,4165 @@ import org.zendesk.client.v2.model.targets.TwitterTarget; import org.zendesk.client.v2.model.targets.UrlTarget; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; - /** * @author stephenc * @since 04/04/2013 13:08 */ public class Zendesk implements Closeable { - private static final String JSON = "application/json; charset=UTF-8"; - private static final DefaultAsyncHttpClientConfig DEFAULT_ASYNC_HTTP_CLIENT_CONFIG = - new DefaultAsyncHttpClientConfig.Builder().setFollowRedirect(true).build(); - private final boolean closeClient; - private final AsyncHttpClient client; - private final Realm realm; - private final String url; - private final String oauthToken; - private final Map headers; - private final ObjectMapper mapper; - private final Logger logger; - private boolean closed = false; - private static final Map> searchResultTypes = searchResultTypes(); - private static final Map> targetTypes = targetTypes(); - - private static Map> searchResultTypes() { - Map> result = new HashMap<>(); - result.put("ticket", Ticket.class); - result.put("user", User.class); - result.put("group", Group.class); - result.put("organization", Organization.class); - result.put("topic", Topic.class); - result.put("article", Article.class); - return Collections.unmodifiableMap(result); - } - - private static Map> targetTypes() { - Map> result = new HashMap<>(); - result.put("url_target", UrlTarget.class); - result.put("email_target",EmailTarget.class); - result.put("basecamp_target", BasecampTarget.class); - result.put("campfire_target", CampfireTarget.class); - result.put("pivotal_target", PivotalTarget.class); - result.put("twitter_target", TwitterTarget.class); - - // TODO: Implement other Target types - //result.put("clickatell_target", ClickatellTarget.class); - //result.put("flowdock_target", FlowdockTarget.class); - //result.put("get_satisfaction_target", GetSatisfactionTarget.class); - //result.put("yammer_target", YammerTarget.class); - - return Collections.unmodifiableMap(result); - } - - private Zendesk(AsyncHttpClient client, String url, String username, String password, Map headers) { - this.logger = LoggerFactory.getLogger(Zendesk.class); - this.closeClient = client == null; - this.oauthToken = null; - this.client = client == null ? new DefaultAsyncHttpClient(DEFAULT_ASYNC_HTTP_CLIENT_CONFIG) : client; - this.url = url.endsWith("/") ? url + "api/v2" : url + "/api/v2"; - if (username != null) { - this.realm = new Realm.Builder(username, password) - .setScheme(Realm.AuthScheme.BASIC) - .setUsePreemptiveAuth(true) - .build(); - } else { - if (password != null) { - throw new IllegalStateException("Cannot specify token or password without specifying username"); - } - this.realm = null; - } - this.headers = Collections.unmodifiableMap(headers); - this.mapper = createMapper(); - } - + private static final String JSON = "application/json; charset=UTF-8"; + private static final DefaultAsyncHttpClientConfig DEFAULT_ASYNC_HTTP_CLIENT_CONFIG = + new DefaultAsyncHttpClientConfig.Builder().setFollowRedirect(true).build(); + private final boolean closeClient; + private final AsyncHttpClient client; + private final Realm realm; + private final String url; + private final String oauthToken; + private final Map headers; + private final ObjectMapper mapper; + private final Logger logger; + private boolean closed = false; + private static final Map> searchResultTypes = + searchResultTypes(); + private static final Map> targetTypes = targetTypes(); + + private static Map> searchResultTypes() { + Map> result = new HashMap<>(); + result.put("ticket", Ticket.class); + result.put("user", User.class); + result.put("group", Group.class); + result.put("organization", Organization.class); + result.put("topic", Topic.class); + result.put("article", Article.class); + return Collections.unmodifiableMap(result); + } - private Zendesk(AsyncHttpClient client, String url, String oauthToken, Map headers) { - this.logger = LoggerFactory.getLogger(Zendesk.class); - this.closeClient = client == null; - this.realm = null; - this.client = client == null ? new DefaultAsyncHttpClient(DEFAULT_ASYNC_HTTP_CLIENT_CONFIG) : client; - this.url = url.endsWith("/") ? url + "api/v2" : url + "/api/v2"; - if (oauthToken != null) { - this.oauthToken = oauthToken; - } else { - throw new IllegalStateException("Cannot specify token or password without specifying username"); - } - this.headers = Collections.unmodifiableMap(headers); + private static Map> targetTypes() { + Map> result = new HashMap<>(); + result.put("url_target", UrlTarget.class); + result.put("email_target", EmailTarget.class); + result.put("basecamp_target", BasecampTarget.class); + result.put("campfire_target", CampfireTarget.class); + result.put("pivotal_target", PivotalTarget.class); + result.put("twitter_target", TwitterTarget.class); + + // TODO: Implement other Target types + // result.put("clickatell_target", ClickatellTarget.class); + // result.put("flowdock_target", FlowdockTarget.class); + // result.put("get_satisfaction_target", GetSatisfactionTarget.class); + // result.put("yammer_target", YammerTarget.class); + + return Collections.unmodifiableMap(result); + } - this.mapper = createMapper(); + private Zendesk( + AsyncHttpClient client, + String url, + String username, + String password, + Map headers) { + this.logger = LoggerFactory.getLogger(Zendesk.class); + this.closeClient = client == null; + this.oauthToken = null; + this.client = + client == null ? new DefaultAsyncHttpClient(DEFAULT_ASYNC_HTTP_CLIENT_CONFIG) : client; + this.url = url.endsWith("/") ? url + "api/v2" : url + "/api/v2"; + if (username != null) { + this.realm = + new Realm.Builder(username, password) + .setScheme(Realm.AuthScheme.BASIC) + .setUsePreemptiveAuth(true) + .build(); + } else { + if (password != null) { + throw new IllegalStateException( + "Cannot specify token or password without specifying username"); + } + this.realm = null; } + this.headers = Collections.unmodifiableMap(headers); + this.mapper = createMapper(); + } + private Zendesk( + AsyncHttpClient client, String url, String oauthToken, Map headers) { + this.logger = LoggerFactory.getLogger(Zendesk.class); + this.closeClient = client == null; + this.realm = null; + this.client = + client == null ? new DefaultAsyncHttpClient(DEFAULT_ASYNC_HTTP_CLIENT_CONFIG) : client; + this.url = url.endsWith("/") ? url + "api/v2" : url + "/api/v2"; + if (oauthToken != null) { + this.oauthToken = oauthToken; + } else { + throw new IllegalStateException( + "Cannot specify token or password without specifying username"); + } + this.headers = Collections.unmodifiableMap(headers); + + this.mapper = createMapper(); + } - ////////////////////////////////////////////////////////////////////// - // Closeable interface methods - ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// + // Closeable interface methods + ////////////////////////////////////////////////////////////////////// - public boolean isClosed() { - return closed || client.isClosed(); - } + public boolean isClosed() { + return closed || client.isClosed(); + } - public void close() { - if (closeClient && !client.isClosed()) { - try { - client.close(); - } catch (IOException e) { - logger.warn("Unexpected error on client close", e); - } - } - closed = true; + public void close() { + if (closeClient && !client.isClosed()) { + try { + client.close(); + } catch (IOException e) { + logger.warn("Unexpected error on client close", e); + } } + closed = true; + } - ////////////////////////////////////////////////////////////////////// - // Action methods - ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// + // Action methods + ////////////////////////////////////////////////////////////////////// - public JobStatus getJobStatus(JobStatus status) { - return complete(getJobStatusAsync(status)); - } + public JobStatus getJobStatus(JobStatus status) { + return complete(getJobStatusAsync(status)); + } - public ListenableFuture getJobStatusAsync(JobStatus status) { - return submit(req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())), - handleJobStatus()); - } + public ListenableFuture getJobStatusAsync(JobStatus status) { + return submit( + req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())), handleJobStatus()); + } - public List getJobStatuses(List statuses) { - return complete(getJobStatusesAsync(statuses)); - } + public List getJobStatuses(List statuses) { + return complete(getJobStatusesAsync(statuses)); + } - public ListenableFuture> getJobStatusesAsync(List statuses) { - List ids = new ArrayList<>(statuses.size()); - for (JobStatus status : statuses) { - ids.add(status.getId()); - } - Class clazz = (Class) (Object) JobStatus.class; - return submit(req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)), - handleList(clazz, "job_statuses")); + public ListenableFuture> getJobStatusesAsync(List statuses) { + List ids = new ArrayList<>(statuses.size()); + for (JobStatus status : statuses) { + ids.add(status.getId()); } + Class clazz = (Class) (Object) JobStatus.class; + return submit( + req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)), + handleList(clazz, "job_statuses")); + } - public List getBrands(){ - return complete(submit(req("GET", cnst("/brands.json")), handleList(Brand.class, - "brands"))); - } + public List getBrands() { + return complete(submit(req("GET", cnst("/brands.json")), handleList(Brand.class, "brands"))); + } - public TicketForm getTicketForm(long id) { - return complete(submit(req("GET", tmpl("/ticket_forms/{id}.json").set("id", id)), handle(TicketForm.class, - "ticket_form"))); - } + public TicketForm getTicketForm(long id) { + return complete( + submit( + req("GET", tmpl("/ticket_forms/{id}.json").set("id", id)), + handle(TicketForm.class, "ticket_form"))); + } - public List getTicketForms() { - return complete(submit(req("GET", cnst("/ticket_forms.json")), handleList(TicketForm.class, - "ticket_forms"))); - } + public List getTicketForms() { + return complete( + submit( + req("GET", cnst("/ticket_forms.json")), handleList(TicketForm.class, "ticket_forms"))); + } - public TicketForm createTicketForm(TicketForm ticketForm) { - return complete(submit(req("POST", cnst("/ticket_forms.json"), JSON, json( - Collections.singletonMap("ticket_form", ticketForm))), handle(TicketForm.class, "ticket_form"))); - } + public TicketForm createTicketForm(TicketForm ticketForm) { + return complete( + submit( + req( + "POST", + cnst("/ticket_forms.json"), + JSON, + json(Collections.singletonMap("ticket_form", ticketForm))), + handle(TicketForm.class, "ticket_form"))); + } - public TicketForm updateTicketForm(TicketForm ticketForm) { - checkHasId(ticketForm); - return complete(submit(req("PUT", tmpl("/ticket_forms/{id}.json").set("id", ticketForm.getId()), - JSON, json(Collections.singletonMap("ticket_form", ticketForm))), - handle(TicketForm.class, "ticket_form"))); - } + public TicketForm updateTicketForm(TicketForm ticketForm) { + checkHasId(ticketForm); + return complete( + submit( + req( + "PUT", + tmpl("/ticket_forms/{id}.json").set("id", ticketForm.getId()), + JSON, + json(Collections.singletonMap("ticket_form", ticketForm))), + handle(TicketForm.class, "ticket_form"))); + } - public void deleteTicketForm(TicketForm ticketForm) { - checkHasId(ticketForm); - deleteTicketForm(ticketForm.getId()); - } + public void deleteTicketForm(TicketForm ticketForm) { + checkHasId(ticketForm); + deleteTicketForm(ticketForm.getId()); + } - public void deleteTicketForm(long id) { - complete(submit(req("DELETE", tmpl("/ticket_forms/{id}.json").set("id", id)), handleStatus())); - } + public void deleteTicketForm(long id) { + complete(submit(req("DELETE", tmpl("/ticket_forms/{id}.json").set("id", id)), handleStatus())); + } - public Ticket importTicket(TicketImport ticketImport) { - return complete(submit(req("POST", cnst("/imports/tickets.json"), - JSON, json(Collections.singletonMap("ticket", ticketImport))), - handle(Ticket.class, "ticket"))); - } + public Ticket importTicket(TicketImport ticketImport) { + return complete( + submit( + req( + "POST", + cnst("/imports/tickets.json"), + JSON, + json(Collections.singletonMap("ticket", ticketImport))), + handle(Ticket.class, "ticket"))); + } - public JobStatus importTickets(TicketImport... ticketImports) { - return importTickets(Arrays.asList(ticketImports)); - } + public JobStatus importTickets(TicketImport... ticketImports) { + return importTickets(Arrays.asList(ticketImports)); + } - public JobStatus importTickets(List ticketImports) { - return complete(importTicketsAsync(ticketImports)); - } + public JobStatus importTickets(List ticketImports) { + return complete(importTicketsAsync(ticketImports)); + } - public ListenableFuture importTicketsAsync(List ticketImports) { - return submit(req("POST", cnst("/imports/tickets/create_many.json"), JSON, json( - Collections.singletonMap("tickets", ticketImports))), handleJobStatus()); - } + public ListenableFuture importTicketsAsync(List ticketImports) { + return submit( + req( + "POST", + cnst("/imports/tickets/create_many.json"), + JSON, + json(Collections.singletonMap("tickets", ticketImports))), + handleJobStatus()); + } - public TicketCount getTicketsCount(){ - return complete( - submit( - req("GET", cnst("/tickets/count.json")), - handle(TicketCount.class, "count") - ) - ); - } + public TicketCount getTicketsCount() { + return complete( + submit(req("GET", cnst("/tickets/count.json")), handle(TicketCount.class, "count"))); + } - public TicketCount getTicketsCountForOrganization(long id){ - return complete( - submit( - req("GET", tmpl("/organizations/{id}/tickets/count.json").set("id", id)), - handle(TicketCount.class, "count") - ) - ); - } + public TicketCount getTicketsCountForOrganization(long id) { + return complete( + submit( + req("GET", tmpl("/organizations/{id}/tickets/count.json").set("id", id)), + handle(TicketCount.class, "count"))); + } - public TicketCount getCcdTicketsCountForUser(long id){ - return complete( - submit( - req("GET", tmpl("/users/{id}/tickets/ccd/count.json").set("id", id)), - handle(TicketCount.class, "count") - ) - ); - } + public TicketCount getCcdTicketsCountForUser(long id) { + return complete( + submit( + req("GET", tmpl("/users/{id}/tickets/ccd/count.json").set("id", id)), + handle(TicketCount.class, "count"))); + } - public TicketCount getAssignedTicketsCountForUser(long id){ - return complete( - submit( - req("GET", tmpl("/users/{id}/tickets/assigned/count.json").set("id", id)), - handle(TicketCount.class, "count") - ) - ); - } + public TicketCount getAssignedTicketsCountForUser(long id) { + return complete( + submit( + req("GET", tmpl("/users/{id}/tickets/assigned/count.json").set("id", id)), + handle(TicketCount.class, "count"))); + } - public Ticket getTicket(long id) { - return complete(submit(req("GET", tmpl("/tickets/{id}.json").set("id", id)), handle(Ticket.class, - "ticket"))); - } + public Ticket getTicket(long id) { + return complete( + submit( + req("GET", tmpl("/tickets/{id}.json").set("id", id)), handle(Ticket.class, "ticket"))); + } - public List getTicketIncidents(long id) { - return complete(submit(req("GET", tmpl("/tickets/{id}/incidents.json").set("id", id)), - handleList(Ticket.class, "tickets"))); - } + public List getTicketIncidents(long id) { + return complete( + submit( + req("GET", tmpl("/tickets/{id}/incidents.json").set("id", id)), + handleList(Ticket.class, "tickets"))); + } - public List getTicketCollaborators(long id) { - return complete(submit(req("GET", tmpl("/tickets/{id}/collaborators.json").set("id", id)), - handleList(User.class, "users"))); - } + public List getTicketCollaborators(long id) { + return complete( + submit( + req("GET", tmpl("/tickets/{id}/collaborators.json").set("id", id)), + handleList(User.class, "users"))); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets - */ - public Iterable getDeletedTickets() { - return new PagedIterable<>(cnst("/deleted_tickets.json"), handleList(DeletedTicket.class, "deleted_tickets")); - } + /** https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets */ + public Iterable getDeletedTickets() { + return new PagedIterable<>( + cnst("/deleted_tickets.json"), handleList(DeletedTicket.class, "deleted_tickets")); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets - */ - public Iterable getDeletedTickets(String sortBy, SortOrder sortOrder) { - return new PagedIterable<>(tmpl("/deleted_tickets.json?sort_by={sortBy}&sort_order={sortOrder}") - .set("sortBy", sortBy) - .set("sortOrder", sortOrder.getQueryParameter()), - handleList(DeletedTicket.class, "deleted_tickets")); - } + /** https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets */ + public Iterable getDeletedTickets(String sortBy, SortOrder sortOrder) { + return new PagedIterable<>( + tmpl("/deleted_tickets.json?sort_by={sortBy}&sort_order={sortOrder}") + .set("sortBy", sortBy) + .set("sortOrder", sortOrder.getQueryParameter()), + handleList(DeletedTicket.class, "deleted_tickets")); + } - public void deleteTicket(Ticket ticket) { - checkHasId(ticket); - deleteTicket(ticket.getId()); - } + public void deleteTicket(Ticket ticket) { + checkHasId(ticket); + deleteTicket(ticket.getId()); + } - public void deleteTicket(long id) { - complete(submit(req("DELETE", tmpl("/tickets/{id}.json").set("id", id)), handleStatus())); - } + public void deleteTicket(long id) { + complete(submit(req("DELETE", tmpl("/tickets/{id}.json").set("id", id)), handleStatus())); + } - public JobStatus permanentlyDeleteTicket(Ticket ticket) { - checkHasId(ticket); - return permanentlyDeleteTicket(ticket.getId()); - } + public JobStatus permanentlyDeleteTicket(Ticket ticket) { + checkHasId(ticket); + return permanentlyDeleteTicket(ticket.getId()); + } - public JobStatus permanentlyDeleteTicket(long id) { - return complete(submit( - req("DELETE", tmpl("/deleted_tickets/{id}.json").set("id", id)), - handleJobStatus()) - ); - } + public JobStatus permanentlyDeleteTicket(long id) { + return complete( + submit(req("DELETE", tmpl("/deleted_tickets/{id}.json").set("id", id)), handleJobStatus())); + } - public ListenableFuture queueCreateTicketAsync(Ticket ticket) { - return submit(req("POST", cnst("/tickets.json?async=true"), - JSON, json(Collections.singletonMap("ticket", ticket))), - handleJobStatus()); - } + public ListenableFuture queueCreateTicketAsync(Ticket ticket) { + return submit( + req( + "POST", + cnst("/tickets.json?async=true"), + JSON, + json(Collections.singletonMap("ticket", ticket))), + handleJobStatus()); + } - public ListenableFuture createTicketAsync(Ticket ticket) { - return submit(req("POST", cnst("/tickets.json"), - JSON, json(Collections.singletonMap("ticket", ticket))), - handle(Ticket.class, "ticket")); - } + public ListenableFuture createTicketAsync(Ticket ticket) { + return submit( + req("POST", cnst("/tickets.json"), JSON, json(Collections.singletonMap("ticket", ticket))), + handle(Ticket.class, "ticket")); + } - public Ticket createTicket(Ticket ticket) { - return complete(createTicketAsync(ticket)); - } + public Ticket createTicket(Ticket ticket) { + return complete(createTicketAsync(ticket)); + } - public JobStatus createTickets(Ticket... tickets) { - return createTickets(Arrays.asList(tickets)); - } + public JobStatus createTickets(Ticket... tickets) { + return createTickets(Arrays.asList(tickets)); + } - public JobStatus createTickets(List tickets) { - return complete(createTicketsAsync(tickets)); - } + public JobStatus createTickets(List tickets) { + return complete(createTicketsAsync(tickets)); + } - public ListenableFuture createTicketsAsync(List tickets) { - return submit(req("POST", cnst("/tickets/create_many.json"), JSON, json( - Collections.singletonMap("tickets", tickets))), handleJobStatus()); - } + public ListenableFuture createTicketsAsync(List tickets) { + return submit( + req( + "POST", + cnst("/tickets/create_many.json"), + JSON, + json(Collections.singletonMap("tickets", tickets))), + handleJobStatus()); + } - public Ticket updateTicket(Ticket ticket) { - checkHasId(ticket); - return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticket.getId()), - JSON, json(Collections.singletonMap("ticket", ticket))), - handle(Ticket.class, "ticket"))); - } + public Ticket updateTicket(Ticket ticket) { + checkHasId(ticket); + return complete( + submit( + req( + "PUT", + tmpl("/tickets/{id}.json").set("id", ticket.getId()), + JSON, + json(Collections.singletonMap("ticket", ticket))), + handle(Ticket.class, "ticket"))); + } - public JobStatus updateTickets(Ticket... tickets) { - return updateTickets(Arrays.asList(tickets)); - } + public JobStatus updateTickets(Ticket... tickets) { + return updateTickets(Arrays.asList(tickets)); + } - public JobStatus updateTickets(List tickets) { - return complete(updateTicketsAsync(tickets)); - } + public JobStatus updateTickets(List tickets) { + return complete(updateTicketsAsync(tickets)); + } - public ListenableFuture updateTicketsAsync(List tickets) { - return submit(req("PUT", cnst("/tickets/update_many.json"), JSON, json( - Collections.singletonMap("tickets", tickets))), handleJobStatus()); - } + public ListenableFuture updateTicketsAsync(List tickets) { + return submit( + req( + "PUT", + cnst("/tickets/update_many.json"), + JSON, + json(Collections.singletonMap("tickets", tickets))), + handleJobStatus()); + } - public void markTicketAsSpam(Ticket ticket) { - checkHasId(ticket); - markTicketAsSpam(ticket.getId()); - } + public void markTicketAsSpam(Ticket ticket) { + checkHasId(ticket); + markTicketAsSpam(ticket.getId()); + } - public void markTicketAsSpam(long id) { - complete(submit(req("PUT", tmpl("/tickets/{id}/mark_as_spam.json").set("id", id)), handleStatus())); - } + public void markTicketAsSpam(long id) { + complete( + submit(req("PUT", tmpl("/tickets/{id}/mark_as_spam.json").set("id", id)), handleStatus())); + } - public JobStatus deleteTickets(long id, long... ids) { - return complete(submit(req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), - handleJobStatus())); - } + public JobStatus deleteTickets(long id, long... ids) { + return complete( + submit( + req("DELETE", tmpl("/tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), + handleJobStatus())); + } - public JobStatus permanentlyDeleteTickets(long id, long... ids) { - return complete( - submit( - req("DELETE", tmpl("/deleted_tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), - handleJobStatus()) - ); - } + public JobStatus permanentlyDeleteTickets(long id, long... ids) { + return complete( + submit( + req( + "DELETE", + tmpl("/deleted_tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))), + handleJobStatus())); + } - public Iterable getTickets() { - return new PagedIterable<>(cnst("/tickets.json"), handleList(Ticket.class, "tickets")); - } + public Iterable getTickets() { + return new PagedIterable<>(cnst("/tickets.json"), handleList(Ticket.class, "tickets")); + } - /** - * @deprecated This API is no longer available from the vendor. Use the {@link #getTicketsFromSearch(String)} method instead - * @param ticketStatus - * @return - */ - @Deprecated - public Iterable getTicketsByStatus(Status... ticketStatus) { - return new PagedIterable<>(tmpl("/tickets.json{?status}").set("status", statusArray(ticketStatus)), - handleList(Ticket.class, "tickets")); - } + /** + * @deprecated This API is no longer available from the vendor. Use the {@link + * #getTicketsFromSearch(String)} method instead + * @param ticketStatus + * @return + */ + @Deprecated + public Iterable getTicketsByStatus(Status... ticketStatus) { + return new PagedIterable<>( + tmpl("/tickets.json{?status}").set("status", statusArray(ticketStatus)), + handleList(Ticket.class, "tickets")); + } - public Iterable getTicketsByExternalId(String externalId, boolean includeArchived) { - Iterable results = - new PagedIterable<>(tmpl("/tickets.json{?external_id}").set("external_id", externalId), - handleList(Ticket.class, "tickets")); + public Iterable getTicketsByExternalId(String externalId, boolean includeArchived) { + Iterable results = + new PagedIterable<>( + tmpl("/tickets.json{?external_id}").set("external_id", externalId), + handleList(Ticket.class, "tickets")); - if (!includeArchived || results.iterator().hasNext()) { - return results; - } - return new PagedIterable<>( - tmpl("/search.json{?query}{&type}").set("query", "external_id:" + externalId).set("type", "ticket"), - handleList(Ticket.class, "results")); + if (!includeArchived || results.iterator().hasNext()) { + return results; } + return new PagedIterable<>( + tmpl("/search.json{?query}{&type}") + .set("query", "external_id:" + externalId) + .set("type", "ticket"), + handleList(Ticket.class, "results")); + } - public Iterable getTicketsByExternalId(String externalId) { - return getTicketsByExternalId(externalId, false); - } + public Iterable getTicketsByExternalId(String externalId) { + return getTicketsByExternalId(externalId, false); + } - public Iterable getTicketsFromSearch(String searchTerm) { - return new PagedIterable<>(tmpl("/search.json{?query}").set("query", searchTerm + " type:ticket"), - handleList(Ticket.class, "results")); - } + public Iterable getTicketsFromSearch(String searchTerm) { + return new PagedIterable<>( + tmpl("/search.json{?query}").set("query", searchTerm + " type:ticket"), + handleList(Ticket.class, "results")); + } - public Iterable

getArticleFromSearch(String searchTerm) { - return new PagedIterable<>(tmpl("/help_center/articles/search.json{?query}").set("query", searchTerm), - handleList(Article.class, "results")); - } + public Iterable
getArticleFromSearch(String searchTerm) { + return new PagedIterable<>( + tmpl("/help_center/articles/search.json{?query}").set("query", searchTerm), + handleList(Article.class, "results")); + } - public Iterable
getArticleFromSearch(String searchTerm, Long sectionId) { - return new PagedIterable<>(tmpl("/help_center/articles/search.json{?section,query}") - .set("query", searchTerm).set("section", sectionId), handleList(Article.class, "results")); - } + public Iterable
getArticleFromSearch(String searchTerm, Long sectionId) { + return new PagedIterable<>( + tmpl("/help_center/articles/search.json{?section,query}") + .set("query", searchTerm) + .set("section", sectionId), + handleList(Article.class, "results")); + } - public Iterable
getArticlesFromAnyLabels(List labels) { - return new PagedIterable<>(tmpl("/help_center/articles/search.json{?label_names}").set("label_names", labels), - handleList(Article.class, "results")); - } + public Iterable
getArticlesFromAnyLabels(List labels) { + return new PagedIterable<>( + tmpl("/help_center/articles/search.json{?label_names}").set("label_names", labels), + handleList(Article.class, "results")); + } - public Iterable
getArticlesFromAllLabels(List labels) { - return new PagedIterable<>(tmpl("/help_center/en-us/articles.json{?label_names}").set("label_names", labels), - handleList(Article.class, "articles")); - } + public Iterable
getArticlesFromAllLabels(List labels) { + return new PagedIterable<>( + tmpl("/help_center/en-us/articles.json{?label_names}").set("label_names", labels), + handleList(Article.class, "articles")); + } - public List getAttachmentsFromArticle(Long articleID) { - return complete(submit(req("GET", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleID)), - handleArticleAttachmentsList("article_attachments"))); - } + public List getAttachmentsFromArticle(Long articleID) { + return complete( + submit( + req("GET", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleID)), + handleArticleAttachmentsList("article_attachments"))); + } - public List getTickets(long id, long... ids) { - return complete(submit(req("GET", tmpl("/tickets/show_many.json{?ids}").set("ids", idArray(id, ids))), - handleList(Ticket.class, "tickets"))); - } + public List getTickets(long id, long... ids) { + return complete( + submit( + req("GET", tmpl("/tickets/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(Ticket.class, "tickets"))); + } - public Iterable getRecentTickets() { - return new PagedIterable<>(cnst("/tickets/recent.json"), handleList(Ticket.class, "tickets")); - } + public Iterable getRecentTickets() { + return new PagedIterable<>(cnst("/tickets/recent.json"), handleList(Ticket.class, "tickets")); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/incremental_export - */ - public Iterable getTicketsIncrementally(Date startTime) { - return new PagedIterable<>( - tmpl("/incremental/tickets.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), - handleIncrementalList(Ticket.class, "tickets")); - } + /** https://developer.zendesk.com/rest_api/docs/support/incremental_export */ + public Iterable getTicketsIncrementally(Date startTime) { + return new PagedIterable<>( + tmpl("/incremental/tickets.json{?start_time}") + .set("start_time", msToSeconds(startTime.getTime())), + handleIncrementalList(Ticket.class, "tickets")); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/incremental_export - * - * @deprecated incremental export does not support an end_time parameter - */ - @Deprecated - public Iterable getTicketsIncrementally(Date startTime, Date endTime) { - return new PagedIterable<>( - tmpl("/incremental/tickets.json{?start_time,end_time}") - .set("start_time", msToSeconds(startTime.getTime())) - .set("end_time", msToSeconds(endTime.getTime())), - handleIncrementalList(Ticket.class, "tickets")); - } + /** + * https://developer.zendesk.com/rest_api/docs/support/incremental_export + * + * @deprecated incremental export does not support an end_time parameter + */ + @Deprecated + public Iterable getTicketsIncrementally(Date startTime, Date endTime) { + return new PagedIterable<>( + tmpl("/incremental/tickets.json{?start_time,end_time}") + .set("start_time", msToSeconds(startTime.getTime())) + .set("end_time", msToSeconds(endTime.getTime())), + handleIncrementalList(Ticket.class, "tickets")); + } - public Iterable getOrganizationTickets(long organizationId) { - return new PagedIterable<>( - tmpl("/organizations/{organizationId}/tickets.json").set("organizationId", organizationId), - handleList(Ticket.class, "tickets")); - } + public Iterable getOrganizationTickets(long organizationId) { + return new PagedIterable<>( + tmpl("/organizations/{organizationId}/tickets.json").set("organizationId", organizationId), + handleList(Ticket.class, "tickets")); + } - public Iterable getOrganizationRequests(long organizationId) { - return new PagedIterable<>( - tmpl("/organizations/{organizationId}/requests.json").set("organizationId", organizationId), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getOrganizationRequests( + long organizationId) { + return new PagedIterable<>( + tmpl("/organizations/{organizationId}/requests.json").set("organizationId", organizationId), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public Iterable getUserRequestedTickets(long userId) { - return new PagedIterable<>(tmpl("/users/{userId}/tickets/requested.json").set("userId", userId), - handleList(Ticket.class, "tickets")); - } + public Iterable getUserRequestedTickets(long userId) { + return new PagedIterable<>( + tmpl("/users/{userId}/tickets/requested.json").set("userId", userId), + handleList(Ticket.class, "tickets")); + } - public Iterable getComplianceDeletionStatuses(long userId) { - return new PagedIterable<>(tmpl("/users/{userId}/compliance_deletion_statuses.json").set("userId", userId), - handleList(ComplianceDeletionStatus.class, "compliance_deletion_statuses")); - } + public Iterable getComplianceDeletionStatuses(long userId) { + return new PagedIterable<>( + tmpl("/users/{userId}/compliance_deletion_statuses.json").set("userId", userId), + handleList(ComplianceDeletionStatus.class, "compliance_deletion_statuses")); + } - public Iterable getUserCCDTickets(long userId) { - return new PagedIterable<>(tmpl("/users/{userId}/tickets/ccd.json").set("userId", userId), - handleList(Ticket.class, "tickets")); - } + public Iterable getUserCCDTickets(long userId) { + return new PagedIterable<>( + tmpl("/users/{userId}/tickets/ccd.json").set("userId", userId), + handleList(Ticket.class, "tickets")); + } - public UserRelatedInfo getUserRelatedInfo(long userId) { - return complete(submit(req("GET", tmpl("/users/{userId}/related.json").set("userId", userId)), - handle(UserRelatedInfo.class, "user_related"))); - } + public UserRelatedInfo getUserRelatedInfo(long userId) { + return complete( + submit( + req("GET", tmpl("/users/{userId}/related.json").set("userId", userId)), + handle(UserRelatedInfo.class, "user_related"))); + } - public Iterable getTicketMetrics() { - return new PagedIterable<>(cnst("/ticket_metrics.json"), handleList(Metric.class, "ticket_metrics")); - } + public Iterable getTicketMetrics() { + return new PagedIterable<>( + cnst("/ticket_metrics.json"), handleList(Metric.class, "ticket_metrics")); + } - public Metric getTicketMetricByTicket(long id) { - return complete(submit(req("GET", tmpl("/tickets/{ticketId}/metrics.json").set("ticketId", id)), handle(Metric.class, "ticket_metric"))); - } + public Metric getTicketMetricByTicket(long id) { + return complete( + submit( + req("GET", tmpl("/tickets/{ticketId}/metrics.json").set("ticketId", id)), + handle(Metric.class, "ticket_metric"))); + } - public Metric getTicketMetric(long id) { - return complete(submit(req("GET", tmpl("/ticket_metrics/{ticketMetricId}.json").set("ticketMetricId", id)), handle(Metric.class, "ticket_metric"))); - } + public Metric getTicketMetric(long id) { + return complete( + submit( + req("GET", tmpl("/ticket_metrics/{ticketMetricId}.json").set("ticketMetricId", id)), + handle(Metric.class, "ticket_metric"))); + } - public Iterable getTicketAudits(Ticket ticket) { - checkHasId(ticket); - return getTicketAudits(ticket.getId()); - } + public Iterable getTicketAudits(Ticket ticket) { + checkHasId(ticket); + return getTicketAudits(ticket.getId()); + } - public Iterable getTicketAudits(Long id) { - return new PagedIterable<>(tmpl("/tickets/{ticketId}/audits.json").set("ticketId", id), - handleList(Audit.class, "audits")); - } + public Iterable getTicketAudits(Long id) { + return new PagedIterable<>( + tmpl("/tickets/{ticketId}/audits.json").set("ticketId", id), + handleList(Audit.class, "audits")); + } - public Audit getTicketAudit(Ticket ticket, Audit audit) { - checkHasId(audit); - return getTicketAudit(ticket, audit.getId()); - } + public Audit getTicketAudit(Ticket ticket, Audit audit) { + checkHasId(audit); + return getTicketAudit(ticket, audit.getId()); + } - public Audit getTicketAudit(Ticket ticket, long id) { - checkHasId(ticket); - return getTicketAudit(ticket.getId(), id); - } + public Audit getTicketAudit(Ticket ticket, long id) { + checkHasId(ticket); + return getTicketAudit(ticket.getId(), id); + } - public Audit getTicketAudit(long ticketId, long auditId) { - return complete(submit(req("GET", - tmpl("/tickets/{ticketId}/audits/{auditId}.json").set("ticketId", ticketId) - .set("auditId", auditId)), - handle(Audit.class, "audit"))); - } + public Audit getTicketAudit(long ticketId, long auditId) { + return complete( + submit( + req( + "GET", + tmpl("/tickets/{ticketId}/audits/{auditId}.json") + .set("ticketId", ticketId) + .set("auditId", auditId)), + handle(Audit.class, "audit"))); + } - public void trustTicketAudit(Ticket ticket, Audit audit) { - checkHasId(audit); - trustTicketAudit(ticket, audit.getId()); - } + public void trustTicketAudit(Ticket ticket, Audit audit) { + checkHasId(audit); + trustTicketAudit(ticket, audit.getId()); + } - public void trustTicketAudit(Ticket ticket, long id) { - checkHasId(ticket); - trustTicketAudit(ticket.getId(), id); - } + public void trustTicketAudit(Ticket ticket, long id) { + checkHasId(ticket); + trustTicketAudit(ticket.getId(), id); + } - public void trustTicketAudit(long ticketId, long auditId) { - complete(submit(req("PUT", tmpl("/tickets/{ticketId}/audits/{auditId}/trust.json").set("ticketId", ticketId) - .set("auditId", auditId)), handleStatus())); - } + public void trustTicketAudit(long ticketId, long auditId) { + complete( + submit( + req( + "PUT", + tmpl("/tickets/{ticketId}/audits/{auditId}/trust.json") + .set("ticketId", ticketId) + .set("auditId", auditId)), + handleStatus())); + } - public void makePrivateTicketAudit(Ticket ticket, Audit audit) { - checkHasId(audit); - makePrivateTicketAudit(ticket, audit.getId()); - } + public void makePrivateTicketAudit(Ticket ticket, Audit audit) { + checkHasId(audit); + makePrivateTicketAudit(ticket, audit.getId()); + } - public void makePrivateTicketAudit(Ticket ticket, long id) { - checkHasId(ticket); - makePrivateTicketAudit(ticket.getId(), id); - } + public void makePrivateTicketAudit(Ticket ticket, long id) { + checkHasId(ticket); + makePrivateTicketAudit(ticket.getId(), id); + } - public void makePrivateTicketAudit(long ticketId, long auditId) { - complete(submit(req("PUT", - tmpl("/tickets/{ticketId}/audits/{auditId}/make_private.json").set("ticketId", ticketId) - .set("auditId", auditId)), handleStatus())); - } + public void makePrivateTicketAudit(long ticketId, long auditId) { + complete( + submit( + req( + "PUT", + tmpl("/tickets/{ticketId}/audits/{auditId}/make_private.json") + .set("ticketId", ticketId) + .set("auditId", auditId)), + handleStatus())); + } - public List getTicketFields() { - return complete(submit(req("GET", cnst("/ticket_fields.json")), handleList(Field.class, "ticket_fields"))); - } + public List getTicketFields() { + return complete( + submit(req("GET", cnst("/ticket_fields.json")), handleList(Field.class, "ticket_fields"))); + } - public Field getTicketField(long id) { - return complete(submit(req("GET", tmpl("/ticket_fields/{id}.json").set("id", id)), handle(Field.class, - "ticket_field"))); - } + public Field getTicketField(long id) { + return complete( + submit( + req("GET", tmpl("/ticket_fields/{id}.json").set("id", id)), + handle(Field.class, "ticket_field"))); + } - public Field createTicketField(Field field) { - return complete(submit(req("POST", cnst("/ticket_fields.json"), JSON, json( - Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); - } + public Field createTicketField(Field field) { + return complete( + submit( + req( + "POST", + cnst("/ticket_fields.json"), + JSON, + json(Collections.singletonMap("ticket_field", field))), + handle(Field.class, "ticket_field"))); + } - public Field updateTicketField(Field field) { - checkHasId(field); - return complete(submit(req("PUT", tmpl("/ticket_fields/{id}.json").set("id", field.getId()), JSON, - json(Collections.singletonMap("ticket_field", field))), handle(Field.class, "ticket_field"))); - } + public Field updateTicketField(Field field) { + checkHasId(field); + return complete( + submit( + req( + "PUT", + tmpl("/ticket_fields/{id}.json").set("id", field.getId()), + JSON, + json(Collections.singletonMap("ticket_field", field))), + handle(Field.class, "ticket_field"))); + } - public void deleteTicketField(Field field) { - checkHasId(field); - deleteTicket(field.getId()); - } + public void deleteTicketField(Field field) { + checkHasId(field); + deleteTicket(field.getId()); + } - public void deleteTicketField(long id) { - complete(submit(req("DELETE", tmpl("/ticket_fields/{id}.json").set("id", id)), handleStatus())); - } + public void deleteTicketField(long id) { + complete(submit(req("DELETE", tmpl("/ticket_fields/{id}.json").set("id", id)), handleStatus())); + } - public Iterable getSuspendedTickets() { - return new PagedIterable<>(cnst("/suspended_tickets.json"), - handleList(SuspendedTicket.class, "suspended_tickets")); - } + public Iterable getSuspendedTickets() { + return new PagedIterable<>( + cnst("/suspended_tickets.json"), handleList(SuspendedTicket.class, "suspended_tickets")); + } - /** - * Recover Multiple Suspended Tickets. Accepts up to 100 ticket ids. - * - * @throws IllegalArgumentException when the number of tickets exceeds 100 - * @param tickets tickets to be recovered - * @return recovered tickets - */ - public Iterable recoverSuspendedTickets(List tickets) { - if (100 < tickets.size()) { - throw new IllegalArgumentException("This endpoint accepts up to 100 tickets. Provided " + tickets.size() + " tickets.\n" + - "https://developer.zendesk.com/rest_api/docs/support/suspended_tickets#recover-multiple-suspended-tickets"); - } - List ids = new ArrayList<>(); - for (SuspendedTicket ticket : tickets) { - ids.add(ticket.getId()); - } - return complete(submit(req("PUT", tmpl("/suspended_tickets/recover_many.json{?ids}").set("ids", ids)), - handleList(Ticket.class, "tickets"))); - } + /** + * Recover Multiple Suspended Tickets. Accepts + * up to 100 ticket ids. + * + * @throws IllegalArgumentException when the number of tickets exceeds 100 + * @param tickets tickets to be recovered + * @return recovered tickets + */ + public Iterable recoverSuspendedTickets(List tickets) { + if (100 < tickets.size()) { + throw new IllegalArgumentException( + "This endpoint accepts up to 100 tickets. Provided " + + tickets.size() + + " tickets.\n" + + "https://developer.zendesk.com/rest_api/docs/support/suspended_tickets#recover-multiple-suspended-tickets"); + } + List ids = new ArrayList<>(); + for (SuspendedTicket ticket : tickets) { + ids.add(ticket.getId()); + } + return complete( + submit( + req("PUT", tmpl("/suspended_tickets/recover_many.json{?ids}").set("ids", ids)), + handleList(Ticket.class, "tickets"))); + } - public void deleteSuspendedTicket(SuspendedTicket ticket) { - checkHasId(ticket); - deleteSuspendedTicket(ticket.getId()); - } + public void deleteSuspendedTicket(SuspendedTicket ticket) { + checkHasId(ticket); + deleteSuspendedTicket(ticket.getId()); + } - public void deleteSuspendedTicket(long id) { - complete(submit(req("DELETE", tmpl("/suspended_tickets/{id}.json").set("id", id)), handleStatus())); - } + public void deleteSuspendedTicket(long id) { + complete( + submit(req("DELETE", tmpl("/suspended_tickets/{id}.json").set("id", id)), handleStatus())); + } - public Attachment.Upload createUpload(String fileName, byte[] content) { - return createUpload(null, fileName, "application/binary", content); - } + public Attachment.Upload createUpload(String fileName, byte[] content) { + return createUpload(null, fileName, "application/binary", content); + } - public Attachment.Upload createUpload(String fileName, String contentType, byte[] content) { - return createUpload(null, fileName, contentType, content); - } + public Attachment.Upload createUpload(String fileName, String contentType, byte[] content) { + return createUpload(null, fileName, contentType, content); + } - public Attachment.Upload createUpload(String token, String fileName, String contentType, byte[] content) { - TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); - if (token != null) { - uri.set("token", token); - } - return complete( - submit(req("POST", uri, contentType, - content), handle(Attachment.Upload.class, "upload"))); + public Attachment.Upload createUpload( + String token, String fileName, String contentType, byte[] content) { + TemplateUri uri = tmpl("/uploads.json{?filename,token}").set("filename", fileName); + if (token != null) { + uri.set("token", token); } + return complete( + submit(req("POST", uri, contentType, content), handle(Attachment.Upload.class, "upload"))); + } public void associateAttachmentsToArticle(String idArticle, List attachments) { - TemplateUri uri = tmpl("/help_center/articles/{article_id}/bulk_attachments.json").set("article_id", idArticle); - List attachmentsIds = new ArrayList<>(); - for(Attachment item : attachments){ - attachmentsIds.add(item.getId()); - } - complete(submit(req("POST", uri, JSON, json(Collections.singletonMap("attachment_ids", attachmentsIds))), handleStatus())); + TemplateUri uri = + tmpl("/help_center/articles/{article_id}/bulk_attachments.json") + .set("article_id", idArticle); + List attachmentsIds = new ArrayList<>(); + for (Attachment item : attachments) { + attachmentsIds.add(item.getId()); + } + complete( + submit( + req( + "POST", + uri, + JSON, + json(Collections.singletonMap("attachment_ids", attachmentsIds))), + handleStatus())); } - /** - * Create upload article with inline false - */ + /** Create upload article with inline false */ public ArticleAttachments createUploadArticle(long articleId, File file) throws IOException { - return createUploadArticle(articleId, file, false); + return createUploadArticle(articleId, file, false); } - public ArticleAttachments createUploadArticle(long articleId, File file, boolean inline) throws IOException { - RequestBuilder builder = reqBuilder("POST", tmpl("/help_center/articles/{id}/attachments.json").set("id", articleId).toString()); - builder.setHeader("Content-Type", "multipart/form-data"); + public ArticleAttachments createUploadArticle(long articleId, File file, boolean inline) + throws IOException { + RequestBuilder builder = + reqBuilder( + "POST", + tmpl("/help_center/articles/{id}/attachments.json").set("id", articleId).toString()); + builder.setHeader("Content-Type", "multipart/form-data"); + + if (inline) builder.addBodyPart(new StringPart("inline", "true")); + + builder.addBodyPart( + new FilePart( + "file", file, "application/octet-stream", StandardCharsets.UTF_8, file.getName())); + final Request req = builder.build(); + return complete(submit(req, handle(ArticleAttachments.class, "article_attachment"))); + } - if (inline) - builder.addBodyPart(new StringPart("inline", "true")); + public void deleteUpload(Attachment.Upload upload) { + checkHasToken(upload); + deleteUpload(upload.getToken()); + } - builder.addBodyPart( - new FilePart("file", file, "application/octet-stream", StandardCharsets.UTF_8, file.getName())); - final Request req = builder.build(); - return complete(submit(req, handle(ArticleAttachments.class, "article_attachment"))); - } + public void deleteUpload(String token) { + complete( + submit(req("DELETE", tmpl("/uploads/{token}.json").set("token", token)), handleStatus())); + } - public void deleteUpload(Attachment.Upload upload) { - checkHasToken(upload); - deleteUpload(upload.getToken()); - } + public Attachment getAttachment(Attachment attachment) { + checkHasId(attachment); + return getAttachment(attachment.getId()); + } - public void deleteUpload(String token) { - complete(submit(req("DELETE", tmpl("/uploads/{token}.json").set("token", token)), handleStatus())); - } + public Attachment getAttachment(long id) { + return complete( + submit( + req("GET", tmpl("/attachments/{id}.json").set("id", id)), + handle(Attachment.class, "attachment"))); + } - public Attachment getAttachment(Attachment attachment) { - checkHasId(attachment); - return getAttachment(attachment.getId()); - } + public void deleteAttachment(Attachment attachment) { + checkHasId(attachment); + deleteAttachment(attachment.getId()); + } - public Attachment getAttachment(long id) { - return complete(submit(req("GET", tmpl("/attachments/{id}.json").set("id", id)), handle(Attachment.class, - "attachment"))); - } + public void deleteAttachment(long id) { + complete(submit(req("DELETE", tmpl("/attachments/{id}.json").set("id", id)), handleStatus())); + } - public void deleteAttachment(Attachment attachment) { - checkHasId(attachment); - deleteAttachment(attachment.getId()); - } - - public void deleteAttachment(long id) { - complete(submit(req("DELETE", tmpl("/attachments/{id}.json").set("id", id)), handleStatus())); - } - - public Iterable getTargets() { - return new PagedIterable<>(cnst("/targets.json"), handleTargetList("targets")); - } - - public Target getTarget(long id) { - return complete(submit(req("GET", tmpl("/targets/{id}.json").set("id", id)), handle(Target.class, "target"))); - } - - public Target createTarget(Target target) { - return complete(submit(req("POST", cnst("/targets.json"), JSON, json(Collections.singletonMap("target", target))), - handle(Target.class, "target"))); - } + public Iterable getTargets() { + return new PagedIterable<>(cnst("/targets.json"), handleTargetList("targets")); + } - public void deleteTarget(long targetId) { - complete(submit(req("DELETE", tmpl("/targets/{id}.json").set("id", targetId)), handleStatus())); - } + public Target getTarget(long id) { + return complete( + submit( + req("GET", tmpl("/targets/{id}.json").set("id", id)), handle(Target.class, "target"))); + } - public Iterable getTriggers() { - return new PagedIterable<>(cnst("/triggers.json"), handleList(Trigger.class, "triggers")); - } + public Target createTarget(Target target) { + return complete( + submit( + req( + "POST", + cnst("/targets.json"), + JSON, + json(Collections.singletonMap("target", target))), + handle(Target.class, "target"))); + } - public Iterable getTriggers(String categoryId, boolean active, String sortBy, SortOrder sortOrder) { - return new PagedIterable<>( - tmpl("/triggers.json{?category_id,active,sort_by,sort_order}") - .set("category_id", categoryId) - .set("active", active) - .set("sort_by", sortBy) - .set("sort_order", sortOrder.getQueryParameter()), - handleList(Trigger.class, "triggers")); - } + public void deleteTarget(long targetId) { + complete(submit(req("DELETE", tmpl("/targets/{id}.json").set("id", targetId)), handleStatus())); + } - public Iterable getActiveTriggers() { - return new PagedIterable<>(cnst("/triggers/active.json"), handleList(Trigger.class, "triggers")); - } + public Iterable getTriggers() { + return new PagedIterable<>(cnst("/triggers.json"), handleList(Trigger.class, "triggers")); + } - public Iterable searchTriggers(String query) { - return new PagedIterable<>(tmpl("/triggers/search.json{?query}").set("query", query), - handleList(Trigger.class, "triggers")); - } + public Iterable getTriggers( + String categoryId, boolean active, String sortBy, SortOrder sortOrder) { + return new PagedIterable<>( + tmpl("/triggers.json{?category_id,active,sort_by,sort_order}") + .set("category_id", categoryId) + .set("active", active) + .set("sort_by", sortBy) + .set("sort_order", sortOrder.getQueryParameter()), + handleList(Trigger.class, "triggers")); + } - public Iterable searchTriggers(String query, boolean active, String sortBy, SortOrder sortOrder) { - return new PagedIterable<>( - tmpl("/triggers/search.json{?query,active,sort_by,sort_order}") - .set("query", query) - .set("active", active) - .set("sort_by", sortBy) - .set("sort_order", sortOrder.getQueryParameter()), - handleList(Trigger.class, "triggers")); - } + public Iterable getActiveTriggers() { + return new PagedIterable<>( + cnst("/triggers/active.json"), handleList(Trigger.class, "triggers")); + } - public Trigger getTrigger(long id) { - return complete( - submit(req("GET", tmpl("/triggers/{id}.json").set("id", id)), handle(Trigger.class, "trigger"))); - } + public Iterable searchTriggers(String query) { + return new PagedIterable<>( + tmpl("/triggers/search.json{?query}").set("query", query), + handleList(Trigger.class, "triggers")); + } - public Trigger createTrigger(Trigger trigger) { - return complete( - submit(req("POST", cnst("/triggers.json"), JSON, json(Collections.singletonMap("trigger", trigger))), - handle(Trigger.class, "trigger"))); - } + public Iterable searchTriggers( + String query, boolean active, String sortBy, SortOrder sortOrder) { + return new PagedIterable<>( + tmpl("/triggers/search.json{?query,active,sort_by,sort_order}") + .set("query", query) + .set("active", active) + .set("sort_by", sortBy) + .set("sort_order", sortOrder.getQueryParameter()), + handleList(Trigger.class, "triggers")); + } - public Trigger updateTrigger(Long triggerId, Trigger trigger) { - return complete(submit(req("PUT", tmpl("/triggers/{id}.json").set("id", triggerId), JSON, - json(Collections.singletonMap("trigger", trigger))), - handle(Trigger.class, "trigger"))); - } + public Trigger getTrigger(long id) { + return complete( + submit( + req("GET", tmpl("/triggers/{id}.json").set("id", id)), + handle(Trigger.class, "trigger"))); + } - public void deleteTrigger(long triggerId) { - complete(submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); - } + public Trigger createTrigger(Trigger trigger) { + return complete( + submit( + req( + "POST", + cnst("/triggers.json"), + JSON, + json(Collections.singletonMap("trigger", trigger))), + handle(Trigger.class, "trigger"))); + } + public Trigger updateTrigger(Long triggerId, Trigger trigger) { + return complete( + submit( + req( + "PUT", + tmpl("/triggers/{id}.json").set("id", triggerId), + JSON, + json(Collections.singletonMap("trigger", trigger))), + handle(Trigger.class, "trigger"))); + } - // Views - public Iterable getViews() { - return new PagedIterable<>(cnst("/views.json"), handleList(View.class, "views")); + public void deleteTrigger(long triggerId) { + complete( + submit(req("DELETE", tmpl("/triggers/{id}.json").set("id", triggerId)), handleStatus())); + } - } + // Views + public Iterable getViews() { + return new PagedIterable<>(cnst("/views.json"), handleList(View.class, "views")); + } - public Iterable getView(long id) { - return new PagedIterable<>(tmpl("/views/{id}/tickets.json").set("id", id), - handleList(Ticket.class, "tickets")); - } + public Iterable getView(long id) { + return new PagedIterable<>( + tmpl("/views/{id}/tickets.json").set("id", id), handleList(Ticket.class, "tickets")); + } - // Automations + // Automations public Iterable getAutomations() { - return new PagedIterable<>(cnst("/automations.json"), - handleList(Automation.class, "automations")); + return new PagedIterable<>( + cnst("/automations.json"), handleList(Automation.class, "automations")); } public Automation getAutomation(long id) { - return complete(submit(req("GET", tmpl("/automations/{id}.json").set("id", id)), - handle(Automation.class, "automation"))); + return complete( + submit( + req("GET", tmpl("/automations/{id}.json").set("id", id)), + handle(Automation.class, "automation"))); } public Automation createAutomation(Automation automation) { - return complete(submit( - req("POST", cnst("/automations.json"), JSON, - json(Collections.singletonMap("automation", automation))), - handle(Automation.class, "automation"))); + return complete( + submit( + req( + "POST", + cnst("/automations.json"), + JSON, + json(Collections.singletonMap("automation", automation))), + handle(Automation.class, "automation"))); } public Automation updateAutomation(Long automationId, Automation automation) { - return complete(submit( - req("PUT", tmpl("/automations/{id}.json").set("id", automationId), JSON, - json(Collections.singletonMap("automation", automation))), - handle(Automation.class, "automation"))); + return complete( + submit( + req( + "PUT", + tmpl("/automations/{id}.json").set("id", automationId), + JSON, + json(Collections.singletonMap("automation", automation))), + handle(Automation.class, "automation"))); } public void deleteAutomation(long automationId) { - complete(submit(req("DELETE", tmpl("/automations/{id}.json").set("id", automationId)), - handleStatus())); + complete( + submit( + req("DELETE", tmpl("/automations/{id}.json").set("id", automationId)), handleStatus())); } + public Iterable getTwitterMonitors() { + return new PagedIterable<>( + cnst("/channels/twitter/monitored_twitter_handles.json"), + handleList(TwitterMonitor.class, "monitored_twitter_handles")); + } - public Iterable getTwitterMonitors() { - return new PagedIterable<>(cnst("/channels/twitter/monitored_twitter_handles.json"), - handleList(TwitterMonitor.class, "monitored_twitter_handles")); - } - + public Iterable getUsers() { + return new PagedIterable<>(cnst("/users.json?page[size]=100"), handleList(User.class, "users")); + } - public Iterable getUsers() { - return new PagedIterable<>(cnst("/users.json?page[size]=100"), handleList(User.class, "users")); + public Iterable getUsersByRole(String role, String... roles) { + // Going to have to build this URI manually, because the RFC6570 template spec doesn't support + // variables like ?role[]=...role[]=..., which is what Zendesk requires. + // See https://developer.zendesk.com/rest_api/docs/core/users#filters + final StringBuilder uriBuilder = new StringBuilder("/users.json?page[size]=100"); + if (roles.length == 0) { + uriBuilder.append("&role=").append(encodeUrl(role)); + } else { + uriBuilder.append("&role[]=").append(encodeUrl(role)); } - - public Iterable getUsersByRole(String role, String... roles) { - // Going to have to build this URI manually, because the RFC6570 template spec doesn't support - // variables like ?role[]=...role[]=..., which is what Zendesk requires. - // See https://developer.zendesk.com/rest_api/docs/core/users#filters - final StringBuilder uriBuilder = new StringBuilder("/users.json?page[size]=100"); - if (roles.length == 0) { - uriBuilder.append("&role=").append(encodeUrl(role)); - } else { - uriBuilder.append("&role[]=").append(encodeUrl(role)); - } - for (final String curRole : roles) { - uriBuilder.append("&role[]=").append(encodeUrl(curRole)); - } - return new PagedIterable<>(cnst(uriBuilder.toString()), handleList(User.class, "users")); + for (final String curRole : roles) { + uriBuilder.append("&role[]=").append(encodeUrl(curRole)); } + return new PagedIterable<>(cnst(uriBuilder.toString()), handleList(User.class, "users")); + } - public List getUsers(long id, long... ids) { - return complete(submit(req("GET", tmpl("/users/show_many.json{?ids}").set("ids", idArray(id, ids))), - handleList(User.class, "users"))); - } + public List getUsers(long id, long... ids) { + return complete( + submit( + req("GET", tmpl("/users/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(User.class, "users"))); + } - /** - * @deprecated - User externalIds are Strings in Zendesk API, not longs. - * Use {@link #getUsersByExternalIds(String, String...)} instead - */ - @Deprecated - public List getUsersByExternalIds(long externalId, long... externalIds) { - return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(externalId, externalIds))), - handleList(User.class, "users"))); - } + /** + * @deprecated - User externalIds are Strings in Zendesk API, not longs. Use {@link + * #getUsersByExternalIds(String, String...)} instead + */ + @Deprecated + public List getUsersByExternalIds(long externalId, long... externalIds) { + return complete( + submit( + req( + "GET", + tmpl("/users/show_many.json{?external_ids}") + .set("external_ids", idArray(externalId, externalIds))), + handleList(User.class, "users"))); + } - public List getUsersByExternalIds(String externalId, String... externalIds) { - return complete(submit(req("GET", tmpl("/users/show_many.json{?external_ids}").set("external_ids", idArray(externalId, externalIds))), - handleList(User.class, "users"))); - } + public List getUsersByExternalIds(String externalId, String... externalIds) { + return complete( + submit( + req( + "GET", + tmpl("/users/show_many.json{?external_ids}") + .set("external_ids", idArray(externalId, externalIds))), + handleList(User.class, "users"))); + } - public Iterable getUsersIncrementally(Date startTime) { - return new PagedIterable<>( - tmpl("/incremental/users.json{?start_time}").set("start_time", msToSeconds(startTime.getTime())), - handleIncrementalList(User.class, "users")); - } + public Iterable getUsersIncrementally(Date startTime) { + return new PagedIterable<>( + tmpl("/incremental/users.json{?start_time}") + .set("start_time", msToSeconds(startTime.getTime())), + handleIncrementalList(User.class, "users")); + } - public Iterable getGroupUsers(long id) { - return new PagedIterable<>(tmpl("/groups/{id}/users.json").set("id", id), handleList(User.class, "users")); - } + public Iterable getGroupUsers(long id) { + return new PagedIterable<>( + tmpl("/groups/{id}/users.json").set("id", id), handleList(User.class, "users")); + } - public Iterable getOrganizationUsers(long id) { - return new PagedIterable<>(tmpl("/organizations/{id}/users.json").set("id", id), - handleList(User.class, "users")); - } + public Iterable getOrganizationUsers(long id) { + return new PagedIterable<>( + tmpl("/organizations/{id}/users.json").set("id", id), handleList(User.class, "users")); + } - public User getUser(long id) { - return complete(submit(req("GET", tmpl("/users/{id}.json").set("id", id)), handle(User.class, "user"))); - } + public User getUser(long id) { + return complete( + submit(req("GET", tmpl("/users/{id}.json").set("id", id)), handle(User.class, "user"))); + } - public User getAuthenticatedUser() { - return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); - } + public User getAuthenticatedUser() { + return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); + } - public Iterable getUserFields() { - return complete(submit(req("GET", cnst("/user_fields.json")), - handleList(UserField.class, "user_fields"))); - } + public Iterable getUserFields() { + return complete( + submit(req("GET", cnst("/user_fields.json")), handleList(UserField.class, "user_fields"))); + } - public User createUser(User user) { - return complete(submit(req("POST", cnst("/users.json"), JSON, json( - Collections.singletonMap("user", user))), handle(User.class, "user"))); - } + public User createUser(User user) { + return complete( + submit( + req("POST", cnst("/users.json"), JSON, json(Collections.singletonMap("user", user))), + handle(User.class, "user"))); + } - public User mergeUsers(long userIdThatWillRemain, long userIdThatWillBeMerged) { - return complete(submit(req("PUT", tmpl("/users/{id}/merge.json").set("id", userIdThatWillBeMerged), JSON, json( - Collections.singletonMap("user", Collections.singletonMap("id", userIdThatWillRemain)))), handle(User.class, "user"))); - } + public User mergeUsers(long userIdThatWillRemain, long userIdThatWillBeMerged) { + return complete( + submit( + req( + "PUT", + tmpl("/users/{id}/merge.json").set("id", userIdThatWillBeMerged), + JSON, + json( + Collections.singletonMap( + "user", Collections.singletonMap("id", userIdThatWillRemain)))), + handle(User.class, "user"))); + } - public JobStatus createUsers(User... users) { - return createUsers(Arrays.asList(users)); - } + public JobStatus createUsers(User... users) { + return createUsers(Arrays.asList(users)); + } - public JobStatus createUsers(List users) { - return complete(createUsersAsync(users)); - } + public JobStatus createUsers(List users) { + return complete(createUsersAsync(users)); + } - public ListenableFuture createUsersAsync(List users) { - return submit(req("POST", cnst("/users/create_many.json"), JSON, json( - Collections.singletonMap("users", users))), handleJobStatus()); - } + public ListenableFuture createUsersAsync(List users) { + return submit( + req( + "POST", + cnst("/users/create_many.json"), + JSON, + json(Collections.singletonMap("users", users))), + handleJobStatus()); + } - public User createOrUpdateUser(User user) { - return complete(submit(req("POST", cnst("/users/create_or_update.json"), JSON, json( - Collections.singletonMap("user", user))), handle(User.class, "user"))); - } + public User createOrUpdateUser(User user) { + return complete( + submit( + req( + "POST", + cnst("/users/create_or_update.json"), + JSON, + json(Collections.singletonMap("user", user))), + handle(User.class, "user"))); + } - public JobStatus createOrUpdateUsers(User... users) { - return createOrUpdateUsers(Arrays.asList(users)); - } + public JobStatus createOrUpdateUsers(User... users) { + return createOrUpdateUsers(Arrays.asList(users)); + } - public JobStatus createOrUpdateUsers(List users) { - return complete(createOrUpdateUsersAsync(users)); - } + public JobStatus createOrUpdateUsers(List users) { + return complete(createOrUpdateUsersAsync(users)); + } - public ListenableFuture createOrUpdateUsersAsync(List users) { - return submit(req("POST", cnst("/users/create_or_update_many.json"), JSON, json( - Collections.singletonMap("users", users))), handleJobStatus()); - } + public ListenableFuture createOrUpdateUsersAsync(List users) { + return submit( + req( + "POST", + cnst("/users/create_or_update_many.json"), + JSON, + json(Collections.singletonMap("users", users))), + handleJobStatus()); + } - public User updateUser(User user) { - checkHasId(user); - return complete(submit(req("PUT", tmpl("/users/{id}.json").set("id", user.getId()), JSON, json( - Collections.singletonMap("user", user))), handle(User.class, "user"))); - } + public User updateUser(User user) { + checkHasId(user); + return complete( + submit( + req( + "PUT", + tmpl("/users/{id}.json").set("id", user.getId()), + JSON, + json(Collections.singletonMap("user", user))), + handle(User.class, "user"))); + } - public JobStatus updateUsers(User... users) { - return updateUsers(Arrays.asList(users)); - } + public JobStatus updateUsers(User... users) { + return updateUsers(Arrays.asList(users)); + } - public JobStatus updateUsers(List users) { - return complete(updateUsersAsync(users)); - } + public JobStatus updateUsers(List users) { + return complete(updateUsersAsync(users)); + } - public ListenableFuture updateUsersAsync(List users) { - return submit(req("PUT", cnst("/users/update_many.json"), JSON, json( - Collections.singletonMap("users", users))), handleJobStatus()); - } + public ListenableFuture updateUsersAsync(List users) { + return submit( + req( + "PUT", + cnst("/users/update_many.json"), + JSON, + json(Collections.singletonMap("users", users))), + handleJobStatus()); + } - public void deleteUser(User user) { - checkHasId(user); - deleteUser(user.getId()); - } + public void deleteUser(User user) { + checkHasId(user); + deleteUser(user.getId()); + } - public void deleteUser(long id) { - complete(submit(req("DELETE", tmpl("/users/{id}.json").set("id", id)), handleStatus())); - } + public void deleteUser(long id) { + complete(submit(req("DELETE", tmpl("/users/{id}.json").set("id", id)), handleStatus())); + } - public JobStatus deleteUsers(long... ids) { - return complete(submit(req("DELETE", tmpl("/users/destroy_many.json{?ids}").set("ids", ids)), - handleJobStatus())); - } + public JobStatus deleteUsers(long... ids) { + return complete( + submit( + req("DELETE", tmpl("/users/destroy_many.json{?ids}").set("ids", ids)), + handleJobStatus())); + } - public User permanentlyDeleteUser(User user) { - checkHasId(user); - return permanentlyDeleteUser(user.getId()); - } + public User permanentlyDeleteUser(User user) { + checkHasId(user); + return permanentlyDeleteUser(user.getId()); + } - public User permanentlyDeleteUser(long id) { - deleteUser(id); - return complete(submit(req("DELETE", tmpl("/deleted_users/{id}.json").set("id", id)), handle(User.class))); - } + public User permanentlyDeleteUser(long id) { + deleteUser(id); + return complete( + submit(req("DELETE", tmpl("/deleted_users/{id}.json").set("id", id)), handle(User.class))); + } - public User suspendUser(long id) { - User user = new User(); - user.setId(id); - user.setSuspended(true); - return updateUser(user); - } + public User suspendUser(long id) { + User user = new User(); + user.setId(id); + user.setSuspended(true); + return updateUser(user); + } - public User unsuspendUser(long id) { - User user = new User(); - user.setId(id); - user.setSuspended(false); - return updateUser(user); - } + public User unsuspendUser(long id) { + User user = new User(); + user.setId(id); + user.setSuspended(false); + return updateUser(user); + } - public Iterable lookupUserByEmail(String email) { - return new PagedIterable<>(tmpl("/users/search.json{?query}").set("query", email), - handleList(User.class, "users")); - } + public Iterable lookupUserByEmail(String email) { + return new PagedIterable<>( + tmpl("/users/search.json{?query}").set("query", email), handleList(User.class, "users")); + } - public Iterable lookupUserByExternalId(String externalId) { - return new PagedIterable<>(tmpl("/users/search.json{?external_id}").set("external_id", externalId), - handleList(User.class, "users")); - } + public Iterable lookupUserByExternalId(String externalId) { + return new PagedIterable<>( + tmpl("/users/search.json{?external_id}").set("external_id", externalId), + handleList(User.class, "users")); + } - public User getCurrentUser() { - return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); - } + public User getCurrentUser() { + return complete(submit(req("GET", cnst("/users/me.json")), handle(User.class, "user"))); + } - public void resetUserPassword(User user, String password) { - checkHasId(user); - resetUserPassword(user.getId(), password); - } + public void resetUserPassword(User user, String password) { + checkHasId(user); + resetUserPassword(user.getId(), password); + } - public void resetUserPassword(long id, String password) { - complete(submit(req("POST", tmpl("/users/{id}/password.json").set("id", id), JSON, - json(Collections.singletonMap("password", password))), handleStatus())); - } + public void resetUserPassword(long id, String password) { + complete( + submit( + req( + "POST", + tmpl("/users/{id}/password.json").set("id", id), + JSON, + json(Collections.singletonMap("password", password))), + handleStatus())); + } - public void changeUserPassword(User user, String oldPassword, String newPassword) { - checkHasId(user); - Map req = new HashMap<>(); - req.put("previous_password", oldPassword); - req.put("password", newPassword); - complete(submit(req("PUT", tmpl("/users/{id}/password.json").set("id", user.getId()), JSON, - json(req)), handleStatus())); - } + public void changeUserPassword(User user, String oldPassword, String newPassword) { + checkHasId(user); + Map req = new HashMap<>(); + req.put("previous_password", oldPassword); + req.put("password", newPassword); + complete( + submit( + req("PUT", tmpl("/users/{id}/password.json").set("id", user.getId()), JSON, json(req)), + handleStatus())); + } - public List getUserIdentities(User user) { - checkHasId(user); - return getUserIdentities(user.getId()); - } + public List getUserIdentities(User user) { + checkHasId(user); + return getUserIdentities(user.getId()); + } - public List getUserIdentities(long userId) { - return complete(submit(req("GET", tmpl("/users/{id}/identities.json").set("id", userId)), - handleList(Identity.class, "identities"))); - } + public List getUserIdentities(long userId) { + return complete( + submit( + req("GET", tmpl("/users/{id}/identities.json").set("id", userId)), + handleList(Identity.class, "identities"))); + } - public Identity getUserIdentity(User user, Identity identity) { - checkHasId(identity); - return getUserIdentity(user, identity.getId()); - } + public Identity getUserIdentity(User user, Identity identity) { + checkHasId(identity); + return getUserIdentity(user, identity.getId()); + } - public Identity getUserIdentity(User user, long identityId) { - checkHasId(user); - return getUserIdentity(user.getId(), identityId); - } + public Identity getUserIdentity(User user, long identityId) { + checkHasId(user); + return getUserIdentity(user.getId(), identityId); + } - public Identity getUserIdentity(long userId, long identityId) { - return complete(submit(req("GET", tmpl("/users/{userId}/identities/{identityId}.json").set("userId", userId) - .set("identityId", identityId)), handle( - Identity.class, "identity"))); - } + public Identity getUserIdentity(long userId, long identityId) { + return complete( + submit( + req( + "GET", + tmpl("/users/{userId}/identities/{identityId}.json") + .set("userId", userId) + .set("identityId", identityId)), + handle(Identity.class, "identity"))); + } - public List setUserPrimaryIdentity(User user, Identity identity) { - checkHasId(identity); - return setUserPrimaryIdentity(user, identity.getId()); - } + public List setUserPrimaryIdentity(User user, Identity identity) { + checkHasId(identity); + return setUserPrimaryIdentity(user, identity.getId()); + } - public List setUserPrimaryIdentity(User user, long identityId) { - checkHasId(user); - return setUserPrimaryIdentity(user.getId(), identityId); - } + public List setUserPrimaryIdentity(User user, long identityId) { + checkHasId(user); + return setUserPrimaryIdentity(user.getId(), identityId); + } - public List setUserPrimaryIdentity(long userId, long identityId) { - return complete(submit(req("PUT", - tmpl("/users/{userId}/identities/{identityId}/make_primary.json").set("userId", userId) - .set("identityId", identityId), JSON, null), - handleList(Identity.class, "identities"))); - } + public List setUserPrimaryIdentity(long userId, long identityId) { + return complete( + submit( + req( + "PUT", + tmpl("/users/{userId}/identities/{identityId}/make_primary.json") + .set("userId", userId) + .set("identityId", identityId), + JSON, + null), + handleList(Identity.class, "identities"))); + } - public Identity verifyUserIdentity(User user, Identity identity) { - checkHasId(identity); - return verifyUserIdentity(user, identity.getId()); - } + public Identity verifyUserIdentity(User user, Identity identity) { + checkHasId(identity); + return verifyUserIdentity(user, identity.getId()); + } - public Identity verifyUserIdentity(User user, long identityId) { - checkHasId(user); - return verifyUserIdentity(user.getId(), identityId); - } + public Identity verifyUserIdentity(User user, long identityId) { + checkHasId(user); + return verifyUserIdentity(user.getId(), identityId); + } - public Identity verifyUserIdentity(long userId, long identityId) { - return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/verify.json") - .set("userId", userId) - .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); - } + public Identity verifyUserIdentity(long userId, long identityId) { + return complete( + submit( + req( + "PUT", + tmpl("/users/{userId}/identities/{identityId}/verify.json") + .set("userId", userId) + .set("identityId", identityId), + JSON, + null), + handle(Identity.class, "identity"))); + } - public Identity requestVerifyUserIdentity(User user, Identity identity) { - checkHasId(identity); - return requestVerifyUserIdentity(user, identity.getId()); - } + public Identity requestVerifyUserIdentity(User user, Identity identity) { + checkHasId(identity); + return requestVerifyUserIdentity(user, identity.getId()); + } - public Identity requestVerifyUserIdentity(User user, long identityId) { - checkHasId(user); - return requestVerifyUserIdentity(user.getId(), identityId); - } + public Identity requestVerifyUserIdentity(User user, long identityId) { + checkHasId(user); + return requestVerifyUserIdentity(user.getId(), identityId); + } - public Identity requestVerifyUserIdentity(long userId, long identityId) { - return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}/request_verification.json") - .set("userId", userId) - .set("identityId", identityId), JSON, null), handle(Identity.class, "identity"))); - } + public Identity requestVerifyUserIdentity(long userId, long identityId) { + return complete( + submit( + req( + "PUT", + tmpl("/users/{userId}/identities/{identityId}/request_verification.json") + .set("userId", userId) + .set("identityId", identityId), + JSON, + null), + handle(Identity.class, "identity"))); + } - public Identity updateUserIdentity(long userId, Identity identity) { - checkHasId(identity); - return complete(submit(req("PUT", tmpl("/users/{userId}/identities/{identityId}.json") - .set("userId", userId) - .set("identityId", identity.getId()), JSON, json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); - } + public Identity updateUserIdentity(long userId, Identity identity) { + checkHasId(identity); + return complete( + submit( + req( + "PUT", + tmpl("/users/{userId}/identities/{identityId}.json") + .set("userId", userId) + .set("identityId", identity.getId()), + JSON, + json(Collections.singletonMap("identity", identity))), + handle(Identity.class, "identity"))); + } - public Identity updateUserIdentity(User user, Identity identity) { - checkHasId(user); - return updateUserIdentity(user.getId(), identity); - } + public Identity updateUserIdentity(User user, Identity identity) { + checkHasId(user); + return updateUserIdentity(user.getId(), identity); + } - public void deleteUserIdentity(User user, Identity identity) { - checkHasId(identity); - deleteUserIdentity(user, identity.getId()); - } + public void deleteUserIdentity(User user, Identity identity) { + checkHasId(identity); + deleteUserIdentity(user, identity.getId()); + } - public void deleteUserIdentity(User user, long identityId) { - checkHasId(user); - deleteUserIdentity(user.getId(), identityId); - } + public void deleteUserIdentity(User user, long identityId) { + checkHasId(user); + deleteUserIdentity(user.getId(), identityId); + } - public void deleteUserIdentity(long userId, long identityId) { - complete(submit(req("DELETE", tmpl("/users/{userId}/identities/{identityId}.json") - .set("userId", userId) - .set("identityId", identityId) - ), handleStatus())); - } + public void deleteUserIdentity(long userId, long identityId) { + complete( + submit( + req( + "DELETE", + tmpl("/users/{userId}/identities/{identityId}.json") + .set("userId", userId) + .set("identityId", identityId)), + handleStatus())); + } - public Identity createUserIdentity(long userId, Identity identity) { - return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", userId), JSON, - json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); - } + public Identity createUserIdentity(long userId, Identity identity) { + return complete( + submit( + req( + "POST", + tmpl("/users/{userId}/identities.json").set("userId", userId), + JSON, + json(Collections.singletonMap("identity", identity))), + handle(Identity.class, "identity"))); + } - public Identity createUserIdentity(User user, Identity identity) { - return complete(submit(req("POST", tmpl("/users/{userId}/identities.json").set("userId", user.getId()), JSON, - json(Collections.singletonMap("identity", identity))), handle(Identity.class, "identity"))); - } + public Identity createUserIdentity(User user, Identity identity) { + return complete( + submit( + req( + "POST", + tmpl("/users/{userId}/identities.json").set("userId", user.getId()), + JSON, + json(Collections.singletonMap("identity", identity))), + handle(Identity.class, "identity"))); + } - public Iterable getCustomAgentRoles() { - return new PagedIterable<>(cnst("/custom_roles.json"), - handleList(AgentRole.class, "custom_roles")); - } + public Iterable getCustomAgentRoles() { + return new PagedIterable<>( + cnst("/custom_roles.json"), handleList(AgentRole.class, "custom_roles")); + } - public Iterable getRequests() { - return new PagedIterable<>(cnst("/requests.json"), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getRequests() { + return new PagedIterable<>( + cnst("/requests.json"), handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public Iterable getOpenRequests() { - return new PagedIterable<>(cnst("/requests/open.json"), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getOpenRequests() { + return new PagedIterable<>( + cnst("/requests/open.json"), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public Iterable getSolvedRequests() { - return new PagedIterable<>(cnst("/requests/solved.json"), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getSolvedRequests() { + return new PagedIterable<>( + cnst("/requests/solved.json"), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public Iterable getCCRequests() { - return new PagedIterable<>(cnst("/requests/ccd.json"), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getCCRequests() { + return new PagedIterable<>( + cnst("/requests/ccd.json"), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public Iterable getUserRequests(User user) { - checkHasId(user); - return getUserRequests(user.getId()); - } + public Iterable getUserRequests(User user) { + checkHasId(user); + return getUserRequests(user.getId()); + } - public Iterable getUserRequests(long id) { - return new PagedIterable<>(tmpl("/users/{id}/requests.json").set("id", id), - handleList(org.zendesk.client.v2.model.Request.class, "requests")); - } + public Iterable getUserRequests(long id) { + return new PagedIterable<>( + tmpl("/users/{id}/requests.json").set("id", id), + handleList(org.zendesk.client.v2.model.Request.class, "requests")); + } - public org.zendesk.client.v2.model.Request getRequest(long id) { - return complete(submit(req("GET", tmpl("/requests/{id}.json").set("id", id)), - handle(org.zendesk.client.v2.model.Request.class, "request"))); - } + public org.zendesk.client.v2.model.Request getRequest(long id) { + return complete( + submit( + req("GET", tmpl("/requests/{id}.json").set("id", id)), + handle(org.zendesk.client.v2.model.Request.class, "request"))); + } - public org.zendesk.client.v2.model.Request createRequest(org.zendesk.client.v2.model.Request request) { - return complete(submit(req("POST", cnst("/requests.json"), - JSON, json(Collections.singletonMap("request", request))), - handle(org.zendesk.client.v2.model.Request.class, "request"))); - } + public org.zendesk.client.v2.model.Request createRequest( + org.zendesk.client.v2.model.Request request) { + return complete( + submit( + req( + "POST", + cnst("/requests.json"), + JSON, + json(Collections.singletonMap("request", request))), + handle(org.zendesk.client.v2.model.Request.class, "request"))); + } - public org.zendesk.client.v2.model.Request updateRequest(org.zendesk.client.v2.model.Request request) { - checkHasId(request); - return complete(submit(req("PUT", tmpl("/requests/{id}.json").set("id", request.getId()), - JSON, json(Collections.singletonMap("request", request))), - handle(org.zendesk.client.v2.model.Request.class, "request"))); - } + public org.zendesk.client.v2.model.Request updateRequest( + org.zendesk.client.v2.model.Request request) { + checkHasId(request); + return complete( + submit( + req( + "PUT", + tmpl("/requests/{id}.json").set("id", request.getId()), + JSON, + json(Collections.singletonMap("request", request))), + handle(org.zendesk.client.v2.model.Request.class, "request"))); + } - public Iterable getRequestComments(org.zendesk.client.v2.model.Request request) { - checkHasId(request); - return getRequestComments(request.getId()); - } + public Iterable getRequestComments(org.zendesk.client.v2.model.Request request) { + checkHasId(request); + return getRequestComments(request.getId()); + } - public Iterable getRequestComments(long id) { - return new PagedIterable<>(tmpl("/requests/{id}/comments.json").set("id", id), - handleList(Comment.class, "comments")); - } + public Iterable getRequestComments(long id) { + return new PagedIterable<>( + tmpl("/requests/{id}/comments.json").set("id", id), handleList(Comment.class, "comments")); + } - public Iterable getTicketComments(long id) { - return getTicketComments(id, SortOrder.ASCENDING); - } + public Iterable getTicketComments(long id) { + return getTicketComments(id, SortOrder.ASCENDING); + } - public Iterable getTicketComments(long id, SortOrder order) { - return new PagedIterable<>( - tmpl("/tickets/{id}/comments.json?sort_order={order}") - .set("id", id) - .set("order", order.getQueryParameter()), - handleList(Comment.class, "comments")); - } + public Iterable getTicketComments(long id, SortOrder order) { + return new PagedIterable<>( + tmpl("/tickets/{id}/comments.json?sort_order={order}") + .set("id", id) + .set("order", order.getQueryParameter()), + handleList(Comment.class, "comments")); + } - public Comment getRequestComment(org.zendesk.client.v2.model.Request request, Comment comment) { - checkHasId(comment); - return getRequestComment(request, comment.getId()); - } + public Comment getRequestComment(org.zendesk.client.v2.model.Request request, Comment comment) { + checkHasId(comment); + return getRequestComment(request, comment.getId()); + } - public Comment getRequestComment(org.zendesk.client.v2.model.Request request, long commentId) { - checkHasId(request); - return getRequestComment(request.getId(), commentId); - } + public Comment getRequestComment(org.zendesk.client.v2.model.Request request, long commentId) { + checkHasId(request); + return getRequestComment(request.getId(), commentId); + } - public Comment getRequestComment(long requestId, long commentId) { - return complete(submit(req("GET", tmpl("/requests/{requestId}/comments/{commentId}.json") - .set("requestId", requestId) - .set("commentId", commentId)), - handle(Comment.class, "comment"))); - } + public Comment getRequestComment(long requestId, long commentId) { + return complete( + submit( + req( + "GET", + tmpl("/requests/{requestId}/comments/{commentId}.json") + .set("requestId", requestId) + .set("commentId", commentId)), + handle(Comment.class, "comment"))); + } - public Ticket createComment(long ticketId, Comment comment) { - Ticket ticket = new Ticket(); - ticket.setComment(comment); - return complete(submit(req("PUT", tmpl("/tickets/{id}.json").set("id", ticketId), JSON, - json(Collections.singletonMap("ticket", ticket))), - handle(Ticket.class, "ticket"))); - } + public Ticket createComment(long ticketId, Comment comment) { + Ticket ticket = new Ticket(); + ticket.setComment(comment); + return complete( + submit( + req( + "PUT", + tmpl("/tickets/{id}.json").set("id", ticketId), + JSON, + json(Collections.singletonMap("ticket", ticket))), + handle(Ticket.class, "ticket"))); + } - public Ticket createTicketFromTweet(long tweetId, long monitorId) { - Map map = new HashMap<>(); - map.put("twitter_status_message_id", tweetId); - map.put("monitored_twitter_handle_id", monitorId); + public Ticket createTicketFromTweet(long tweetId, long monitorId) { + Map map = new HashMap<>(); + map.put("twitter_status_message_id", tweetId); + map.put("monitored_twitter_handle_id", monitorId); + + return complete( + submit( + req( + "POST", + cnst("/channels/twitter/tickets.json"), + JSON, + json(Collections.singletonMap("ticket", map))), + handle(Ticket.class, "ticket"))); + } - return complete(submit(req("POST", cnst("/channels/twitter/tickets.json"), JSON, - json(Collections.singletonMap("ticket", map))), - handle(Ticket.class, "ticket"))); - } + public Iterable getOrganizations() { + return new PagedIterable<>( + cnst("/organizations.json"), handleList(Organization.class, "organizations")); + } - public Iterable getOrganizations() { - return new PagedIterable<>(cnst("/organizations.json"), - handleList(Organization.class, "organizations")); - } + public List getOrganizations(long id, long... ids) { + return complete( + submit( + req("GET", tmpl("/organizations/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(Organization.class, "organizations"))); + } - public List getOrganizations(long id, long... ids) { - return complete(submit(req("GET", tmpl("/organizations/show_many.json{?ids}").set("ids", idArray(id, ids))), - handleList(Organization.class, "organizations"))); - } + public Iterable getOrganizationsIncrementally(Date startTime) { + return new PagedIterable<>( + tmpl("/incremental/organizations.json{?start_time}") + .set("start_time", msToSeconds(startTime.getTime())), + handleIncrementalList(Organization.class, "organizations")); + } - public Iterable getOrganizationsIncrementally(Date startTime) { - return new PagedIterable<>( - tmpl("/incremental/organizations.json{?start_time}") - .set("start_time", msToSeconds(startTime.getTime())), - handleIncrementalList(Organization.class, "organizations")); - } + public Iterable getOrganizationFields() { + // The organization_fields api doesn't seem to support paging + return complete( + submit( + req("GET", cnst("/organization_fields.json")), + handleList(OrganizationField.class, "organization_fields"))); + } - public Iterable getOrganizationFields() { - //The organization_fields api doesn't seem to support paging - return complete(submit(req("GET", cnst("/organization_fields.json")), - handleList(OrganizationField.class, "organization_fields"))); + public Iterable getAutoCompleteOrganizations(String name) { + if (name == null || name.length() < 2) { + throw new IllegalArgumentException("Name must be at least 2 characters long"); } + return new PagedIterable<>( + tmpl("/organizations/autocomplete.json{?name}").set("name", name), + handleList(Organization.class, "organizations")); + } - public Iterable getAutoCompleteOrganizations(String name) { - if (name == null || name.length() < 2) { - throw new IllegalArgumentException("Name must be at least 2 characters long"); - } - return new PagedIterable<>(tmpl("/organizations/autocomplete.json{?name}").set("name", name), - handleList(Organization.class, "organizations")); - } + // TODO getOrganizationRelatedInformation - // TODO getOrganizationRelatedInformation + public Organization getOrganization(long id) { + return complete( + submit( + req("GET", tmpl("/organizations/{id}.json").set("id", id)), + handle(Organization.class, "organization"))); + } - public Organization getOrganization(long id) { - return complete(submit(req("GET", tmpl("/organizations/{id}.json").set("id", id)), - handle(Organization.class, "organization"))); - } + public Organization createOrganization(Organization organization) { + return complete( + submit( + req( + "POST", + cnst("/organizations.json"), + JSON, + json(Collections.singletonMap("organization", organization))), + handle(Organization.class, "organization"))); + } - public Organization createOrganization(Organization organization) { - return complete(submit(req("POST", cnst("/organizations.json"), JSON, json( - Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); - } + public JobStatus createOrganizations(Organization... organizations) { + return createOrganizations(Arrays.asList(organizations)); + } - public JobStatus createOrganizations(Organization... organizations) { - return createOrganizations(Arrays.asList(organizations)); - } + public JobStatus createOrganizations(List organizations) { + return complete(createOrganizationsAsync(organizations)); + } - public JobStatus createOrganizations(List organizations) { - return complete(createOrganizationsAsync(organizations)); - } + public ListenableFuture createOrganizationsAsync(List organizations) { + return submit( + req( + "POST", + cnst("/organizations/create_many.json"), + JSON, + json(Collections.singletonMap("organizations", organizations))), + handleJobStatus()); + } - public ListenableFuture createOrganizationsAsync(List organizations) { - return submit(req("POST", cnst("/organizations/create_many.json"), JSON, json( - Collections.singletonMap("organizations", organizations))), handleJobStatus()); - } + public Organization createOrUpdateOrganization(Organization organization) { + return complete( + submit( + req( + "POST", + cnst("/organizations/create_or_update.json"), + JSON, + json(Collections.singletonMap("organization", organization))), + handle(Organization.class, "organization"))); + } - public Organization createOrUpdateOrganization(Organization organization) { - return complete(submit(req("POST", cnst("/organizations/create_or_update.json"), JSON, json( - Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); - } + public Organization updateOrganization(Organization organization) { + checkHasId(organization); + return complete( + submit( + req( + "PUT", + tmpl("/organizations/{id}.json").set("id", organization.getId()), + JSON, + json(Collections.singletonMap("organization", organization))), + handle(Organization.class, "organization"))); + } - public Organization updateOrganization(Organization organization) { - checkHasId(organization); - return complete(submit(req("PUT", tmpl("/organizations/{id}.json").set("id", organization.getId()), JSON, json( - Collections.singletonMap("organization", organization))), handle(Organization.class, "organization"))); - } + public JobStatus updateOrganizations(Organization... organizations) { + return updateOrganizations(Arrays.asList(organizations)); + } - public JobStatus updateOrganizations(Organization... organizations) { - return updateOrganizations(Arrays.asList(organizations)); - } + public JobStatus updateOrganizations(List organizations) { + return complete(updateOrganizationsAsync(organizations)); + } - public JobStatus updateOrganizations(List organizations) { - return complete(updateOrganizationsAsync(organizations)); - } + public ListenableFuture updateOrganizationsAsync(List organizations) { + return submit( + req( + "PUT", + cnst("/organizations/update_many.json"), + JSON, + json(Collections.singletonMap("organizations", organizations))), + handleJobStatus()); + } - public ListenableFuture updateOrganizationsAsync(List organizations) { - return submit(req("PUT", cnst("/organizations/update_many.json"), JSON, json( - Collections.singletonMap("organizations", organizations))), handleJobStatus()); - } + public void deleteOrganization(Organization organization) { + checkHasId(organization); + deleteOrganization(organization.getId()); + } - public void deleteOrganization(Organization organization) { - checkHasId(organization); - deleteOrganization(organization.getId()); - } + public void deleteOrganization(long id) { + complete(submit(req("DELETE", tmpl("/organizations/{id}.json").set("id", id)), handleStatus())); + } - public void deleteOrganization(long id) { - complete(submit(req("DELETE", tmpl("/organizations/{id}.json").set("id", id)), handleStatus())); - } + public JobStatus deleteOrganizations(long... ids) { + return complete( + submit( + req("DELETE", tmpl("/organizations/destroy_many.json{?ids}").set("ids", ids)), + handleJobStatus())); + } - public JobStatus deleteOrganizations(long... ids) { - return complete(submit(req("DELETE", tmpl("/organizations/destroy_many.json{?ids}").set("ids", ids)), - handleJobStatus())); + public Iterable lookupOrganizationsByExternalId(String externalId) { + if (externalId == null || externalId.length() == 0) { + throw new IllegalArgumentException("External ID must not be null or length 0"); } + return new PagedIterable<>( + tmpl("/organizations/search.json{?external_id}").set("external_id", externalId), + handleList(Organization.class, "organizations")); + } - public Iterable lookupOrganizationsByExternalId(String externalId) { - if (externalId == null || externalId.length() == 0) { - throw new IllegalArgumentException("External ID must not be null or length 0"); - } - return new PagedIterable<>( - tmpl("/organizations/search.json{?external_id}").set("external_id", externalId), - handleList(Organization.class, "organizations")); - } + public Iterable getOrganizationMemberships() { + return new PagedIterable<>( + cnst("/organization_memberships.json"), + handleList(OrganizationMembership.class, "organization_memberships")); + } - public Iterable getOrganizationMemberships() { - return new PagedIterable<>(cnst("/organization_memberships.json"), - handleList(OrganizationMembership.class, "organization_memberships")); - } + public Iterable getOrganizationMembershipsForOrg(long organization_id) { + return new PagedIterable<>( + tmpl("/organizations/{organization_id}/organization_memberships.json") + .set("organization_id", organization_id), + handleList(OrganizationMembership.class, "organization_memberships")); + } - public Iterable getOrganizationMembershipsForOrg(long organization_id) { - return new PagedIterable<>(tmpl("/organizations/{organization_id}/organization_memberships.json") - .set("organization_id", organization_id), - handleList(OrganizationMembership.class, "organization_memberships")); - } + public Iterable getOrganizationMembershipsForUser(long user_id) { + return new PagedIterable<>( + tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id), + handleList(OrganizationMembership.class, "organization_memberships")); + } - public Iterable getOrganizationMembershipsForUser(long user_id) { - return new PagedIterable<>(tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id), - handleList(OrganizationMembership.class, "organization_memberships")); - } + public OrganizationMembership getOrganizationMembershipForUser(long user_id, long id) { + return complete( + submit( + req( + "GET", + tmpl("/users/{user_id}/organization_memberships/{id}.json") + .set("user_id", user_id) + .set("id", id)), + handle(OrganizationMembership.class, "organization_membership"))); + } - public OrganizationMembership getOrganizationMembershipForUser(long user_id, long id) { - return complete(submit(req("GET", - tmpl("/users/{user_id}/organization_memberships/{id}.json").set("user_id", user_id).set("id", id)), - handle(OrganizationMembership.class, "organization_membership"))); - } + public OrganizationMembership getOrganizationMembership(long id) { + return complete( + submit( + req("GET", tmpl("/organization_memberships/{id}.json").set("id", id)), + handle(OrganizationMembership.class, "organization_membership"))); + } - public OrganizationMembership getOrganizationMembership(long id) { - return complete(submit(req("GET", - tmpl("/organization_memberships/{id}.json").set("id", id)), - handle(OrganizationMembership.class, "organization_membership"))); - } + public OrganizationMembership createOrganizationMembership( + OrganizationMembership organizationMembership) { + return complete( + submit( + req( + "POST", + cnst("/organization_memberships.json"), + JSON, + json(Collections.singletonMap("organization_membership", organizationMembership))), + handle(OrganizationMembership.class, "organization_membership"))); + } - public OrganizationMembership createOrganizationMembership(OrganizationMembership organizationMembership) { - return complete(submit(req("POST", - cnst("/organization_memberships.json"), JSON, json( - Collections.singletonMap("organization_membership", - organizationMembership))), handle(OrganizationMembership.class, "organization_membership"))); - } + /** + * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships + */ + public JobStatus createOrganizationMemberships( + OrganizationMembership... organizationMemberships) { + return createOrganizationMemberships(Arrays.asList(organizationMemberships)); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships - */ - public JobStatus createOrganizationMemberships(OrganizationMembership... organizationMemberships) { - return createOrganizationMemberships(Arrays.asList(organizationMemberships)); - } + /** + * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships + */ + public JobStatus createOrganizationMemberships( + List organizationMemberships) { + return complete(createOrganizationMembershipsAsync(organizationMemberships)); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships - */ - public JobStatus createOrganizationMemberships(List organizationMemberships) { - return complete(createOrganizationMembershipsAsync(organizationMemberships)); - } + /** + * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships + */ + public ListenableFuture createOrganizationMembershipsAsync( + List organizationMemberships) { + return submit( + req( + "POST", + cnst("/organization_memberships/create_many.json"), + JSON, + json(Collections.singletonMap("organization_memberships", organizationMemberships))), + handleJobStatus()); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships - */ - public ListenableFuture createOrganizationMembershipsAsync( - List organizationMemberships) { - return submit(req("POST", cnst("/organization_memberships/create_many.json"), JSON, json( - Collections.singletonMap("organization_memberships", organizationMemberships))), handleJobStatus()); - } + public void deleteOrganizationMembership(long id) { + complete( + submit( + req("DELETE", tmpl("/organization_memberships/{id}.json").set("id", id)), + handleStatus())); + } - public void deleteOrganizationMembership(long id) { - complete(submit(req("DELETE", tmpl("/organization_memberships/{id}.json").set("id", id)), handleStatus())); - } + /** + * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#bulk-delete-memberships + */ + public void deleteOrganizationMemberships(long id, long... ids) { + complete( + submit( + req( + "DELETE", + tmpl("/organization_memberships/destroy_many.json{?ids}") + .set("ids", idArray(id, ids))), + handleStatus())); + } - /** - * https://developer.zendesk.com/rest_api/docs/support/organization_memberships#bulk-delete-memberships - */ - public void deleteOrganizationMemberships(long id, long... ids) { - complete(submit(req("DELETE", tmpl("/organization_memberships/destroy_many.json{?ids}").set("ids", idArray(id, ids))), - handleStatus())); - } - - public Iterable getGroups() { - return new PagedIterable<>(cnst("/groups.json"), - handleList(Group.class, "groups")); - } + public Iterable getGroups() { + return new PagedIterable<>(cnst("/groups.json"), handleList(Group.class, "groups")); + } - public Iterable getAssignableGroups() { - return new PagedIterable<>(cnst("/groups/assignable.json"), - handleList(Group.class, "groups")); - } + public Iterable getAssignableGroups() { + return new PagedIterable<>(cnst("/groups/assignable.json"), handleList(Group.class, "groups")); + } - public Group getGroup(long id) { - return complete(submit(req("GET", tmpl("/groups/{id}.json").set("id", id)), - handle(Group.class, "group"))); - } + public Group getGroup(long id) { + return complete( + submit(req("GET", tmpl("/groups/{id}.json").set("id", id)), handle(Group.class, "group"))); + } - public Group createGroup(Group group) { - return complete(submit(req("POST", cnst("/groups.json"), JSON, json( - Collections.singletonMap("group", group))), handle(Group.class, "group"))); - } + public Group createGroup(Group group) { + return complete( + submit( + req("POST", cnst("/groups.json"), JSON, json(Collections.singletonMap("group", group))), + handle(Group.class, "group"))); + } - /** - * This API will be removed in a future release. The API endpoint does not exist. - * Instead, the {@link #createGroup(Group) createGroup} method should be called for each Group - * - * @see Zendesk Java Client Issue #111 - */ - @Deprecated - public List createGroups(Group... groups) { - return createGroups(Arrays.asList(groups)); - } + /** + * This API will be removed in a future release. The API endpoint does not exist. Instead, the + * {@link #createGroup(Group) createGroup} method should be called for each Group + * + * @see Zendesk Java Client + * Issue #111 + */ + @Deprecated + public List createGroups(Group... groups) { + return createGroups(Arrays.asList(groups)); + } - /** - * This API will be removed in a future release. The API endpoint does not exist. - * Instead, the {@link #createGroup(Group) createGroup} method should be called for each Group - * - * @see Zendesk Java Client Issue #111 - */ - @Deprecated - public List createGroups(List groups) { - throw new ZendeskException("API Endpoint for createGroups does not exist."); - } + /** + * This API will be removed in a future release. The API endpoint does not exist. Instead, the + * {@link #createGroup(Group) createGroup} method should be called for each Group + * + * @see Zendesk Java Client + * Issue #111 + */ + @Deprecated + public List createGroups(List groups) { + throw new ZendeskException("API Endpoint for createGroups does not exist."); + } - public Group updateGroup(Group group) { - checkHasId(group); - return complete(submit(req("PUT", tmpl("/groups/{id}.json").set("id", group.getId()), JSON, json( - Collections.singletonMap("group", group))), handle(Group.class, "group"))); - } + public Group updateGroup(Group group) { + checkHasId(group); + return complete( + submit( + req( + "PUT", + tmpl("/groups/{id}.json").set("id", group.getId()), + JSON, + json(Collections.singletonMap("group", group))), + handle(Group.class, "group"))); + } - public void deleteGroup(Group group) { - checkHasId(group); - deleteGroup(group.getId()); - } + public void deleteGroup(Group group) { + checkHasId(group); + deleteGroup(group.getId()); + } - public void deleteGroup(long id) { - complete(submit(req("DELETE", tmpl("/groups/{id}.json").set("id", id)), handleStatus())); - } + public void deleteGroup(long id) { + complete(submit(req("DELETE", tmpl("/groups/{id}.json").set("id", id)), handleStatus())); + } - public Iterable getMacros(){ - return new PagedIterable<>(cnst("/macros.json"), - handleList(Macro.class, "macros")); - } + public Iterable getMacros() { + return new PagedIterable<>(cnst("/macros.json"), handleList(Macro.class, "macros")); + } - public Macro getMacro(long macroId){ + public Macro getMacro(long macroId) { - return complete(submit(req("GET", tmpl("/macros/{id}.json").set("id", macroId)), handle(Macro.class, "macro"))); + return complete( + submit( + req("GET", tmpl("/macros/{id}.json").set("id", macroId)), + handle(Macro.class, "macro"))); } public Macro createMacro(Macro macro) { - return complete(submit( - req("POST", cnst("/macros.json"), JSON, json(Collections.singletonMap("macro", macro))), - handle(Macro.class, "macro"))); + return complete( + submit( + req("POST", cnst("/macros.json"), JSON, json(Collections.singletonMap("macro", macro))), + handle(Macro.class, "macro"))); } public Macro updateMacro(Long macroId, Macro macro) { - return complete(submit(req("PUT", tmpl("/macros/{id}.json").set("id", macroId), JSON, - json(Collections.singletonMap("macro", macro))), handle(Macro.class, "macro"))); + return complete( + submit( + req( + "PUT", + tmpl("/macros/{id}.json").set("id", macroId), + JSON, + json(Collections.singletonMap("macro", macro))), + handle(Macro.class, "macro"))); } + public Ticket macrosShowChangesToTicket(long macroId) { + return complete( + submit( + req("GET", tmpl("/macros/{id}/apply.json").set("id", macroId)), + handle(TicketResult.class, "result"))) + .getTicket(); + } - public Ticket macrosShowChangesToTicket(long macroId) { - return complete(submit(req("GET", tmpl("/macros/{id}/apply.json").set("id", macroId)), - handle(TicketResult.class, "result"))).getTicket(); - } - - public Ticket macrosShowTicketAfterChanges(long ticketId, long macroId) { - return complete(submit(req("GET", tmpl("/tickets/{ticket_id}/macros/{id}/apply.json") + public Ticket macrosShowTicketAfterChanges(long ticketId, long macroId) { + return complete( + submit( + req( + "GET", + tmpl("/tickets/{ticket_id}/macros/{id}/apply.json") .set("ticket_id", ticketId) .set("id", macroId)), - handle(TicketResult.class, "result"))).getTicket(); - } + handle(TicketResult.class, "result"))) + .getTicket(); + } - public List addTagToTicket(long id, String... tags) { - return complete(submit( - req("PUT", tmpl("/tickets/{id}/tags.json").set("id", id), JSON, - json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List addTagToTicket(long id, String... tags) { + return complete( + submit( + req( + "PUT", + tmpl("/tickets/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List addTagToTopics(long id, String... tags) { - return complete(submit( - req("PUT", tmpl("/topics/{id}/tags.json").set("id", id), JSON, - json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List addTagToTopics(long id, String... tags) { + return complete( + submit( + req( + "PUT", + tmpl("/topics/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List addTagToOrganisations(long id, String... tags) { - return complete(submit( - req("PUT", tmpl("/organizations/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List addTagToOrganisations(long id, String... tags) { + return complete( + submit( + req( + "PUT", + tmpl("/organizations/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List setTagOnTicket(long id, String... tags) { - return complete(submit( - req("POST", tmpl("/tickets/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List setTagOnTicket(long id, String... tags) { + return complete( + submit( + req( + "POST", + tmpl("/tickets/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List setTagOnTopics(long id, String... tags) { - return complete(submit( - req("POST", tmpl("/topics/{id}/tags.json").set("id", id), JSON, - json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List setTagOnTopics(long id, String... tags) { + return complete( + submit( + req( + "POST", + tmpl("/topics/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List setTagOnOrganisations(long id, String... tags) { - return complete(submit( - req("POST", - tmpl("/organizations/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List setTagOnOrganisations(long id, String... tags) { + return complete( + submit( + req( + "POST", + tmpl("/organizations/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List removeTagFromTicket(long id, String... tags) { - return complete(submit( - req("DELETE", tmpl("/tickets/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List removeTagFromTicket(long id, String... tags) { + return complete( + submit( + req( + "DELETE", + tmpl("/tickets/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List removeTagFromTopics(long id, String... tags) { - return complete(submit( - req("DELETE", tmpl("/topics/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List removeTagFromTopics(long id, String... tags) { + return complete( + submit( + req( + "DELETE", + tmpl("/topics/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public List removeTagFromOrganisations(long id, String... tags) { - return complete(submit( - req("DELETE", - tmpl("/organizations/{id}/tags.json").set("id", id), - JSON, json(Collections.singletonMap("tags", tags))), - handle(List.class, "tags"))); - } + public List removeTagFromOrganisations(long id, String... tags) { + return complete( + submit( + req( + "DELETE", + tmpl("/organizations/{id}/tags.json").set("id", id), + JSON, + json(Collections.singletonMap("tags", tags))), + handle(List.class, "tags"))); + } - public Map getIncrementalTicketsResult(long unixEpochTime) { - return complete(submit( - req("GET", - tmpl("/exports/tickets.json?start_time={time}").set( - "time", unixEpochTime)), handle(Map.class))); - } + public Map getIncrementalTicketsResult(long unixEpochTime) { + return complete( + submit( + req("GET", tmpl("/exports/tickets.json?start_time={time}").set("time", unixEpochTime)), + handle(Map.class))); + } - public Iterable getGroupMemberships() { - return new PagedIterable<>(cnst("/group_memberships.json"), - handleList(GroupMembership.class, "group_memberships")); - } + public Iterable getGroupMemberships() { + return new PagedIterable<>( + cnst("/group_memberships.json"), handleList(GroupMembership.class, "group_memberships")); + } - public List getGroupMembershipByUser(long user_id) { - return complete(submit(req("GET", tmpl("/users/{user_id}/group_memberships.json").set("user_id", user_id)), - handleList(GroupMembership.class, "group_memberships"))); - } + public List getGroupMembershipByUser(long user_id) { + return complete( + submit( + req("GET", tmpl("/users/{user_id}/group_memberships.json").set("user_id", user_id)), + handleList(GroupMembership.class, "group_memberships"))); + } - public List getGroupMemberships(long group_id) { - return complete(submit(req("GET", tmpl("/groups/{group_id}/memberships.json").set("group_id", group_id)), - handleList(GroupMembership.class, "group_memberships"))); - } + public List getGroupMemberships(long group_id) { + return complete( + submit( + req("GET", tmpl("/groups/{group_id}/memberships.json").set("group_id", group_id)), + handleList(GroupMembership.class, "group_memberships"))); + } - public Iterable getAssignableGroupMemberships() { - return new PagedIterable<>(cnst("/group_memberships/assignable.json"), - handleList(GroupMembership.class, "group_memberships")); - } + public Iterable getAssignableGroupMemberships() { + return new PagedIterable<>( + cnst("/group_memberships/assignable.json"), + handleList(GroupMembership.class, "group_memberships")); + } - public List getAssignableGroupMemberships(long group_id) { - return complete(submit(req("GET", - tmpl("/groups/{group_id}/memberships/assignable.json").set("group_id", group_id)), - handleList(GroupMembership.class, "group_memberships"))); - } + public List getAssignableGroupMemberships(long group_id) { + return complete( + submit( + req( + "GET", + tmpl("/groups/{group_id}/memberships/assignable.json").set("group_id", group_id)), + handleList(GroupMembership.class, "group_memberships"))); + } - public GroupMembership getGroupMembership(long id) { - return complete(submit(req("GET", tmpl("/group_memberships/{id}.json").set("id", id)), - handle(GroupMembership.class, "group_membership"))); - } + public GroupMembership getGroupMembership(long id) { + return complete( + submit( + req("GET", tmpl("/group_memberships/{id}.json").set("id", id)), + handle(GroupMembership.class, "group_membership"))); + } - public GroupMembership getGroupMembership(long user_id, long group_membership_id) { - return complete(submit(req("GET", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) - .set("gmid", group_membership_id)), - handle(GroupMembership.class, "group_membership"))); - } + public GroupMembership getGroupMembership(long user_id, long group_membership_id) { + return complete( + submit( + req( + "GET", + tmpl("/users/{uid}/group_memberships/{gmid}.json") + .set("uid", user_id) + .set("gmid", group_membership_id)), + handle(GroupMembership.class, "group_membership"))); + } - public GroupMembership createGroupMembership(GroupMembership groupMembership) { - return complete(submit(req("POST", cnst("/group_memberships.json"), JSON, json( - Collections.singletonMap("group_membership", groupMembership))), - handle(GroupMembership.class, "group_membership"))); - } + public GroupMembership createGroupMembership(GroupMembership groupMembership) { + return complete( + submit( + req( + "POST", + cnst("/group_memberships.json"), + JSON, + json(Collections.singletonMap("group_membership", groupMembership))), + handle(GroupMembership.class, "group_membership"))); + } - public GroupMembership createGroupMembership(long user_id, GroupMembership groupMembership) { - return complete(submit(req("POST", tmpl("/users/{id}/group_memberships.json").set("id", user_id), JSON, - json(Collections.singletonMap("group_membership", groupMembership))), - handle(GroupMembership.class, "group_membership"))); - } + public GroupMembership createGroupMembership(long user_id, GroupMembership groupMembership) { + return complete( + submit( + req( + "POST", + tmpl("/users/{id}/group_memberships.json").set("id", user_id), + JSON, + json(Collections.singletonMap("group_membership", groupMembership))), + handle(GroupMembership.class, "group_membership"))); + } - public void deleteGroupMembership(GroupMembership groupMembership) { - checkHasId(groupMembership); - deleteGroupMembership(groupMembership.getId()); - } + public void deleteGroupMembership(GroupMembership groupMembership) { + checkHasId(groupMembership); + deleteGroupMembership(groupMembership.getId()); + } - public void deleteGroupMembership(long id) { - complete(submit(req("DELETE", tmpl("/group_memberships/{id}.json").set("id", id)), handleStatus())); - } + public void deleteGroupMembership(long id) { + complete( + submit(req("DELETE", tmpl("/group_memberships/{id}.json").set("id", id)), handleStatus())); + } - public void deleteGroupMembership(long user_id, GroupMembership groupMembership) { - checkHasId(groupMembership); - deleteGroupMembership(user_id, groupMembership.getId()); - } + public void deleteGroupMembership(long user_id, GroupMembership groupMembership) { + checkHasId(groupMembership); + deleteGroupMembership(user_id, groupMembership.getId()); + } - public void deleteGroupMembership(long user_id, long group_membership_id) { - complete(submit(req("DELETE", tmpl("/users/{uid}/group_memberships/{gmid}.json").set("uid", user_id) - .set("gmid", group_membership_id)), handleStatus())); - } + public void deleteGroupMembership(long user_id, long group_membership_id) { + complete( + submit( + req( + "DELETE", + tmpl("/users/{uid}/group_memberships/{gmid}.json") + .set("uid", user_id) + .set("gmid", group_membership_id)), + handleStatus())); + } - public List setGroupMembershipAsDefault(long user_id, GroupMembership groupMembership) { - checkHasId(groupMembership); - return complete(submit(req("PUT", tmpl("/users/{uid}/group_memberships/{gmid}/make_default.json") - .set("uid", user_id).set("gmid", groupMembership.getId()), JSON, json( - Collections.singletonMap("group_memberships", groupMembership))), - handleList(GroupMembership.class, "results"))); - } + public List setGroupMembershipAsDefault( + long user_id, GroupMembership groupMembership) { + checkHasId(groupMembership); + return complete( + submit( + req( + "PUT", + tmpl("/users/{uid}/group_memberships/{gmid}/make_default.json") + .set("uid", user_id) + .set("gmid", groupMembership.getId()), + JSON, + json(Collections.singletonMap("group_memberships", groupMembership))), + handleList(GroupMembership.class, "results"))); + } - public Iterable getForums() { - return new PagedIterable<>(cnst("/forums.json"), handleList(Forum.class, "forums")); - } + public Iterable getForums() { + return new PagedIterable<>(cnst("/forums.json"), handleList(Forum.class, "forums")); + } - public List getForums(long category_id) { - return complete(submit(req("GET", tmpl("/categories/{id}/forums.json").set("id", category_id)), - handleList(Forum.class, "forums"))); - } + public List getForums(long category_id) { + return complete( + submit( + req("GET", tmpl("/categories/{id}/forums.json").set("id", category_id)), + handleList(Forum.class, "forums"))); + } - public Forum getForum(long id) { - return complete(submit(req("GET", tmpl("/forums/{id}.json").set("id", id)), - handle(Forum.class, "forum"))); - } + public Forum getForum(long id) { + return complete( + submit(req("GET", tmpl("/forums/{id}.json").set("id", id)), handle(Forum.class, "forum"))); + } - public Forum createForum(Forum forum) { - return complete(submit(req("POST", cnst("/forums.json"), JSON, json( - Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); - } + public Forum createForum(Forum forum) { + return complete( + submit( + req("POST", cnst("/forums.json"), JSON, json(Collections.singletonMap("forum", forum))), + handle(Forum.class, "forum"))); + } - public Forum updateForum(Forum forum) { - checkHasId(forum); - return complete(submit(req("PUT", tmpl("/forums/{id}.json").set("id", forum.getId()), JSON, json( - Collections.singletonMap("forum", forum))), handle(Forum.class, "forum"))); - } + public Forum updateForum(Forum forum) { + checkHasId(forum); + return complete( + submit( + req( + "PUT", + tmpl("/forums/{id}.json").set("id", forum.getId()), + JSON, + json(Collections.singletonMap("forum", forum))), + handle(Forum.class, "forum"))); + } - public void deleteForum(Forum forum) { - checkHasId(forum); - complete(submit(req("DELETE", tmpl("/forums/{id}.json").set("id", forum.getId())), handleStatus())); - } + public void deleteForum(Forum forum) { + checkHasId(forum); + complete( + submit(req("DELETE", tmpl("/forums/{id}.json").set("id", forum.getId())), handleStatus())); + } - public Iterable getTopics() { - return new PagedIterable<>(cnst("/topics.json"), handleList(Topic.class, "topics")); - } + public Iterable getTopics() { + return new PagedIterable<>(cnst("/topics.json"), handleList(Topic.class, "topics")); + } - public List getTopics(long forum_id) { - return complete(submit(req("GET", tmpl("/forums/{id}/topics.json").set("id", forum_id)), - handleList(Topic.class, "topics"))); - } + public List getTopics(long forum_id) { + return complete( + submit( + req("GET", tmpl("/forums/{id}/topics.json").set("id", forum_id)), + handleList(Topic.class, "topics"))); + } - public List getTopicsByUser(long user_id) { - return complete(submit(req("GET", tmpl("/users/{id}/topics.json").set("id", user_id)), - handleList(Topic.class, "topics"))); - } + public List getTopicsByUser(long user_id) { + return complete( + submit( + req("GET", tmpl("/users/{id}/topics.json").set("id", user_id)), + handleList(Topic.class, "topics"))); + } - public Topic getTopic(long id) { - return complete(submit(req("GET", tmpl("/topics/{id}.json").set("id", id)), - handle(Topic.class, "topic"))); - } + public Topic getTopic(long id) { + return complete( + submit(req("GET", tmpl("/topics/{id}.json").set("id", id)), handle(Topic.class, "topic"))); + } - public Topic createTopic(Topic topic) { - checkHasId(topic); - return complete(submit(req("POST", cnst("/topics.json"), JSON, json( - Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); - } + public Topic createTopic(Topic topic) { + checkHasId(topic); + return complete( + submit( + req("POST", cnst("/topics.json"), JSON, json(Collections.singletonMap("topic", topic))), + handle(Topic.class, "topic"))); + } - public Topic importTopic(Topic topic) { - checkHasId(topic); - return complete(submit(req("POST", cnst("/import/topics.json"), JSON, json( - Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); - } + public Topic importTopic(Topic topic) { + checkHasId(topic); + return complete( + submit( + req( + "POST", + cnst("/import/topics.json"), + JSON, + json(Collections.singletonMap("topic", topic))), + handle(Topic.class, "topic"))); + } - public List getTopics(long id, long... ids) { - return complete(submit(req("POST", tmpl("/topics/show_many.json{?ids}").set("ids", idArray(id, ids))), - handleList(Topic.class, "topics"))); - } + public List getTopics(long id, long... ids) { + return complete( + submit( + req("POST", tmpl("/topics/show_many.json{?ids}").set("ids", idArray(id, ids))), + handleList(Topic.class, "topics"))); + } - public Topic updateTopic(Topic topic) { - checkHasId(topic); - return complete(submit(req("PUT", tmpl("/topics/{id}.json").set("id", topic.getId()), JSON, json( - Collections.singletonMap("topic", topic))), handle(Topic.class, "topic"))); - } + public Topic updateTopic(Topic topic) { + checkHasId(topic); + return complete( + submit( + req( + "PUT", + tmpl("/topics/{id}.json").set("id", topic.getId()), + JSON, + json(Collections.singletonMap("topic", topic))), + handle(Topic.class, "topic"))); + } - public void deleteTopic(Topic topic) { - checkHasId(topic); - complete(submit(req("DELETE", tmpl("/topics/{id}.json").set("id", topic.getId())), handleStatus())); - } + public void deleteTopic(Topic topic) { + checkHasId(topic); + complete( + submit(req("DELETE", tmpl("/topics/{id}.json").set("id", topic.getId())), handleStatus())); + } - // https://support.zendesk.com/hc/communities/public/posts/203464106-Managing-Organization-Memberships-via-the-Zendesk-API - public List getOrganizationMembershipByUser(long user_id) { - return complete(submit(req("GET", tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id)), - handleList(OrganizationMembership.class, "organization_memberships"))); - } + // https://support.zendesk.com/hc/communities/public/posts/203464106-Managing-Organization-Memberships-via-the-Zendesk-API + public List getOrganizationMembershipByUser(long user_id) { + return complete( + submit( + req( + "GET", + tmpl("/users/{user_id}/organization_memberships.json").set("user_id", user_id)), + handleList(OrganizationMembership.class, "organization_memberships"))); + } - public OrganizationMembership getGroupOrganization(long user_id, long organization_membership_id) { - return complete(submit(req("GET", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) - .set("oid", organization_membership_id)), - handle(OrganizationMembership.class, "organization_membership"))); - } + public OrganizationMembership getGroupOrganization( + long user_id, long organization_membership_id) { + return complete( + submit( + req( + "GET", + tmpl("/users/{uid}/organization_memberships/{oid}.json") + .set("uid", user_id) + .set("oid", organization_membership_id)), + handle(OrganizationMembership.class, "organization_membership"))); + } - public OrganizationMembership createOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { - return complete(submit(req("POST", tmpl("/users/{id}/organization_memberships.json").set("id", user_id), JSON, - json(Collections.singletonMap("organization_membership", organizationMembership))), - handle(OrganizationMembership.class, "organization_membership"))); - } + public OrganizationMembership createOrganizationMembership( + long user_id, OrganizationMembership organizationMembership) { + return complete( + submit( + req( + "POST", + tmpl("/users/{id}/organization_memberships.json").set("id", user_id), + JSON, + json(Collections.singletonMap("organization_membership", organizationMembership))), + handle(OrganizationMembership.class, "organization_membership"))); + } - public void deleteOrganizationMembership(long user_id, OrganizationMembership organizationMembership) { - checkHasId(organizationMembership); - deleteOrganizationMembership(user_id, organizationMembership.getId()); - } + public void deleteOrganizationMembership( + long user_id, OrganizationMembership organizationMembership) { + checkHasId(organizationMembership); + deleteOrganizationMembership(user_id, organizationMembership.getId()); + } - public void deleteOrganizationMembership(long user_id, long organization_membership_id) { - complete(submit(req("DELETE", tmpl("/users/{uid}/organization_memberships/{oid}.json").set("uid", user_id) - .set("oid", organization_membership_id)), handleStatus())); - } + public void deleteOrganizationMembership(long user_id, long organization_membership_id) { + complete( + submit( + req( + "DELETE", + tmpl("/users/{uid}/organization_memberships/{oid}.json") + .set("uid", user_id) + .set("oid", organization_membership_id)), + handleStatus())); + } - public List setOrganizationMembershipAsDefault(long user_id, OrganizationMembership organizationMembership) { - checkHasId(organizationMembership); - return complete(submit(req("PUT", tmpl("/users/{uid}/organization_memberships/{omid}/make_default.json") - .set("uid", user_id).set("omid", organizationMembership.getId()), JSON, json( - Collections.singletonMap("organization_memberships", organizationMembership))), - handleList(OrganizationMembership.class, "results"))); - } - //-- END BETA + public List setOrganizationMembershipAsDefault( + long user_id, OrganizationMembership organizationMembership) { + checkHasId(organizationMembership); + return complete( + submit( + req( + "PUT", + tmpl("/users/{uid}/organization_memberships/{omid}/make_default.json") + .set("uid", user_id) + .set("omid", organizationMembership.getId()), + JSON, + json(Collections.singletonMap("organization_memberships", organizationMembership))), + handleList(OrganizationMembership.class, "results"))); + } - public Iterable getSearchResults(String query) { - return new PagedIterable<>(tmpl("/search.json{?query}").set("query", query), - handleSearchList("results")); - } + // -- END BETA - public Iterable getSearchResults(Class type, String query) { - return getSearchResults(type, query, Collections.emptyMap()); - } + public Iterable getSearchResults(String query) { + return new PagedIterable<>( + tmpl("/search.json{?query}").set("query", query), handleSearchList("results")); + } - /** - * @deprecated Use {@link #getSearchResults(Class, String, Map)} instead. - */ - @Deprecated - public Iterable getSearchResults(Class type, String query, String params) { - /* - preserving backwards compatabile logic, this method will continue to do what it did before, which is "wrong" - in that you can't really specify things like sort order via this method - */ + public Iterable getSearchResults(Class type, String query) { + return getSearchResults(type, query, Collections.emptyMap()); + } - Map paramsMap = new HashMap<>(1); - paramsMap.put("params", params); + /** + * @deprecated Use {@link #getSearchResults(Class, String, Map)} instead. + */ + @Deprecated + public Iterable getSearchResults( + Class type, String query, String params) { + /* + preserving backwards compatabile logic, this method will continue to do what it did before, which is "wrong" + in that you can't really specify things like sort order via this method + */ + + Map paramsMap = new HashMap<>(1); + paramsMap.put("params", params); + + return getSearchResults(type, query, paramsMap); + } - return getSearchResults(type, query, paramsMap); - } + public Iterable getSearchResults( + Class type, String query, String sortBy, SortOrder sortOrder) { + Map paramsMap = new HashMap<>(2); + paramsMap.put("sort_by", sortBy); + paramsMap.put("sort_order", sortOrder.getQueryParameter()); + return getSearchResults(type, query, paramsMap); + } - public Iterable getSearchResults(Class type, String query, String sortBy, SortOrder sortOrder) { - Map paramsMap = new HashMap<>(2); - paramsMap.put("sort_by", sortBy); - paramsMap.put("sort_order", sortOrder.getQueryParameter()); + public Iterable getSearchResults( + Class type, String query, Map params) { + String typeName = getTypeName(type); - return getSearchResults(type, query, paramsMap); + if (typeName == null) { + return Collections.emptyList(); } + TemplateUri templateUri = getSearchUri(params, query, typeName); - public Iterable getSearchResults(Class type, String query, Map params) { - String typeName = getTypeName(type); - - if (typeName == null) { - return Collections.emptyList(); - } + return new PagedIterable<>(templateUri, handleList(type, "results")); + } - TemplateUri templateUri = getSearchUri(params, query, typeName); - - return new PagedIterable<>(templateUri, handleList(type, "results")); - } - - /** - * Search API implementation with pagination support. - * - * @param searchType type of search entity like Ticket, User etc - * @param pageType page return type to which the search result will be deserialized - * @param query string used filter a type given by searchType - * @param queryParams additional parameters other than filter string like per_page, page etc - * @param sortBy name of any field of the searchType - * @param sortOrder sort order - */ - public Optional getSearchResults( - final Class searchType, - final Class pageType, - final String query, - final Map queryParams, - final String sortBy, - final SortOrder sortOrder - ) { - - String typeName = getTypeName(searchType); - - if (typeName == null) { - return Optional.empty(); - } - - final Map paramsMap = new HashMap<>(); - - if(queryParams != null) { - paramsMap.putAll(queryParams); - } - - if(sortBy!=null && sortOrder!=null) { - paramsMap.put("sort_by", sortBy); - paramsMap.put("sort_order", sortOrder.getQueryParameter()); - } + /** + * Search API implementation with pagination support. + * + * @param searchType type of search entity like Ticket, User etc + * @param pageType page return type to which the search result will be deserialized + * @param query string used filter a type given by searchType + * @param queryParams additional parameters other than filter string like per_page, page etc + * @param sortBy name of any field of the searchType + * @param sortOrder sort order + */ + public Optional getSearchResults( + final Class searchType, + final Class pageType, + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder) { - final TemplateUri templateUri = getSearchUri(paramsMap, query, typeName); - - return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType)))); - } - - /** - * Ticket Search API implementation with pagination support. - * - * @param query string used filter a type given by searchType - * @param queryParams additional parameters other than filter string like per_page, page etc - * @param sortBy name of any field of the searchType - * @param sortOrder sort order - */ - public Optional getSearchTicketResults( - final String query, - final Map queryParams, - final String sortBy, - final SortOrder sortOrder) { - - return getSearchResults(Ticket.class, TicketPage.class, query, queryParams, sortBy, sortOrder); - } - - public void notifyApp(String json) { - complete(submit(req("POST", cnst("/apps/notify.json"), JSON, json.getBytes()), handleStatus())); - } + String typeName = getTypeName(searchType); - public void updateInstallation(int id, String json) { - complete(submit(req("PUT", tmpl("/apps/installations/{id}.json").set("id", id), JSON, json.getBytes()), handleStatus())); + if (typeName == null) { + return Optional.empty(); } - public Iterable getSatisfactionRatings() { - return new PagedIterable<>(cnst("/satisfaction_ratings.json"), - handleList(SatisfactionRating.class, "satisfaction_ratings")); + final Map paramsMap = new HashMap<>(); + + if (queryParams != null) { + paramsMap.putAll(queryParams); } - public SatisfactionRating getSatisfactionRating(long id) { - return complete(submit(req("GET", tmpl("/satisfaction_ratings/{id}.json").set("id", id)), - handle(SatisfactionRating.class, "satisfaction_rating"))); + if (sortBy != null && sortOrder != null) { + paramsMap.put("sort_by", sortBy); + paramsMap.put("sort_order", sortOrder.getQueryParameter()); } - public SatisfactionRating createSatisfactionRating(long ticketId, SatisfactionRating satisfactionRating) { - return complete(submit(req("POST", tmpl("/tickets/{ticketId}/satisfaction_rating.json") - .set("ticketId", ticketId), JSON, + final TemplateUri templateUri = getSearchUri(paramsMap, query, typeName); + + return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType)))); + } + + /** + * Ticket Search API implementation with pagination support. + * + * @param query string used filter a type given by searchType + * @param queryParams additional parameters other than filter string like per_page, page etc + * @param sortBy name of any field of the searchType + * @param sortOrder sort order + */ + public Optional getSearchTicketResults( + final String query, + final Map queryParams, + final String sortBy, + final SortOrder sortOrder) { + + return getSearchResults(Ticket.class, TicketPage.class, query, queryParams, sortBy, sortOrder); + } + + public void notifyApp(String json) { + complete(submit(req("POST", cnst("/apps/notify.json"), JSON, json.getBytes()), handleStatus())); + } + + public void updateInstallation(int id, String json) { + complete( + submit( + req("PUT", tmpl("/apps/installations/{id}.json").set("id", id), JSON, json.getBytes()), + handleStatus())); + } + + public Iterable getSatisfactionRatings() { + return new PagedIterable<>( + cnst("/satisfaction_ratings.json"), + handleList(SatisfactionRating.class, "satisfaction_ratings")); + } + + public SatisfactionRating getSatisfactionRating(long id) { + return complete( + submit( + req("GET", tmpl("/satisfaction_ratings/{id}.json").set("id", id)), + handle(SatisfactionRating.class, "satisfaction_rating"))); + } + + public SatisfactionRating createSatisfactionRating( + long ticketId, SatisfactionRating satisfactionRating) { + return complete( + submit( + req( + "POST", + tmpl("/tickets/{ticketId}/satisfaction_rating.json").set("ticketId", ticketId), + JSON, json(Collections.singletonMap("satisfaction_rating", satisfactionRating))), - handle(SatisfactionRating.class, "satisfaction_rating"))); - } + handle(SatisfactionRating.class, "satisfaction_rating"))); + } - public SatisfactionRating createSatisfactionRating(Ticket ticket, SatisfactionRating satisfactionRating) { - return createSatisfactionRating(ticket.getId(), satisfactionRating); - } + public SatisfactionRating createSatisfactionRating( + Ticket ticket, SatisfactionRating satisfactionRating) { + return createSatisfactionRating(ticket.getId(), satisfactionRating); + } - ////////////////////////////////////////////////////////////////////// - // Action methods for Dynamic Content - Items and Variants - ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// + // Action methods for Dynamic Content - Items and Variants + ////////////////////////////////////////////////////////////////////// - public Iterable getDynamicContentItems() { - return new PagedIterable<>(cnst("/dynamic_content/items.json"), handleList(DynamicContentItem.class, "items")); - } + public Iterable getDynamicContentItems() { + return new PagedIterable<>( + cnst("/dynamic_content/items.json"), handleList(DynamicContentItem.class, "items")); + } - public DynamicContentItem getDynamicContentItem(long id) { - return complete(submit(req("GET", tmpl("/dynamic_content/items/{id}.json").set("id", id)), handle(DynamicContentItem.class, "item"))); - } + public DynamicContentItem getDynamicContentItem(long id) { + return complete( + submit( + req("GET", tmpl("/dynamic_content/items/{id}.json").set("id", id)), + handle(DynamicContentItem.class, "item"))); + } - public DynamicContentItem createDynamicContentItem(DynamicContentItem item) { - return complete(submit(req("POST", cnst("/dynamic_content/items.json"), JSON, json( - Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); - } + public DynamicContentItem createDynamicContentItem(DynamicContentItem item) { + return complete( + submit( + req( + "POST", + cnst("/dynamic_content/items.json"), + JSON, + json(Collections.singletonMap("item", item))), + handle(DynamicContentItem.class, "item"))); + } - public DynamicContentItem updateDynamicContentItem(DynamicContentItem item) { - checkHasId(item); - return complete(submit(req("PUT", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId()), - JSON, json(Collections.singletonMap("item", item))), handle(DynamicContentItem.class, "item"))); - } + public DynamicContentItem updateDynamicContentItem(DynamicContentItem item) { + checkHasId(item); + return complete( + submit( + req( + "PUT", + tmpl("/dynamic_content/items/{id}.json").set("id", item.getId()), + JSON, + json(Collections.singletonMap("item", item))), + handle(DynamicContentItem.class, "item"))); + } - public void deleteDynamicContentItem(DynamicContentItem item) { - checkHasId(item); - complete(submit(req("DELETE", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId())), - handleStatus())); - } - - /** VARIANTS */ + public void deleteDynamicContentItem(DynamicContentItem item) { + checkHasId(item); + complete( + submit( + req("DELETE", tmpl("/dynamic_content/items/{id}.json").set("id", item.getId())), + handleStatus())); + } - public Iterable getDynamicContentItemVariants(DynamicContentItem item) { - checkHasId(item); - return new PagedIterable<>( - tmpl("/dynamic_content/items/{id}/variants.json").set("id", item.getId()), - handleList(DynamicContentItemVariant.class, "variants")); - } - - public DynamicContentItemVariant getDynamicContentItemVariant(Long itemId, long id) { - return complete(submit(req("GET", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", id)), - handle(DynamicContentItemVariant.class, "variant"))); - } - - public DynamicContentItemVariant createDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { - checkHasItemId(itemId); - return complete(submit(req("POST", tmpl("/dynamic_content/items/{id}/variants.json").set("id", itemId), - JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); - } - - public DynamicContentItemVariant updateDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { - checkHasItemId(itemId); - checkHasId(variant); - return complete(submit(req("PUT", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId()), - JSON, json(Collections.singletonMap("variant", variant))), handle(DynamicContentItemVariant.class, "variant"))); - } - - public void deleteDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { - checkHasItemId(itemId); - checkHasId(variant); - complete(submit(req("DELETE", tmpl("/dynamic_content/items/{itemId}/variants/{id}.json").set("itemId", itemId).set("id", variant.getId())), handleStatus())); - } - - // TODO search with query building API - - ////////////////////////////////////////////////////////////////////// - // Action methods for Help Center - ////////////////////////////////////////////////////////////////////// - /** - * Get all permission groups - * - * @return List of Permission Groups - */ - public Iterable getPermissionGroups() { - return new PagedIterable<>(cnst("/guide/permission_groups.json"), - handleList(PermissionGroup.class, "permission_groups")); - } - /** - * Get permission group by id - * - * @param id - */ - public PermissionGroup getPermissionGroup(long id) { - return complete(submit(req("GET", tmpl("/guide/permission_groups/{id}.json").set("id", id)), - handle(PermissionGroup.class, "permission_group"))); - } - /** - * Create permission group - * - * @param permissionGroup - */ - public PermissionGroup createPermissionGroup(PermissionGroup permissionGroup) { - return complete(submit(req("POST", tmpl("/guide/permission_groups.json"), - JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); - } - /** - * Update permission group - * - * @param permissionGroup - */ - public PermissionGroup updatePermissionGroup(PermissionGroup permissionGroup) { - checkHasId(permissionGroup); - return complete(submit(req("PUT", tmpl("/guide/permission_groups/{id}.json").set("id", permissionGroup.getId()), - JSON, json(Collections.singletonMap("permission_group", permissionGroup))), handle(PermissionGroup.class, "permission_group"))); - } - /** - * Delete permission group - * - * @param permissionGroup - */ - public void deletePermissionGroup(PermissionGroup permissionGroup) { - checkHasId(permissionGroup); - deletePermissionGroup(permissionGroup.getId()); - } - /** - * Delete permission group - * - * @param id - */ - public void deletePermissionGroup(long id) { - complete(submit(req("DELETE", tmpl("/guide/permission_groups/{id}.json").set("id", id)), - handleStatus())); - } - /** - * Get user segments - * - * @return List of User Segments - */ - public Iterable getUserSegments() { - return new PagedIterable<>(cnst("/help_center/user_segments.json"), - handleList(UserSegment.class, "user_segments")); - } - /** - * Returns the list of user segments that a particular user belongs to - * - * @return List of User Segments - */ - public Iterable getUserSegments(long id) { - return new PagedIterable<>(tmpl("/help_center/users/{id}/user_segments.json").set("id", id), - handleList(UserSegment.class, "user_segments")); - } - /** - * Request only user segments applicable on the account's current Guide plan - * - * @return List of User Segments - */ - public Iterable getUserSegmentsApplicable() { - return new PagedIterable<>(cnst("/help_center/user_segments/applicable.json"), - handleList(UserSegment.class, "user_segments")); - } - /** - * Get user segment by id - * - * @param id - */ - public UserSegment getUserSegment(long id) { - return complete(submit(req("GET", tmpl("/help_center/user_segments/{id}.json").set("id", id)), - handle(UserSegment.class, "user_segment"))); - } - - /** - * List Sections using a User Segment - * - * @param userSegment - * @return List of Sections - */ - public Iterable
getSections(UserSegment userSegment) { - checkHasId(userSegment); - return new PagedIterable<>( - tmpl("/help_center/user_segments/{id}/sections.json").set("id", userSegment.getId()), - handleList(Section.class, "sections")); - } - - /** - * List Topics using a User Segment - * - * @param userSegment - * @return List of Topics - */ - public Iterable getTopics(UserSegment userSegment) { - checkHasId(userSegment); - return new PagedIterable<>( - tmpl("/help_center/user_segments/{id}/topics.json").set("id", userSegment.getId()), - handleList(Topic.class, "topics")); - } - - /** - * Create User Segment - * - * @param userSegment - */ - public UserSegment createUserSegment(UserSegment userSegment) { - return complete(submit(req("POST", tmpl("/help_center/user_segments.json"), - JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); - } - /** - * Update User Segment - * - * @param userSegment - */ - public UserSegment updateUserSegment(UserSegment userSegment) { - checkHasId(userSegment); - return complete(submit(req("PUT", tmpl("/help_center/user_segments/{id}.json").set("id", userSegment.getId()), - JSON, json(Collections.singletonMap("user_segment", userSegment))), handle(UserSegment.class, "user_segment"))); - } - /** - * Delete User Segment - * - * @param userSegment - */ - public void deleteUserSegment(UserSegment userSegment) { - checkHasId(userSegment); - deleteUserSegment(userSegment.getId()); - } - - /** - * Delete User Segment - * - * @param id - */ - public void deleteUserSegment(long id) { - complete(submit(req("DELETE", tmpl("/help_center/user_segments/{id}.json").set("id", id)), - handleStatus())); - } - - public Locales listHelpCenterLocales() { - return complete(submit( - req("GET", cnst("/help_center/locales.json")), - handle(Locales.class))); - } - - /** - * @deprecated Use {@link Zendesk#listHelpCenterLocales()} instead - */ - @Deprecated - public List getHelpCenterLocales() { - return listHelpCenterLocales().getLocales(); - } - - /** - * Get all articles from help center. - * - * @return List of Articles. - */ - public Iterable
getArticles() { - return new PagedIterable<>(cnst("/help_center/articles.json"), - handleList(Article.class, "articles")); - } - - public Iterable
getArticles(String locale) { - return new PagedIterable<>(tmpl("/help_center/{locale}/articles.json").set("locale", locale), - handleList(Article.class, "articles")); - } - - public Iterable
getArticles(Category category) { - checkHasId(category); - return new PagedIterable<>( - tmpl("/help_center/categories/{id}/articles.json").set("id", category.getId()), - handleList(Article.class, "articles")); - } - - public Iterable
getArticles(Section section) { - checkHasId(section); - return new PagedIterable<>( - tmpl("/help_center/sections/{id}/articles.json").set("id", section.getId()), - handleList(Article.class, "articles")); - } - - public Iterable
getArticlesIncrementally(Date startTime) { - return new PagedIterable<>( - tmpl("/help_center/incremental/articles.json{?start_time}") - .set("start_time", msToSeconds(startTime.getTime())), - handleIncrementalList(Article.class, "articles")); - } - - public List
getArticlesFromPage(int page) { - return complete(submit(req("GET", tmpl("/help_center/articles.json?page={page}").set("page", page)), - handleList(Article.class, "articles"))); - } + /** VARIANTS */ + public Iterable getDynamicContentItemVariants( + DynamicContentItem item) { + checkHasId(item); + return new PagedIterable<>( + tmpl("/dynamic_content/items/{id}/variants.json").set("id", item.getId()), + handleList(DynamicContentItemVariant.class, "variants")); + } - public Article getArticle(long id) { - return complete(submit(req("GET", tmpl("/help_center/articles/{id}.json").set("id", id)), - handle(Article.class, "article"))); - } + public DynamicContentItemVariant getDynamicContentItemVariant(Long itemId, long id) { + return complete( + submit( + req( + "GET", + tmpl("/dynamic_content/items/{itemId}/variants/{id}.json") + .set("itemId", itemId) + .set("id", id)), + handle(DynamicContentItemVariant.class, "variant"))); + } - public Iterable getArticleTranslations(Long articleId) { - return new PagedIterable<>( - tmpl("/help_center/articles/{articleId}/translations.json").set("articleId", articleId), - handleList(Translation.class, "translations")); - } + public DynamicContentItemVariant createDynamicContentItemVariant( + Long itemId, DynamicContentItemVariant variant) { + checkHasItemId(itemId); + return complete( + submit( + req( + "POST", + tmpl("/dynamic_content/items/{id}/variants.json").set("id", itemId), + JSON, + json(Collections.singletonMap("variant", variant))), + handle(DynamicContentItemVariant.class, "variant"))); + } - public Translation showArticleTranslation(long articleId, String locale) { - return complete(submit(req("GET", - tmpl("/help_center/articles/{articleId}/translations/{locale}.json") - .set("articleId", articleId).set("locale", locale)), - handle(Translation.class, "translation"))); - } + public DynamicContentItemVariant updateDynamicContentItemVariant( + Long itemId, DynamicContentItemVariant variant) { + checkHasItemId(itemId); + checkHasId(variant); + return complete( + submit( + req( + "PUT", + tmpl("/dynamic_content/items/{itemId}/variants/{id}.json") + .set("itemId", itemId) + .set("id", variant.getId()), + JSON, + json(Collections.singletonMap("variant", variant))), + handle(DynamicContentItemVariant.class, "variant"))); + } - public Article createArticle(Article article) { - checkHasSectionId(article); - return complete(submit(req("POST", tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), - JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); - } + public void deleteDynamicContentItemVariant(Long itemId, DynamicContentItemVariant variant) { + checkHasItemId(itemId); + checkHasId(variant); + complete( + submit( + req( + "DELETE", + tmpl("/dynamic_content/items/{itemId}/variants/{id}.json") + .set("itemId", itemId) + .set("id", variant.getId())), + handleStatus())); + } - public Article createArticle(Article article, boolean notifySubscribers) { - checkHasSectionId(article); + // TODO search with query building API + + ////////////////////////////////////////////////////////////////////// + // Action methods for Help Center + ////////////////////////////////////////////////////////////////////// + /** + * Get all permission groups + * + * @return List of Permission Groups + */ + public Iterable getPermissionGroups() { + return new PagedIterable<>( + cnst("/guide/permission_groups.json"), + handleList(PermissionGroup.class, "permission_groups")); + } - Map map = new HashMap(); - map.put("article", article); - map.put("notify_subscribers", notifySubscribers ? String.valueOf("true") : String.valueOf("false")); + /** + * Get permission group by id + * + * @param id + */ + public PermissionGroup getPermissionGroup(long id) { + return complete( + submit( + req("GET", tmpl("/guide/permission_groups/{id}.json").set("id", id)), + handle(PermissionGroup.class, "permission_group"))); + } - return complete(submit(req("POST", tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), - JSON, json(Collections.unmodifiableMap(map))), handle(Article.class, "article"))); - } + /** + * Create permission group + * + * @param permissionGroup + */ + public PermissionGroup createPermissionGroup(PermissionGroup permissionGroup) { + return complete( + submit( + req( + "POST", + tmpl("/guide/permission_groups.json"), + JSON, + json(Collections.singletonMap("permission_group", permissionGroup))), + handle(PermissionGroup.class, "permission_group"))); + } - public Article updateArticle(Article article) { - checkHasId(article); - return complete(submit(req("PUT", tmpl("/help_center/articles/{id}.json").set("id", article.getId()), - JSON, json(Collections.singletonMap("article", article))), handle(Article.class, "article"))); - } + /** + * Update permission group + * + * @param permissionGroup + */ + public PermissionGroup updatePermissionGroup(PermissionGroup permissionGroup) { + checkHasId(permissionGroup); + return complete( + submit( + req( + "PUT", + tmpl("/guide/permission_groups/{id}.json").set("id", permissionGroup.getId()), + JSON, + json(Collections.singletonMap("permission_group", permissionGroup))), + handle(PermissionGroup.class, "permission_group"))); + } - public Translation createArticleTranslation(Long articleId, Translation translation) { - checkHasArticleId(articleId); - return complete(submit(req("POST", tmpl("/help_center/articles/{id}/translations.json").set("id", articleId), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + /** + * Delete permission group + * + * @param permissionGroup + */ + public void deletePermissionGroup(PermissionGroup permissionGroup) { + checkHasId(permissionGroup); + deletePermissionGroup(permissionGroup.getId()); + } - public Translation updateArticleTranslation(Long articleId, String locale, Translation translation) { - checkHasId(translation); - return complete(submit(req("PUT", tmpl("/help_center/articles/{id}/translations/{locale}.json").set("id", articleId).set("locale",locale), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + /** + * Delete permission group + * + * @param id + */ + public void deletePermissionGroup(long id) { + complete( + submit( + req("DELETE", tmpl("/guide/permission_groups/{id}.json").set("id", id)), + handleStatus())); + } - public void deleteArticle(Article article) { - checkHasId(article); - complete(submit(req("DELETE", tmpl("/help_center/articles/{id}.json").set("id", article.getId())), - handleStatus())); - } + /** + * Get user segments + * + * @return List of User Segments + */ + public Iterable getUserSegments() { + return new PagedIterable<>( + cnst("/help_center/user_segments.json"), handleList(UserSegment.class, "user_segments")); + } - /** - * Delete translation. - * @param translation - */ - public void deleteTranslation(Translation translation) { - checkHasId(translation); - deleteTranslation(translation.getId()); - } + /** + * Returns the list of user segments that a particular user belongs to + * + * @return List of User Segments + */ + public Iterable getUserSegments(long id) { + return new PagedIterable<>( + tmpl("/help_center/users/{id}/user_segments.json").set("id", id), + handleList(UserSegment.class, "user_segments")); + } - /** - * Delete translation. - * @param translationId - */ - public void deleteTranslation(Long translationId) { - complete(submit(req("DELETE", tmpl("/help_center/translations/{id}.json").set("id", translationId)), - handleStatus())); - } + /** + * Request only user segments applicable on the account's current Guide plan + * + * @return List of User Segments + */ + public Iterable getUserSegmentsApplicable() { + return new PagedIterable<>( + cnst("/help_center/user_segments/applicable.json"), + handleList(UserSegment.class, "user_segments")); + } - /** - * Delete attachment from article. - * @param attachment - */ - public void deleteArticleAttachment(ArticleAttachments attachment) { - checkHasId(attachment); - deleteArticleAttachment(attachment.getId()); - } + /** + * Get user segment by id + * + * @param id + */ + public UserSegment getUserSegment(long id) { + return complete( + submit( + req("GET", tmpl("/help_center/user_segments/{id}.json").set("id", id)), + handle(UserSegment.class, "user_segment"))); + } - /** - * Delete attachment from article. - * @param id attachment identifier. - */ - public void deleteArticleAttachment(long id) { - complete(submit(req("DELETE", tmpl("/help_center/articles/attachments/{id}.json").set("id", id)), handleStatus())); - } + /** + * List Sections using a User Segment + * + * @param userSegment + * @return List of Sections + */ + public Iterable
getSections(UserSegment userSegment) { + checkHasId(userSegment); + return new PagedIterable<>( + tmpl("/help_center/user_segments/{id}/sections.json").set("id", userSegment.getId()), + handleList(Section.class, "sections")); + } - public Iterable getCategories() { - return new PagedIterable<>(cnst("/help_center/categories.json"), - handleList(Category.class, "categories")); - } + /** + * List Topics using a User Segment + * + * @param userSegment + * @return List of Topics + */ + public Iterable getTopics(UserSegment userSegment) { + checkHasId(userSegment); + return new PagedIterable<>( + tmpl("/help_center/user_segments/{id}/topics.json").set("id", userSegment.getId()), + handleList(Topic.class, "topics")); + } - public Category getCategory(long id) { - return complete(submit(req("GET", tmpl("/help_center/categories/{id}.json").set("id", id)), - handle(Category.class, "category"))); - } + /** + * Create User Segment + * + * @param userSegment + */ + public UserSegment createUserSegment(UserSegment userSegment) { + return complete( + submit( + req( + "POST", + tmpl("/help_center/user_segments.json"), + JSON, + json(Collections.singletonMap("user_segment", userSegment))), + handle(UserSegment.class, "user_segment"))); + } - public Iterable getCategoryTranslations(Long categoryId) { - return new PagedIterable<>( - tmpl("/help_center/categories/{categoryId}/translations.json").set("categoryId", categoryId), - handleList(Translation.class, "translations")); - } + /** + * Update User Segment + * + * @param userSegment + */ + public UserSegment updateUserSegment(UserSegment userSegment) { + checkHasId(userSegment); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/user_segments/{id}.json").set("id", userSegment.getId()), + JSON, + json(Collections.singletonMap("user_segment", userSegment))), + handle(UserSegment.class, "user_segment"))); + } + + /** + * Delete User Segment + * + * @param userSegment + */ + public void deleteUserSegment(UserSegment userSegment) { + checkHasId(userSegment); + deleteUserSegment(userSegment.getId()); + } + + /** + * Delete User Segment + * + * @param id + */ + public void deleteUserSegment(long id) { + complete( + submit( + req("DELETE", tmpl("/help_center/user_segments/{id}.json").set("id", id)), + handleStatus())); + } + + public Locales listHelpCenterLocales() { + return complete(submit(req("GET", cnst("/help_center/locales.json")), handle(Locales.class))); + } + + /** + * @deprecated Use {@link Zendesk#listHelpCenterLocales()} instead + */ + @Deprecated + public List getHelpCenterLocales() { + return listHelpCenterLocales().getLocales(); + } + + /** + * Get all articles from help center. + * + * @return List of Articles. + */ + public Iterable
getArticles() { + return new PagedIterable<>( + cnst("/help_center/articles.json"), handleList(Article.class, "articles")); + } + + public Iterable
getArticles(String locale) { + return new PagedIterable<>( + tmpl("/help_center/{locale}/articles.json").set("locale", locale), + handleList(Article.class, "articles")); + } + + public Iterable
getArticles(Category category) { + checkHasId(category); + return new PagedIterable<>( + tmpl("/help_center/categories/{id}/articles.json").set("id", category.getId()), + handleList(Article.class, "articles")); + } + + public Iterable
getArticles(Section section) { + checkHasId(section); + return new PagedIterable<>( + tmpl("/help_center/sections/{id}/articles.json").set("id", section.getId()), + handleList(Article.class, "articles")); + } + + public Iterable
getArticlesIncrementally(Date startTime) { + return new PagedIterable<>( + tmpl("/help_center/incremental/articles.json{?start_time}") + .set("start_time", msToSeconds(startTime.getTime())), + handleIncrementalList(Article.class, "articles")); + } + + public List
getArticlesFromPage(int page) { + return complete( + submit( + req("GET", tmpl("/help_center/articles.json?page={page}").set("page", page)), + handleList(Article.class, "articles"))); + } + + public Article getArticle(long id) { + return complete( + submit( + req("GET", tmpl("/help_center/articles/{id}.json").set("id", id)), + handle(Article.class, "article"))); + } + + public Iterable getArticleTranslations(Long articleId) { + return new PagedIterable<>( + tmpl("/help_center/articles/{articleId}/translations.json").set("articleId", articleId), + handleList(Translation.class, "translations")); + } + + public Translation showArticleTranslation(long articleId, String locale) { + return complete( + submit( + req( + "GET", + tmpl("/help_center/articles/{articleId}/translations/{locale}.json") + .set("articleId", articleId) + .set("locale", locale)), + handle(Translation.class, "translation"))); + } + + public Article createArticle(Article article) { + checkHasSectionId(article); + return complete( + submit( + req( + "POST", + tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), + JSON, + json(Collections.singletonMap("article", article))), + handle(Article.class, "article"))); + } + + public Article createArticle(Article article, boolean notifySubscribers) { + checkHasSectionId(article); + + Map map = new HashMap(); + map.put("article", article); + map.put( + "notify_subscribers", notifySubscribers ? String.valueOf("true") : String.valueOf("false")); + + return complete( + submit( + req( + "POST", + tmpl("/help_center/sections/{id}/articles.json").set("id", article.getSectionId()), + JSON, + json(Collections.unmodifiableMap(map))), + handle(Article.class, "article"))); + } + + public Article updateArticle(Article article) { + checkHasId(article); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/articles/{id}.json").set("id", article.getId()), + JSON, + json(Collections.singletonMap("article", article))), + handle(Article.class, "article"))); + } + + public Translation createArticleTranslation(Long articleId, Translation translation) { + checkHasArticleId(articleId); + return complete( + submit( + req( + "POST", + tmpl("/help_center/articles/{id}/translations.json").set("id", articleId), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } + + public Translation updateArticleTranslation( + Long articleId, String locale, Translation translation) { + checkHasId(translation); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/articles/{id}/translations/{locale}.json") + .set("id", articleId) + .set("locale", locale), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } + + public void deleteArticle(Article article) { + checkHasId(article); + complete( + submit( + req("DELETE", tmpl("/help_center/articles/{id}.json").set("id", article.getId())), + handleStatus())); + } + + /** + * Delete translation. + * + * @param translation + */ + public void deleteTranslation(Translation translation) { + checkHasId(translation); + deleteTranslation(translation.getId()); + } + + /** + * Delete translation. + * + * @param translationId + */ + public void deleteTranslation(Long translationId) { + complete( + submit( + req("DELETE", tmpl("/help_center/translations/{id}.json").set("id", translationId)), + handleStatus())); + } + + /** + * Delete attachment from article. + * + * @param attachment + */ + public void deleteArticleAttachment(ArticleAttachments attachment) { + checkHasId(attachment); + deleteArticleAttachment(attachment.getId()); + } + + /** + * Delete attachment from article. + * + * @param id attachment identifier. + */ + public void deleteArticleAttachment(long id) { + complete( + submit( + req("DELETE", tmpl("/help_center/articles/attachments/{id}.json").set("id", id)), + handleStatus())); + } + + public Iterable getCategories() { + return new PagedIterable<>( + cnst("/help_center/categories.json"), handleList(Category.class, "categories")); + } - public Translation showCategoryTranslation(long categoryId, String locale) { - return complete(submit(req("GET", + public Category getCategory(long id) { + return complete( + submit( + req("GET", tmpl("/help_center/categories/{id}.json").set("id", id)), + handle(Category.class, "category"))); + } + + public Iterable getCategoryTranslations(Long categoryId) { + return new PagedIterable<>( + tmpl("/help_center/categories/{categoryId}/translations.json") + .set("categoryId", categoryId), + handleList(Translation.class, "translations")); + } + + public Translation showCategoryTranslation(long categoryId, String locale) { + return complete( + submit( + req( + "GET", tmpl("/help_center/categories/{categoryId}/translations/{locale}.json") - .set("categoryId", categoryId).set("locale", locale)), + .set("categoryId", categoryId) + .set("locale", locale)), handle(Translation.class, "translation"))); - } + } - public Category createCategory(Category category) { - return complete(submit(req("POST", cnst("/help_center/categories.json"), - JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); - } + public Category createCategory(Category category) { + return complete( + submit( + req( + "POST", + cnst("/help_center/categories.json"), + JSON, + json(Collections.singletonMap("category", category))), + handle(Category.class, "category"))); + } - public Category updateCategory(Category category) { - checkHasId(category); - return complete(submit(req("PUT", tmpl("/help_center/categories/{id}.json").set("id", category.getId()), - JSON, json(Collections.singletonMap("category", category))), handle(Category.class, "category"))); - } + public Category updateCategory(Category category) { + checkHasId(category); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/categories/{id}.json").set("id", category.getId()), + JSON, + json(Collections.singletonMap("category", category))), + handle(Category.class, "category"))); + } - public Translation createCategoryTranslation(Long categoryId, Translation translation) { - checkHasCategoryId(categoryId); - return complete(submit(req("POST", tmpl("/help_center/categories/{id}/translations.json").set("id", categoryId), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + public Translation createCategoryTranslation(Long categoryId, Translation translation) { + checkHasCategoryId(categoryId); + return complete( + submit( + req( + "POST", + tmpl("/help_center/categories/{id}/translations.json").set("id", categoryId), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } - public Translation updateCategoryTranslation(Long categoryId, String locale, Translation translation) { - checkHasId(translation); - return complete(submit(req("PUT", tmpl("/help_center/categories/{id}/translations/{locale}.json").set("id", categoryId).set("locale",locale), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + public Translation updateCategoryTranslation( + Long categoryId, String locale, Translation translation) { + checkHasId(translation); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/categories/{id}/translations/{locale}.json") + .set("id", categoryId) + .set("locale", locale), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } - public void deleteCategory(Category category) { - checkHasId(category); - complete(submit(req("DELETE", tmpl("/help_center/categories/{id}.json").set("id", category.getId())), - handleStatus())); - } + public void deleteCategory(Category category) { + checkHasId(category); + complete( + submit( + req("DELETE", tmpl("/help_center/categories/{id}.json").set("id", category.getId())), + handleStatus())); + } - public Iterable
getSections() { - return new PagedIterable<>( - cnst("/help_center/sections.json"), handleList(Section.class, "sections")); - } + public Iterable
getSections() { + return new PagedIterable<>( + cnst("/help_center/sections.json"), handleList(Section.class, "sections")); + } - public Iterable
getSections(Category category) { - checkHasId(category); - return new PagedIterable<>( - tmpl("/help_center/categories/{id}/sections.json").set("id", category.getId()), - handleList(Section.class, "sections")); - } + public Iterable
getSections(Category category) { + checkHasId(category); + return new PagedIterable<>( + tmpl("/help_center/categories/{id}/sections.json").set("id", category.getId()), + handleList(Section.class, "sections")); + } - public Section getSection(long id) { - return complete(submit(req("GET", tmpl("/help_center/sections/{id}.json").set("id", id)), - handle(Section.class, "section"))); - } + public Section getSection(long id) { + return complete( + submit( + req("GET", tmpl("/help_center/sections/{id}.json").set("id", id)), + handle(Section.class, "section"))); + } - public Iterable getSectionTranslations(Long sectionId) { - return new PagedIterable<>( - tmpl("/help_center/sections/{sectionId}/translations.json").set("sectionId", sectionId), - handleList(Translation.class, "translations")); - } + public Iterable getSectionTranslations(Long sectionId) { + return new PagedIterable<>( + tmpl("/help_center/sections/{sectionId}/translations.json").set("sectionId", sectionId), + handleList(Translation.class, "translations")); + } - public Translation showSectionTranslation(long sectionId, String locale) { - return complete(submit(req("GET", + public Translation showSectionTranslation(long sectionId, String locale) { + return complete( + submit( + req( + "GET", tmpl("/help_center/sections/{sectionId}/translations/{locale}.json") - .set("sectionId", sectionId).set("locale", locale)), + .set("sectionId", sectionId) + .set("locale", locale)), handle(Translation.class, "translation"))); - } + } - public Section createSection(Section section) { - checkHasCategoryId(section); - return complete(submit(req("POST", tmpl("/help_center/categories/{id}/sections.json").set("id", section.getCategoryId()), - JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); - } + public Section createSection(Section section) { + checkHasCategoryId(section); + return complete( + submit( + req( + "POST", + tmpl("/help_center/categories/{id}/sections.json") + .set("id", section.getCategoryId()), + JSON, + json(Collections.singletonMap("section", section))), + handle(Section.class, "section"))); + } - public Section updateSection(Section section) { - checkHasId(section); - return complete(submit(req("PUT", tmpl("/help_center/sections/{id}.json").set("id", section.getId()), - JSON, json(Collections.singletonMap("section", section))), handle(Section.class, "section"))); - } + public Section updateSection(Section section) { + checkHasId(section); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/sections/{id}.json").set("id", section.getId()), + JSON, + json(Collections.singletonMap("section", section))), + handle(Section.class, "section"))); + } - public Translation createSectionTranslation(Long sectionId, Translation translation) { - checkHasSectionId(sectionId); - return complete(submit(req("POST", tmpl("/help_center/sections/{id}/translations.json").set("id", sectionId), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + public Translation createSectionTranslation(Long sectionId, Translation translation) { + checkHasSectionId(sectionId); + return complete( + submit( + req( + "POST", + tmpl("/help_center/sections/{id}/translations.json").set("id", sectionId), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } - public Translation updateSectionTranslation(Long sectionId, String locale, Translation translation) { - checkHasId(translation); - return complete(submit(req("PUT", tmpl("/help_center/sections/{id}/translations/{locale}.json").set("id", sectionId).set("locale",locale), - JSON, json(Collections.singletonMap("translation", translation))), handle(Translation.class, "translation"))); - } + public Translation updateSectionTranslation( + Long sectionId, String locale, Translation translation) { + checkHasId(translation); + return complete( + submit( + req( + "PUT", + tmpl("/help_center/sections/{id}/translations/{locale}.json") + .set("id", sectionId) + .set("locale", locale), + JSON, + json(Collections.singletonMap("translation", translation))), + handle(Translation.class, "translation"))); + } - public void deleteSection(Section section) { - checkHasId(section); - complete(submit(req("DELETE", tmpl("/help_center/sections/{id}.json").set("id", section.getId())), - handleStatus())); - } + public void deleteSection(Section section) { + checkHasId(section); + complete( + submit( + req("DELETE", tmpl("/help_center/sections/{id}.json").set("id", section.getId())), + handleStatus())); + } - public Iterable getUserSubscriptions(User user) { - checkHasId(user); - return getUserSubscriptions(user.getId()); - } + public Iterable getUserSubscriptions(User user) { + checkHasId(user); + return getUserSubscriptions(user.getId()); + } - public Iterable getUserSubscriptions(Long userId) { - return new PagedIterable<>( - tmpl("/help_center/users/{userId}/subscriptions.json").set("userId", userId), - handleList(Subscription.class, "subscriptions")); - } + public Iterable getUserSubscriptions(Long userId) { + return new PagedIterable<>( + tmpl("/help_center/users/{userId}/subscriptions.json").set("userId", userId), + handleList(Subscription.class, "subscriptions")); + } - public Iterable getArticleSubscriptions(Long articleId) { - return getArticleSubscriptions(articleId, null); - } + public Iterable getArticleSubscriptions(Long articleId) { + return getArticleSubscriptions(articleId, null); + } - public Iterable getArticleSubscriptions(Long articleId, String locale) { - return new PagedIterable<>( - tmpl("/help_center{/locale}/articles/{articleId}/subscriptions.json").set("locale", locale) - .set("articleId", articleId), - handleList(Subscription.class, "subscriptions")); - } + public Iterable getArticleSubscriptions(Long articleId, String locale) { + return new PagedIterable<>( + tmpl("/help_center{/locale}/articles/{articleId}/subscriptions.json") + .set("locale", locale) + .set("articleId", articleId), + handleList(Subscription.class, "subscriptions")); + } - public Iterable getSectionSubscriptions(Long sectionId) { - return getSectionSubscriptions(sectionId, null); - } + public Iterable getSectionSubscriptions(Long sectionId) { + return getSectionSubscriptions(sectionId, null); + } - public Iterable getSectionSubscriptions(Long sectionId, String locale) { - return new PagedIterable<>( - tmpl("/help_center{/locale}/sections/{sectionId}/subscriptions.json").set("locale", locale) - .set("sectionId", sectionId), - handleList(Subscription.class, "subscriptions")); - } + public Iterable getSectionSubscriptions(Long sectionId, String locale) { + return new PagedIterable<>( + tmpl("/help_center{/locale}/sections/{sectionId}/subscriptions.json") + .set("locale", locale) + .set("sectionId", sectionId), + handleList(Subscription.class, "subscriptions")); + } - /** - * Get a list of the current business hours schedules - * @return A List of Schedules - */ - public Iterable getSchedules() { - return complete(submit(req("GET", cnst("/business_hours/schedules.json")), + /** + * Get a list of the current business hours schedules + * + * @return A List of Schedules + */ + public Iterable getSchedules() { + return complete( + submit( + req("GET", cnst("/business_hours/schedules.json")), handleList(Schedule.class, "schedules"))); - } + } + + public Schedule getSchedule(Schedule schedule) { + checkHasId(schedule); + return getSchedule(schedule.getId()); + } + + public Schedule getSchedule(Long scheduleId) { + return complete( + submit( + req("GET", tmpl("/business_hours/schedules/{id}.json").set("id", scheduleId)), + handle(Schedule.class, "schedule"))); + } + + public Iterable getHolidaysForSchedule(Schedule schedule) { + checkHasId(schedule); + return getHolidaysForSchedule(schedule.getId()); + } + + public Iterable getHolidaysForSchedule(Long scheduleId) { + return complete( + submit( + req("GET", tmpl("/business_hours/schedules/{id}/holidays.json").set("id", scheduleId)), + handleList(Holiday.class, "holidays"))); + } + + public ContentTag getContentTag(String contentTagId) { + return complete( + submit( + req("GET", tmpl("/guide/content_tags/{id}").set("id", contentTagId)), + handle(ContentTag.class, "content_tag"))); + } + + public ContentTag createContentTag(ContentTag contentTag) { + checkHasName(contentTag); + return complete( + submit( + req( + "POST", + cnst("/guide/content_tags"), + JSON, + json(Collections.singletonMap("content_tag", contentTag))), + handle(ContentTag.class, "content_tag"))); + } + + public ContentTag updateContentTag(ContentTag contentTag) { + checkHasId(contentTag); + checkHasName(contentTag); + return complete( + submit( + req( + "PUT", + tmpl("/guide/content_tags/{id}").set("id", contentTag.getId()), + JSON, + json(Collections.singletonMap("content_tag", contentTag))), + handle(ContentTag.class, "content_tag"))); + } + + public void deleteContentTag(ContentTag contentTag) { + checkHasId(contentTag); + complete( + submit( + req("DELETE", tmpl("/guide/content_tags/{id}").set("id", contentTag.getId())), + handleStatus())); + } + + public Iterable getContentTags() { + int defaultPageSize = 10; + return getContentTags(defaultPageSize, null); + } + + public Iterable getContentTags(int pageSize) { + return getContentTags(pageSize, null); + } + + public Iterable getContentTags(int pageSize, String namePrefix) { + Function afterCursorUriBuilder = + (String afterCursor) -> buildContentTagsSearchUrl(pageSize, namePrefix, afterCursor); + return new PagedIterable<>( + afterCursorUriBuilder.apply(null), + handleListWithAfterCursorButNoLinks(ContentTag.class, afterCursorUriBuilder, "records")); + } + + private Uri buildContentTagsSearchUrl(int pageSize, String namePrefixFilter, String afterCursor) { + final StringBuilder uriBuilder = + new StringBuilder("/guide/content_tags?page[size]=").append(pageSize); - public Schedule getSchedule(Schedule schedule) { - checkHasId(schedule); - return getSchedule(schedule.getId()); + if (namePrefixFilter != null) { + uriBuilder.append("&filter[name_prefix]=").append(encodeUrl(namePrefixFilter)); } - - public Schedule getSchedule(Long scheduleId) { - return complete(submit(req("GET", tmpl("/business_hours/schedules/{id}.json").set("id", scheduleId)), - handle(Schedule.class, "schedule"))); + if (afterCursor != null) { + uriBuilder.append("&page[after]=").append(encodeUrl(afterCursor)); } + return cnst(uriBuilder.toString()); + } - public Iterable getHolidaysForSchedule(Schedule schedule) { - checkHasId(schedule); - return getHolidaysForSchedule(schedule.getId()); - } + public List getTimeZones() { + return complete( + submit(req("GET", cnst("/time_zones.json")), handleList(TimeZone.class, "time_zones"))); + } - public Iterable getHolidaysForSchedule(Long scheduleId) { - return complete(submit(req("GET", - tmpl("/business_hours/schedules/{id}/holidays.json").set("id", scheduleId)), - handleList(Holiday.class, "holidays"))); - } + ////////////////////////////////////////////////////////////////////// + // Helper methods + ////////////////////////////////////////////////////////////////////// - public ContentTag getContentTag(String contentTagId) { - return complete(submit(req("GET", tmpl("/guide/content_tags/{id}").set("id", contentTagId)), - handle(ContentTag.class, "content_tag"))); + private byte[] json(Object object) { + try { + return mapper.writeValueAsBytes(object); + } catch (JsonProcessingException e) { + throw new ZendeskException(e.getMessage(), e); } + } - public ContentTag createContentTag(ContentTag contentTag) { - checkHasName(contentTag); - return complete(submit(req("POST", cnst("/guide/content_tags"), - JSON, json(Collections.singletonMap("content_tag", contentTag))), - handle(ContentTag.class, "content_tag"))); + private ListenableFuture submit( + Request request, ZendeskAsyncCompletionHandler handler) { + if (logger.isDebugEnabled()) { + if (request.getStringData() != null) { + logger.debug( + "Request {} {}\n{}", request.getMethod(), request.getUrl(), request.getStringData()); + } else if (request.getByteData() != null) { + logger.debug( + "Request {} {} {} {} bytes", + request.getMethod(), + request.getUrl(), + request.getHeaders().get("Content-type"), + request.getByteData().length); + } else { + logger.debug("Request {} {}", request.getMethod(), request.getUrl()); + } } + return client.executeRequest(request, handler); + } - public ContentTag updateContentTag(ContentTag contentTag) { - checkHasId(contentTag); - checkHasName(contentTag); - return complete(submit(req("PUT", tmpl("/guide/content_tags/{id}").set("id", contentTag.getId()), - JSON, json(Collections.singletonMap("content_tag", contentTag))), - handle(ContentTag.class, "content_tag"))); + private abstract static class ZendeskAsyncCompletionHandler extends AsyncCompletionHandler { + @Override + public void onThrowable(Throwable t) { + if (t instanceof IOException) { + throw new ZendeskException(t); + } else { + super.onThrowable(t); + } } + } - public void deleteContentTag(ContentTag contentTag) { - checkHasId(contentTag); - complete(submit(req("DELETE", tmpl("/guide/content_tags/{id}").set("id", contentTag.getId())), - handleStatus())); - } + private Request req(String method, Uri template) { + return req(method, template.toString()); + } - public Iterable getContentTags() { - int defaultPageSize = 10; - return getContentTags(defaultPageSize, null); - } + private Request req(String method, String url) { + return reqBuilder(method, url).build(); + } - public Iterable getContentTags(int pageSize) { - return getContentTags(pageSize, null); - } + private Request req(String method, Uri template, String contentType, byte[] body) { + RequestBuilder builder = reqBuilder(method, template.toString()); + builder.addHeader("Content-type", contentType); + builder.setBody(body); + return builder.build(); + } - public Iterable getContentTags(int pageSize, String namePrefix) { - Function afterCursorUriBuilder = (String afterCursor) -> buildContentTagsSearchUrl(pageSize, namePrefix, afterCursor); - return new PagedIterable<>(afterCursorUriBuilder.apply(null), - handleListWithAfterCursorButNoLinks(ContentTag.class, afterCursorUriBuilder, "records")); + private RequestBuilder reqBuilder(String method, String url) { + RequestBuilder builder = new RequestBuilder(method); + if (realm != null) { + builder.setRealm(realm); + } else { + builder.addHeader("Authorization", "Bearer " + oauthToken); } + headers.forEach(builder::setHeader); + return builder.setUrl(url); + } - private Uri buildContentTagsSearchUrl(int pageSize, String namePrefixFilter, String afterCursor) { - final StringBuilder uriBuilder = new StringBuilder("/guide/content_tags?page[size]=").append(pageSize); + protected ZendeskAsyncCompletionHandler handleStatus() { + return new ZendeskAsyncCompletionHandler() { + @Override + public Void onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + return null; + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); + } + throw new ZendeskResponseException(response); + } + }; + } - if (namePrefixFilter != null) { - uriBuilder.append("&filter[name_prefix]=").append(encodeUrl(namePrefixFilter)); + @SuppressWarnings("unchecked") + protected ZendeskAsyncCompletionHandler handle(final Class clazz) { + return new ZendeskAsyncCompletionHandler() { + @Override + public T onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + return (T) mapper.readerFor(clazz).readValue(response.getResponseBodyAsStream()); + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); } - if (afterCursor != null) { - uriBuilder.append("&page[after]=").append(encodeUrl(afterCursor)); + if (response.getStatusCode() == 404) { + return null; } - return cnst(uriBuilder.toString()); - } + throw new ZendeskResponseException(response); + } + }; + } - public List getTimeZones(){ - return complete(submit(req("GET", cnst("/time_zones.json")), handleList(TimeZone.class, - "time_zones"))); + private class BasicAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { + private final Class clazz; + private final String name; + private final Class[] typeParams; + + public BasicAsyncCompletionHandler(Class clazz, String name, Class... typeParams) { + this.clazz = clazz; + this.name = name; + this.typeParams = typeParams; + } + + @Override + public T onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + if (typeParams.length > 0) { + JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); + return mapper.convertValue( + mapper.readTree(response.getResponseBodyAsStream()).get(name), type); + } + return mapper.convertValue( + mapper.readTree(response.getResponseBodyAsStream()).get(name), clazz); + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); + } + if (response.getStatusCode() == 404) { + return null; + } + throw new ZendeskResponseException(response); } + } - ////////////////////////////////////////////////////////////////////// - // Helper methods - ////////////////////////////////////////////////////////////////////// + protected ZendeskAsyncCompletionHandler handle( + final Class clazz, final String name, final Class... typeParams) { + return new BasicAsyncCompletionHandler<>(clazz, name, typeParams); + } - private byte[] json(Object object) { - try { - return mapper.writeValueAsBytes(object); - } catch (JsonProcessingException e) { - throw new ZendeskException(e.getMessage(), e); + protected ZendeskAsyncCompletionHandler handleJobStatus() { + return new BasicAsyncCompletionHandler(JobStatus.class, "job_status") { + @Override + public JobStatus onCompleted(Response response) throws Exception { + JobStatus result = super.onCompleted(response); + if (result == null) { + // null is when we receive a 404 response. + // For an async job we trigger an error + throw new ZendeskResponseException(response); } - } + return result; + } + }; + } + + private static final String CURSOR_LINKS = "links"; + private static final String CURSOR_NEXT_PAGE = "next"; + private static final String NEXT_PAGE = "next_page"; + private static final String END_TIME = "end_time"; + private static final String COUNT = "count"; + private static final int INCREMENTAL_EXPORT_MAX_COUNT_BY_REQUEST = 1000; + + private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { + private String nextPage; - private ListenableFuture submit(Request request, ZendeskAsyncCompletionHandler handler) { + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode node = responseNode.get(CURSOR_LINKS); + + // Attempt to use cursor pagination if possible + if (node != null) { + node = node.get(CURSOR_NEXT_PAGE); + } else { + node = responseNode.get(NEXT_PAGE); + } + + if (node == null) { + this.nextPage = null; if (logger.isDebugEnabled()) { - if (request.getStringData() != null) { - logger.debug("Request {} {}\n{}", request.getMethod(), request.getUrl(), request.getStringData()); - } else if (request.getByteData() != null) { - logger.debug("Request {} {} {} {} bytes", request.getMethod(), request.getUrl(), - request.getHeaders().get("Content-type"), request.getByteData().length); - } else { - logger.debug("Request {} {}", request.getMethod(), request.getUrl()); - } + logger.debug( + NEXT_PAGE + + " property not found, pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); } - return client.executeRequest(request, handler); + } else { + this.nextPage = node.asText(); + } } - private static abstract class ZendeskAsyncCompletionHandler extends AsyncCompletionHandler { - @Override - public void onThrowable(Throwable t) { - if (t instanceof IOException) { - throw new ZendeskException(t); - } else { - super.onThrowable(t); - } - } + public String getNextPage() { + return nextPage; } - private Request req(String method, Uri template) { - return req(method, template.toString()); + public void setNextPage(String nextPage) { + this.nextPage = nextPage; } + } - private Request req(String method, String url) { - return reqBuilder(method, url).build(); - } + private class PagedAsyncListCompletionHandler extends PagedAsyncCompletionHandler> { + private final Class clazz; + private final String name; - private Request req(String method, Uri template, String contentType, byte[] body) { - RequestBuilder builder = reqBuilder(method, template.toString()); - builder.addHeader("Content-type", contentType); - builder.setBody(body); - return builder.build(); + public PagedAsyncListCompletionHandler(Class clazz, String name) { + this.clazz = clazz; + this.name = name; } - private RequestBuilder reqBuilder(String method, String url) { - RequestBuilder builder = new RequestBuilder(method); - if (realm != null) { - builder.setRealm(realm); - } else { - builder.addHeader("Authorization", "Bearer " + oauthToken); + @Override + public List onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + setPagedProperties(responseNode, clazz); + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { + values.add(mapper.convertValue(node, clazz)); } - headers.forEach(builder::setHeader); - return builder.setUrl(url); - } - - protected ZendeskAsyncCompletionHandler handleStatus() { - return new ZendeskAsyncCompletionHandler() { - @Override - public Void onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - return null; - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - throw new ZendeskResponseException(response); - } - }; - } - - @SuppressWarnings("unchecked") - protected ZendeskAsyncCompletionHandler handle(final Class clazz) { - return new ZendeskAsyncCompletionHandler() { - @Override - public T onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - return (T) mapper.readerFor(clazz).readValue(response.getResponseBodyAsStream()); - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - if (response.getStatusCode() == 404) { - return null; - } - throw new ZendeskResponseException(response); - } - }; + return values; + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); + } + throw new ZendeskResponseException(response); } + } - private class BasicAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { - private final Class clazz; - private final String name; - private final Class[] typeParams; + protected PagedAsyncCompletionHandler> handleList( + final Class clazz, final String name) { + return new PagedAsyncListCompletionHandler<>(clazz, name); + } - public BasicAsyncCompletionHandler(Class clazz, String name, Class... typeParams) { - this.clazz = clazz; - this.name = name; - this.typeParams = typeParams; + private static final long FIVE_MINUTES = TimeUnit.MINUTES.toMillis(5); + + protected PagedAsyncCompletionHandler> handleIncrementalList( + final Class clazz, final String name) { + return new PagedAsyncListCompletionHandler(clazz, name) { + @Override + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode node = responseNode.get(NEXT_PAGE); + if (node == null) { + if (logger.isDebugEnabled()) { + logger.debug( + NEXT_PAGE + + " property not found, pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); + } + setNextPage(null); + return; } - - @Override - public T onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - if (typeParams.length > 0) { - JavaType type = mapper.getTypeFactory().constructParametricType(clazz, typeParams); - return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), type); - } - return mapper.convertValue(mapper.readTree(response.getResponseBodyAsStream()).get(name), clazz); - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - if (response.getStatusCode() == 404) { - return null; - } - throw new ZendeskResponseException(response); + JsonNode endTimeNode = responseNode.get(END_TIME); + if (endTimeNode == null || endTimeNode.asLong() == 0) { + if (logger.isDebugEnabled()) { + logger.debug( + END_TIME + + " property not found, incremental export pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); + } + setNextPage(null); + return; } - } - - protected ZendeskAsyncCompletionHandler handle(final Class clazz, final String name, final Class... typeParams) { - return new BasicAsyncCompletionHandler<>(clazz, name, typeParams); - } - - protected ZendeskAsyncCompletionHandler handleJobStatus() { - return new BasicAsyncCompletionHandler(JobStatus.class, "job_status") { - @Override - public JobStatus onCompleted(Response response) throws Exception { - JobStatus result = super.onCompleted(response); - if (result == null) { - // null is when we receive a 404 response. - // For an async job we trigger an error - throw new ZendeskResponseException(response); - } - return result; - } - }; - } - - private static final String CURSOR_LINKS = "links"; - private static final String CURSOR_NEXT_PAGE = "next"; - private static final String NEXT_PAGE = "next_page"; - private static final String END_TIME = "end_time"; - private static final String COUNT = "count"; - private static final int INCREMENTAL_EXPORT_MAX_COUNT_BY_REQUEST = 1000; - - - private abstract class PagedAsyncCompletionHandler extends ZendeskAsyncCompletionHandler { - private String nextPage; - - public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode node = responseNode.get(CURSOR_LINKS); - - // Attempt to use cursor pagination if possible - if (node != null) { - node = node.get(CURSOR_NEXT_PAGE); - } else { - node = responseNode.get(NEXT_PAGE); + /* + A request after five minutes ago will result in a 422 responds from Zendesk. + Therefore, we stop pagination. + */ + if (TimeUnit.SECONDS.toMillis(endTimeNode.asLong()) + > System.currentTimeMillis() - FIVE_MINUTES) { + setNextPage(null); + } else { + // Taking into account documentation found at + // https://developer.zendesk.com/rest_api/docs/core/incremental_export#polling-strategy + JsonNode countNode = responseNode.get(COUNT); + if (countNode == null) { + if (logger.isDebugEnabled()) { + logger.debug( + COUNT + + " property not found, incremental export pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); } + setNextPage(null); + return; + } - if (node == null) { - this.nextPage = null; - if (logger.isDebugEnabled()) { - logger.debug(NEXT_PAGE + " property not found, pagination not supported" + - (clazz != null ? " for " + clazz.getName() : "")); - } - } else { - this.nextPage = node.asText(); - } + if (countNode.asInt() < INCREMENTAL_EXPORT_MAX_COUNT_BY_REQUEST) { + setNextPage(null); + } else { + setNextPage(node.asText()); + } } + } + }; + } - public String getNextPage() { - return nextPage; + protected PagedAsyncCompletionHandler> handleSearchList( + final String name) { + return new PagedAsyncCompletionHandler>() { + @Override + public List onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); + setPagedProperties(responseNode, null); + List values = new ArrayList<>(); + for (JsonNode node : responseNode) { + Class clazz = + searchResultTypes.get(node.get("result_type").asText()); + if (clazz != null) { + values.add(mapper.convertValue(node, clazz)); + } + } + return values; + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); } + throw new ZendeskResponseException(response); + } + }; + } - public void setNextPage(String nextPage) { - this.nextPage = nextPage; + protected PagedAsyncCompletionHandler> handleTargetList(final String name) { + return new PagedAsyncCompletionHandler>() { + @Override + public List onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + setPagedProperties(responseNode, null); + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { + Class clazz = targetTypes.get(node.get("type").asText()); + if (clazz != null) { + values.add(mapper.convertValue(node, clazz)); + } + } + return values; + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); } - } + throw new ZendeskResponseException(response); + } + }; + } - private class PagedAsyncListCompletionHandler extends PagedAsyncCompletionHandler> { - private final Class clazz; - private final String name; - public PagedAsyncListCompletionHandler(Class clazz, String name) { - this.clazz = clazz; - this.name = name; + protected PagedAsyncCompletionHandler> handleArticleAttachmentsList( + final String name) { + return new PagedAsyncCompletionHandler>() { + @Override + public List onCompleted(Response response) throws Exception { + logResponse(response); + if (isStatus2xx(response)) { + JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); + List values = new ArrayList<>(); + for (JsonNode node : responseNode.get(name)) { + values.add(mapper.convertValue(node, ArticleAttachments.class)); + } + return values; + } else if (isRateLimitResponse(response)) { + throw new ZendeskResponseRateLimitException(response); } + throw new ZendeskResponseException(response); + } + }; + } - @Override - public List onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); - setPagedProperties(responseNode, clazz); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { - values.add(mapper.convertValue(node, clazz)); - } - return values; - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); + /** + * For a resource (e.g. ContentTag) which supports cursor based pagination for multiple results, + * but where the response does not have a `links.next` node (which would hold the URL of the next + * page) So we need to build the next page URL from the original URL and the meta.after_cursor + * node value + * + * @param The class of the resource + * @param afterCursorUriBuilder a function to build the URL for the next page + * `fn(after_cursor_value) => URL_of_next_page` + * @param name the name of the Json node that contains the resources entities (e.g. 'records' for + * ContentTag) + */ + private PagedAsyncCompletionHandler> handleListWithAfterCursorButNoLinks( + Class clazz, Function afterCursorUriBuilder, String name) { + + return new PagedAsyncListCompletionHandler(clazz, name) { + @Override + public void setPagedProperties(JsonNode responseNode, Class clazz) { + JsonNode metaNode = responseNode.get("meta"); + String nextPage = null; + if (metaNode == null) { + if (logger.isDebugEnabled()) { + logger.debug( + "meta" + + " property not found, pagination not supported" + + (clazz != null ? " for " + clazz.getName() : "")); + } + } else { + JsonNode afterCursorNode = metaNode.get("after_cursor"); + if (afterCursorNode != null) { + JsonNode hasMoreNode = metaNode.get("has_more"); + if (hasMoreNode != null && hasMoreNode.asBoolean()) { + nextPage = afterCursorUriBuilder.apply(afterCursorNode.asText()).toString(); } - throw new ZendeskResponseException(response); + } } - } + setNextPage(nextPage); + } + }; + } - protected PagedAsyncCompletionHandler> handleList(final Class clazz, final String name) { - return new PagedAsyncListCompletionHandler<>(clazz, name); - } - - private static final long FIVE_MINUTES = TimeUnit.MINUTES.toMillis(5); - - protected PagedAsyncCompletionHandler> handleIncrementalList(final Class clazz, final String name) { - return new PagedAsyncListCompletionHandler(clazz, name) { - @Override - public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode node = responseNode.get(NEXT_PAGE); - if (node == null) { - if (logger.isDebugEnabled()) { - logger.debug(NEXT_PAGE + " property not found, pagination not supported" + - (clazz != null ? " for " + clazz.getName() : "")); - } - setNextPage(null); - return; - } - JsonNode endTimeNode = responseNode.get(END_TIME); - if (endTimeNode == null || endTimeNode.asLong() == 0) { - if (logger.isDebugEnabled()) { - logger.debug(END_TIME + " property not found, incremental export pagination not supported" + - (clazz != null ? " for " + clazz.getName() : "")); - } - setNextPage(null); - return; - } - /* - A request after five minutes ago will result in a 422 responds from Zendesk. - Therefore, we stop pagination. - */ - if (TimeUnit.SECONDS.toMillis(endTimeNode.asLong()) > System.currentTimeMillis() - FIVE_MINUTES) { - setNextPage(null); - } else { - // Taking into account documentation found at https://developer.zendesk.com/rest_api/docs/core/incremental_export#polling-strategy - JsonNode countNode = responseNode.get(COUNT); - if (countNode == null) { - if (logger.isDebugEnabled()) { - logger.debug(COUNT + " property not found, incremental export pagination not supported" + - (clazz != null ? " for " + clazz.getName() : "")); - } - setNextPage(null); - return; - } - - if (countNode.asInt() < INCREMENTAL_EXPORT_MAX_COUNT_BY_REQUEST) { - setNextPage(null); - } else { - setNextPage(node.asText()); - } - } - } - }; - } - - protected PagedAsyncCompletionHandler> handleSearchList(final String name) { - return new PagedAsyncCompletionHandler>() { - @Override - public List onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsStream()).get(name); - setPagedProperties(responseNode, null); - List values = new ArrayList<>(); - for (JsonNode node : responseNode) { - Class clazz = searchResultTypes.get(node.get("result_type").asText()); - if (clazz != null) { - values.add(mapper.convertValue(node, clazz)); - } - } - return values; - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - throw new ZendeskResponseException(response); - } - }; - } - - protected PagedAsyncCompletionHandler> handleTargetList(final String name) { - return new PagedAsyncCompletionHandler>() { - @Override - public List onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); - setPagedProperties(responseNode, null); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { - Class clazz = targetTypes.get(node.get("type").asText()); - if (clazz != null) { - values.add(mapper.convertValue(node, clazz)); - } - } - return values; - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - throw new ZendeskResponseException(response); - } - }; - } - - - protected PagedAsyncCompletionHandler> handleArticleAttachmentsList(final String name) { - return new PagedAsyncCompletionHandler>() { - @Override - public List onCompleted(Response response) throws Exception { - logResponse(response); - if (isStatus2xx(response)) { - JsonNode responseNode = mapper.readTree(response.getResponseBodyAsBytes()); - List values = new ArrayList<>(); - for (JsonNode node : responseNode.get(name)) { - values.add(mapper.convertValue(node, ArticleAttachments.class)); - } - return values; - } else if (isRateLimitResponse(response)) { - throw new ZendeskResponseRateLimitException(response); - } - throw new ZendeskResponseException(response); - } - }; - } - - /** - * For a resource (e.g. ContentTag) which supports cursor based pagination for multiple results, - * but where the response does not have a `links.next` node (which would hold the URL of the next page) - * So we need to build the next page URL from the original URL and the meta.after_cursor node value - * - * @param The class of the resource - * @param afterCursorUriBuilder a function to build the URL for the next page `fn(after_cursor_value) => URL_of_next_page` - * @param name the name of the Json node that contains the resources entities (e.g. 'records' for ContentTag) - */ - private PagedAsyncCompletionHandler> handleListWithAfterCursorButNoLinks( - Class clazz, Function afterCursorUriBuilder, String name) { - - return new PagedAsyncListCompletionHandler(clazz, name) { - @Override - public void setPagedProperties(JsonNode responseNode, Class clazz) { - JsonNode metaNode = responseNode.get("meta"); - String nextPage = null; - if (metaNode == null) { - if (logger.isDebugEnabled()) { - logger.debug("meta" + " property not found, pagination not supported" + - (clazz != null ? " for " + clazz.getName() : "")); - } - } else { - JsonNode afterCursorNode = metaNode.get("after_cursor"); - if (afterCursorNode != null) { - JsonNode hasMoreNode = metaNode.get("has_more"); - if (hasMoreNode != null && hasMoreNode.asBoolean()) { - nextPage = afterCursorUriBuilder.apply(afterCursorNode.asText()).toString(); - } - } - } - setNextPage(nextPage); - } - }; - } + private TemplateUri tmpl(String template) { + return new TemplateUri(url + template); + } - private TemplateUri tmpl(String template) { - return new TemplateUri(url + template); - } + private Uri cnst(String template) { + return new FixedUri(url + template); + } - private Uri cnst(String template) { - return new FixedUri(url + template); + private void logResponse(Response response) throws IOException { + if (logger.isDebugEnabled()) { + logger.debug( + "Response HTTP/{} {}\n{}", + response.getStatusCode(), + response.getStatusText(), + response.getResponseBody()); } - - private void logResponse(Response response) throws IOException { - if (logger.isDebugEnabled()) { - logger.debug("Response HTTP/{} {}\n{}", response.getStatusCode(), response.getStatusText(), - response.getResponseBody()); - } - if (logger.isTraceEnabled()) { - logger.trace("Response headers {}", response.getHeaders()); - } + if (logger.isTraceEnabled()) { + logger.trace("Response headers {}", response.getHeaders()); } + } - private static final String UTF_8 = "UTF-8"; - - private static String encodeUrl(String input) { - try { - return URLEncoder.encode(input, UTF_8); - } catch (UnsupportedEncodingException impossible) { - return input; - } - } + private static final String UTF_8 = "UTF-8"; - private static long msToSeconds(long millis) { - return TimeUnit.MILLISECONDS.toSeconds(millis); + private static String encodeUrl(String input) { + try { + return URLEncoder.encode(input, UTF_8); + } catch (UnsupportedEncodingException impossible) { + return input; } + } - private boolean isStatus2xx(Response response) { - return response.getStatusCode() / 100 == 2; - } + private static long msToSeconds(long millis) { + return TimeUnit.MILLISECONDS.toSeconds(millis); + } - private boolean isRateLimitResponse(Response response) { - return response.getStatusCode() == 429; - } + private boolean isStatus2xx(Response response) { + return response.getStatusCode() / 100 == 2; + } - ////////////////////////////////////////////////////////////////////// - // Static helper methods - ////////////////////////////////////////////////////////////////////// + private boolean isRateLimitResponse(Response response) { + return response.getStatusCode() == 429; + } - private static T complete(ListenableFuture future) { - try { - return future.get(); - } catch (InterruptedException e) { - throw new ZendeskException(e.getMessage(), e); - } catch (ExecutionException e) { - if (e.getCause() instanceof ZendeskException) { - if (e.getCause() instanceof ZendeskResponseRateLimitException) { - throw new ZendeskResponseRateLimitException((ZendeskResponseRateLimitException) e.getCause()); - } - if (e.getCause() instanceof ZendeskResponseException) { - throw new ZendeskResponseException((ZendeskResponseException)e.getCause()); - } - throw new ZendeskException(e.getCause()); - } - throw new ZendeskException(e.getMessage(), e); + ////////////////////////////////////////////////////////////////////// + // Static helper methods + ////////////////////////////////////////////////////////////////////// + + private static T complete(ListenableFuture future) { + try { + return future.get(); + } catch (InterruptedException e) { + throw new ZendeskException(e.getMessage(), e); + } catch (ExecutionException e) { + if (e.getCause() instanceof ZendeskException) { + if (e.getCause() instanceof ZendeskResponseRateLimitException) { + throw new ZendeskResponseRateLimitException( + (ZendeskResponseRateLimitException) e.getCause()); } + if (e.getCause() instanceof ZendeskResponseException) { + throw new ZendeskResponseException((ZendeskResponseException) e.getCause()); + } + throw new ZendeskException(e.getCause()); + } + throw new ZendeskException(e.getMessage(), e); } + } - private static void checkHasId(Ticket ticket) { - if (ticket.getId() == null) { - throw new IllegalArgumentException("Ticket requires id"); - } + private static void checkHasId(Ticket ticket) { + if (ticket.getId() == null) { + throw new IllegalArgumentException("Ticket requires id"); } + } - private static void checkHasId(TicketForm ticketForm) { - if (ticketForm.getId() == null) { - throw new IllegalArgumentException("TicketForm requires id"); - } + private static void checkHasId(TicketForm ticketForm) { + if (ticketForm.getId() == null) { + throw new IllegalArgumentException("TicketForm requires id"); } + } - private static void checkHasId(org.zendesk.client.v2.model.Request request) { - if (request.getId() == null) { - throw new IllegalArgumentException("Request requires id"); - } + private static void checkHasId(org.zendesk.client.v2.model.Request request) { + if (request.getId() == null) { + throw new IllegalArgumentException("Request requires id"); } + } - private static void checkHasId(Audit audit) { - if (audit.getId() == null) { - throw new IllegalArgumentException("Audit requires id"); - } + private static void checkHasId(Audit audit) { + if (audit.getId() == null) { + throw new IllegalArgumentException("Audit requires id"); } + } - private static void checkHasId(Comment comment) { - if (comment.getId() == null) { - throw new IllegalArgumentException("Comment requires id"); - } + private static void checkHasId(Comment comment) { + if (comment.getId() == null) { + throw new IllegalArgumentException("Comment requires id"); } + } - private static void checkHasId(Field field) { - if (field.getId() == null) { - throw new IllegalArgumentException("Field requires id"); - } + private static void checkHasId(Field field) { + if (field.getId() == null) { + throw new IllegalArgumentException("Field requires id"); } + } - private static void checkHasId(Attachment attachment) { - if (attachment.getId() == null) { - throw new IllegalArgumentException("Attachment requires id"); - } + private static void checkHasId(Attachment attachment) { + if (attachment.getId() == null) { + throw new IllegalArgumentException("Attachment requires id"); } + } - private static void checkHasId(ArticleAttachments attachments) { - if (attachments.getId() == null) { - throw new IllegalArgumentException("Attachment requires id"); - } + private static void checkHasId(ArticleAttachments attachments) { + if (attachments.getId() == null) { + throw new IllegalArgumentException("Attachment requires id"); } + } - private static void checkHasId(User user) { - if (user.getId() == null) { - throw new IllegalArgumentException("User requires id"); - } + private static void checkHasId(User user) { + if (user.getId() == null) { + throw new IllegalArgumentException("User requires id"); } + } - private static void checkHasId(Identity identity) { - if (identity.getId() == null) { - throw new IllegalArgumentException("Identity requires id"); - } + private static void checkHasId(Identity identity) { + if (identity.getId() == null) { + throw new IllegalArgumentException("Identity requires id"); } + } - private static void checkHasId(Organization organization) { - if (organization.getId() == null) { - throw new IllegalArgumentException("Organization requires id"); - } + private static void checkHasId(Organization organization) { + if (organization.getId() == null) { + throw new IllegalArgumentException("Organization requires id"); } + } - private static void checkHasId(Group group) { - if (group.getId() == null) { - throw new IllegalArgumentException("Group requires id"); - } + private static void checkHasId(Group group) { + if (group.getId() == null) { + throw new IllegalArgumentException("Group requires id"); } + } - private static void checkHasId(GroupMembership groupMembership) { - if (groupMembership.getId() == null) { - throw new IllegalArgumentException("GroupMembership requires id"); - } + private static void checkHasId(GroupMembership groupMembership) { + if (groupMembership.getId() == null) { + throw new IllegalArgumentException("GroupMembership requires id"); } + } - private void checkHasId(Forum forum) { - if (forum.getId() == null) { - throw new IllegalArgumentException("Forum requires id"); - } + private void checkHasId(Forum forum) { + if (forum.getId() == null) { + throw new IllegalArgumentException("Forum requires id"); } + } - private void checkHasId(Topic topic) { - if (topic.getId() == null) { - throw new IllegalArgumentException("Topic requires id"); - } + private void checkHasId(Topic topic) { + if (topic.getId() == null) { + throw new IllegalArgumentException("Topic requires id"); } + } - private static void checkHasId(OrganizationMembership organizationMembership) { - if (organizationMembership.getId() == null) { - throw new IllegalArgumentException("OrganizationMembership requires id"); - } + private static void checkHasId(OrganizationMembership organizationMembership) { + if (organizationMembership.getId() == null) { + throw new IllegalArgumentException("OrganizationMembership requires id"); } + } - private static void checkHasId(Article article) { - if (article.getId() == null) { - throw new IllegalArgumentException("Article requires id"); - } + private static void checkHasId(Article article) { + if (article.getId() == null) { + throw new IllegalArgumentException("Article requires id"); } + } - private static void checkHasId(DynamicContentItem item) { - if (item.getId() == null) { - throw new IllegalArgumentException("Item requires id"); - } + private static void checkHasId(DynamicContentItem item) { + if (item.getId() == null) { + throw new IllegalArgumentException("Item requires id"); } + } - private static void checkHasId(DynamicContentItemVariant variant) { - if (variant.getId() == null) { - throw new IllegalArgumentException("Variant requires id"); - } + private static void checkHasId(DynamicContentItemVariant variant) { + if (variant.getId() == null) { + throw new IllegalArgumentException("Variant requires id"); } + } - private static void checkHasItemId(Long itemId) { - if (itemId == null) { - throw new IllegalArgumentException("Variant requires item id"); - } + private static void checkHasItemId(Long itemId) { + if (itemId == null) { + throw new IllegalArgumentException("Variant requires item id"); } + } - private static void checkHasSectionId(Article article) { - if (article.getSectionId() == null) { - throw new IllegalArgumentException("Article requires section id"); - } + private static void checkHasSectionId(Article article) { + if (article.getSectionId() == null) { + throw new IllegalArgumentException("Article requires section id"); } + } - private static void checkHasArticleId(Long articleId) { - if (articleId == null) { - throw new IllegalArgumentException("Translation requires article id"); - } + private static void checkHasArticleId(Long articleId) { + if (articleId == null) { + throw new IllegalArgumentException("Translation requires article id"); } + } - private static void checkHasSectionId(Long articleId) { - if (articleId == null) { - throw new IllegalArgumentException("Translation requires section id"); - } + private static void checkHasSectionId(Long articleId) { + if (articleId == null) { + throw new IllegalArgumentException("Translation requires section id"); } + } - private static void checkHasCategoryId(Long articleId) { - if (articleId == null) { - throw new IllegalArgumentException("Translation requires category id"); - } + private static void checkHasCategoryId(Long articleId) { + if (articleId == null) { + throw new IllegalArgumentException("Translation requires category id"); } + } - private static void checkHasCategoryId(Section section) { - if (section.getCategoryId() == null) { - throw new IllegalArgumentException("Section requires category id"); - } + private static void checkHasCategoryId(Section section) { + if (section.getCategoryId() == null) { + throw new IllegalArgumentException("Section requires category id"); } + } - private static void checkHasId(Category category) { - if (category.getId() == null) { - throw new IllegalArgumentException("Category requires id"); - } + private static void checkHasId(Category category) { + if (category.getId() == null) { + throw new IllegalArgumentException("Category requires id"); } + } - private static void checkHasId(Section section) { - if (section.getId() == null) { - throw new IllegalArgumentException("Section requires id"); - } + private static void checkHasId(Section section) { + if (section.getId() == null) { + throw new IllegalArgumentException("Section requires id"); } + } - private static void checkHasId(SuspendedTicket ticket) { - if (ticket == null || ticket.getId() == null) { - throw new IllegalArgumentException("SuspendedTicket requires id"); - } + private static void checkHasId(SuspendedTicket ticket) { + if (ticket == null || ticket.getId() == null) { + throw new IllegalArgumentException("SuspendedTicket requires id"); } + } - private static void checkHasId(Translation translation) { - if (translation.getId() == null) { - throw new IllegalArgumentException("Translation requires id"); - } + private static void checkHasId(Translation translation) { + if (translation.getId() == null) { + throw new IllegalArgumentException("Translation requires id"); } + } - private static void checkHasId(Schedule schedule) { - if (schedule == null || schedule.getId() == null) { - throw new IllegalArgumentException("Schedule requires id"); - } + private static void checkHasId(Schedule schedule) { + if (schedule == null || schedule.getId() == null) { + throw new IllegalArgumentException("Schedule requires id"); } + } - private static void checkHasId(Holiday holiday) { - if (holiday == null || holiday.getId() == null) { - throw new IllegalArgumentException("Holiday requires id"); - } + private static void checkHasId(Holiday holiday) { + if (holiday == null || holiday.getId() == null) { + throw new IllegalArgumentException("Holiday requires id"); } + } - private static void checkHasId(PermissionGroup permissionGroup) { - if (permissionGroup.getId() == null) { - throw new IllegalArgumentException("PermissionGroup requires id"); - } + private static void checkHasId(PermissionGroup permissionGroup) { + if (permissionGroup.getId() == null) { + throw new IllegalArgumentException("PermissionGroup requires id"); } + } - private static void checkHasId(UserSegment userSegment) { - if (userSegment.getId() == null) { - throw new IllegalArgumentException("UserSegment requires id"); - } + private static void checkHasId(UserSegment userSegment) { + if (userSegment.getId() == null) { + throw new IllegalArgumentException("UserSegment requires id"); } + } - private static void checkHasId(ContentTag contentTag) { - if (contentTag.getId() == null) { - throw new IllegalArgumentException("Content Tag requires id"); - } + private static void checkHasId(ContentTag contentTag) { + if (contentTag.getId() == null) { + throw new IllegalArgumentException("Content Tag requires id"); } + } - private static void checkHasName(ContentTag contentTag) { - if (contentTag.getName() == null || contentTag.getName().trim().isEmpty()) { - throw new IllegalArgumentException("Content Tag requires name"); - } + private static void checkHasName(ContentTag contentTag) { + if (contentTag.getName() == null || contentTag.getName().trim().isEmpty()) { + throw new IllegalArgumentException("Content Tag requires name"); } + } - private static void checkHasToken(Attachment.Upload upload) { - if (upload.getToken() == null) { - throw new IllegalArgumentException("Upload requires token"); - } + private static void checkHasToken(Attachment.Upload upload) { + if (upload.getToken() == null) { + throw new IllegalArgumentException("Upload requires token"); } + } - private static List idArray(long id, long... ids) { - List result = new ArrayList<>(ids.length + 1); - result.add(id); - for (long i : ids) { - result.add(i); - } - return result; + private static List idArray(long id, long... ids) { + List result = new ArrayList<>(ids.length + 1); + result.add(id); + for (long i : ids) { + result.add(i); } + return result; + } - private static List idArray(String id, String... ids) { - List result = new ArrayList<>(ids.length + 1); - result.add(id); - for (String i : ids) { - result.add(i); - } - return result; + private static List idArray(String id, String... ids) { + List result = new ArrayList<>(ids.length + 1); + result.add(id); + for (String i : ids) { + result.add(i); } + return result; + } - private static List statusArray(Status... statuses) { - List result = new ArrayList<>(statuses.length); - for (Status s : statuses) { - result.add(s.toString()); - } - return result; + private static List statusArray(Status... statuses) { + List result = new ArrayList<>(statuses.length); + for (Status s : statuses) { + result.add(s.toString()); } - - private static String getTypeName(final Class type) { - String typeName = null; - for (final Map.Entry> entry : searchResultTypes.entrySet()) { - if (type.equals(entry.getValue())) { - typeName = entry.getKey(); - break; - } + return result; + } + + private static String getTypeName(final Class type) { + String typeName = null; + for (final Map.Entry> entry : + searchResultTypes.entrySet()) { + if (type.equals(entry.getValue())) { + typeName = entry.getKey(); + break; } - return typeName; } + return typeName; + } - private TemplateUri getSearchUri(Map params, String query , String typeName) { - - StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace + private TemplateUri getSearchUri(Map params, String query, String typeName) { - //we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri - for (String paramName : params.keySet()) { - uriTemplate.append(",") - .append(paramName); - } + StringBuilder uriTemplate = + new StringBuilder("/search.json{?query"); // leave off ending curly brace - uriTemplate.append("}"); + // we have to add each param name to the template so that when we call set() with a map, the + // entries get put in the uri + for (String paramName : params.keySet()) { + uriTemplate.append(",").append(paramName); + } - TemplateUri templateUri = tmpl(uriTemplate.toString()) - .set("query", query + " type:" + typeName); + uriTemplate.append("}"); - if(params != null) { - templateUri.set(params); - } + TemplateUri templateUri = + tmpl(uriTemplate.toString()).set("query", query + " type:" + typeName); - return templateUri; - } - - public static ObjectMapper createMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.setDateFormat(new StdDateFormat()); - mapper.enable(DeserializationFeature.USE_LONG_FOR_INTS); - return mapper; + if (params != null) { + templateUri.set(params); } - ////////////////////////////////////////////////////////////////////// - // Helper classes - ////////////////////////////////////////////////////////////////////// + return templateUri; + } - private class PagedIterable implements Iterable { + public static ObjectMapper createMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.setDateFormat(new StdDateFormat()); + mapper.enable(DeserializationFeature.USE_LONG_FOR_INTS); + return mapper; + } - private final Uri url; - private final PagedAsyncCompletionHandler> handler; + ////////////////////////////////////////////////////////////////////// + // Helper classes + ////////////////////////////////////////////////////////////////////// - private PagedIterable(Uri url, PagedAsyncCompletionHandler> handler) { - this.handler = handler; - this.url = url; - } + private class PagedIterable implements Iterable { - public Iterator iterator() { - return new PagedIterator(url); - } + private final Uri url; + private final PagedAsyncCompletionHandler> handler; - private class PagedIterator implements Iterator { + private PagedIterable(Uri url, PagedAsyncCompletionHandler> handler) { + this.handler = handler; + this.url = url; + } - private Iterator current; - private String nextPage; + public Iterator iterator() { + return new PagedIterator(url); + } - public PagedIterator(Uri url) { - this.nextPage = url.toString(); - } + private class PagedIterator implements Iterator { - public boolean hasNext() { - if (current == null || !current.hasNext()) { - if (nextPage == null || nextPage.equalsIgnoreCase("null")) { - return false; - } - List values = complete(submit(req("GET", nextPage), handler)); - nextPage = handler.getNextPage(); - current = values.iterator(); - } - return current.hasNext(); - } + private Iterator current; + private String nextPage; - public T next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return current.next(); - } + public PagedIterator(Uri url) { + this.nextPage = url.toString(); + } - public void remove() { - throw new UnsupportedOperationException(); - } + public boolean hasNext() { + if (current == null || !current.hasNext()) { + if (nextPage == null || nextPage.equalsIgnoreCase("null")) { + return false; + } + List values = complete(submit(req("GET", nextPage), handler)); + nextPage = handler.getNextPage(); + current = values.iterator(); } + return current.hasNext(); + } - } - - public static class Builder { - private AsyncHttpClient client = null; - private final String url; - private String username = null; - private String password = null; - private String token = null; - private String oauthToken = null; - private final Map headers; - - public Builder(String url) { - this.url = url; - this.headers = new HashMap<>(); + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); } + return current.next(); + } - public Builder setClient(AsyncHttpClient client) { - this.client = client; - return this; - } + public void remove() { + throw new UnsupportedOperationException(); + } + } + } - public Builder setUsername(String username) { - this.username = username; - return this; - } + public static class Builder { + private AsyncHttpClient client = null; + private final String url; + private String username = null; + private String password = null; + private String token = null; + private String oauthToken = null; + private final Map headers; - public Builder setPassword(String password) { - this.password = password; - if (password != null) { - this.token = null; - this.oauthToken = null; - } - return this; - } + public Builder(String url) { + this.url = url; + this.headers = new HashMap<>(); + } - public Builder setToken(String token) { - this.token = token; - if (token != null) { - this.password = null; - this.oauthToken = null; - } - return this; - } + public Builder setClient(AsyncHttpClient client) { + this.client = client; + return this; + } + public Builder setUsername(String username) { + this.username = username; + return this; + } - public Builder setOauthToken(String oauthToken) { - this.oauthToken = oauthToken; - if (oauthToken != null) { - this.password = null; - this.token = null; - } - return this; - } + public Builder setPassword(String password) { + this.password = password; + if (password != null) { + this.token = null; + this.oauthToken = null; + } + return this; + } + public Builder setToken(String token) { + this.token = token; + if (token != null) { + this.password = null; + this.oauthToken = null; + } + return this; + } - public Builder setRetry(boolean retry) { - return this; - } + public Builder setOauthToken(String oauthToken) { + this.oauthToken = oauthToken; + if (oauthToken != null) { + this.password = null; + this.token = null; + } + return this; + } - public Builder addHeader(String name, String value) { - Objects.requireNonNull(name, "Header name cannot be null"); - Objects.requireNonNull(value, "Header value cannot be null"); - headers.put(name, value); - return this; - } + public Builder setRetry(boolean retry) { + return this; + } - public Zendesk build() { - if (token != null) { - return new Zendesk(client, url, username + "/token", token, headers); - } else if (oauthToken != null) { - return new Zendesk(client, url, oauthToken, headers); - } - return new Zendesk(client, url, username, password, headers); - } + public Builder addHeader(String name, String value) { + Objects.requireNonNull(name, "Header name cannot be null"); + Objects.requireNonNull(value, "Header value cannot be null"); + headers.put(name, value); + return this; } + + public Zendesk build() { + if (token != null) { + return new Zendesk(client, url, username + "/token", token, headers); + } else if (oauthToken != null) { + return new Zendesk(client, url, oauthToken, headers); + } + return new Zendesk(client, url, username, password, headers); + } + } } diff --git a/src/main/java/org/zendesk/client/v2/ZendeskException.java b/src/main/java/org/zendesk/client/v2/ZendeskException.java index 477c3f5c0..82cd3ce68 100644 --- a/src/main/java/org/zendesk/client/v2/ZendeskException.java +++ b/src/main/java/org/zendesk/client/v2/ZendeskException.java @@ -6,20 +6,19 @@ */ public class ZendeskException extends RuntimeException { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public ZendeskException(String message) { - super(message); - } + public ZendeskException(String message) { + super(message); + } - public ZendeskException() { - } + public ZendeskException() {} - public ZendeskException(Throwable cause) { - super(cause); - } + public ZendeskException(Throwable cause) { + super(cause); + } - public ZendeskException(String message, Throwable cause) { - super(message, cause); - } + public ZendeskException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/src/main/java/org/zendesk/client/v2/ZendeskResponseException.java b/src/main/java/org/zendesk/client/v2/ZendeskResponseException.java index 8b5dcfe33..195e66a99 100644 --- a/src/main/java/org/zendesk/client/v2/ZendeskResponseException.java +++ b/src/main/java/org/zendesk/client/v2/ZendeskResponseException.java @@ -1,48 +1,45 @@ package org.zendesk.client.v2; -import org.asynchttpclient.Response; - import java.io.IOException; import java.text.MessageFormat; +import org.asynchttpclient.Response; -/** - * {@link ZendeskException} specialisation for HTTP non-2xx responses - */ +/** {@link ZendeskException} specialisation for HTTP non-2xx responses */ public class ZendeskResponseException extends ZendeskException { - private static final long serialVersionUID = 1L; - - private int statusCode; - private String statusText; - private String body; - - public ZendeskResponseException(Response resp) throws IOException { - this(resp.getStatusCode(), resp.getStatusText(), resp.getResponseBody()); - } - - public ZendeskResponseException(int statusCode, String statusText, String body) { - super(MessageFormat.format("HTTP/{0}: {1} - {2}", statusCode, statusText, body)); - this.statusCode = statusCode; - this.statusText = statusText; - this.body = body; - } - - public ZendeskResponseException(ZendeskResponseException cause) { - super(cause.getMessage(), cause); - this.statusCode = cause.getStatusCode(); - this.statusText = cause.getStatusText(); - this.body = cause.getBody(); - } - - public int getStatusCode() { - return statusCode; - } - - public String getStatusText() { - return statusText; - } - - public String getBody() { - return body; - } + private static final long serialVersionUID = 1L; + + private int statusCode; + private String statusText; + private String body; + + public ZendeskResponseException(Response resp) throws IOException { + this(resp.getStatusCode(), resp.getStatusText(), resp.getResponseBody()); + } + + public ZendeskResponseException(int statusCode, String statusText, String body) { + super(MessageFormat.format("HTTP/{0}: {1} - {2}", statusCode, statusText, body)); + this.statusCode = statusCode; + this.statusText = statusText; + this.body = body; + } + + public ZendeskResponseException(ZendeskResponseException cause) { + super(cause.getMessage(), cause); + this.statusCode = cause.getStatusCode(); + this.statusText = cause.getStatusText(); + this.body = cause.getBody(); + } + + public int getStatusCode() { + return statusCode; + } + + public String getStatusText() { + return statusText; + } + + public String getBody() { + return body; + } } diff --git a/src/main/java/org/zendesk/client/v2/ZendeskResponseRateLimitException.java b/src/main/java/org/zendesk/client/v2/ZendeskResponseRateLimitException.java index a19bc7f77..c4dacb7c8 100644 --- a/src/main/java/org/zendesk/client/v2/ZendeskResponseRateLimitException.java +++ b/src/main/java/org/zendesk/client/v2/ZendeskResponseRateLimitException.java @@ -1,32 +1,31 @@ package org.zendesk.client.v2; -import org.asynchttpclient.Response; - import java.io.IOException; +import org.asynchttpclient.Response; public class ZendeskResponseRateLimitException extends ZendeskResponseException { - private static final long serialVersionUID = 1L; - private static final String RETRY_AFTER_HEADER = "Retry-After"; - private static final long DEFAULT_RETRY_AFTER = 60L; + private static final long serialVersionUID = 1L; + private static final String RETRY_AFTER_HEADER = "Retry-After"; + private static final long DEFAULT_RETRY_AFTER = 60L; - private Long retryAfter = DEFAULT_RETRY_AFTER; + private Long retryAfter = DEFAULT_RETRY_AFTER; - public ZendeskResponseRateLimitException(Response resp) throws IOException { - super(resp); - try { - this.retryAfter = Long.valueOf(resp.getHeader(RETRY_AFTER_HEADER)); - } catch (NumberFormatException e) { - // Ignore, use the default value already set - } + public ZendeskResponseRateLimitException(Response resp) throws IOException { + super(resp); + try { + this.retryAfter = Long.valueOf(resp.getHeader(RETRY_AFTER_HEADER)); + } catch (NumberFormatException e) { + // Ignore, use the default value already set } + } - protected ZendeskResponseRateLimitException(ZendeskResponseRateLimitException e) { - super(e); - this.retryAfter = e.getRetryAfter(); - } + protected ZendeskResponseRateLimitException(ZendeskResponseRateLimitException e) { + super(e); + this.retryAfter = e.getRetryAfter(); + } - public Long getRetryAfter() { - return retryAfter; - } + public Long getRetryAfter() { + return retryAfter; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Action.java b/src/main/java/org/zendesk/client/v2/model/Action.java index cfdcda8be..0c9d49eea 100644 --- a/src/main/java/org/zendesk/client/v2/model/Action.java +++ b/src/main/java/org/zendesk/client/v2/model/Action.java @@ -1,7 +1,6 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonFormat; - import java.util.Arrays; /** @@ -10,41 +9,40 @@ */ public class Action { - private String field; + private String field; - @JsonFormat(with = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, - JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED}) - private Object[] value; + @JsonFormat( + with = { + JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, + JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED + }) + private Object[] value; - public Action() { - } + public Action() {} - public Action(String field, String[] value) { - this.field = field; - this.value = value; - } + public Action(String field, String[] value) { + this.field = field; + this.value = value; + } - public String getField() { - return field; - } + public String getField() { + return field; + } - public void setField(String field) { - this.field = field; - } + public void setField(String field) { + this.field = field; + } - public Object[] getValue() { - return value; - } + public Object[] getValue() { + return value; + } - public void setValue(Object[] value) { - this.value = value; - } + public void setValue(Object[] value) { + this.value = value; + } - @Override - public String toString() { - return "Action{" + - "field='" + field + '\'' + - ", value=" + Arrays.toString(value) + - '}'; - } + @Override + public String toString() { + return "Action{" + "field='" + field + '\'' + ", value=" + Arrays.toString(value) + '}'; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/AgentRole.java b/src/main/java/org/zendesk/client/v2/model/AgentRole.java index 831109ced..4afade872 100644 --- a/src/main/java/org/zendesk/client/v2/model/AgentRole.java +++ b/src/main/java/org/zendesk/client/v2/model/AgentRole.java @@ -1,70 +1,67 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.Date; import java.util.Map; public class AgentRole { - private Long id; - private String name; - private String description; - private Date createdAt; - private Date updatedAt; - - /** - * A series of permissions granted to agents in this role - */ - private Map configuration; - - public Long getId() { - return id; - } - - public void setId( Long id ) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName( String name ) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription( String description ) { - this.description = description; - } - - @JsonProperty("created_at") - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt( Date createdAt ) { - this.createdAt = createdAt; - } - - @JsonProperty("updated_at") - public Date getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt( Date updatedAt ) { - this.updatedAt = updatedAt; - } - - public Map getConfiguration() { - return configuration; - } - - public void setConfiguration( Map configuration ) { - this.configuration = configuration; - } + private Long id; + private String name; + private String description; + private Date createdAt; + private Date updatedAt; + + /** A series of permissions granted to agents in this role */ + private Map configuration; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty("created_at") + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + @JsonProperty("updated_at") + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public Map getConfiguration() { + return configuration; + } + + public void setConfiguration(Map configuration) { + this.configuration = configuration; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Attachment.java b/src/main/java/org/zendesk/client/v2/model/Attachment.java index b31c7248b..da0eca989 100644 --- a/src/main/java/org/zendesk/client/v2/model/Attachment.java +++ b/src/main/java/org/zendesk/client/v2/model/Attachment.java @@ -8,56 +8,62 @@ */ public class Attachment extends Photo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private List thumbnails; + private List thumbnails; - public List getThumbnails() { - return thumbnails; + public List getThumbnails() { + return thumbnails; + } + + public void setThumbnails(List thumbnails) { + this.thumbnails = thumbnails; + } + + @Override + public String toString() { + return "Attachment" + + "{id=" + + getId() + + ", fileName='" + + getFileName() + + '\'' + + ", contentType='" + + getContentType() + + '\'' + + ", contentUrl='" + + getContentUrl() + + '\'' + + ", size=" + + getSize() + + ", thumbnails=" + + thumbnails + + '}'; + } + + public static class Upload { + private String token; + private List attachments; + + public String getToken() { + return token; } - public void setThumbnails(List thumbnails) { - this.thumbnails = thumbnails; + public void setToken(String token) { + this.token = token; } - @Override - public String toString() { - return "Attachment" + - "{id=" + getId() + - ", fileName='" + getFileName() + '\'' + - ", contentType='" + getContentType() + '\'' + - ", contentUrl='" + getContentUrl() + '\'' + - ", size=" + getSize() + - ", thumbnails=" + thumbnails + - '}'; + public List getAttachments() { + return attachments; + } + + public void setAttachments(List attachments) { + this.attachments = attachments; } - public static class Upload { - private String token; - private List attachments; - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public List getAttachments() { - return attachments; - } - - public void setAttachments(List attachments) { - this.attachments = attachments; - } - - @Override - public String toString() { - return "Upload" + - "{token='" + token + '\'' + - ", attachments=" + attachments + - '}'; - } + @Override + public String toString() { + return "Upload" + "{token='" + token + '\'' + ", attachments=" + attachments + '}'; } + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Audit.java b/src/main/java/org/zendesk/client/v2/model/Audit.java index e7af123be..2ab6090e6 100644 --- a/src/main/java/org/zendesk/client/v2/model/Audit.java +++ b/src/main/java/org/zendesk/client/v2/model/Audit.java @@ -1,12 +1,11 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import org.zendesk.client.v2.model.events.Event; - import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map; +import org.zendesk.client.v2.model.events.Event; /** * @author stephenc @@ -14,86 +13,92 @@ */ public class Audit implements Serializable { - private static final long serialVersionUID = 1L; - - private Long id; - private Long ticketId; - private Map metadata; - private Via via; - private Date createdAt; - private Long authorId; - private List events; - - @JsonProperty("author_id") - public Long getAuthorId() { - return authorId; - } - - public void setAuthorId(Long authorId) { - this.authorId = authorId; - } - - @JsonProperty("created_at") - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - public List getEvents() { - return events; - } - - public void setEvents(List events) { - this.events = events; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Map getMetadata() { - return metadata; - } - - public void setMetadata(Map metadata) { - this.metadata = metadata; - } - - @JsonProperty("ticket_id") - public Long getTicketId() { - return ticketId; - } - - public void setTicketId(Long ticketId) { - this.ticketId = ticketId; - } - - public Via getVia() { - return via; - } - - public void setVia(Via via) { - this.via = via; - } - - @Override - public String toString() { - return "Audit" + - "{authorId=" + authorId + - ", id=" + id + - ", ticketId=" + ticketId + - ", metadata=" + metadata + - ", via=" + via + - ", createdAt=" + createdAt + - ", events=" + events + - '}'; - } - + private static final long serialVersionUID = 1L; + + private Long id; + private Long ticketId; + private Map metadata; + private Via via; + private Date createdAt; + private Long authorId; + private List events; + + @JsonProperty("author_id") + public Long getAuthorId() { + return authorId; + } + + public void setAuthorId(Long authorId) { + this.authorId = authorId; + } + + @JsonProperty("created_at") + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public List getEvents() { + return events; + } + + public void setEvents(List events) { + this.events = events; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + @JsonProperty("ticket_id") + public Long getTicketId() { + return ticketId; + } + + public void setTicketId(Long ticketId) { + this.ticketId = ticketId; + } + + public Via getVia() { + return via; + } + + public void setVia(Via via) { + this.via = via; + } + + @Override + public String toString() { + return "Audit" + + "{authorId=" + + authorId + + ", id=" + + id + + ", ticketId=" + + ticketId + + ", metadata=" + + metadata + + ", via=" + + via + + ", createdAt=" + + createdAt + + ", events=" + + events + + '}'; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Automation.java b/src/main/java/org/zendesk/client/v2/model/Automation.java index 8e4257317..e72b10b40 100644 --- a/src/main/java/org/zendesk/client/v2/model/Automation.java +++ b/src/main/java/org/zendesk/client/v2/model/Automation.java @@ -4,12 +4,10 @@ import java.util.Date; import java.util.List; - /** * https://developer.zendesk.com/rest_api/docs/core/automations - * - * @author Sandeep Kaul (sandeep.kaul@olacabs.com) * + * @author Sandeep Kaul (sandeep.kaul@olacabs.com) */ public class Automation implements Serializable { @@ -23,62 +21,89 @@ public class Automation implements Serializable { private int position; private Date createdAt; private Date updatedAt; - + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public Boolean getActive() { return active; } + public void setActive(Boolean active) { this.active = active; } + public List getActions() { return actions; } + public void setActions(List actions) { this.actions = actions; } + public Conditions getConditions() { return conditions; } + public void setConditions(Conditions conditions) { this.conditions = conditions; } + public Date getCreatedAt() { return createdAt; } + public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } + public Date getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } + public int getPosition() { return position; } + public void setPosition(int position) { this.position = position; } + @Override public String toString() { - return "Automation [id=" + id + ", title=" + title + ", active=" + active + ", actions=" - + actions + ", conditions=" + conditions + ", position=" + position + ", createdAt=" - + createdAt + ", updatedAt=" + updatedAt + "]"; + return "Automation [id=" + + id + + ", title=" + + title + + ", active=" + + active + + ", actions=" + + actions + + ", conditions=" + + conditions + + ", position=" + + position + + ", createdAt=" + + createdAt + + ", updatedAt=" + + updatedAt + + "]"; } - - - } diff --git a/src/main/java/org/zendesk/client/v2/model/Brand.java b/src/main/java/org/zendesk/client/v2/model/Brand.java index 49e6ab4e9..a88378578 100644 --- a/src/main/java/org/zendesk/client/v2/model/Brand.java +++ b/src/main/java/org/zendesk/client/v2/model/Brand.java @@ -1,7 +1,6 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.Date; import java.util.List; @@ -11,154 +10,163 @@ */ public class Brand { - private String url; - private Long id; - private String name; - @JsonProperty("brand_url") - private String brandUrl; - @JsonProperty("has_help_center") - private boolean hasHelpCenter; - @JsonProperty("help_center_state") - private String helpCenterState; - @JsonProperty("active") - private boolean isActive; - @JsonProperty("default") - private boolean isDefault; - private Attachment logo; - @JsonProperty("ticket_form_ids") - private List ticketFormIds; - @JsonProperty("created_at") - private Date createdAt; - @JsonProperty("updated_at") - private Date updatedAt; - private String subdomain; - @JsonProperty("host_mapping") - private String hostMapping; - - public Brand() { - } - - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - public Date getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - public String getSubdomain() { - return subdomain; - } - - public void setSubdomain(String subdomain) { - this.subdomain = subdomain; - } - - public String getHostMapping() { - return hostMapping; - } - - public void setHostMapping(String hostMapping) { - this.hostMapping = hostMapping; - } - - public String getSignatureTemplate() { - return signatureTemplate; - } - - public void setSignatureTemplate(String signatureTemplate) { - this.signatureTemplate = signatureTemplate; - } - - @JsonProperty("signature_template") - private String signatureTemplate; - - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getBrandUrl() { - return brandUrl; - } - - public void setBrandUrl(String brandUrl) { - this.brandUrl = brandUrl; - } - - public boolean isHasHelpCenter() { - return hasHelpCenter; - } - - public void setHasHelpCenter(boolean hasHelpCenter) { - this.hasHelpCenter = hasHelpCenter; - } - - public String getHelpCenterState() { - return helpCenterState; - } - - public void setHelpCenterState(String helpCenterState) { - this.helpCenterState = helpCenterState; - } - - public boolean isActive() { - return isActive; - } - - public void setActive(boolean active) { - isActive = active; - } + private String url; + private Long id; + private String name; + + @JsonProperty("brand_url") + private String brandUrl; + + @JsonProperty("has_help_center") + private boolean hasHelpCenter; + + @JsonProperty("help_center_state") + private String helpCenterState; + + @JsonProperty("active") + private boolean isActive; + + @JsonProperty("default") + private boolean isDefault; + + private Attachment logo; + + @JsonProperty("ticket_form_ids") + private List ticketFormIds; + + @JsonProperty("created_at") + private Date createdAt; + + @JsonProperty("updated_at") + private Date updatedAt; + + private String subdomain; + + @JsonProperty("host_mapping") + private String hostMapping; + + public Brand() {} + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public String getSubdomain() { + return subdomain; + } + + public void setSubdomain(String subdomain) { + this.subdomain = subdomain; + } + + public String getHostMapping() { + return hostMapping; + } + + public void setHostMapping(String hostMapping) { + this.hostMapping = hostMapping; + } + + public String getSignatureTemplate() { + return signatureTemplate; + } + + public void setSignatureTemplate(String signatureTemplate) { + this.signatureTemplate = signatureTemplate; + } + + @JsonProperty("signature_template") + private String signatureTemplate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBrandUrl() { + return brandUrl; + } + + public void setBrandUrl(String brandUrl) { + this.brandUrl = brandUrl; + } + + public boolean isHasHelpCenter() { + return hasHelpCenter; + } + + public void setHasHelpCenter(boolean hasHelpCenter) { + this.hasHelpCenter = hasHelpCenter; + } + + public String getHelpCenterState() { + return helpCenterState; + } + + public void setHelpCenterState(String helpCenterState) { + this.helpCenterState = helpCenterState; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } - public boolean isDefault() { - return isDefault; - } + public boolean isDefault() { + return isDefault; + } - public void setDefault(boolean aDefault) { - isDefault = aDefault; - } + public void setDefault(boolean aDefault) { + isDefault = aDefault; + } - public Attachment getLogo() { - return logo; - } + public Attachment getLogo() { + return logo; + } - public void setLogo(Attachment logo) { - this.logo = logo; - } + public void setLogo(Attachment logo) { + this.logo = logo; + } - public List getTicketFormIds() { - return ticketFormIds; - } + public List getTicketFormIds() { + return ticketFormIds; + } - public void setTicketFormIds(List ticketFormIds) { - this.ticketFormIds = ticketFormIds; - } + public void setTicketFormIds(List ticketFormIds) { + this.ticketFormIds = ticketFormIds; + } - public String getUrl() { - return url; - } + public String getUrl() { + return url; + } - public void setUrl(String url) { - this.url = url; - } + public void setUrl(String url) { + this.url = url; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Collaborator.java b/src/main/java/org/zendesk/client/v2/model/Collaborator.java index 472d3e802..8cd24306c 100644 --- a/src/main/java/org/zendesk/client/v2/model/Collaborator.java +++ b/src/main/java/org/zendesk/client/v2/model/Collaborator.java @@ -1,42 +1,40 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - import java.io.Serializable; @JsonIgnoreProperties(ignoreUnknown = true) public class Collaborator implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private String name; - private String email; + private String name; + private String email; - public Collaborator() { - } + public Collaborator() {} - protected Collaborator(String name) { - this.name = name; - } + protected Collaborator(String name) { + this.name = name; + } - public Collaborator(String name, String email) { - this.name = name; - this.email = email; - } + public Collaborator(String name, String email) { + this.name = name; + this.email = email; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getEmail() { - return email; - } + public String getEmail() { + return email; + } - public void setEmail(String email) { - this.email = email; - } + public void setEmail(String email) { + this.email = email; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Comment.java b/src/main/java/org/zendesk/client/v2/model/Comment.java index 4c347e9d4..0459423e5 100644 --- a/src/main/java/org/zendesk/client/v2/model/Comment.java +++ b/src/main/java/org/zendesk/client/v2/model/Comment.java @@ -1,7 +1,6 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; - import java.io.Serializable; import java.util.Arrays; import java.util.Date; @@ -13,125 +12,134 @@ */ public class Comment implements Serializable { - private static final long serialVersionUID = 1L; - - private Long id; - private String body; - private String htmlBody; - private Long authorId; - private List uploads; - private List attachments; - private Date createdAt; - private Boolean publicComment; - private CommentType type; - private Via via; - - - public Comment() { - } - - public Comment(String body) { - this.body = body; - } - - public Comment(String body, String... uploads) { - this.body = body; - this.uploads = uploads.length == 0 ? null : Arrays.asList(uploads); - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - - @JsonProperty("html_body") - public String getHtmlBody() { - return htmlBody; - } - - public void setHtmlBody(String htmlBody) { - this.htmlBody = htmlBody; - } - - public List getUploads() { - return uploads; - } - - public void setUploads(List uploads) { - this.uploads = uploads; - } - - public List getAttachments() { - return attachments; - } - - public void setAttachments(List attachments) { - this.attachments = attachments; - } - - @JsonProperty("author_id") - public Long getAuthorId() { - return authorId; - } - - public void setAuthorId(Long authorId) { - this.authorId = authorId; - } - - @JsonProperty("created_at") - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - @JsonProperty("public") - public Boolean isPublic() { - return publicComment; - } - - public void setPublic(Boolean isPublic) { - this.publicComment = isPublic; - } - - @JsonProperty("type") - public CommentType getType() { - return type; - } - - public void setType(CommentType type) { - this.type = type; - } - - @JsonProperty("via") - public Via getVia() { - return via; - } - - public void setVia(Via via) { this.via = via; } - - @Override - public String toString() { - return "Comment{" + "id=" + id + - ", body='" + body + '\'' + - ", authorId=" + authorId + - ", attachments=" + attachments + - ", createdAt=" + createdAt + - ", uploads=" + uploads + - ", via=" + via + - '}'; - } -} \ No newline at end of file + private static final long serialVersionUID = 1L; + + private Long id; + private String body; + private String htmlBody; + private Long authorId; + private List uploads; + private List attachments; + private Date createdAt; + private Boolean publicComment; + private CommentType type; + private Via via; + + public Comment() {} + + public Comment(String body) { + this.body = body; + } + + public Comment(String body, String... uploads) { + this.body = body; + this.uploads = uploads.length == 0 ? null : Arrays.asList(uploads); + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + @JsonProperty("html_body") + public String getHtmlBody() { + return htmlBody; + } + + public void setHtmlBody(String htmlBody) { + this.htmlBody = htmlBody; + } + + public List getUploads() { + return uploads; + } + + public void setUploads(List uploads) { + this.uploads = uploads; + } + + public List getAttachments() { + return attachments; + } + + public void setAttachments(List attachments) { + this.attachments = attachments; + } + + @JsonProperty("author_id") + public Long getAuthorId() { + return authorId; + } + + public void setAuthorId(Long authorId) { + this.authorId = authorId; + } + + @JsonProperty("created_at") + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @JsonProperty("public") + public Boolean isPublic() { + return publicComment; + } + + public void setPublic(Boolean isPublic) { + this.publicComment = isPublic; + } + + @JsonProperty("type") + public CommentType getType() { + return type; + } + + public void setType(CommentType type) { + this.type = type; + } + + @JsonProperty("via") + public Via getVia() { + return via; + } + + public void setVia(Via via) { + this.via = via; + } + + @Override + public String toString() { + return "Comment{" + + "id=" + + id + + ", body='" + + body + + '\'' + + ", authorId=" + + authorId + + ", attachments=" + + attachments + + ", createdAt=" + + createdAt + + ", uploads=" + + uploads + + ", via=" + + via + + '}'; + } +} diff --git a/src/main/java/org/zendesk/client/v2/model/CommentType.java b/src/main/java/org/zendesk/client/v2/model/CommentType.java index c5d550d23..0e218da38 100644 --- a/src/main/java/org/zendesk/client/v2/model/CommentType.java +++ b/src/main/java/org/zendesk/client/v2/model/CommentType.java @@ -1,21 +1,18 @@ package org.zendesk.client.v2.model; -/** - * https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_comments/ - */ +/** https://developer.zendesk.com/api-reference/ticketing/tickets/ticket_comments/ */ public enum CommentType { + COMMENT("Comment"), + VOICE_COMMENT("VoiceComment"); - COMMENT("Comment"), - VOICE_COMMENT("VoiceComment"); + private final String name; - private final String name; + CommentType(String name) { + this.name = name; + } - CommentType(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } + @Override + public String toString() { + return name; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/ComplianceDeletionStatus.java b/src/main/java/org/zendesk/client/v2/model/ComplianceDeletionStatus.java index 2fca472d4..aa827ea0f 100644 --- a/src/main/java/org/zendesk/client/v2/model/ComplianceDeletionStatus.java +++ b/src/main/java/org/zendesk/client/v2/model/ComplianceDeletionStatus.java @@ -1,100 +1,112 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; - import java.io.Serializable; import java.util.Date; -/** - * https://developer.zendesk.com/rest_api/docs/core/users#show-compliance-deletion-statuses - */ +/** https://developer.zendesk.com/rest_api/docs/core/users#show-compliance-deletion-statuses */ public class ComplianceDeletionStatus implements Serializable { - private static final long serialVersionUID = 1L; - - private String action; - private String application; - @JsonProperty("account_subdomain") - private String accountSubdomain; - @JsonProperty("executer_id") - private long executerId; - @JsonProperty("user_id") - private long userId; - @JsonProperty("account_id") - private long accountId; - @JsonProperty("created_at") - private Date createdAt; - - public static long getSerialVersionUID() { - return serialVersionUID; - } - - public String getAction() { - return action; - } - - public void setAction(String action) { - this.action = action; - } - - public String getApplication() { - return application; - } - - public void setApplication(String application) { - this.application = application; - } - - public String getAccountSubdomain() { - return accountSubdomain; - } - - public void setAccountSubdomain(String accountSubdomain) { - this.accountSubdomain = accountSubdomain; - } - - public long getExecuterId() { - return executerId; - } - - public void setExecuterId(long executerId) { - this.executerId = executerId; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public Date getCreatedAt() { - return new Date(createdAt.getTime()); - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - @Override - public String toString() { - return "ComplianceDeletionStatus{" + - "action='" + action + '\'' + - ", application='" + application + '\'' + - ", accountSubdomain='" + accountSubdomain + '\'' + - ", executerId=" + executerId + - ", userId=" + userId + - ", accountId=" + accountId + - ", createdAt=" + createdAt + - '}'; - } -} \ No newline at end of file + private static final long serialVersionUID = 1L; + + private String action; + private String application; + + @JsonProperty("account_subdomain") + private String accountSubdomain; + + @JsonProperty("executer_id") + private long executerId; + + @JsonProperty("user_id") + private long userId; + + @JsonProperty("account_id") + private long accountId; + + @JsonProperty("created_at") + private Date createdAt; + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getApplication() { + return application; + } + + public void setApplication(String application) { + this.application = application; + } + + public String getAccountSubdomain() { + return accountSubdomain; + } + + public void setAccountSubdomain(String accountSubdomain) { + this.accountSubdomain = accountSubdomain; + } + + public long getExecuterId() { + return executerId; + } + + public void setExecuterId(long executerId) { + this.executerId = executerId; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + public Date getCreatedAt() { + return new Date(createdAt.getTime()); + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + @Override + public String toString() { + return "ComplianceDeletionStatus{" + + "action='" + + action + + '\'' + + ", application='" + + application + + '\'' + + ", accountSubdomain='" + + accountSubdomain + + '\'' + + ", executerId=" + + executerId + + ", userId=" + + userId + + ", accountId=" + + accountId + + ", createdAt=" + + createdAt + + '}'; + } +} diff --git a/src/main/java/org/zendesk/client/v2/model/Condition.java b/src/main/java/org/zendesk/client/v2/model/Condition.java index 79c12b6be..805e0dbbf 100644 --- a/src/main/java/org/zendesk/client/v2/model/Condition.java +++ b/src/main/java/org/zendesk/client/v2/model/Condition.java @@ -4,7 +4,6 @@ /** * @author Sandeep Kaul (sandeep.kaul@olacabs.com) - * */ public class Condition implements Serializable { @@ -48,11 +47,6 @@ public void setValue(String value) { @Override public String toString() { - return "Condition" + - "{field=" + field + - ", operator=" + operator + - ", value=" + value + - '}'; + return "Condition" + "{field=" + field + ", operator=" + operator + ", value=" + value + '}'; } - } diff --git a/src/main/java/org/zendesk/client/v2/model/Conditions.java b/src/main/java/org/zendesk/client/v2/model/Conditions.java index 3233471e3..83daf0473 100644 --- a/src/main/java/org/zendesk/client/v2/model/Conditions.java +++ b/src/main/java/org/zendesk/client/v2/model/Conditions.java @@ -4,10 +4,8 @@ import java.util.ArrayList; import java.util.List; - /** * @author Sandeep Kaul(sandeep.kaul@olacabs.com) - * */ public class Conditions implements Serializable { @@ -34,10 +32,6 @@ public void setAny(List any) { @Override public String toString() { - return "Conditions" + - "{all=" + all + - ", any=" + any + - '}'; + return "Conditions" + "{all=" + all + ", any=" + any + '}'; } - } diff --git a/src/main/java/org/zendesk/client/v2/model/CustomFieldValue.java b/src/main/java/org/zendesk/client/v2/model/CustomFieldValue.java index 4e9ea9c0a..74ef37252 100644 --- a/src/main/java/org/zendesk/client/v2/model/CustomFieldValue.java +++ b/src/main/java/org/zendesk/client/v2/model/CustomFieldValue.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - import java.io.Serializable; import java.util.Arrays; @@ -13,43 +12,42 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class CustomFieldValue implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private Long id; + private Long id; - @JsonFormat(with = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, - JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED}) - private String[] value; + @JsonFormat( + with = { + JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, + JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED + }) + private String[] value; - public CustomFieldValue() { - } + public CustomFieldValue() {} - public CustomFieldValue(Long id, String[] value) { - this.id = id; - this.value = value; - } + public CustomFieldValue(Long id, String[] value) { + this.id = id; + this.value = value; + } - public Long getId() { - return id; - } + public Long getId() { + return id; + } - public void setId(Long id) { - this.id = id; - } + public void setId(Long id) { + this.id = id; + } - public String[] getValue() { - return value; - } + public String[] getValue() { + return value; + } - public void setValue(String[] value) { - this.value = value; - } + public void setValue(String[] value) { + this.value = value; + } - @Override - public String toString() { - return "CustomFieldValue{" + - "id=" + id + - ", value=" + Arrays.toString(value) + - '}'; - } + @Override + public String toString() { + return "CustomFieldValue{" + "id=" + id + ", value=" + Arrays.toString(value) + '}'; + } } diff --git a/src/main/java/org/zendesk/client/v2/model/DeletedTicket.java b/src/main/java/org/zendesk/client/v2/model/DeletedTicket.java index 6d62e18b1..9dc4dc15c 100644 --- a/src/main/java/org/zendesk/client/v2/model/DeletedTicket.java +++ b/src/main/java/org/zendesk/client/v2/model/DeletedTicket.java @@ -2,135 +2,142 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; - import java.io.Serializable; import java.util.Date; @JsonIgnoreProperties(ignoreUnknown = true) public class DeletedTicket implements Serializable { - private static final long serialVersionUID = -1245555299753747844L; - - protected Long id; - protected String subject; - protected String description; - protected Actor actor; - protected Status previousState; - protected Date deletedAt; - - public DeletedTicket() { - } - - public DeletedTicket(Long id, String subject, String description, Actor actor, - Status previousState, Date deletedAt) { - this.id = id; - this.subject = subject; - this.description = description; - this.actor = actor; - this.previousState = previousState; - this.deletedAt = deletedAt; + private static final long serialVersionUID = -1245555299753747844L; + + protected Long id; + protected String subject; + protected String description; + protected Actor actor; + protected Status previousState; + protected Date deletedAt; + + public DeletedTicket() {} + + public DeletedTicket( + Long id, + String subject, + String description, + Actor actor, + Status previousState, + Date deletedAt) { + this.id = id; + this.subject = subject; + this.description = description; + this.actor = actor; + this.previousState = previousState; + this.deletedAt = deletedAt; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Actor getActor() { + return actor; + } + + public void setActor(Actor actor) { + this.actor = actor; + } + + @JsonProperty("previous_state") + public Status getPreviousState() { + return previousState; + } + + public void setPreviousState(Status previousState) { + this.previousState = previousState; + } + + @JsonProperty("deleted_at") + public Date getDeletedAt() { + return deletedAt; + } + + public void setDeletedAt(Date deletedAt) { + this.deletedAt = deletedAt; + } + + @Override + public String toString() { + return "DeletedTicket{" + + "id=" + + id + + ", subject='" + + subject + + '\'' + + ", description='" + + description + + '\'' + + ", actor=" + + actor + + ", previousState=" + + previousState + + ", deletedAt=" + + deletedAt + + '}'; + } + + public static class Actor implements Serializable { + private static final long serialVersionUID = 6945229807147073769L; + private Long id; + private String name; + + public Actor() {} + + public Actor(Long id) { + this.id = id; + } + + public Actor(Long id, String name) { + this.id = id; + this.name = name; } public Long getId() { - return id; + return id; } public void setId(Long id) { - this.id = id; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; + this.id = id; } - public String getDescription() { - return description; + public String getName() { + return name; } - public void setDescription(String description) { - this.description = description; - } - - public Actor getActor() { - return actor; - } - - public void setActor(Actor actor) { - this.actor = actor; - } - - @JsonProperty("previous_state") - public Status getPreviousState() { - return previousState; - } - - public void setPreviousState(Status previousState) { - this.previousState = previousState; - } - - @JsonProperty("deleted_at") - public Date getDeletedAt() { - return deletedAt; - } - - public void setDeletedAt(Date deletedAt) { - this.deletedAt = deletedAt; + public void setName(String name) { + this.name = name; } @Override public String toString() { - return "DeletedTicket{" + - "id=" + id + - ", subject='" + subject + '\'' + - ", description='" + description + '\'' + - ", actor=" + actor + - ", previousState=" + previousState + - ", deletedAt=" + deletedAt + - '}'; - } - - public static class Actor implements Serializable { - private static final long serialVersionUID = 6945229807147073769L; - private Long id; - private String name; - - public Actor() { - } - - public Actor(Long id) { - this.id = id; - } - - public Actor(Long id, String name) { - this.id = id; - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Actor" + - "{id=" + id + - ", name='" + name + '\'' + - '}'; - } + return "Actor" + "{id=" + id + ", name='" + name + '\'' + '}'; } + } } diff --git a/src/main/java/org/zendesk/client/v2/model/Field.java b/src/main/java/org/zendesk/client/v2/model/Field.java index 0dc4c723a..9f8093166 100644 --- a/src/main/java/org/zendesk/client/v2/model/Field.java +++ b/src/main/java/org/zendesk/client/v2/model/Field.java @@ -1,7 +1,6 @@ package org.zendesk.client.v2.model; import com.fasterxml.jackson.annotation.JsonProperty; - import java.io.Serializable; import java.util.Date; import java.util.List; @@ -12,288 +11,309 @@ */ public class Field implements Serializable { - private static final long serialVersionUID = 1L; - - private Long id; - private String url; - private String type; - private String title; - private String rawTitle; - private String description; - private String rawDescription; - private Integer position; - private Boolean active; - private Boolean required; - private Boolean collapsedForAgents; - private String regexpForValidation; - private String titleInPortal; - private String rawTitleInPortal; - private Boolean visibleInPortal; - private Boolean editableInPortal; - private Boolean requiredInPortal; - private String tag; - private Date createdAt; - private Date updatedAt; - private List