Skip to content

Commit

Permalink
[Feature Parcelable]: Kotlin parcelable support added
Browse files Browse the repository at this point in the history
  • Loading branch information
robohorse committed Apr 25, 2020
1 parent 7c4224c commit 534f569
Show file tree
Hide file tree
Showing 34 changed files with 145 additions and 68 deletions.
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -9,32 +9,32 @@ Intellij Idea, Android Studio plugin for JSON to POJO conversion.
Generate Java and Kotlin POJO files from JSON: [GSON](https://github.com/google/gson), [AutoValue](https://github.com/google/auto/blob/master/value/userguide/index.md), [Logan Square](https://github.com/bluelinelabs/LoganSquare), [FastJSON](https://github.com/alibaba/fastjson), [Jackson](https://github.com/FasterXML/jackson), [Moshi](https://github.com/square/moshi), empty annotations template.
Supports: primitive types, multiple inner JSONArrays.

<p><img src="images/tutorial_v3.gif" width="100%" height="50%"></p>
<p><img src="images/tutorial_v201.gif" width="100%" height="50%"></p>


# Download
get it and install from <a href="https://plugins.jetbrains.com/plugin/8634">plugin repository</a> or simply find it in "Preferences" -> "Plugins" -> "Browse Repositories" -> "RoboPOJOGenerator"

<p><img src="images/install_v3.png" width="100%" height="70%"></p>
<p><img src="images/install_v201.png" width="100%" height="70%"></p>

# How to use

Select target package -> new -> Generate POJO from JSON

<p>
<img src="images/plugin_start_v4.png" height="300">
<img src="images/plugin_start_v201.png" height="300">
</p>

put JSON into window and select target POJO type

<p>
<img src="images/plugin_window_v4.png" height="300">
<img src="images/plugin_window_v201.png" height="300">
</p>

see log of changes

<p>
<img src="images/plugin_log_v3.png" height="200">
<img src="images/plugin_log_v201.png" height="200">
</p>

# People, who help
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -44,7 +44,7 @@ repositories {
}

group "com.robohorse.robopojogenerator"
version "2.0.1"
version "2.1.0"

intellij {
pluginName "RoboPOJOGenerator"
Expand Down
Binary file added images/install_v201.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed images/install_v3.png
Binary file not shown.
File renamed without changes
Binary file added images/plugin_start_v201.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed images/plugin_start_v4.png
Binary file not shown.
Binary file added images/plugin_window_v201.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed images/plugin_window_v4.png
Binary file not shown.
Binary file added images/tutorial_v201.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed images/tutorial_v3.gif
Binary file not shown.
Expand Up @@ -155,7 +155,7 @@
<scrollpane id="b86d3" binding="scrollPropertiesPanel">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false">
<minimum-size width="-1" height="70"/>
<minimum-size width="250" height="70"/>
</grid>
</constraints>
<properties/>
Expand Down
Expand Up @@ -9,7 +9,7 @@ import com.robohorse.robopojogenerator.models.GenerationModel
import com.robohorse.robopojogenerator.models.ProjectModel
import java.util.*

class KotlinFileWriterDelegate(
class KotlinSingleFileWriterDelegate(
messageDelegate: MessageDelegate,
factory: PostProcessorFactory,
fileWriterDelegate: FileWriterDelegate,
Expand Down Expand Up @@ -42,7 +42,7 @@ class KotlinFileWriterDelegate(
val classBody = kotlinDataClassPostProcessor.createClassItemText(
packagePath = projectModel.packageName,
classTemplate = rootClassBuilder.toString(),
imports = kotlinDataClassPostProcessor.proceedClassImports(imports).toString()
imports = kotlinDataClassPostProcessor.proceedClassImports(imports, generationModel).toString()
)
writeFile(
className = generationModel.rootClassName,
Expand All @@ -59,7 +59,7 @@ class KotlinFileWriterDelegate(
set.forEach { addAll(it.classImports) }
}
val universalClassItem = ClassItem()
kotlinDataClassPostProcessor.applyAnnotations(generationModel.annotationEnum, universalClassItem)
kotlinDataClassPostProcessor.applyAnnotations(generationModel, universalClassItem)
imports.addAll(universalClassItem.classImports)
return imports
}
Expand Down
Expand Up @@ -6,7 +6,7 @@ import com.robohorse.robopojogenerator.delegates.file.CommonFileWriterDelegate
import com.robohorse.robopojogenerator.delegates.GenerationDelegate
import com.robohorse.robopojogenerator.delegates.MessageDelegate
import com.robohorse.robopojogenerator.delegates.file.FileWriterDelegate
import com.robohorse.robopojogenerator.delegates.file.KotlinFileWriterDelegate
import com.robohorse.robopojogenerator.delegates.file.KotlinSingleFileWriterDelegate
import com.robohorse.robopojogenerator.generator.RoboPOJOGenerator
import com.robohorse.robopojogenerator.generator.consts.common.ClassCreator
import com.robohorse.robopojogenerator.generator.consts.common.FileWriteFactory
Expand Down Expand Up @@ -65,7 +65,7 @@ val appModule = module {
}

single {
KotlinFileWriterDelegate(get(), get(), get(), get())
KotlinSingleFileWriterDelegate(get(), get(), get(), get())
}

single {
Expand Down
Expand Up @@ -13,7 +13,6 @@ class ClassCreator(
generationModel: GenerationModel,
projectModel: ProjectModel
) = fileWriteFactory.createFileWriter(
generationModel,
projectModel
generationModel
).writeFiles(roboPOJOGenerator.generate(generationModel), generationModel, projectModel)
}
Expand Up @@ -2,20 +2,18 @@ package com.robohorse.robopojogenerator.generator.consts.common

import com.robohorse.robopojogenerator.delegates.file.BaseWriterDelegate
import com.robohorse.robopojogenerator.delegates.file.CommonFileWriterDelegate
import com.robohorse.robopojogenerator.delegates.file.KotlinFileWriterDelegate
import com.robohorse.robopojogenerator.delegates.file.KotlinSingleFileWriterDelegate
import com.robohorse.robopojogenerator.models.GenerationModel
import com.robohorse.robopojogenerator.models.ProjectModel

class FileWriteFactory(
private val commonFileWriterDelegate: CommonFileWriterDelegate,
private val kotlinFileWriterDelegate: KotlinFileWriterDelegate
private val kotlinSingleFileWriterDelegate: KotlinSingleFileWriterDelegate
) {

fun createFileWriter(generationModel: GenerationModel,
projectModel: ProjectModel
): BaseWriterDelegate =
if (generationModel.useKotlin) {
kotlinFileWriterDelegate
fun createFileWriter(generationModel: GenerationModel): BaseWriterDelegate =
if (generationModel.useKotlin && generationModel.useKotlinSingleDataClass) {
kotlinSingleFileWriterDelegate
} else {
commonFileWriterDelegate
}
Expand Down
Expand Up @@ -16,6 +16,10 @@ object ClassTemplate {
"(" + NEW_LINE +
"%2\$s" + NEW_LINE +
")"
const val CLASS_BODY_KOTLIN_DTO_PARCELABLE = "@Parcelize\ndata class %1\$s" +
"(" + NEW_LINE +
"%2\$s" + NEW_LINE +
") : Parcelable"
const val CLASS_BODY_ANNOTATED = "%1\$s" + NEW_LINE +
"%2\$s"
const val CLASS_ROOT_IMPORTS = ("package %1\$s;" + NEW_LINE + NEW_LINE +
Expand Down
Expand Up @@ -28,3 +28,6 @@ const val MOSHI_PROPERTY = "import com.squareup.moshi.Json;"
const val AUTO_VALUE = "import com.google.auto.value.AutoValue;"
const val TYPED_ADAPTER = "import com.google.gson.TypeAdapter;"
const val GSON_IMPORT = "import com.google.gson.Gson;"

const val PARCELABLE_ANDROID = "import android.os.Parcelable"
const val PARCELIZE_KOTLINX = "import kotlinx.android.parcel.Parcelize"
Expand Up @@ -5,7 +5,6 @@ import com.robohorse.robopojogenerator.generator.consts.templates.ClassTemplate
import com.robohorse.robopojogenerator.generator.utils.ClassGenerateHelper
import com.robohorse.robopojogenerator.generator.utils.ClassTemplateHelper
import com.robohorse.robopojogenerator.models.GenerationModel
import com.robohorse.robopojogenerator.view.FrameworkVW
import java.util.*

abstract class BasePostProcessor(
Expand All @@ -17,15 +16,19 @@ abstract class BasePostProcessor(
classItem: ClassItem,
generationModel: GenerationModel
): String {
applyAnnotations(generationModel.annotationEnum, classItem)
applyAnnotations(generationModel, classItem)
return proceedClass(classItem, generationModel)
}

abstract fun applyAnnotations(item: FrameworkVW, classItem: ClassItem)
abstract fun applyAnnotations(generationModel: GenerationModel, classItem: ClassItem)

abstract fun proceedClassBody(classItem: ClassItem, generationModel: GenerationModel): String?

abstract fun createClassTemplate(classItem: ClassItem, classBody: String?): String
abstract fun createClassTemplate(
classItem: ClassItem,
classBody: String?,
generationModel: GenerationModel
): String

private fun proceedClass(
classItem: ClassItem,
Expand All @@ -34,16 +37,19 @@ abstract class BasePostProcessor(
val classBody = generateHelper.updateClassBody(
proceedClassBody(classItem, generationModel)
)
val classTemplate = createClassTemplate(classItem, classBody)
val importsBuilder = proceedClassImports(classItem.classImports)
val classTemplate = createClassTemplate(classItem, classBody, generationModel)
val importsBuilder = proceedClassImports(classItem.classImports, generationModel)
return createClassItemText(
classItem.packagePath,
importsBuilder.toString(),
classTemplate
)
}

open fun proceedClassImports(imports: HashSet<String>): StringBuilder {
open fun proceedClassImports(
imports: HashSet<String>,
generationModel: GenerationModel
): StringBuilder {
val importsBuilder = StringBuilder()
for (importItem in imports) {
importsBuilder.append(importItem)
Expand Down
Expand Up @@ -36,6 +36,6 @@ class AutoValueClassPostProcessor(
}

override fun createClassTemplate(
classItem: ClassItem, classBody: String?
classItem: ClassItem, classBody: String?, generationModel: GenerationModel
) = classTemplateHelper.createClassBodyAbstract(classItem, classBody)
}
Expand Up @@ -60,6 +60,6 @@ class CommonJavaPostProcessor(
}

override fun createClassTemplate(
classItem: ClassItem, classBody: String?
classItem: ClassItem, classBody: String?, generationModel: GenerationModel
) = classTemplateHelper.createClassBody(classItem, classBody)
}
Expand Up @@ -6,7 +6,7 @@ import com.robohorse.robopojogenerator.generator.consts.templates.ImportsTemplat
import com.robohorse.robopojogenerator.generator.postrocessing.BasePostProcessor
import com.robohorse.robopojogenerator.generator.utils.ClassGenerateHelper
import com.robohorse.robopojogenerator.generator.utils.ClassTemplateHelper
import com.robohorse.robopojogenerator.view.FrameworkVW
import com.robohorse.robopojogenerator.models.GenerationModel
import com.robohorse.robopojogenerator.view.FrameworkVW.*

abstract class JavaPostProcessor(
Expand All @@ -15,10 +15,10 @@ abstract class JavaPostProcessor(
) : BasePostProcessor(generateHelper, classTemplateHelper) {

override fun applyAnnotations(
item: FrameworkVW,
generationModel: GenerationModel,
classItem: ClassItem
) {
when (item) {
when (generationModel.annotationEnum) {
is Gson -> {
generateHelper.setAnnotations(classItem,
PojoAnnotations.GSON.classAnnotation,
Expand Down
Expand Up @@ -4,12 +4,13 @@ import com.robohorse.robopojogenerator.generator.consts.annotations.KotlinAnnota
import com.robohorse.robopojogenerator.generator.consts.common.ClassItem
import com.robohorse.robopojogenerator.generator.consts.templates.ClassTemplate
import com.robohorse.robopojogenerator.generator.consts.templates.ImportsTemplate
import com.robohorse.robopojogenerator.generator.consts.templates.PARCELABLE_ANDROID
import com.robohorse.robopojogenerator.generator.consts.templates.PARCELIZE_KOTLINX
import com.robohorse.robopojogenerator.generator.postrocessing.BasePostProcessor
import com.robohorse.robopojogenerator.generator.utils.ClassGenerateHelper
import com.robohorse.robopojogenerator.generator.utils.ClassTemplateHelper
import com.robohorse.robopojogenerator.models.FieldModel
import com.robohorse.robopojogenerator.models.GenerationModel
import com.robohorse.robopojogenerator.view.FrameworkVW
import com.robohorse.robopojogenerator.view.FrameworkVW.*
import java.util.*

Expand All @@ -19,9 +20,13 @@ class KotlinDataClassPostProcessor(
) : BasePostProcessor(generateHelper, classTemplateHelper) {

override fun proceedClassImports(
imports: HashSet<String>
imports: HashSet<String>, generationModel: GenerationModel
): StringBuilder {
imports.remove(ImportsTemplate.LIST)
if (generationModel.useKotlinParcelable) {
imports.add(PARCELABLE_ANDROID)
imports.add(PARCELIZE_KOTLINX)
}
val importsBuilder = StringBuilder()
for (importItem in imports) {
importsBuilder.append(importItem.replace(";", ""))
Expand Down Expand Up @@ -54,8 +59,11 @@ class KotlinDataClassPostProcessor(
classTemplate)
}

override fun applyAnnotations(item: FrameworkVW, classItem: ClassItem) {
when (item) {
override fun applyAnnotations(
generationModel: GenerationModel,
classItem: ClassItem
) {
when (generationModel.annotationEnum) {
is Gson -> {
generateHelper.setAnnotations(classItem,
KotlinAnnotations.GSON.classAnnotation,
Expand Down Expand Up @@ -92,7 +100,13 @@ class KotlinDataClassPostProcessor(
}
}

override fun createClassTemplate(classItem: ClassItem, classBody: String?): String {
return classTemplateHelper.createClassBodyKotlinDataClass(classItem, classBody)
override fun createClassTemplate(
classItem: ClassItem, classBody: String?, generationModel: GenerationModel
): String {
return classTemplateHelper.createClassBodyKotlinDataClass(
classItem,
classBody,
generationModel.useKotlinParcelable
)
}
}
Expand Up @@ -88,12 +88,19 @@ class ClassTemplateHelper(
classBody
))

fun createClassBodyKotlinDataClass(classItem: ClassItem, classBody: String?) =
createClassBodyAnnotated(classItem, String.format(
ClassTemplate.CLASS_BODY_KOTLIN_DTO,
classItem.className,
classBody
))
fun createClassBodyKotlinDataClass(
classItem: ClassItem,
classBody: String?,
parcelable: Boolean = false
) = createClassBodyAnnotated(classItem, String.format(
if (parcelable) {
ClassTemplate.CLASS_BODY_KOTLIN_DTO_PARCELABLE
} else {
ClassTemplate.CLASS_BODY_KOTLIN_DTO
},
classItem.className,
classBody
))

fun createClassItem(
packagePath: String?,
Expand Down
Expand Up @@ -13,7 +13,9 @@ data class GenerationModel(
val content: String?,
val useSetters: Boolean,
val useGetters: Boolean,
val useStrings: Boolean
val useStrings: Boolean,
val useKotlinSingleDataClass: Boolean,
val useKotlinParcelable: Boolean
)

data class ProjectModel(
Expand Down
Expand Up @@ -106,9 +106,19 @@ sealed class AdditionalPropertiesVM(
selected: Boolean = false
) : AdditionalPropertiesVM(selected, TO_STRING)

class UseKotlinParcelable(
selected: Boolean = false
) : AdditionalPropertiesVM(selected, KOTLIN_PARCELABLE)

class UseKotlinSingleDataClass(
selected: Boolean = false
) : AdditionalPropertiesVM(selected, KOTLIN_SINGLE_DATA_CLASS)

companion object {
const val SETTERS = "use setters"
const val GETTERS = "use getters"
const val TO_STRING = "use to string"
const val SETTERS = "create setters"
const val GETTERS = "create getters"
const val TO_STRING = "override toString()"
const val KOTLIN_PARCELABLE = "parcelable (Android)"
const val KOTLIN_SINGLE_DATA_CLASS = "single data class"
}
}

0 comments on commit 534f569

Please sign in to comment.