From 299e5b0e27bf6f42e1b04f165561ad0130bbb77b Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 15 Oct 2023 20:02:50 +0200 Subject: [PATCH 01/11] Move variables of MastodonClient to constructor --- .../kotlin/social/bigbone/MastodonClient.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index c537d1278..5159b3f4c 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -63,12 +63,12 @@ import javax.net.ssl.X509TrustManager class MastodonClient private constructor( private val instanceName: String, - private val client: OkHttpClient + private val client: OkHttpClient, + private var debug: Boolean = false, + private var instanceVersion: String? = null, + private var scheme: String = "https", + private var port: Int = 443, ) { - private var debug = false - private var instanceVersion: String? = null - private var scheme: String = "https" - private var port: Int = 443 /** * Access API methods under the "accounts" endpoint. @@ -785,13 +785,12 @@ private constructor( .readTimeout(readTimeoutSeconds, TimeUnit.SECONDS) .writeTimeout(writeTimeoutSeconds, TimeUnit.SECONDS) .connectTimeout(connectTimeoutSeconds, TimeUnit.SECONDS) - .build() - ).also { - it.debug = debug - it.instanceVersion = getInstanceVersion() - it.scheme = scheme - it.port = port - } + .build(), + debug = debug, + instanceVersion = getInstanceVersion(), + scheme = scheme, + port = port + ) } } From 589542bf969d1540ff6e18205350e0e980d20265 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 15 Oct 2023 20:14:58 +0200 Subject: [PATCH 02/11] Move instance response body JSONs to assets from unit test --- .../mastodon_client_v1_instance_response.json | 132 ++++++++ .../mastodon_client_v2_instance_response.json | 146 +++++++++ .../social/bigbone/MastodonClientTest.kt | 289 +----------------- 3 files changed, 285 insertions(+), 282 deletions(-) create mode 100644 bigbone/src/test/assets/mastodon_client_v1_instance_response.json create mode 100644 bigbone/src/test/assets/mastodon_client_v2_instance_response.json diff --git a/bigbone/src/test/assets/mastodon_client_v1_instance_response.json b/bigbone/src/test/assets/mastodon_client_v1_instance_response.json new file mode 100644 index 000000000..630a45216 --- /dev/null +++ b/bigbone/src/test/assets/mastodon_client_v1_instance_response.json @@ -0,0 +1,132 @@ +{ + "uri": "mastodon.social", + "title": "Mastodon", + "short_description": "The original server operated by the Mastodon gGmbH non-profit", + "description": "", + "email": "staff@mastodon.social", + "version": "4.0.0rc1", + "urls": { + "streaming_api": "wss://mastodon.social" + }, + "stats": { + "user_count": 921487, + "status_count": 48629230, + "domain_count": 48722 + }, + "thumbnail": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", + "languages": [ + "en" + ], + "registrations": false, + "approval_required": false, + "invites_enabled": true, + "configuration": { + "accounts": { + "max_featured_tags": 10 + }, + "statuses": { + "max_characters": 500, + "max_media_attachments": 4, + "characters_reserved_per_url": 23 + }, + "media_attachments": { + "supported_mime_types": [ + "image/jpeg", + "image/png", + "image/gif", + "image/heic", + "image/heif", + "image/webp", + "image/avif", + "video/webm", + "video/mp4", + "video/quicktime", + "video/ogg", + "audio/wave", + "audio/wav", + "audio/x-wav", + "audio/x-pn-wave", + "audio/vnd.wave", + "audio/ogg", + "audio/vorbis", + "audio/mpeg", + "audio/mp3", + "audio/webm", + "audio/flac", + "audio/aac", + "audio/m4a", + "audio/x-m4a", + "audio/mp4", + "audio/3gpp", + "video/x-ms-asf" + ], + "image_size_limit": 10485760, + "image_matrix_limit": 16777216, + "video_size_limit": 41943040, + "video_frame_rate_limit": 60, + "video_matrix_limit": 2304000 + }, + "polls": { + "max_options": 4, + "max_characters_per_option": 50, + "min_expiration": 300, + "max_expiration": 2629746 + } + }, + "contact_account": { + "id": "1", + "username": "Gargron", + "acct": "Gargron", + "display_name": "Eugen Rochko", + "locked": false, + "bot": false, + "discoverable": true, + "group": false, + "created_at": "2016-03-16T00:00:00.000Z", + "note": "\u003cp\u003eFounder, CEO and lead developer \u003cspan class=\"h-card\"\u003e\u003ca href=\"https://mastodon.social/@Mastodon\" class=\"u-url mention\"\u003e@\u003cspan\u003eMastodon\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e, Germany.\u003c/p\u003e", + "url": "https://mastodon.social/@Gargron", + "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", + "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", + "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", + "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", + "followers_count": 288547, + "following_count": 342, + "statuses_count": 73066, + "last_status_at": "2023-01-17", + "noindex": false, + "emojis": [], + "fields": [ + { + "name": "Patreon", + "value": "\u003ca href=\"https://www.patreon.com/mastodon\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"\u003e\u003cspan class=\"invisible\"\u003ehttps://www.\u003c/span\u003e\u003cspan class=\"\"\u003epatreon.com/mastodon\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e", + "verified_at": null + } + ] + }, + "rules": [ + { + "id": "1", + "text": "Sexually explicit or violent media must be marked as sensitive when posting" + }, + { + "id": "2", + "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" + }, + { + "id": "3", + "text": "No incitement of violence or promotion of violent ideologies" + }, + { + "id": "4", + "text": "No harassment, dogpiling or doxxing of other users" + }, + { + "id": "5", + "text": "No content illegal in Germany" + }, + { + "id": "7", + "text": "Do not share intentionally false or misleading information" + } + ] +} diff --git a/bigbone/src/test/assets/mastodon_client_v2_instance_response.json b/bigbone/src/test/assets/mastodon_client_v2_instance_response.json new file mode 100644 index 000000000..ed0af285b --- /dev/null +++ b/bigbone/src/test/assets/mastodon_client_v2_instance_response.json @@ -0,0 +1,146 @@ +{ + "domain": "mastodon.social", + "title": "Mastodon", + "version": "4.0.0rc1", + "source_url": "https://github.com/mastodon/mastodon", + "description": "The original server operated by the Mastodon gGmbH non-profit", + "usage": { + "users": { + "active_month": 148401 + } + }, + "thumbnail": { + "url": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", + "blurhash": "UeKUpFxuo~R%0nW;WCnhF6RjaJt757oJodS${'$'}", + "versions": { + "@1x": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", + "@2x": "https://files.mastodon.social/site_uploads/files/000/000/001/@2x/57c12f441d083cde.png" + } + }, + "languages": [ + "en" + ], + "configuration": { + "urls": { + "streaming": "wss://mastodon.social" + }, + "accounts": { + "max_featured_tags": 10 + }, + "statuses": { + "max_characters": 500, + "max_media_attachments": 4, + "characters_reserved_per_url": 23 + }, + "media_attachments": { + "supported_mime_types": [ + "image/jpeg", + "image/png", + "image/gif", + "image/heic", + "image/heif", + "image/webp", + "image/avif", + "video/webm", + "video/mp4", + "video/quicktime", + "video/ogg", + "audio/wave", + "audio/wav", + "audio/x-wav", + "audio/x-pn-wave", + "audio/vnd.wave", + "audio/ogg", + "audio/vorbis", + "audio/mpeg", + "audio/mp3", + "audio/webm", + "audio/flac", + "audio/aac", + "audio/m4a", + "audio/x-m4a", + "audio/mp4", + "audio/3gpp", + "video/x-ms-asf" + ], + "image_size_limit": 10485760, + "image_matrix_limit": 16777216, + "video_size_limit": 41943040, + "video_frame_rate_limit": 60, + "video_matrix_limit": 2304000 + }, + "polls": { + "max_options": 4, + "max_characters_per_option": 50, + "min_expiration": 300, + "max_expiration": 2629746 + }, + "translation": { + "enabled": true + } + }, + "registrations": { + "enabled": false, + "approval_required": false, + "message": null + }, + "contact": { + "email": "staff@mastodon.social", + "account": { + "id": "1", + "username": "Gargron", + "acct": "Gargron", + "display_name": "Eugen Rochko", + "locked": false, + "bot": false, + "discoverable": true, + "group": false, + "created_at": "2016-03-16T00:00:00.000Z", + "note": "\u003cp\u003eFounder, CEO and lead developer \u003cspan class=\"h-card\"\u003e\u003ca href=\"https://mastodon.social/@Mastodon\" class=\"u-url mention\"\u003e@\u003cspan\u003eMastodon\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e, Germany.\u003c/p\u003e", + "url": "https://mastodon.social/@Gargron", + "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", + "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", + "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", + "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", + "followers_count": 288544, + "following_count": 342, + "statuses_count": 73066, + "last_status_at": "2023-01-17", + "noindex": false, + "emojis": [], + "fields": [ + { + "name": "Patreon", + "value": "\u003ca href=\"https://www.patreon.com/mastodon\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"\u003e\u003cspan class=\"invisible\"\u003ehttps://www.\u003c/span\u003e\u003cspan class=\"\"\u003epatreon.com/mastodon\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e", + "verified_at": null + } + ] + } + }, + "rules": [ + { + "id": "1", + "text": "Sexually explicit or violent media must be marked as sensitive when posting" + }, + { + "id": "2", + "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" + }, + { + "id": "3", + "text": "No incitement of violence or promotion of violent ideologies" + }, + { + "id": "4", + "text": "No harassment, dogpiling or doxxing of other users" + }, + { + "id": "5", + "text": "No content illegal in Germany" + }, + { + "id": "7", + "text": "Do not share intentionally false or misleading information" + } + ] +} diff --git a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt index 9ab1a096e..f620ae998 100644 --- a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt +++ b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt @@ -11,297 +11,20 @@ import org.amshove.kluent.shouldBeEqualTo import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import social.bigbone.api.exception.BigBoneRequestException +import social.bigbone.testtool.AssetsUtil @SuppressWarnings("FunctionMaxLength") class MastodonClientTest { private val invalidResponseBody = "{ \"foo\": \"bar\" }" - private val v2InstanceResponseBody = """{ - "domain": "mastodon.social", - "title": "Mastodon", - "version": "4.0.0rc1", - "source_url": "https://github.com/mastodon/mastodon", - "description": "The original server operated by the Mastodon gGmbH non-profit", - "usage": { - "users": { - "active_month": 148401 - } - }, - "thumbnail": { - "url": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", - "blurhash": "UeKUpFxuo~R%0nW;WCnhF6RjaJt757oJodS${'$'}", - "versions": { - "@1x": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", - "@2x": "https://files.mastodon.social/site_uploads/files/000/000/001/@2x/57c12f441d083cde.png" - } - }, - "languages": [ - "en" - ], - "configuration": { - "urls": { - "streaming": "wss://mastodon.social" - }, - "accounts": { - "max_featured_tags": 10 - }, - "statuses": { - "max_characters": 500, - "max_media_attachments": 4, - "characters_reserved_per_url": 23 - }, - "media_attachments": { - "supported_mime_types": [ - "image/jpeg", - "image/png", - "image/gif", - "image/heic", - "image/heif", - "image/webp", - "image/avif", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/vnd.wave", - "audio/ogg", - "audio/vorbis", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ], - "image_size_limit": 10485760, - "image_matrix_limit": 16777216, - "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 2304000 - }, - "polls": { - "max_options": 4, - "max_characters_per_option": 50, - "min_expiration": 300, - "max_expiration": 2629746 - }, - "translation": { - "enabled": true - } - }, - "registrations": { - "enabled": false, - "approval_required": false, - "message": null - }, - "contact": { - "email": "staff@mastodon.social", - "account": { - "id": "1", - "username": "Gargron", - "acct": "Gargron", - "display_name": "Eugen Rochko", - "locked": false, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2016-03-16T00:00:00.000Z", - "note": "\u003cp\u003eFounder, CEO and lead developer \u003cspan class=\"h-card\"\u003e\u003ca href=\"https://mastodon.social/@Mastodon\" class=\"u-url mention\"\u003e@\u003cspan\u003eMastodon\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e, Germany.\u003c/p\u003e", - "url": "https://mastodon.social/@Gargron", - "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", - "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", - "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "followers_count": 288544, - "following_count": 342, - "statuses_count": 73066, - "last_status_at": "2023-01-17", - "noindex": false, - "emojis": [], - "fields": [ - { - "name": "Patreon", - "value": "\u003ca href=\"https://www.patreon.com/mastodon\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"\u003e\u003cspan class=\"invisible\"\u003ehttps://www.\u003c/span\u003e\u003cspan class=\"\"\u003epatreon.com/mastodon\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e", - "verified_at": null - } - ] - } - }, - "rules": [ - { - "id": "1", - "text": "Sexually explicit or violent media must be marked as sensitive when posting" - }, - { - "id": "2", - "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" - }, - { - "id": "3", - "text": "No incitement of violence or promotion of violent ideologies" - }, - { - "id": "4", - "text": "No harassment, dogpiling or doxxing of other users" - }, - { - "id": "5", - "text": "No content illegal in Germany" - }, - { - "id": "7", - "text": "Do not share intentionally false or misleading information" - } - ] -} - """ - private val v1InstanceResponseBody = """{ - "uri": "mastodon.social", - "title": "Mastodon", - "short_description": "The original server operated by the Mastodon gGmbH non-profit", - "description": "", - "email": "staff@mastodon.social", - "version": "4.0.0rc1", - "urls": { - "streaming_api": "wss://mastodon.social" - }, - "stats": { - "user_count": 921487, - "status_count": 48629230, - "domain_count": 48722 - }, - "thumbnail": "https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png", - "languages": [ - "en" - ], - "registrations": false, - "approval_required": false, - "invites_enabled": true, - "configuration": { - "accounts": { - "max_featured_tags": 10 - }, - "statuses": { - "max_characters": 500, - "max_media_attachments": 4, - "characters_reserved_per_url": 23 - }, - "media_attachments": { - "supported_mime_types": [ - "image/jpeg", - "image/png", - "image/gif", - "image/heic", - "image/heif", - "image/webp", - "image/avif", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/vnd.wave", - "audio/ogg", - "audio/vorbis", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ], - "image_size_limit": 10485760, - "image_matrix_limit": 16777216, - "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 2304000 - }, - "polls": { - "max_options": 4, - "max_characters_per_option": 50, - "min_expiration": 300, - "max_expiration": 2629746 - } - }, - "contact_account": { - "id": "1", - "username": "Gargron", - "acct": "Gargron", - "display_name": "Eugen Rochko", - "locked": false, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2016-03-16T00:00:00.000Z", - "note": "\u003cp\u003eFounder, CEO and lead developer \u003cspan class=\"h-card\"\u003e\u003ca href=\"https://mastodon.social/@Mastodon\" class=\"u-url mention\"\u003e@\u003cspan\u003eMastodon\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e, Germany.\u003c/p\u003e", - "url": "https://mastodon.social/@Gargron", - "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", - "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg", - "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "followers_count": 288547, - "following_count": 342, - "statuses_count": 73066, - "last_status_at": "2023-01-17", - "noindex": false, - "emojis": [], - "fields": [ - { - "name": "Patreon", - "value": "\u003ca href=\"https://www.patreon.com/mastodon\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"\u003e\u003cspan class=\"invisible\"\u003ehttps://www.\u003c/span\u003e\u003cspan class=\"\"\u003epatreon.com/mastodon\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e", - "verified_at": null - } - ] - }, - "rules": [ - { - "id": "1", - "text": "Sexually explicit or violent media must be marked as sensitive when posting" - }, - { - "id": "2", - "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" - }, - { - "id": "3", - "text": "No incitement of violence or promotion of violent ideologies" - }, - { - "id": "4", - "text": "No harassment, dogpiling or doxxing of other users" - }, - { - "id": "5", - "text": "No content illegal in Germany" - }, - { - "id": "7", - "text": "Do not share intentionally false or misleading information" - } - ] -} - """ @Test fun `should return version of v2 endpoint if available`() { // given val responseBodyV2Mock = mockk() - every { responseBodyV2Mock.string() } answers { v2InstanceResponseBody } + every { responseBodyV2Mock.string() } answers { + AssetsUtil.readFromAssets("mastodon_client_v2_instance_response.json") + } val responseV2Mock = mockk() every { responseV2Mock.body } answers { responseBodyV2Mock } every { responseV2Mock.isSuccessful } answers { true } @@ -326,7 +49,9 @@ class MastodonClientTest { every { responseV2Mock.isSuccessful } answers { false } val responseBodyV1Mock = mockk() - every { responseBodyV1Mock.string() } answers { v1InstanceResponseBody } + every { responseBodyV1Mock.string() } answers { + AssetsUtil.readFromAssets("mastodon_client_v1_instance_response.json") + } val responseV1Mock = mockk() every { responseV1Mock.isSuccessful } answers { true } every { responseV1Mock.body } answers { responseBodyV1Mock } From 1d2469ffa4fd204e6262459fdbbc69c5ff2a4a0a Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 15 Oct 2023 20:19:04 +0200 Subject: [PATCH 03/11] Better follow given-when-then structure --- .../social/bigbone/MastodonClientTest.kt | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt index f620ae998..9de2bfc78 100644 --- a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt +++ b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt @@ -7,33 +7,33 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.Response import okhttp3.ResponseBody import okhttp3.ResponseBody.Companion.toResponseBody +import org.amshove.kluent.invoking import org.amshove.kluent.shouldBeEqualTo -import org.junit.jupiter.api.Assertions +import org.amshove.kluent.shouldThrow import org.junit.jupiter.api.Test import social.bigbone.api.exception.BigBoneRequestException import social.bigbone.testtool.AssetsUtil -@SuppressWarnings("FunctionMaxLength") class MastodonClientTest { - private val invalidResponseBody = "{ \"foo\": \"bar\" }" - @Test - fun `should return version of v2 endpoint if available`() { + fun `Given server response with available v2 endpoint, when building MastodonClient, then return instance version of v2 endpoint`() { // given - val responseBodyV2Mock = mockk() - every { responseBodyV2Mock.string() } answers { - AssetsUtil.readFromAssets("mastodon_client_v2_instance_response.json") - } - val responseV2Mock = mockk() - every { responseV2Mock.body } answers { responseBodyV2Mock } - every { responseV2Mock.isSuccessful } answers { true } + val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + val responseV1Mock = mockk() + every { versionedInstanceRequest(1) } answers { responseV1Mock } - val responseV1Mock = mockk() - - val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) - every { clientBuilder.versionedInstanceRequest(1) } answers { responseV1Mock } - every { clientBuilder.versionedInstanceRequest(2) } answers { responseV2Mock } + val responseBodyV2Mock = mockk { + every { string() } answers { + AssetsUtil.readFromAssets("mastodon_client_v2_instance_response.json") + } + } + val responseV2Mock = mockk { + every { body } answers { responseBodyV2Mock } + every { isSuccessful } answers { true } + } + every { versionedInstanceRequest(2) } answers { responseV2Mock } + } // when val client = clientBuilder.build() @@ -43,22 +43,25 @@ class MastodonClientTest { } @Test - fun `should return version of v1 endpoint if v2 endpoint is not available`() { + fun `Given server response with only v1 endpoint available, when building MastodonClient, then return instance version of v1 endpoint`() { // given - val responseV2Mock = mockk() - every { responseV2Mock.isSuccessful } answers { false } + val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + val responseBodyV1Mock = mockk { + every { string() } answers { + AssetsUtil.readFromAssets("mastodon_client_v1_instance_response.json") + } + } + val responseV1Mock = mockk { + every { isSuccessful } answers { true } + every { body } answers { responseBodyV1Mock } + } + every { versionedInstanceRequest(1) } answers { responseV1Mock } - val responseBodyV1Mock = mockk() - every { responseBodyV1Mock.string() } answers { - AssetsUtil.readFromAssets("mastodon_client_v1_instance_response.json") + val responseV2Mock = mockk { + every { isSuccessful } answers { false } + } + every { versionedInstanceRequest(2) } answers { responseV2Mock } } - val responseV1Mock = mockk() - every { responseV1Mock.isSuccessful } answers { true } - every { responseV1Mock.body } answers { responseBodyV1Mock } - - val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) - every { clientBuilder.versionedInstanceRequest(1) } answers { responseV1Mock } - every { clientBuilder.versionedInstanceRequest(2) } answers { responseV2Mock } // when val client = clientBuilder.build() @@ -68,17 +71,16 @@ class MastodonClientTest { } @Test - fun `should throw exception when instance version cannot be found in response body`() { - // given - val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) - val responseMock = mockk() - every { responseMock.body } answers { invalidResponseBody.toResponseBody("application/json".toMediaType()) } - every { responseMock.isSuccessful } answers { true } - every { clientBuilder.versionedInstanceRequest(any()) } answers { responseMock } - - // when / then - Assertions.assertThrows(BigBoneRequestException::class.java) { - clientBuilder.build() + fun `Given response body without instance version, when building MastodonClient, then fail with exception`() { + val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + val responseMock = mockk { + val invalidResponseBody = "{ \"foo\": \"bar\" }" + every { body } answers { invalidResponseBody.toResponseBody("application/json".toMediaType()) } + every { isSuccessful } answers { true } + } + every { versionedInstanceRequest(any()) } answers { responseMock } } + + invoking(clientBuilder::build) shouldThrow BigBoneRequestException::class } } From 977900beb9138b6409fd697f6c92ad17baf02892 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 15 Oct 2023 20:40:24 +0200 Subject: [PATCH 04/11] Auto-close okhttp responses by using Kotlin's Closeable#use --- .../kotlin/social/bigbone/MastodonClient.kt | 65 ++++++++++--------- .../social/bigbone/nodeinfo/NodeInfoClient.kt | 45 ++++++------- .../social/bigbone/MastodonClientTest.kt | 5 ++ 3 files changed, 59 insertions(+), 56 deletions(-) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index 5159b3f4c..694ab9943 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -415,16 +415,16 @@ private constructor( */ @Throws(BigBoneRequestException::class) internal fun performAction(endpoint: String, method: Method, parameters: Parameters? = null) { - val response = when (method) { + when (method) { Method.DELETE -> delete(endpoint, parameters) Method.GET -> get(endpoint, parameters) Method.PATCH -> patch(endpoint, parameters) Method.POST -> post(endpoint, parameters) Method.PUT -> put(endpoint, parameters) - } - response.close() - if (!response.isSuccessful) { - throw BigBoneRequestException(response) + }.use { response: Response -> + if (!response.isSuccessful) { + throw BigBoneRequestException(response) + } } } @@ -724,15 +724,15 @@ private constructor( */ private fun getInstanceVersionFromApi(apiVersion: Int): String? { return try { - val response = versionedInstanceRequest(apiVersion) - if (response.isSuccessful) { - val instanceVersion: InstanceVersion? = response.body?.string()?.let { responseBody: String -> - JSON_SERIALIZER.decodeFromString(responseBody) + versionedInstanceRequest(apiVersion).use { response: Response -> + if (response.isSuccessful) { + val instanceVersion: InstanceVersion? = response.body?.string()?.let { responseBody: String -> + JSON_SERIALIZER.decodeFromString(responseBody) + } + instanceVersion?.version + } else { + null } - instanceVersion?.version - } else { - response.close() - null } } catch (e: Exception) { null @@ -755,26 +755,27 @@ private constructor( * @return server response for this request */ internal fun versionedInstanceRequest(version: Int): Response { - val versionString = if (version == 2) { - "v2" - } else { - "v1" - } + val versionString = if (version == 2) "v2" else "v1" + val clientBuilder = OkHttpClient.Builder() - if (trustAllCerts) { - configureForTrustAll(clientBuilder) - } - val client = clientBuilder.build() - return client.newCall( - Request.Builder().url( - fullUrl( - scheme, - instanceName, - port, - "api/$versionString/instance" - ) - ).get().build() - ).execute() + if (trustAllCerts) configureForTrustAll(clientBuilder) + + return clientBuilder + .build() + .newCall( + Request.Builder() + .url( + fullUrl( + scheme = scheme, + instanceName = instanceName, + port = port, + path = "api/$versionString/instance" + ) + ) + .get() + .build() + ) + .execute() } fun build(): MastodonClient { diff --git a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt index d0d781f02..bccbd536d 100644 --- a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt @@ -25,20 +25,18 @@ object NodeInfoClient { */ fun retrieveServerInfo(host: String): Server? { try { - val serverInfoUrl = getServerInfoUrl(host) - val response = CLIENT.newCall( + CLIENT.newCall( Request.Builder() - .url(serverInfoUrl) + .url(getServerInfoUrl(host)) .get() .build() - ).execute() + ).execute().use { response: Response -> + if (!response.isSuccessful) { + throw BigBoneRequestException("request for NodeInfo URL unsuccessful") + } - if (!response.isSuccessful) { - response.close() - throw BigBoneRequestException("request for NodeInfo URL unsuccessful") + return response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } } - - return response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } } catch (e: Exception) { throw BigBoneRequestException("invalid NodeInfo response") } @@ -50,27 +48,26 @@ object NodeInfoClient { * @return String containing the URL holding server information */ private fun getServerInfoUrl(host: String): String { - val response = CLIENT.newCall( + CLIENT.newCall( Request.Builder() .url("https://$host/.well-known/nodeinfo") .get() .build() - ).execute() + ).execute().use { response: Response -> + if (!response.isSuccessful) { + throw BigBoneRequestException("request for well-known NodeInfo URL unsuccessful") + } - if (!response.isSuccessful) { - response.close() - throw BigBoneRequestException("request for well-known NodeInfo URL unsuccessful") - } + val nodeInfo: NodeInfo? = response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } + if (nodeInfo == null || nodeInfo.links.isEmpty()) { + throw BigBoneRequestException("empty link list in well-known NodeInfo location") + } - val nodeInfo: NodeInfo? = response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } - if (nodeInfo == null || nodeInfo.links.isEmpty()) { - throw BigBoneRequestException("empty link list in well-known NodeInfo location") + // attempt returning URL to schema 2.0 information, but fall back to any - software information exists in all schemas + return nodeInfo.links + .firstOrNull { link -> link.rel == "http://nodeinfo.diaspora.software/ns/schema/2.0" } + ?.href + ?: nodeInfo.links.first().href } - - // attempt returning URL to schema 2.0 information, but fall back to any - software information exists in all schemas - return nodeInfo.links - .firstOrNull { link -> link.rel == "http://nodeinfo.diaspora.software/ns/schema/2.0" } - ?.href - ?: nodeInfo.links.first().href } } diff --git a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt index 9de2bfc78..e2cca58d1 100644 --- a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt +++ b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt @@ -27,10 +27,12 @@ class MastodonClientTest { every { string() } answers { AssetsUtil.readFromAssets("mastodon_client_v2_instance_response.json") } + every { close() } returns Unit } val responseV2Mock = mockk { every { body } answers { responseBodyV2Mock } every { isSuccessful } answers { true } + every { close() } returns Unit } every { versionedInstanceRequest(2) } answers { responseV2Mock } } @@ -54,11 +56,13 @@ class MastodonClientTest { val responseV1Mock = mockk { every { isSuccessful } answers { true } every { body } answers { responseBodyV1Mock } + every { close() } returns Unit } every { versionedInstanceRequest(1) } answers { responseV1Mock } val responseV2Mock = mockk { every { isSuccessful } answers { false } + every { close() } returns Unit } every { versionedInstanceRequest(2) } answers { responseV2Mock } } @@ -77,6 +81,7 @@ class MastodonClientTest { val invalidResponseBody = "{ \"foo\": \"bar\" }" every { body } answers { invalidResponseBody.toResponseBody("application/json".toMediaType()) } every { isSuccessful } answers { true } + every { close() } returns Unit } every { versionedInstanceRequest(any()) } answers { responseMock } } From 26c4acedd2417e5c97e4b4c30092c8a03f472ab8 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 26 Nov 2023 22:25:50 +0100 Subject: [PATCH 05/11] Return more specific ServerInfoRetrievalException if node info fails --- .../BigBoneClientInstantiationException.kt | 36 +++++++++++++++ .../social/bigbone/nodeinfo/NodeInfoClient.kt | 44 +++++++++++-------- 2 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt diff --git a/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt b/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt new file mode 100644 index 000000000..21d9e9b05 --- /dev/null +++ b/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt @@ -0,0 +1,36 @@ +package social.bigbone.api.exception + +import okhttp3.Response + +open class BigBoneClientInstantiationException : Exception { + constructor() : super() + constructor(message: String) : super(message) + constructor(message: String, cause: Throwable?) : super(message, cause) + constructor(cause: Throwable?) : super(cause) +} + +class ServerInfoRetrievalException : BigBoneClientInstantiationException { + constructor(cause: Throwable?) : super(cause) + constructor(message: String, cause: Throwable?) : super(message, cause) + constructor(response: Response, message: String? = null) : super( + message = "${message ?: ""}${response.message}" + ) +} + +class ServerInfoUrlRetrievalException( + response: Response, + message: String? = null +) : + BigBoneClientInstantiationException( + message = "${message ?: ""}${response.message}" + ) + +class InstanceVersionRetrievalException : BigBoneClientInstantiationException { + constructor() : super() + constructor(message: String) : super(message) + constructor(message: String, cause: Throwable?) : super(message, cause) + constructor(cause: Throwable?) : super(cause) + constructor(response: Response, message: String? = null) : super( + message = "${response.code} – ${message ?: ""}${response.message}" + ) +} diff --git a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt index bccbd536d..457741342 100644 --- a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt @@ -2,8 +2,10 @@ package social.bigbone.nodeinfo import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.Response import social.bigbone.JSON_SERIALIZER -import social.bigbone.api.exception.BigBoneRequestException +import social.bigbone.api.exception.ServerInfoRetrievalException +import social.bigbone.api.exception.ServerInfoUrlRetrievalException import social.bigbone.nodeinfo.entity.NodeInfo import social.bigbone.nodeinfo.entity.Server @@ -21,24 +23,23 @@ object NodeInfoClient { * Retrieve server information. * @param host hostname of the server to retrieve information from * @return server information, including the name and version of the software running on this server - * @throws BigBoneRequestException if server info can not be retrieved via NodeInfo for any reason */ + @Throws(ServerInfoRetrievalException::class) fun retrieveServerInfo(host: String): Server? { - try { - CLIENT.newCall( - Request.Builder() - .url(getServerInfoUrl(host)) - .get() - .build() - ).execute().use { response: Response -> - if (!response.isSuccessful) { - throw BigBoneRequestException("request for NodeInfo URL unsuccessful") - } - - return response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } + CLIENT.newCall( + Request.Builder() + .url(getServerInfoUrl(host)) + .get() + .build() + ).execute().use { response: Response -> + if (!response.isSuccessful) { + throw ServerInfoRetrievalException( + message = "request for NodeInfo URL unsuccessful", + response = response + ) } - } catch (e: Exception) { - throw BigBoneRequestException("invalid NodeInfo response") + + return response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } } } @@ -47,6 +48,7 @@ object NodeInfoClient { * @param host the hostname of the server to request information from * @return String containing the URL holding server information */ + @Throws(ServerInfoUrlRetrievalException::class) private fun getServerInfoUrl(host: String): String { CLIENT.newCall( Request.Builder() @@ -55,12 +57,18 @@ object NodeInfoClient { .build() ).execute().use { response: Response -> if (!response.isSuccessful) { - throw BigBoneRequestException("request for well-known NodeInfo URL unsuccessful") + throw ServerInfoUrlRetrievalException( + message = "request for well-known NodeInfo URL unsuccessful", + response = response + ) } val nodeInfo: NodeInfo? = response.body?.string()?.let { JSON_SERIALIZER.decodeFromString(it) } if (nodeInfo == null || nodeInfo.links.isEmpty()) { - throw BigBoneRequestException("empty link list in well-known NodeInfo location") + throw ServerInfoUrlRetrievalException( + message = "empty link list in well-known NodeInfo location", + response = response + ) } // attempt returning URL to schema 2.0 information, but fall back to any - software information exists in all schemas From 7f204b99775235ba0f38a5cea4000559b24e9caa Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 26 Nov 2023 22:34:26 +0100 Subject: [PATCH 06/11] Fall back but propagate errors in the end when instantiating client --- .../kotlin/social/bigbone/MastodonClient.kt | 89 ++++++++++++++----- .../BigBoneClientInstantiationException.kt | 17 +++- .../social/bigbone/MastodonClientTest.kt | 60 ++++++++++++- 3 files changed, 135 insertions(+), 31 deletions(-) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index 694ab9943..797430617 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -10,7 +10,10 @@ import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import social.bigbone.api.Pageable import social.bigbone.api.entity.data.InstanceVersion +import social.bigbone.api.exception.BigBoneClientInstantiationException import social.bigbone.api.exception.BigBoneRequestException +import social.bigbone.api.exception.InstanceVersionRetrievalException +import social.bigbone.api.exception.ServerInfoRetrievalException import social.bigbone.api.method.AccountMethods import social.bigbone.api.method.AnnouncementMethods import social.bigbone.api.method.AppMethods @@ -47,6 +50,7 @@ import social.bigbone.api.method.admin.AdminMeasureMethods import social.bigbone.api.method.admin.AdminRetentionMethods import social.bigbone.extension.emptyRequestBody import social.bigbone.nodeinfo.NodeInfoClient +import social.bigbone.nodeinfo.entity.Server import java.io.IOException import java.security.SecureRandom import java.security.cert.X509Certificate @@ -698,22 +702,50 @@ private constructor( /** * Get the version string for this Mastodon instance. * @return a string corresponding to the version of this Mastodon instance - * @throws BigBoneRequestException if instance version can not be retrieved using any known method or API version + * @throws BigBoneClientInstantiationException if instance version cannot be retrieved using any known method or API version */ + @Throws(BigBoneClientInstantiationException::class) private fun getInstanceVersion(): String { - try { - val serverInfoVersion = NodeInfoClient - .retrieveServerInfo(instanceName) - ?.software - ?.takeIf { it.name == "mastodon" } - ?.version - if (serverInfoVersion != null) return serverInfoVersion - } catch (_: BigBoneRequestException) { + return try { + getInstanceVersionViaServerInfo() + } catch (error: BigBoneClientInstantiationException) { + // fall back to retrieving from Mastodon API itself + try { + getInstanceVersionViaApi() + } catch (instanceException: InstanceVersionRetrievalException) { + throw BigBoneClientInstantiationException( + message = "Failed to get instance version of $instanceName", + cause = if (instanceException.cause == instanceException) { + instanceException.initCause(error) + } else { + instanceException + } + ) + } } + } + + @Throws(ServerInfoRetrievalException::class) + private fun getInstanceVersionViaServerInfo(): String { + val serverSoftwareInfo: Server.Software? = NodeInfoClient + .retrieveServerInfo(instanceName) + ?.software + ?.takeIf { it.name == "mastodon" } - // fall back to retrieving from Mastodon API itself - val instanceVersion = getInstanceVersionFromApi(2) ?: getInstanceVersionFromApi(1) - return instanceVersion ?: throw BigBoneRequestException("Unable to fetch instance version") + if (serverSoftwareInfo != null) return serverSoftwareInfo.version + + throw ServerInfoRetrievalException( + cause = IllegalArgumentException("Server $instanceName doesn't appear to run Mastodon") + ) + } + + @Throws(InstanceVersionRetrievalException::class) + private fun getInstanceVersionViaApi(): String { + return try { + getInstanceVersionFromApi(2) + } catch (e: InstanceVersionRetrievalException) { + getInstanceVersionFromApi(1) + } } /** @@ -722,20 +754,21 @@ private constructor( * @return a string corresponding to the version of this Mastodon instance, or null if no version string can be * retrieved using the specified API version. */ - private fun getInstanceVersionFromApi(apiVersion: Int): String? { - return try { - versionedInstanceRequest(apiVersion).use { response: Response -> - if (response.isSuccessful) { - val instanceVersion: InstanceVersion? = response.body?.string()?.let { responseBody: String -> - JSON_SERIALIZER.decodeFromString(responseBody) - } - instanceVersion?.version - } else { - null + @Throws(InstanceVersionRetrievalException::class) + private fun getInstanceVersionFromApi(apiVersion: Int): String { + return versionedInstanceRequest(apiVersion).use { response: Response -> + if (response.isSuccessful) { + val instanceVersion: InstanceVersion? = response.body?.string()?.let { responseBody: String -> + JSON_SERIALIZER.decodeFromString(responseBody) } + instanceVersion + ?.version + ?: throw InstanceVersionRetrievalException( + cause = IllegalStateException("Instance version was null unexpectedly") + ) + } else { + throw InstanceVersionRetrievalException(response = response) } - } catch (e: Exception) { - null } } @@ -778,6 +811,14 @@ private constructor( .execute() } + /** + * Builds this MastodonClient. + * + * @throws BigBoneClientInstantiationException if the client could not be instantiated, likely due to an issue + * when getting the instance version of the server in [instanceName]. Other exceptions, e.g. due to no Internet + * connection are _not_ caught by this library. + */ + @Throws(BigBoneClientInstantiationException::class) fun build(): MastodonClient { return MastodonClient( instanceName = instanceName, diff --git a/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt b/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt index 21d9e9b05..2a470e8e0 100644 --- a/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt +++ b/bigbone/src/main/kotlin/social/bigbone/api/exception/BigBoneClientInstantiationException.kt @@ -1,7 +1,12 @@ package social.bigbone.api.exception import okhttp3.Response +import social.bigbone.MastodonClient +import social.bigbone.nodeinfo.entity.NodeInfo +/** + * Exception thrown if we could not instantiate a [MastodonClient]. Mostly used to wrap other more specific exceptions. + */ open class BigBoneClientInstantiationException : Exception { constructor() : super() constructor(message: String) : super(message) @@ -9,6 +14,9 @@ open class BigBoneClientInstantiationException : Exception { constructor(cause: Throwable?) : super(cause) } +/** + * Exception thrown if we could not retrieve server information during [MastodonClient] instantiation. + */ class ServerInfoRetrievalException : BigBoneClientInstantiationException { constructor(cause: Throwable?) : super(cause) constructor(message: String, cause: Throwable?) : super(message, cause) @@ -17,6 +25,9 @@ class ServerInfoRetrievalException : BigBoneClientInstantiationException { ) } +/** + * Exception thrown if we could not successfully get the [NodeInfo] server URL during [MastodonClient] instantiation. + */ class ServerInfoUrlRetrievalException( response: Response, message: String? = null @@ -25,10 +36,10 @@ class ServerInfoUrlRetrievalException( message = "${message ?: ""}${response.message}" ) +/** + * Exception thrown if we could not retrieve the instance version of a Mastodon server during [MastodonClient] instantiation. + */ class InstanceVersionRetrievalException : BigBoneClientInstantiationException { - constructor() : super() - constructor(message: String) : super(message) - constructor(message: String, cause: Throwable?) : super(message, cause) constructor(cause: Throwable?) : super(cause) constructor(response: Response, message: String? = null) : super( message = "${response.code} – ${message ?: ""}${response.message}" diff --git a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt index e2cca58d1..e30a423e5 100644 --- a/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt +++ b/bigbone/src/test/kotlin/social/bigbone/MastodonClientTest.kt @@ -2,6 +2,7 @@ package social.bigbone import io.mockk.every import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.spyk import okhttp3.MediaType.Companion.toMediaType import okhttp3.Response @@ -10,9 +11,15 @@ import okhttp3.ResponseBody.Companion.toResponseBody import org.amshove.kluent.invoking import org.amshove.kluent.shouldBeEqualTo import org.amshove.kluent.shouldThrow +import org.amshove.kluent.withCause +import org.amshove.kluent.withMessage import org.junit.jupiter.api.Test -import social.bigbone.api.exception.BigBoneRequestException +import social.bigbone.api.exception.BigBoneClientInstantiationException +import social.bigbone.api.exception.InstanceVersionRetrievalException +import social.bigbone.api.exception.ServerInfoRetrievalException +import social.bigbone.nodeinfo.NodeInfoClient import social.bigbone.testtool.AssetsUtil +import java.net.UnknownHostException class MastodonClientTest { @@ -20,6 +27,13 @@ class MastodonClientTest { fun `Given server response with available v2 endpoint, when building MastodonClient, then return instance version of v2 endpoint`() { // given val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + // Mock internal NodeInfoClient so that we don't open the site in unit testing + mockkObject(NodeInfoClient) + every { NodeInfoClient.retrieveServerInfo("foo.bar") } throws ServerInfoRetrievalException( + "just for testing", + null + ) + val responseV1Mock = mockk() every { versionedInstanceRequest(1) } answers { responseV1Mock } @@ -48,6 +62,13 @@ class MastodonClientTest { fun `Given server response with only v1 endpoint available, when building MastodonClient, then return instance version of v1 endpoint`() { // given val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + // Mock internal NodeInfoClient so that we don't open the site in unit testing + mockkObject(NodeInfoClient) + every { NodeInfoClient.retrieveServerInfo("foo.bar") } throws ServerInfoRetrievalException( + "just for testing", + null + ) + val responseBodyV1Mock = mockk { every { string() } answers { AssetsUtil.readFromAssets("mastodon_client_v1_instance_response.json") @@ -62,6 +83,8 @@ class MastodonClientTest { val responseV2Mock = mockk { every { isSuccessful } answers { false } + every { code } returns 404 + every { message } returns "Not Found" every { close() } returns Unit } every { versionedInstanceRequest(2) } answers { responseV2Mock } @@ -75,8 +98,16 @@ class MastodonClientTest { } @Test - fun `Given response body without instance version, when building MastodonClient, then fail with exception`() { - val clientBuilder = spyk(MastodonClient.Builder("foo.bar")) { + fun `Given response body without instance version, when building MastodonClient, then fail with InstanceVersionRetrievalException`() { + val serverUrl = "foo.bar" + val clientBuilder = spyk(MastodonClient.Builder(serverUrl)) { + // Mock internal NodeInfoClient so that we don't open the site in unit testing + mockkObject(NodeInfoClient) + every { NodeInfoClient.retrieveServerInfo(serverUrl) } throws ServerInfoRetrievalException( + "just for testing", + null + ) + val responseMock = mockk { val invalidResponseBody = "{ \"foo\": \"bar\" }" every { body } answers { invalidResponseBody.toResponseBody("application/json".toMediaType()) } @@ -86,6 +117,27 @@ class MastodonClientTest { every { versionedInstanceRequest(any()) } answers { responseMock } } - invoking(clientBuilder::build) shouldThrow BigBoneRequestException::class + invoking(clientBuilder::build) + .shouldThrow(BigBoneClientInstantiationException::class) + .withCause(InstanceVersionRetrievalException::class) + .withMessage("Failed to get instance version of $serverUrl") + } + + @Test + fun `Given a server that doesn't run Mastodon, when building MastodonClient, then fail with InstanceVersionRetrievalException`() { + val testUrl = "pod.dapor.net" + val clientBuilder: MastodonClient.Builder = spyk(MastodonClient.Builder(testUrl)) + + invoking(clientBuilder::build) + .shouldThrow(BigBoneClientInstantiationException::class) + .withCause(InstanceVersionRetrievalException::class) + .withMessage("Failed to get instance version of $testUrl") + } + + @Test + fun `Given a server that cannot be reached, when building MastodonClient, then propagate UnknownHostException`() { + val clientBuilder: MastodonClient.Builder = spyk(MastodonClient.Builder("unreachabledomain")) + + invoking(clientBuilder::build) shouldThrow UnknownHostException::class } } From e4acc5c14414b5061cab9f8825b5335bd9074a05 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 26 Nov 2023 22:44:48 +0100 Subject: [PATCH 07/11] Update Java samples to expect thrown exception --- .../kotlin/social/bigbone/MastodonClient.kt | 2 +- .../social/bigbone/sample/Authenticator.java | 21 ++++++++++++++++--- .../bigbone/sample/GetAppRegistration.java | 6 ++++-- .../social/bigbone/sample/GetBookmarks.java | 12 ++++++++--- .../bigbone/sample/GetConversations.java | 12 ++++++++--- .../bigbone/sample/GetDirectoryAccounts.java | 12 ++++++++--- .../sample/GetHomeTimelineWithFiltering.java | 12 ++++++++--- .../bigbone/sample/GetInstanceInfo.java | 8 ++++++- .../social/bigbone/sample/GetMarkers.java | 12 ++++++++--- .../bigbone/sample/GetOEmbedMetadata.java | 8 ++++++- .../bigbone/sample/GetPublicTimeline.java | 9 ++++++-- .../social/bigbone/sample/GetRawJson.java | 9 ++++++-- .../social/bigbone/sample/GetTagTimeline.java | 9 ++++++-- .../social/bigbone/sample/ManageFilters.java | 14 +++++++++---- .../bigbone/sample/OAuthGetAccessToken.java | 8 ++++++- .../bigbone/sample/PerformSimpleSearch.java | 12 ++++++++--- .../sample/PostStatusWithMediaAttached.java | 13 +++++++++--- .../sample/StreamFederatedPublicTimeline.java | 14 +++++++++---- 18 files changed, 149 insertions(+), 44 deletions(-) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index 797430617..edd5b55dc 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -71,7 +71,7 @@ private constructor( private var debug: Boolean = false, private var instanceVersion: String? = null, private var scheme: String = "https", - private var port: Int = 443, + private var port: Int = 443 ) { /** diff --git a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java index 6f41dcbe8..572a1bec1 100644 --- a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java +++ b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java @@ -4,6 +4,7 @@ import social.bigbone.api.Scope; import social.bigbone.api.entity.Application; import social.bigbone.api.entity.Token; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import social.bigbone.api.method.OAuthMethods; @@ -58,17 +59,31 @@ static MastodonClient appRegistrationIfNeeded(final String instanceName, final S if (useStreaming) { builder.useStreamingApi(); } - return builder.build(); + try { + return builder.build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } } private static Token getAccessToken(final String instanceName, final String clientId, final String clientSecret, final String email, final String password) throws BigBoneRequestException { - final MastodonClient client = new MastodonClient.Builder(instanceName).build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instanceName).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } final OAuthMethods oauthMethods = new OAuthMethods(client); return oauthMethods.getUserAccessTokenWithPasswordGrant(clientId, clientSecret, REDIRECT_URI, email, password, new Scope()).execute(); } private static Application application(final String instanceName) throws BigBoneRequestException { - final MastodonClient client = new MastodonClient.Builder(instanceName).build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instanceName).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } return client.apps().createApp("bigbone-sample-app", REDIRECT_URI, null, new Scope()).execute(); } } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java index 58992e675..2db03c2c6 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java @@ -3,12 +3,14 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Scope; import social.bigbone.api.entity.Application; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetAppRegistration { public static void main(final String[] args) { - final MastodonClient client = new MastodonClient.Builder("mstdn.jp").build(); try { + final MastodonClient client = new MastodonClient.Builder("mstdn.jp").build(); + final Application application = client.apps().createApp( "bigbone-sample-app", "urn:ietf:wg:oauth:2.0:oob", @@ -17,7 +19,7 @@ public static void main(final String[] args) { ).execute(); System.out.println("client_id=" + application.getClientId()); System.out.println("client_secret=" + application.getClientSecret()); - } catch (BigBoneRequestException e) { + } catch (BigBoneRequestException | BigBoneClientInstantiationException e) { e.printStackTrace(); } } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java index 3022ce3a3..85a036f7f 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java @@ -3,6 +3,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetBookmarks { @@ -11,9 +12,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get bookmarks final Pageable bookmarks = client.bookmarks().getBookmarks().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java index df7234ec7..6f3614f5d 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java @@ -3,6 +3,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Conversation; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetConversations { @@ -11,9 +12,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get conversations final Pageable conversations = client.conversations().getConversations().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java index a4aa60fec..3f34fd03b 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java @@ -2,6 +2,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Account; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import social.bigbone.api.method.DirectoryMethods; @@ -15,9 +16,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // get 40 local accounts that were recently active, skipping the first ten final List accounts = client.directories().listAccounts( diff --git a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java index 0c476e390..9f65ac0e6 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java @@ -4,6 +4,7 @@ import social.bigbone.api.Pageable; import social.bigbone.api.entity.Filter; import social.bigbone.api.entity.Status; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.concurrent.atomic.AtomicBoolean; @@ -15,9 +16,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get statuses from home timeline, then handle each one final Pageable statuses = client.timelines().getHomeTimeline().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java index 1887ad162..b4a8dd6e1 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java @@ -2,6 +2,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Instance; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; @SuppressWarnings("PMD.SystemPrintln") @@ -11,7 +12,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance).build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get instance info and dump it to the console as JSON final Instance instanceInfo = client.instances().getInstance().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java index e2d3a82f6..b0bafe424 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java @@ -2,6 +2,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Markers; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetMarkers { @@ -10,9 +11,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get markers final Markers markers = client.markers().getMarkers().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java index d18beab12..4e838dfd5 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java @@ -2,6 +2,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.OEmbedMetadata; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetOEmbedMetadata { @@ -11,7 +12,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String statusUrl = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance).build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get oEmbed metadata for [statusUrl] final OEmbedMetadata oEmbedMetadata = client.oembed().getOEmbedInfoAsJson(statusUrl).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java index 0bde48a87..e0930a380 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java @@ -3,6 +3,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; @@ -12,8 +13,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get statuses from public timeline final Pageable statuses = client.timelines().getPublicTimeline(LOCAL_AND_REMOTE).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java index 17df35250..314b692df 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java @@ -1,6 +1,7 @@ package social.bigbone.sample; import social.bigbone.MastodonClient; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; @@ -10,8 +11,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Print timeline statuses client.timelines().getPublicTimeline(LOCAL_AND_REMOTE).doOnJson( diff --git a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java index fb76022b8..ae5c4199c 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java @@ -3,6 +3,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; @@ -13,8 +14,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String hashtag = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Get statuses from public timeline final Pageable statuses = client.timelines().getTagTimeline(hashtag, LOCAL_AND_REMOTE).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java index 4fcb19e83..2ebfdde6a 100644 --- a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java +++ b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java @@ -3,6 +3,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Filter; import social.bigbone.api.entity.FilterKeyword; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.Arrays; @@ -23,10 +24,15 @@ public static void main(final String[] args) throws BigBoneRequestException { final String action = args[2]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } + switch (action) { case "list": listExistingFilters(client); diff --git a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java index 724ba87a1..23bbca92f 100644 --- a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java +++ b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java @@ -4,6 +4,7 @@ import social.bigbone.MastodonRequest; import social.bigbone.api.Scope; import social.bigbone.api.entity.Token; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.Scanner; @@ -15,7 +16,12 @@ public static void main(final String[] args) throws BigBoneRequestException { final String clientSecret = args[2]; final String redirectUri = args[3]; - final MastodonClient client = new MastodonClient.Builder(instanceName).build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instanceName).build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } final String url = client.oauth().getOAuthUrl(clientId, new Scope(), redirectUri); System.out.println("Open authorization page and copy code:"); System.out.println(url); diff --git a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java index 399fda92b..5a2349e71 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java +++ b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java @@ -2,6 +2,7 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Search; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class PerformSimpleSearch { @@ -11,9 +12,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String searchTerm = args[2]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Perform search and print results final Search searchResult = client.search().searchContent(searchTerm).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java index 673695083..fa221402f 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java +++ b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java @@ -3,7 +3,9 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.MediaAttachment; import social.bigbone.api.entity.data.Visibility; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; + import java.io.File; import java.util.Collections; import java.util.List; @@ -14,9 +16,14 @@ public static void main(final String[] args) throws BigBoneRequestException { final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Read file from resources folder final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java index 1011110bd..f66a1b5dd 100644 --- a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java @@ -6,6 +6,7 @@ import social.bigbone.api.Shutdownable; import social.bigbone.api.entity.Notification; import social.bigbone.api.entity.Status; +import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class StreamFederatedPublicTimeline { @@ -14,10 +15,15 @@ public static void main(final String[] args) throws BigBoneRequestException, Int final String accessToken = args[1]; // Instantiate client - final MastodonClient client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .useStreamingApi() - .build(); + final MastodonClient client; + try { + client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .useStreamingApi() + .build(); + } catch (BigBoneClientInstantiationException e) { + throw new RuntimeException(e); + } // Configure status handler final Handler handler = new Handler() { From ddbae4cd0716940d3afe932f61725717ccf2375c Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 26 Nov 2023 22:58:27 +0100 Subject: [PATCH 08/11] Add info about exceptions to USAGE help file --- USAGE.md | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/USAGE.md b/USAGE.md index 750437611..2c15a4635 100644 --- a/USAGE.md +++ b/USAGE.md @@ -29,7 +29,15 @@ scope = Scope() ## Registering an App -To access the API of a Mastodon server, we first need to create client credentials. +To access the API of a Mastodon server, we first need to create client credentials. + + +> [!IMPORTANT] +> When building an instance of the `MastodonClient`, it may throw a `BigBoneClientInstantiationException` if we could +> not +> successfully retrieve information about an instance you provide. The stacktrace of that exception should either help you +> find a solution, or give you necessary information you can provide to us, e.g. via the GitHub issues, to help you find +> one. __Kotlin__ @@ -46,14 +54,19 @@ val appRegistration = client.apps.createApp( __Java__ ```java -MastodonClient client = new MastodonClient.Builder(instanceHostname).build(); try { - AppRegistration appRegistration = client.apps().createApp( - "bigbone-sample-app", - "urn:ietf:wg:oauth:2.0:oob", - new Scope(), - "https://example.org/" - ).execute(); + MastodonClient client=new MastodonClient.Builder(instanceHostname).build(); +} catch (BigBoneClientInstantiationException e){ + // error handling +} + +try { + AppRegistration appRegistration=client.apps().createApp( + "bigbone-sample-app", + "urn:ietf:wg:oauth:2.0:oob", + new Scope(), + "https://example.org/" + ).execute(); } catch (BigBoneRequestException e) { // error handling } From 931ed66f9bb9b5876e5c75f2d427d61d3f778b36 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Sun, 26 Nov 2023 23:17:58 +0100 Subject: [PATCH 09/11] Add throws info to existing kdoc --- bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt | 2 ++ .../src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index edd5b55dc..c614cbc70 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -416,6 +416,7 @@ private constructor( * @param endpoint the Mastodon API endpoint to call * @param method the HTTP method to use * @param parameters parameters to use in the action; can be null + * @throws BigBoneRequestException in case the action to be performed yielded an unsuccessful response */ @Throws(BigBoneRequestException::class) internal fun performAction(endpoint: String, method: Method, parameters: Parameters? = null) { @@ -753,6 +754,7 @@ private constructor( * @param apiVersion the version of API call to use in this request * @return a string corresponding to the version of this Mastodon instance, or null if no version string can be * retrieved using the specified API version. + * @throws InstanceVersionRetrievalException in case we got a server response but no version, or an unsucessful response */ @Throws(InstanceVersionRetrievalException::class) private fun getInstanceVersionFromApi(apiVersion: Int): String { diff --git a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt index 457741342..ae35f82fc 100644 --- a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt @@ -23,6 +23,7 @@ object NodeInfoClient { * Retrieve server information. * @param host hostname of the server to retrieve information from * @return server information, including the name and version of the software running on this server + * @throws ServerInfoRetrievalException if the request for a server info to [host] was unsuccessful */ @Throws(ServerInfoRetrievalException::class) fun retrieveServerInfo(host: String): Server? { @@ -47,6 +48,7 @@ object NodeInfoClient { * Get the URL to retrieve server information from. * @param host the hostname of the server to request information from * @return String containing the URL holding server information + * @throws ServerInfoUrlRetrievalException if we could not call the [host] or if the [NodeInfo] was empty */ @Throws(ServerInfoUrlRetrievalException::class) private fun getServerInfoUrl(host: String): String { From b98a2a10f1754d7d1a9ee0eeff0c8da785b2297c Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Wed, 29 Nov 2023 01:38:09 +0100 Subject: [PATCH 10/11] Replace try/catch with throws declaration Signed-off-by: PattaFeuFeu --- .../social/bigbone/sample/Authenticator.java | 31 ++++++------------- .../bigbone/sample/GetAppRegistration.java | 24 ++++++-------- .../social/bigbone/sample/GetBookmarks.java | 13 +++----- .../bigbone/sample/GetConversations.java | 13 +++----- .../bigbone/sample/GetDirectoryAccounts.java | 13 +++----- .../sample/GetHomeTimelineWithFiltering.java | 13 +++----- .../bigbone/sample/GetInstanceInfo.java | 9 ++---- .../social/bigbone/sample/GetMarkers.java | 13 +++----- .../bigbone/sample/GetOEmbedMetadata.java | 9 ++---- .../bigbone/sample/GetPublicTimeline.java | 9 ++---- .../social/bigbone/sample/GetRawJson.java | 11 ++----- .../social/bigbone/sample/GetTagTimeline.java | 9 ++---- .../social/bigbone/sample/ManageFilters.java | 14 +++------ .../bigbone/sample/OAuthGetAccessToken.java | 9 ++---- .../bigbone/sample/PerformSimpleSearch.java | 13 +++----- .../sample/PostStatusWithMediaAttached.java | 13 +++----- .../sample/StreamFederatedPublicTimeline.java | 15 +++------ 17 files changed, 69 insertions(+), 162 deletions(-) diff --git a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java index 572a1bec1..e86e93f0b 100644 --- a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java +++ b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java @@ -20,9 +20,10 @@ final class Authenticator { private static final String ACCESS_TOKEN = "access_token"; private static final String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; - private Authenticator() { } + private Authenticator() { + } - static MastodonClient appRegistrationIfNeeded(final String instanceName, final String credentialFilePath, final boolean useStreaming) throws IOException, BigBoneRequestException { + static MastodonClient appRegistrationIfNeeded(final String instanceName, final String credentialFilePath, final boolean useStreaming) throws IOException, BigBoneRequestException, BigBoneClientInstantiationException { final File file = new File(credentialFilePath); if (!file.exists()) { System.out.println("create $credentialFilePath."); @@ -55,35 +56,21 @@ static MastodonClient appRegistrationIfNeeded(final String instanceName, final S System.out.println("access token found..."); } final MastodonClient.Builder builder = new MastodonClient.Builder(instanceName) - .accessToken(properties.get(ACCESS_TOKEN).toString()); + .accessToken(properties.get(ACCESS_TOKEN).toString()); if (useStreaming) { builder.useStreamingApi(); } - try { - return builder.build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + return builder.build(); } - private static Token getAccessToken(final String instanceName, final String clientId, final String clientSecret, final String email, final String password) throws BigBoneRequestException { - final MastodonClient client; - try { - client = new MastodonClient.Builder(instanceName).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + private static Token getAccessToken(final String instanceName, final String clientId, final String clientSecret, final String email, final String password) throws BigBoneRequestException, BigBoneClientInstantiationException { + final MastodonClient client = new MastodonClient.Builder(instanceName).build(); final OAuthMethods oauthMethods = new OAuthMethods(client); return oauthMethods.getUserAccessTokenWithPasswordGrant(clientId, clientSecret, REDIRECT_URI, email, password, new Scope()).execute(); } - private static Application application(final String instanceName) throws BigBoneRequestException { - final MastodonClient client; - try { - client = new MastodonClient.Builder(instanceName).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + private static Application application(final String instanceName) throws BigBoneRequestException, BigBoneClientInstantiationException { + final MastodonClient client = new MastodonClient.Builder(instanceName).build(); return client.apps().createApp("bigbone-sample-app", REDIRECT_URI, null, new Scope()).execute(); } } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java index 2db03c2c6..12d6b3ac3 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java @@ -7,20 +7,16 @@ import social.bigbone.api.exception.BigBoneRequestException; public class GetAppRegistration { - public static void main(final String[] args) { - try { - final MastodonClient client = new MastodonClient.Builder("mstdn.jp").build(); + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + final MastodonClient client = new MastodonClient.Builder("mstdn.jp").build(); - final Application application = client.apps().createApp( - "bigbone-sample-app", - "urn:ietf:wg:oauth:2.0:oob", - "", - new Scope(Scope.Name.ALL) - ).execute(); - System.out.println("client_id=" + application.getClientId()); - System.out.println("client_secret=" + application.getClientSecret()); - } catch (BigBoneRequestException | BigBoneClientInstantiationException e) { - e.printStackTrace(); - } + final Application application = client.apps().createApp( + "bigbone-sample-app", + "urn:ietf:wg:oauth:2.0:oob", + "", + new Scope(Scope.Name.ALL) + ).execute(); + System.out.println("client_id=" + application.getClientId()); + System.out.println("client_secret=" + application.getClientSecret()); } } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java index 85a036f7f..9b3fa4e9b 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java @@ -7,19 +7,14 @@ import social.bigbone.api.exception.BigBoneRequestException; public class GetBookmarks { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Get bookmarks final Pageable bookmarks = client.bookmarks().getBookmarks().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java index 6f3614f5d..d96326419 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java @@ -7,19 +7,14 @@ import social.bigbone.api.exception.BigBoneRequestException; public class GetConversations { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Get conversations final Pageable conversations = client.conversations().getConversations().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java index 3f34fd03b..cc00b87f5 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java @@ -11,19 +11,14 @@ import java.util.NoSuchElementException; public class GetDirectoryAccounts { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // get 40 local accounts that were recently active, skipping the first ten final List accounts = client.directories().listAccounts( diff --git a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java index 9f65ac0e6..462ef80a7 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java @@ -11,19 +11,14 @@ public class GetHomeTimelineWithFiltering { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Get statuses from home timeline, then handle each one final Pageable statuses = client.timelines().getHomeTimeline().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java index b4a8dd6e1..4b7c6812b 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java @@ -8,16 +8,11 @@ @SuppressWarnings("PMD.SystemPrintln") public class GetInstanceInfo { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance).build(); // Get instance info and dump it to the console as JSON final Instance instanceInfo = client.instances().getInstance().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java index b0bafe424..11bb8d486 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java @@ -6,19 +6,14 @@ import social.bigbone.api.exception.BigBoneRequestException; public class GetMarkers { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Get markers final Markers markers = client.markers().getMarkers().execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java index 4e838dfd5..561f34cf9 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java @@ -7,17 +7,12 @@ public class GetOEmbedMetadata { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String statusUrl = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance).build(); // Get oEmbed metadata for [statusUrl] final OEmbedMetadata oEmbedMetadata = client.oembed().getOEmbedInfoAsJson(statusUrl).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java index e0930a380..b2b15446c 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java @@ -9,16 +9,11 @@ import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetPublicTimeline { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance).build(); // Get statuses from public timeline final Pageable statuses = client.timelines().getPublicTimeline(LOCAL_AND_REMOTE).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java index 314b692df..f171042c4 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java @@ -7,20 +7,15 @@ import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetRawJson { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance).build(); // Print timeline statuses client.timelines().getPublicTimeline(LOCAL_AND_REMOTE).doOnJson( - System.out::println + System.out::println ).execute(); } } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java index ae5c4199c..913218863 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java @@ -9,17 +9,12 @@ import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetTagTimeline { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String hashtag = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance).build(); // Get statuses from public timeline final Pageable statuses = client.timelines().getTagTimeline(hashtag, LOCAL_AND_REMOTE).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java index 2ebfdde6a..90094d3d1 100644 --- a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java +++ b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java @@ -18,20 +18,15 @@ */ @SuppressWarnings("PMD.SystemPrintln") public class ManageFilters { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; final String action = args[2]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); switch (action) { case "list": @@ -71,7 +66,6 @@ private static void listExistingFilters(final MastodonClient client) throws BigB } System.out.println("\n-------------------------------------------------------"); } - } /** diff --git a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java index 23bbca92f..8154efa46 100644 --- a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java +++ b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java @@ -10,18 +10,13 @@ import java.util.Scanner; public class OAuthGetAccessToken { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instanceName = args[0]; final String clientId = args[1]; final String clientSecret = args[2]; final String redirectUri = args[3]; - final MastodonClient client; - try { - client = new MastodonClient.Builder(instanceName).build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instanceName).build(); final String url = client.oauth().getOAuthUrl(clientId, new Scope(), redirectUri); System.out.println("Open authorization page and copy code:"); System.out.println(url); diff --git a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java index 5a2349e71..84c7828f0 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java +++ b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java @@ -6,20 +6,15 @@ import social.bigbone.api.exception.BigBoneRequestException; public class PerformSimpleSearch { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; final String searchTerm = args[2]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Perform search and print results final Search searchResult = client.search().searchContent(searchTerm).execute(); diff --git a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java index fa221402f..60c027e40 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java +++ b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java @@ -11,19 +11,14 @@ import java.util.List; public class PostStatusWithMediaAttached { - public static void main(final String[] args) throws BigBoneRequestException { + public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .build(); // Read file from resources folder final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java index f66a1b5dd..dbeb1bbb7 100644 --- a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java @@ -10,20 +10,15 @@ import social.bigbone.api.exception.BigBoneRequestException; public class StreamFederatedPublicTimeline { - public static void main(final String[] args) throws BigBoneRequestException, InterruptedException { + public static void main(final String[] args) throws BigBoneRequestException, InterruptedException, BigBoneClientInstantiationException { final String instance = args[0]; final String accessToken = args[1]; // Instantiate client - final MastodonClient client; - try { - client = new MastodonClient.Builder(instance) - .accessToken(accessToken) - .useStreamingApi() - .build(); - } catch (BigBoneClientInstantiationException e) { - throw new RuntimeException(e); - } + final MastodonClient client = new MastodonClient.Builder(instance) + .accessToken(accessToken) + .useStreamingApi() + .build(); // Configure status handler final Handler handler = new Handler() { From 67f556f36ff3e6d8c0c6fbf5e76c0c9717577bd7 Mon Sep 17 00:00:00 2001 From: PattaFeuFeu Date: Wed, 29 Nov 2023 11:39:55 +0100 Subject: [PATCH 11/11] Remove Throws annotation from public methods, keep kDoc Signed-off-by: PattaFeuFeu --- .../kotlin/social/bigbone/MastodonClient.kt | 1 - .../social/bigbone/nodeinfo/NodeInfoClient.kt | 1 - .../social/bigbone/sample/Authenticator.java | 7 +++--- .../bigbone/sample/GetAppRegistration.java | 3 +-- .../social/bigbone/sample/GetBookmarks.java | 3 +-- .../bigbone/sample/GetConversations.java | 3 +-- .../bigbone/sample/GetDirectoryAccounts.java | 3 +-- .../sample/GetHomeTimelineWithFiltering.java | 3 +-- .../bigbone/sample/GetInstanceInfo.java | 3 +-- .../social/bigbone/sample/GetMarkers.java | 3 +-- .../bigbone/sample/GetOEmbedMetadata.java | 3 +-- .../bigbone/sample/GetPublicTimeline.java | 3 +-- .../social/bigbone/sample/GetRawJson.java | 3 +-- .../social/bigbone/sample/GetTagTimeline.java | 3 +-- .../social/bigbone/sample/ManageFilters.java | 25 +++++++++---------- .../bigbone/sample/OAuthGetAccessToken.java | 3 +-- .../bigbone/sample/PerformSimpleSearch.java | 3 +-- .../sample/PostStatusWithMediaAttached.java | 3 +-- .../sample/StreamFederatedPublicTimeline.java | 3 +-- 19 files changed, 30 insertions(+), 49 deletions(-) diff --git a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt index 1ed585e44..c79dc5939 100644 --- a/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/MastodonClient.kt @@ -844,7 +844,6 @@ private constructor( * when getting the instance version of the server in [instanceName]. Other exceptions, e.g. due to no Internet * connection are _not_ caught by this library. */ - @Throws(BigBoneClientInstantiationException::class) fun build(): MastodonClient { return MastodonClient( instanceName = instanceName, diff --git a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt index ae35f82fc..32989ea5d 100644 --- a/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt +++ b/bigbone/src/main/kotlin/social/bigbone/nodeinfo/NodeInfoClient.kt @@ -25,7 +25,6 @@ object NodeInfoClient { * @return server information, including the name and version of the software running on this server * @throws ServerInfoRetrievalException if the request for a server info to [host] was unsuccessful */ - @Throws(ServerInfoRetrievalException::class) fun retrieveServerInfo(host: String): Server? { CLIENT.newCall( Request.Builder() diff --git a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java index e86e93f0b..d1a5b711e 100644 --- a/sample-java/src/main/java/social/bigbone/sample/Authenticator.java +++ b/sample-java/src/main/java/social/bigbone/sample/Authenticator.java @@ -4,7 +4,6 @@ import social.bigbone.api.Scope; import social.bigbone.api.entity.Application; import social.bigbone.api.entity.Token; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import social.bigbone.api.method.OAuthMethods; @@ -23,7 +22,7 @@ final class Authenticator { private Authenticator() { } - static MastodonClient appRegistrationIfNeeded(final String instanceName, final String credentialFilePath, final boolean useStreaming) throws IOException, BigBoneRequestException, BigBoneClientInstantiationException { + static MastodonClient appRegistrationIfNeeded(final String instanceName, final String credentialFilePath, final boolean useStreaming) throws IOException, BigBoneRequestException { final File file = new File(credentialFilePath); if (!file.exists()) { System.out.println("create $credentialFilePath."); @@ -63,13 +62,13 @@ static MastodonClient appRegistrationIfNeeded(final String instanceName, final S return builder.build(); } - private static Token getAccessToken(final String instanceName, final String clientId, final String clientSecret, final String email, final String password) throws BigBoneRequestException, BigBoneClientInstantiationException { + private static Token getAccessToken(final String instanceName, final String clientId, final String clientSecret, final String email, final String password) throws BigBoneRequestException { final MastodonClient client = new MastodonClient.Builder(instanceName).build(); final OAuthMethods oauthMethods = new OAuthMethods(client); return oauthMethods.getUserAccessTokenWithPasswordGrant(clientId, clientSecret, REDIRECT_URI, email, password, new Scope()).execute(); } - private static Application application(final String instanceName) throws BigBoneRequestException, BigBoneClientInstantiationException { + private static Application application(final String instanceName) throws BigBoneRequestException { final MastodonClient client = new MastodonClient.Builder(instanceName).build(); return client.apps().createApp("bigbone-sample-app", REDIRECT_URI, null, new Scope()).execute(); } diff --git a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java index 12d6b3ac3..e3abe8d12 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetAppRegistration.java @@ -3,11 +3,10 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Scope; import social.bigbone.api.entity.Application; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetAppRegistration { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final MastodonClient client = new MastodonClient.Builder("mstdn.jp").build(); final Application application = client.apps().createApp( diff --git a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java index 9b3fa4e9b..733063c82 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetBookmarks.java @@ -3,11 +3,10 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetBookmarks { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java index d96326419..f61a5a58b 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetConversations.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetConversations.java @@ -3,11 +3,10 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Conversation; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetConversations { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java index cc00b87f5..a4aa60fec 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetDirectoryAccounts.java @@ -2,7 +2,6 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Account; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import social.bigbone.api.method.DirectoryMethods; @@ -11,7 +10,7 @@ import java.util.NoSuchElementException; public class GetDirectoryAccounts { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java index 462ef80a7..0c476e390 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetHomeTimelineWithFiltering.java @@ -4,14 +4,13 @@ import social.bigbone.api.Pageable; import social.bigbone.api.entity.Filter; import social.bigbone.api.entity.Status; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.concurrent.atomic.AtomicBoolean; public class GetHomeTimelineWithFiltering { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java index 4b7c6812b..1887ad162 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetInstanceInfo.java @@ -2,13 +2,12 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Instance; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; @SuppressWarnings("PMD.SystemPrintln") public class GetInstanceInfo { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client diff --git a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java index 11bb8d486..d8976271f 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetMarkers.java @@ -2,11 +2,10 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Markers; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetMarkers { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java index 561f34cf9..d18beab12 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetOEmbedMetadata.java @@ -2,12 +2,11 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.OEmbedMetadata; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class GetOEmbedMetadata { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String statusUrl = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java index b2b15446c..f9f696341 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetPublicTimeline.java @@ -3,13 +3,12 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetPublicTimeline { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client diff --git a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java index f171042c4..8b94a5c21 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetRawJson.java @@ -1,13 +1,12 @@ package social.bigbone.sample; import social.bigbone.MastodonClient; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetRawJson { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; // Instantiate client diff --git a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java index 913218863..bcf803623 100644 --- a/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/GetTagTimeline.java @@ -3,13 +3,12 @@ import social.bigbone.MastodonClient; import social.bigbone.api.Pageable; import social.bigbone.api.entity.Status; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import static social.bigbone.api.method.TimelineMethods.StatusOrigin.LOCAL_AND_REMOTE; public class GetTagTimeline { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String hashtag = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java index 90094d3d1..5b54b7832 100644 --- a/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java +++ b/sample-java/src/main/java/social/bigbone/sample/ManageFilters.java @@ -3,7 +3,6 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Filter; import social.bigbone.api.entity.FilterKeyword; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.Arrays; @@ -11,14 +10,14 @@ /** * The main method of this class accepts the following parameters: - * - <instance> <accessToken> list: list all existing filters for this account - * - <instance> <accessToken> create <keyword> create a new filter for the keyword - * - <instance> <accessToken> delete <filterId> delete the filter with this filterId - * - <instance> <accessToken> addKeyword <filterId> <filterId> add keyword to the filter with ID filterId + * - <instance> <accessToken> list: list all existing filters for this account + * - <instance> <accessToken> create <keyword> create a new filter for the keyword + * - <instance> <accessToken> delete <filterId> delete the filter with this filterId + * - <instance> <accessToken> addKeyword <filterId> <filterId> add keyword to the filter with ID filterId */ @SuppressWarnings("PMD.SystemPrintln") public class ManageFilters { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; final String action = args[2]; @@ -54,14 +53,14 @@ public static void main(final String[] args) throws BigBoneRequestException, Big */ private static void listExistingFilters(final MastodonClient client) throws BigBoneRequestException { final List existingFilters = client.filters().listFilters().execute(); - for (final Filter filter: existingFilters) { + for (final Filter filter : existingFilters) { System.out.println(filter.getTitle() + " (ID " + filter.getId() + "):"); System.out.print(filter.getFilterAction() + " in the following contexts: "); - for (final Filter.FilterContext context: filter.getContext()) { + for (final Filter.FilterContext context : filter.getContext()) { System.out.print(context + " "); } System.out.print("\nkeywords: "); - for (final FilterKeyword filterKeyword: filter.getKeywords()) { + for (final FilterKeyword filterKeyword : filter.getKeywords()) { System.out.print(filterKeyword.getKeyword() + " "); } System.out.println("\n-------------------------------------------------------"); @@ -72,7 +71,7 @@ private static void listExistingFilters(final MastodonClient client) throws BigB * Creates a new filter for the given keyword. This filter will expire automatically after an hour. * Similar functionality exists to update a given filter. * - * @param client a [MastodonClient] with an authenticated user + * @param client a [MastodonClient] with an authenticated user * @param keywordToFilter string that should be filtered by the new filter */ private static void createNewFilter(final MastodonClient client, final String keywordToFilter) throws BigBoneRequestException { @@ -102,7 +101,7 @@ private static void createNewFilter(final MastodonClient client, final String ke * Delete a filter with the given filter ID. * Similar functionality exists to view a given filter. * - * @param client a [MastodonClient] with an authenticated user + * @param client a [MastodonClient] with an authenticated user * @param filterId ID string for the filter that should be deleted */ private static void deleteFilter(final MastodonClient client, final String filterId) throws BigBoneRequestException { @@ -114,8 +113,8 @@ private static void deleteFilter(final MastodonClient client, final String filte * Add a keyword to an existing filter. * Similar functionality exists to view, delete or update individual keywords, or to list all keywords of a given filter. * - * @param client a [MastodonClient] with an authenticated user - * @param filterId ID string for the filter that should be edited + * @param client a [MastodonClient] with an authenticated user + * @param filterId ID string for the filter that should be edited * @param keywordToFilter string for a new keyword that should be filtered by the filter */ private static void addKeywordToFilter(final MastodonClient client, final String filterId, final String keywordToFilter) throws BigBoneRequestException { diff --git a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java index 8154efa46..724ba87a1 100644 --- a/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java +++ b/sample-java/src/main/java/social/bigbone/sample/OAuthGetAccessToken.java @@ -4,13 +4,12 @@ import social.bigbone.MastodonRequest; import social.bigbone.api.Scope; import social.bigbone.api.entity.Token; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.util.Scanner; public class OAuthGetAccessToken { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instanceName = args[0]; final String clientId = args[1]; final String clientSecret = args[2]; diff --git a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java index 84c7828f0..4ecde56b2 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java +++ b/sample-java/src/main/java/social/bigbone/sample/PerformSimpleSearch.java @@ -2,11 +2,10 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.Search; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class PerformSimpleSearch { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; final String searchTerm = args[2]; diff --git a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java index 60c027e40..679e49320 100644 --- a/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java +++ b/sample-java/src/main/java/social/bigbone/sample/PostStatusWithMediaAttached.java @@ -3,7 +3,6 @@ import social.bigbone.MastodonClient; import social.bigbone.api.entity.MediaAttachment; import social.bigbone.api.entity.data.Visibility; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; import java.io.File; @@ -11,7 +10,7 @@ import java.util.List; public class PostStatusWithMediaAttached { - public static void main(final String[] args) throws BigBoneRequestException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException { final String instance = args[0]; final String accessToken = args[1]; diff --git a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java index dbeb1bbb7..1011110bd 100644 --- a/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java +++ b/sample-java/src/main/java/social/bigbone/sample/StreamFederatedPublicTimeline.java @@ -6,11 +6,10 @@ import social.bigbone.api.Shutdownable; import social.bigbone.api.entity.Notification; import social.bigbone.api.entity.Status; -import social.bigbone.api.exception.BigBoneClientInstantiationException; import social.bigbone.api.exception.BigBoneRequestException; public class StreamFederatedPublicTimeline { - public static void main(final String[] args) throws BigBoneRequestException, InterruptedException, BigBoneClientInstantiationException { + public static void main(final String[] args) throws BigBoneRequestException, InterruptedException { final String instance = args[0]; final String accessToken = args[1];