Wrap Freshrss and Nextcloud News adapters code in a try/catch to throw ParseException

This commit is contained in:
Shinokuni 2020-10-25 12:49:19 +01:00
parent 39e613e7e6
commit 86c58b9280
6 changed files with 146 additions and 114 deletions

View File

@ -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<Feed> {
val feeds = mutableListOf<Feed>()
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")
}
}

View File

@ -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<Folder> {
val folders = mutableListOf<Folder>()
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 {

View File

@ -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<List<Item>>() {
val logger = TimingLogger(TAG, "item parsing")
val items = mutableListOf<Item>()
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<Item>) {
@ -127,7 +132,8 @@ class FreshRSSItemsAdapter : JsonAdapter<List<Item>>() {
}
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
}

View File

@ -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<Feed> {
val feeds = mutableListOf<Feed>()
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<Feed>) {

View File

@ -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<Folder> {
val folders = mutableListOf<Folder>()
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 {

View File

@ -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<List<Item>>() {
override fun fromJson(reader: JsonReader): List<Item> {
val items = mutableListOf<Item>()
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 {