Skip to content

Commit cf6abfb

Browse files
committed
EJBlock moshi parser
1 parent 8c2f482 commit cf6abfb

File tree

8 files changed

+224
-13
lines changed

8 files changed

+224
-13
lines changed

editorjskit/src/main/java/work/upstarts/editorjskit/models/EJBlock.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,47 @@ package work.upstarts.editorjskit.models
22

33
import work.upstarts.editorjskit.models.data.*
44

5-
abstract class EJBlock(
6-
open val type: EJAbstractBlockType,
7-
open val data: EJData
8-
)
5+
interface EJBlock{
6+
val type: EJAbstractBlockType
7+
val data: EJData
8+
}
99

1010
class EJCustomBlock(
1111
override val type: EJAbstractBlockType,
1212
override val data: EJData
13-
): EJBlock(type, data)
13+
): EJBlock
1414

1515
data class EJHeaderBlock(
1616
override val type: EJAbstractBlockType,
1717
override val data: EJHeaderData
18-
): EJBlock(type, data)
18+
): EJBlock
1919

2020
data class EJParagraphBlock(
2121
override val type: EJAbstractBlockType,
2222
override val data: EJParagraphData
23-
): EJBlock(type, data)
23+
): EJBlock
2424

2525
data class EJListBlock(
2626
override val type: EJAbstractBlockType,
2727
override val data: EJListData
28-
): EJBlock(type, data)
28+
): EJBlock
2929

3030
data class EJDelimiterBlock(
3131
override val type: EJAbstractBlockType,
3232
override val data: EJData
33-
): EJBlock(type, data)
33+
): EJBlock
3434

3535
data class EJImageBlock(
3636
override val type: EJAbstractBlockType,
3737
override val data: EJImageData
38-
): EJBlock(type, data)
38+
): EJBlock
3939

4040
data class EJRawHtmlBlock(
4141
override val type: EJAbstractBlockType,
4242
override val data: EJRawHtmlData
43-
): EJBlock(type, data)
44-
43+
): EJBlock
4544

4645
data class EJTableBlock(
4746
override val type: EJAbstractBlockType,
4847
override val data: EJTableData
49-
): EJBlock(type, data)
48+
): EJBlock

moshiparser/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

