From 86c58b9280f7bb1f5f087d260e544d1469135804 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 25 Oct 2020 12:49:19 +0100 Subject: [PATCH] Wrap Freshrss and Nextcloud News adapters code in a try/catch to throw ParseException --- .../freshrss/adapters/FreshRSSFeedsAdapter.kt | 50 ++++++++------ .../adapters/FreshRSSFoldersAdapter.kt | 57 +++++++++------- .../freshrss/adapters/FreshRSSItemsAdapter.kt | 28 +++++--- .../adapters/NextNewsFeedsAdapter.kt | 19 ++++-- .../adapters/NextNewsFoldersAdapter.kt | 39 ++++++----- .../adapters/NextNewsItemsAdapter.kt | 67 ++++++++++--------- 6 files changed, 146 insertions(+), 114 deletions(-) diff --git a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFeedsAdapter.kt b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFeedsAdapter.kt index e0c19853..365d7c71 100644 --- a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFeedsAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFeedsAdapter.kt @@ -1,6 +1,7 @@ package com.readrops.api.services.freshrss.adapters import android.annotation.SuppressLint +import com.readrops.api.utils.exceptions.ParseException import com.readrops.db.entities.Feed import com.squareup.moshi.FromJson import com.squareup.moshi.JsonReader @@ -16,36 +17,40 @@ class FreshRSSFeedsAdapter { fun fromJson(reader: JsonReader): List { val feeds = mutableListOf() - reader.beginObject() - reader.nextName() // "subscriptions", beginning of the feed array - reader.beginArray() - - while (reader.hasNext()) { + return try { reader.beginObject() + reader.nextName() // "subscriptions", beginning of the feed array + reader.beginArray() - val feed = Feed() while (reader.hasNext()) { - with(feed) { - when (reader.selectName(NAMES)) { - 0 -> name = reader.nextString() - 1 -> url = reader.nextString() - 2 -> siteUrl = reader.nextString() - 3 -> iconUrl = reader.nextString() - 4 -> remoteId = reader.nextString() - 5 -> remoteFolderId = getCategoryId(reader) - else -> reader.skipValue() + reader.beginObject() + + val feed = Feed() + while (reader.hasNext()) { + with(feed) { + when (reader.selectName(NAMES)) { + 0 -> name = reader.nextString() + 1 -> url = reader.nextString() + 2 -> siteUrl = reader.nextString() + 3 -> iconUrl = reader.nextString() + 4 -> remoteId = reader.nextString() + 5 -> remoteFolderId = getCategoryId(reader) + else -> reader.skipValue() + } } } + + feeds += feed + reader.endObject() } - feeds += feed + reader.endArray() reader.endObject() + + feeds + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endArray() - reader.endObject() - - return feeds } private fun getCategoryId(reader: JsonReader): String? { @@ -72,6 +77,7 @@ class FreshRSSFeedsAdapter { } companion object { - val NAMES: JsonReader.Options = JsonReader.Options.of("title", "url", "htmlUrl", "iconUrl", "id", "categories") + val NAMES: JsonReader.Options = JsonReader.Options.of("title", "url", "htmlUrl", + "iconUrl", "id", "categories") } } \ No newline at end of file diff --git a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFoldersAdapter.kt b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFoldersAdapter.kt index 8574f990..20c687c3 100644 --- a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFoldersAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSFoldersAdapter.kt @@ -1,6 +1,7 @@ package com.readrops.api.services.freshrss.adapters import android.annotation.SuppressLint +import com.readrops.api.utils.exceptions.ParseException import com.readrops.db.entities.Folder import com.squareup.moshi.FromJson import com.squareup.moshi.JsonReader @@ -17,42 +18,46 @@ class FreshRSSFoldersAdapter { fun fromJson(reader: JsonReader): List { val folders = mutableListOf() - reader.beginObject() - reader.nextName() // "tags", beginning of folder array - reader.beginArray() - - while (reader.hasNext()) { + return try { reader.beginObject() - - val folder = Folder() - var type: String? = null + reader.nextName() // "tags", beginning of folder array + reader.beginArray() while (reader.hasNext()) { - with(folder) { - when (reader.selectName(NAMES)) { - 0 -> { - val id = reader.nextString() - name = StringTokenizer(id, "/") - .toList() - .last() as String - remoteId = id + reader.beginObject() + + val folder = Folder() + var type: String? = null + + while (reader.hasNext()) { + with(folder) { + when (reader.selectName(NAMES)) { + 0 -> { + val id = reader.nextString() + name = StringTokenizer(id, "/") + .toList() + .last() as String + remoteId = id + } + 1 -> type = reader.nextString() + else -> reader.skipValue() } - 1 -> type = reader.nextString() - else -> reader.skipValue() } } + + if (type == "folder") // add only folders and avoid tags + folders += folder + + reader.endObject() } - if (type == "folder") // add only folders and avoid tags - folders += folder - + reader.endArray() reader.endObject() + + folders + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endArray() - reader.endObject() - - return folders } companion object { diff --git a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSItemsAdapter.kt b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSItemsAdapter.kt index f6ef5f95..bb89f88c 100644 --- a/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSItemsAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/freshrss/adapters/FreshRSSItemsAdapter.kt @@ -3,6 +3,7 @@ package com.readrops.api.services.freshrss.adapters import android.util.TimingLogger import com.readrops.db.entities.Item import com.readrops.api.services.freshrss.FreshRSSDataSource.GOOGLE_READ +import com.readrops.api.utils.exceptions.ParseException import com.squareup.moshi.JsonAdapter import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter @@ -19,17 +20,21 @@ class FreshRSSItemsAdapter : JsonAdapter>() { val logger = TimingLogger(TAG, "item parsing") val items = mutableListOf() - reader.beginObject() - while (reader.hasNext()) { - if (reader.nextName() == "items") parseItems(reader, items) else reader.skipValue() + return try { + reader.beginObject() + while (reader.hasNext()) { + if (reader.nextName() == "items") parseItems(reader, items) else reader.skipValue() + } + + reader.endObject() + + logger.addSplit("item parsing done") + logger.dumpToLog() + + items + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endObject() - - logger.addSplit("item parsing done") - logger.dumpToLog() - - return items } private fun parseItems(reader: JsonReader, items: MutableList) { @@ -127,7 +132,8 @@ class FreshRSSItemsAdapter : JsonAdapter>() { } companion object { - val NAMES: JsonReader.Options = JsonReader.Options.of("id", "published", "title", "summary", "alternate", "categories", "origin", "author") + val NAMES: JsonReader.Options = JsonReader.Options.of("id", "published", "title", + "summary", "alternate", "categories", "origin", "author") val TAG = FreshRSSItemsAdapter::class.java.simpleName } diff --git a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFeedsAdapter.kt b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFeedsAdapter.kt index ba1c34e0..d7720f75 100644 --- a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFeedsAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFeedsAdapter.kt @@ -1,6 +1,7 @@ package com.readrops.api.services.nextcloudnews.adapters import android.annotation.SuppressLint +import com.readrops.api.utils.exceptions.ParseException import com.readrops.db.entities.Feed import com.readrops.api.utils.extensions.nextNullableString import com.squareup.moshi.FromJson @@ -17,15 +18,19 @@ class NextNewsFeedsAdapter { fun fromJson(reader: JsonReader): List { val feeds = mutableListOf() - reader.beginObject() + return try { + reader.beginObject() - while (reader.hasNext()) { - if (reader.nextName() == "feeds") parseFeeds(reader, feeds) else reader.skipValue() + while (reader.hasNext()) { + if (reader.nextName() == "feeds") parseFeeds(reader, feeds) else reader.skipValue() + } + + reader.endObject() + + feeds + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endObject() - - return feeds } private fun parseFeeds(reader: JsonReader, feeds: MutableList) { diff --git a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFoldersAdapter.kt b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFoldersAdapter.kt index e3f70f7b..ceefc80a 100644 --- a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFoldersAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsFoldersAdapter.kt @@ -1,6 +1,7 @@ package com.readrops.api.services.nextcloudnews.adapters import android.annotation.SuppressLint +import com.readrops.api.utils.exceptions.ParseException import com.readrops.db.entities.Folder import com.squareup.moshi.FromJson import com.squareup.moshi.JsonReader @@ -16,32 +17,36 @@ class NextNewsFoldersAdapter { fun fromJson(reader: JsonReader): List { val folders = mutableListOf() - reader.beginObject() - reader.nextName() // "folders", beginning of folders array - reader.beginArray() - - while (reader.hasNext()) { - val folder = Folder() + return try { reader.beginObject() + reader.nextName() // "folders", beginning of folders array + reader.beginArray() while (reader.hasNext()) { - with(folder) { - when (reader.selectName(NAMES)) { - 0 -> remoteId = reader.nextInt().toString() - 1 -> name = reader.nextString() - else -> reader.skipValue() + val folder = Folder() + reader.beginObject() + + while (reader.hasNext()) { + with(folder) { + when (reader.selectName(NAMES)) { + 0 -> remoteId = reader.nextInt().toString() + 1 -> name = reader.nextString() + else -> reader.skipValue() + } } } + + folders += folder + reader.endObject() } - folders += folder + reader.endArray() reader.endObject() + + folders + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endArray() - reader.endObject() - - return folders } companion object { diff --git a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsItemsAdapter.kt b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsItemsAdapter.kt index 9599e2c3..25fdf91e 100644 --- a/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsItemsAdapter.kt +++ b/api/src/main/java/com/readrops/api/services/nextcloudnews/adapters/NextNewsItemsAdapter.kt @@ -3,6 +3,7 @@ package com.readrops.api.services.nextcloudnews.adapters import android.annotation.SuppressLint import com.readrops.db.entities.Item import com.readrops.api.utils.ApiUtils +import com.readrops.api.utils.exceptions.ParseException import com.readrops.api.utils.extensions.nextNullableString import com.squareup.moshi.JsonAdapter import com.squareup.moshi.JsonReader @@ -21,46 +22,50 @@ class NextNewsItemsAdapter : JsonAdapter>() { override fun fromJson(reader: JsonReader): List { val items = mutableListOf() - reader.beginObject() - reader.nextName() // "items", beginning of items array - reader.beginArray() - - while (reader.hasNext()) { - val item = Item() + return try { reader.beginObject() - - var enclosureMime: String? = null - var enclosureLink: String? = null + reader.nextName() // "items", beginning of items array + reader.beginArray() while (reader.hasNext()) { - with(item) { - when (reader.selectName(NAMES)) { - 0 -> remoteId = reader.nextInt().toString() - 1 -> link = reader.nextNullableString() - 2 -> title = reader.nextString() - 3 -> author = reader.nextString() - 4 -> pubDate = LocalDateTime(reader.nextLong() * 1000L, DateTimeZone.getDefault()) - 5 -> content = reader.nextString() - 6 -> enclosureMime = reader.nextNullableString() - 7 -> enclosureLink = reader.nextNullableString() - 8 -> feedRemoteId = reader.nextInt().toString() - 9 -> isRead = !reader.nextBoolean() - else -> reader.skipValue() + val item = Item() + reader.beginObject() + + var enclosureMime: String? = null + var enclosureLink: String? = null + + while (reader.hasNext()) { + with(item) { + when (reader.selectName(NAMES)) { + 0 -> remoteId = reader.nextInt().toString() + 1 -> link = reader.nextNullableString() + 2 -> title = reader.nextString() + 3 -> author = reader.nextString() + 4 -> pubDate = LocalDateTime(reader.nextLong() * 1000L, DateTimeZone.getDefault()) + 5 -> content = reader.nextString() + 6 -> enclosureMime = reader.nextNullableString() + 7 -> enclosureLink = reader.nextNullableString() + 8 -> feedRemoteId = reader.nextInt().toString() + 9 -> isRead = !reader.nextBoolean() + else -> reader.skipValue() + } } } + + if (enclosureMime != null && ApiUtils.isMimeImage(enclosureMime!!)) + item.imageLink = enclosureLink + + items += item + reader.endObject() } - if (enclosureMime != null && ApiUtils.isMimeImage(enclosureMime!!)) - item.imageLink = enclosureLink - - items += item + reader.endArray() reader.endObject() + + items + } catch (e: Exception) { + throw ParseException(e.message) } - - reader.endArray() - reader.endObject() - - return items } companion object {