moshiparser/build.gradle

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
apply plugin: 'com.android.library'
2+
apply plugin: 'com.novoda.bintray-release'
3+
apply plugin: 'kotlin-android'
4+
5+
buildscript {
6+
repositories {
7+
mavenLocal()
8+
jcenter()
9+
}
10+
dependencies {
11+
classpath "com.novoda:bintray-release:${versions.novoda_bintray_plugin}"
12+
}
13+
}
14+
15+
android {
16+
compileSdkVersion versions.compileSdk
17+
18+
defaultConfig {
19+
minSdkVersion versions.minSdk
20+
targetSdkVersion versions.targetSdk
21+
versionCode 1
22+
versionName "1.0"
23+
24+
consumerProguardFiles 'consumer-rules.pro'
25+
}
26+
27+
buildTypes {
28+
release {
29+
minifyEnabled false
30+
}
31+
}
32+
33+
compileOptions {
34+
sourceCompatibility JavaVersion.VERSION_1_8
35+
targetCompatibility JavaVersion.VERSION_1_8
36+
}
37+
}
38+
39+
dependencies {
40+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}"
41+
42+
//Moshi
43+
implementation("com.squareup.moshi:moshi-kotlin:1.11.0")
44+
implementation "com.squareup.moshi:moshi-adapters:1.11.0"
45+
46+
api project(":editorjskit")
47+
testImplementation 'junit:junit:4.13.2'
48+
}
49+
50+
sourceCompatibility = "1.7"
51+
targetCompatibility = "1.7"
52+
53+
apply from: rootProject.file("gradle/publish.gradle")
54+
publish {
55+
repoName = 'EditorJSKit-Moshi'
56+
artifactId = 'ejkit-moshi'
57+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<manifest package="work.upstarts.moshiparser" />
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package work.upstarts.moshiparser
2+
3+
import com.squareup.moshi.FromJson
4+
import com.squareup.moshi.ToJson
5+
import work.upstarts.editorjskit.models.EJAbstractBlockType
6+
import work.upstarts.editorjskit.models.EJBlockType
7+
8+
class EJAbstractBlockTypeAdapter{
9+
@FromJson
10+
fun fromJson(type: String): EJAbstractBlockType {
11+
return EJBlockType.fromString(type)
12+
}
13+
14+
@ToJson
15+
fun toJson(type: EJAbstractBlockType): String {
16+
return type.jsonName
17+
}
18+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package work.upstarts.moshiparser
2+
3+
import com.squareup.moshi.*
4+
import work.upstarts.editorjskit.EJKit
5+
import work.upstarts.editorjskit.models.*
6+
import work.upstarts.editorjskit.models.data.*
7+
8+
class EJBlockAdapter(
9+
private val moshi: Moshi
10+
) {
11+
@FromJson
12+
fun fromJson(jsonData: Map<String, Any>): EJBlock? {
13+
val type = jsonData["type"].toString()
14+
val data = jsonData["data"] ?: throw IllegalStateException("Data cannot be null")
15+
try {
16+
return when (val ejBlockType = EJBlockType.fromString(type)) {
17+
EJBlockType.HEADER -> {
18+
EJHeaderBlock(
19+
ejBlockType,
20+
moshi.adapter(EJHeaderData::class.java).fromJsonValue(data)
21+
?: throw IllegalStateException("Cannot deserialize ${EJHeaderData::class.java.name}")
22+
)
23+
}
24+
EJBlockType.PARAGRAPH -> {
25+
EJParagraphBlock(
26+
ejBlockType,
27+
moshi.adapter(EJParagraphData::class.java).fromJsonValue(data)
28+
?: throw IllegalStateException("Cannot deserialize ${EJParagraphData::class.java.name}")
29+
)
30+
}
31+
EJBlockType.LIST -> {
32+
EJListBlock(
33+
ejBlockType,
34+
moshi.adapter(EJListData::class.java).fromJsonValue(data)
35+
?: throw IllegalStateException("Cannot deserialize ${EJListData::class.java.name}")
36+
)
37+
}
38+
EJBlockType.DELIMITER -> {
39+
EJDelimiterBlock(ejBlockType, EJDelimiterData())
40+
}
41+
EJBlockType.IMAGE -> {
42+
EJImageBlock(
43+
ejBlockType,
44+
moshi.adapter(EJImageData::class.java).fromJsonValue(data)
45+
?: throw IllegalStateException("Cannot deserialize ${EJImageData::class.java.name}")
46+
)
47+
}
48+
EJBlockType.TABLE -> {
49+
EJTableBlock(
50+
ejBlockType,
51+
moshi.adapter(EJTableData::class.java).fromJsonValue(data)
52+
?: throw IllegalStateException("Cannot deserialize ${EJTableData::class.java.name}")
53+
)
54+
}
55+
EJBlockType.RAW_HTML -> {
56+
EJRawHtmlBlock(
57+
ejBlockType,
58+
moshi.adapter(EJRawHtmlData::class.java).fromJsonValue(data)
59+
?: throw IllegalStateException("Cannot deserialize ${EJRawHtmlData::class.java.name}")
60+
)
61+
}
62+
}
63+
} catch (exception: IllegalArgumentException) {
64+
EJKit.getCustomBlocks().find { it.type.jsonName == type }?.let {
65+
val ejBlockData = moshi.adapter(it.data)
66+
.fromJsonValue(data) ?: throw IllegalStateException("Cannot deserialize ${it.data.name}")
67+
68+
return EJCustomBlock(
69+
it.type,
70+
ejBlockData
71+
)
72+
}
73+
74+
exception.printStackTrace()
75+
}
76+
77+
return null
78+
}
79+
80+
@ToJson
81+
fun toJson(block: EJBlock): String? {
82+
TODO("Not implemented")
83+
}
84+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package work.upstarts.moshiparser
2+
3+
import com.squareup.moshi.Moshi
4+
import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
5+
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
6+
import org.hamcrest.CoreMatchers.instanceOf
7+
import org.junit.Test
8+
import work.upstarts.editorjskit.models.EJBlock
9+
import work.upstarts.editorjskit.models.EJBlockType
10+
import work.upstarts.editorjskit.models.EJParagraphBlock
11+
12+
class EJBlockAdapterTest {
13+
14+
@Test
15+
fun fromJsonWithStandardPolymorphicAdapterSingleParagraph() {
16+
val moshi = Moshi.Builder()
17+
.add(EJAbstractBlockTypeAdapter())
18+
.add(
19+
PolymorphicJsonAdapterFactory.of(EJBlock::class.java, "type")
20+
.withSubtype(EJParagraphBlock::class.java, EJBlockType.PARAGRAPH.jsonName)
21+
)
22+
.add(KotlinJsonAdapterFactory())
23+
.build()
24+
25+
val result = moshi.adapter(EJBlock::class.java)
26+
.fromJson(singleParagraph)
27+
28+
instanceOf<EJParagraphBlock>(EJParagraphBlock::class.java).matches(result)
29+
}
30+
31+
@Test
32+
fun fromJsonWithEJBlockAdapterSingleParagraph() {
33+
val innerMoshi = Moshi.Builder()
34+
.add(KotlinJsonAdapterFactory())
35+
.build()
36+
37+
val moshi = Moshi.Builder()
38+
.add(EJBlockAdapter(innerMoshi))
39+
.build()
40+
41+
val result = moshi.adapter(EJBlock::class.java)
42+
.fromJson(singleParagraph)
43+
44+
instanceOf<EJParagraphBlock>(EJParagraphBlock::class.java).matches(result)
45+
}
46+
47+
companion object {
48+
const val singleParagraph = "{\"type\": \"paragraph\",\"data\": {\"text\": \"Lorem ipsum bla bla\" } }"
49+
}
50+
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
include ':app', ':editorjskit'
22
rootProject.name='EditorJSKitSample'
33
include ':gsonparser'
4+
include ':moshiparser'

0 commit comments

Comments
 (0)