Skip to content

Commit c942579

Browse files
committed
refactoring
1 parent 50e5529 commit c942579

30 files changed

+515
-384
lines changed

README.md

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
# JSONToKotlinClass
22
Intellij Idea, Android Studio plugin.
33

4-
Plugin generates Kotlin data classes from JSON text. It can find inner classes in nested JSON. You can disable undesirable fields in class, change field name and type and add Gson annotations.
4+
Plugin generates Kotlin data classes from JSON text. It can find inner classes in nested JSON. You can disable undesirable fields in class, change field name, set it type to optional, specify default value and add annotations for popular json libraries.
5+
6+
Features:
7+
8+
• json highlight and validation<br />
9+
• nested json parsing<br />
10+
• var/val support<br />
11+
• default value support<br />
12+
• generation to single file<br />
13+
• annotations for Gson, Moshi, Jackson<br />
514

615
# Download
716

@@ -10,5 +19,10 @@ You can install it from <a href="https://plugins.jetbrains.com/plugin/10054">plu
1019
# How to use
1120
Right click on package -> Generate class from JSON -> Copy json, type class name -> Check field names and types -> Generate
1221

13-
<img src="images/screen1.png" width="50%" height="50%"><img src="images/screen2.png" width="50%" height="50%"><img src="images/screen3.png" width="50%" height="50%">
22+
<img src="images/demo_gif.gif" width="100%" height="100%">
23+
24+
#License
25+
MIT License
26+
27+
Copyright (c) 2017 Mighty16
1428

images/demo_gif.gif

757 KB
Loading

src/com/mighty16/json/ClassFromJSONAction.java

+41-37
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package com.mighty16.json;
22

3-
import com.intellij.notification.*;
43
import com.intellij.openapi.actionSystem.*;
5-
import com.intellij.openapi.application.ApplicationManager;
64
import com.intellij.openapi.module.Module;
75
import com.intellij.openapi.project.Project;
8-
import com.intellij.openapi.project.ProjectManager;
96
import com.intellij.openapi.roots.ModuleRootManager;
10-
import com.intellij.openapi.ui.popup.Balloon;
11-
import com.intellij.openapi.ui.popup.JBPopupFactory;
7+
import com.intellij.openapi.ui.Messages;
128
import com.intellij.openapi.vfs.VirtualFile;
13-
import com.intellij.openapi.wm.StatusBar;
149
import com.intellij.pom.Navigatable;
1510
import com.intellij.psi.*;
11+
import com.intellij.psi.impl.file.PsiDirectoryFactory;
12+
import com.intellij.util.ui.UIUtil;
1613
import com.mighty16.json.annotations.*;
14+
import com.mighty16.json.core.AnnotationGenerator;
15+
import com.mighty16.json.core.FileSaver;
1716
import com.mighty16.json.generator.SingleFileGenerator;
18-
import com.mighty16.json.generator.SourceFilesGenerator;
17+
import com.mighty16.json.core.SourceFilesGenerator;
1918
import com.mighty16.json.generator.MultipleFilesGenerator;
19+
import com.mighty16.json.resolver.KotlinFileType;
2020
import com.mighty16.json.resolver.KotlinResolver;
21-
import com.mighty16.json.models.ClassModel;
22-
import com.mighty16.json.resolver.LanguageResolver;
21+
import com.mighty16.json.core.models.ClassModel;
22+
import com.mighty16.json.core.LanguageResolver;
2323
import com.mighty16.json.ui.JSONEditDialog;
2424
import com.mighty16.json.ui.ModelTableDialog;
25+
import com.mighty16.json.ui.NotificationsHelper;
26+
import com.mighty16.json.ui.TextResources;
2527

2628
import java.awt.*;
2729
import java.awt.event.ComponentAdapter;
@@ -33,19 +35,20 @@ public class ClassFromJSONAction extends AnAction implements JSONEditDialog.JSON
3335
private PsiDirectory directory;
3436
private Point lastDialogLocation;
3537
private LanguageResolver languageResolver;
36-
37-
private DataContext dataContext;
38+
private TextResources textResources;
3839

3940
public ClassFromJSONAction() {
40-
super("JSON Kotlin Models");
41+
super();
4142
}
4243

4344
@Override
4445
public void actionPerformed(AnActionEvent event) {
4546
languageResolver = new KotlinResolver();
47+
textResources = new TextResources();
48+
4649
Project project = event.getProject();
4750
if (project == null) return;
48-
dataContext = event.getDataContext();
51+
DataContext dataContext = event.getDataContext();
4952
final Module module = DataKeys.MODULE.getData(dataContext);
5053
if (module == null) return;
5154
final Navigatable navigatable = DataKeys.NAVIGATABLE.getData(dataContext);
@@ -63,7 +66,7 @@ public void actionPerformed(AnActionEvent event) {
6366
}
6467
}
6568

66-
JSONEditDialog dialog = new JSONEditDialog(this);
69+
JSONEditDialog dialog = new JSONEditDialog(this, textResources);
6770
dialog.addComponentListener(new ComponentAdapter() {
6871
public void componentMoved(ComponentEvent e) {
6972
lastDialogLocation = dialog.getLocation();
@@ -76,7 +79,7 @@ public void componentMoved(ComponentEvent e) {
7679

7780
@Override
7881
public void onJsonParsed(List<ClassModel> classDataList) {
79-
ModelTableDialog tableDialog = new ModelTableDialog(classDataList, languageResolver, this);
82+
ModelTableDialog tableDialog = new ModelTableDialog(classDataList, languageResolver, textResources, this);
8083
if (lastDialogLocation != null) {
8184
tableDialog.setLocation(lastDialogLocation);
8285
}
@@ -107,33 +110,34 @@ public void onModelsReady(List<ClassModel> data, String singleFileName, int anno
107110
annotations = new JacksonAnnotations();
108111
break;
109112
}
113+
114+
Project project = directory.getProject();
115+
PsiFileFactory factory = PsiFileFactory.getInstance(project);
116+
PsiDirectoryFactory directoryFactory = PsiDirectoryFactory.getInstance(directory.getProject());
117+
String packageName = directoryFactory.getQualifiedName(directory, true);
118+
119+
FileSaver fileSaver = new IDEFileSaver(factory, directory, KotlinFileType.INSTANCE);
120+
121+
fileSaver.setListener(fileName -> {
122+
int ok = Messages.showOkCancelDialog(
123+
textResources.getReplaceDialogMessage(fileName),
124+
textResources.getReplaceDialogTitle(),
125+
UIUtil.getQuestionIcon());
126+
return ok == 0;
127+
});
128+
110129
SourceFilesGenerator generator;
111130
if (singleFileName == null) {
112-
generator = new MultipleFilesGenerator(languageResolver, annotations);
131+
generator = new MultipleFilesGenerator(fileSaver, languageResolver, annotations);
113132
} else {
114-
generator = new SingleFileGenerator(languageResolver, annotations, singleFileName);
133+
generator = new SingleFileGenerator(singleFileName, languageResolver, annotations, fileSaver);
115134
}
116135

117-
generator.setListener(new SourceFilesGenerator.Listener() {
118-
@Override
119-
public void onFilesGenerated(int filesCount) {
120-
121-
String message = filesCount + " data "+ ((filesCount==1)?"class":"classes")+ " generated from JSON";
122-
123-
final NotificationGroup GROUP_DISPLAY_ID_INFO =
124-
new NotificationGroup("JSON to data class",
125-
NotificationDisplayType.BALLOON, true);
126-
127-
ApplicationManager.getApplication().invokeLater(new Runnable() {
128-
@Override
129-
public void run() {
130-
Notification notification = GROUP_DISPLAY_ID_INFO.createNotification(message, NotificationType.INFORMATION);
131-
Notifications.Bus.notify(notification, directory.getProject());
132-
}
133-
});
134-
}
135-
});
136+
generator.setListener(filesCount ->
137+
NotificationsHelper.showNotification(directory.getProject(),
138+
textResources.getGeneratedFilesMessage(filesCount))
139+
);
136140

137-
generator.generateFiles(directory, data);
141+
generator.generateFiles(packageName, data);
138142
}
139143
}
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.mighty16.json;
2+
3+
4+
import com.intellij.openapi.command.WriteCommandAction;
5+
import com.intellij.openapi.fileTypes.FileType;
6+
import com.intellij.psi.PsiDirectory;
7+
import com.intellij.psi.PsiFile;
8+
import com.intellij.psi.PsiFileFactory;
9+
import com.mighty16.json.core.FileSaver;
10+
11+
public class IDEFileSaver extends FileSaver {
12+
13+
private PsiDirectory directory;
14+
private PsiFileFactory factory;
15+
private FileType fileType;
16+
17+
public IDEFileSaver(PsiFileFactory factory, PsiDirectory directory, FileType fileType) {
18+
this.directory = directory;
19+
this.factory = factory;
20+
this.fileType = fileType;
21+
}
22+
23+
@Override
24+
public void saveFile(String fileName, String fileContent) {
25+
PsiFile classFile = factory.createFileFromText(fileName, fileType, fileContent);
26+
PsiFile oldFile = directory.findFile(fileName);
27+
28+
if (oldFile != null) {
29+
30+
if (listener != null && listener.shouldOverwriteFile(fileName)) {
31+
WriteCommandAction.runWriteCommandAction(directory.getProject(), () -> {
32+
oldFile.delete();
33+
directory.add(classFile);
34+
});
35+
}
36+
} else {
37+
WriteCommandAction.runWriteCommandAction(directory.getProject(), () -> {
38+
directory.add(classFile);
39+
});
40+
}
41+
42+
}
43+
}

src/com/mighty16/json/annotations/FastJsonAnnotation.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mighty16.json.annotations;
22

33

4+
import com.mighty16.json.core.AnnotationGenerator;
5+
46
public class FastJsonAnnotation implements AnnotationGenerator {
57

68

src/com/mighty16/json/annotations/GsonAnnotations.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mighty16.json.annotations;
22

33

4+
import com.mighty16.json.core.AnnotationGenerator;
5+
46
public class GsonAnnotations implements AnnotationGenerator {
57

68

src/com/mighty16/json/annotations/JacksonAnnotations.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mighty16.json.annotations;
22

33

4+
import com.mighty16.json.core.AnnotationGenerator;
5+
46
public class JacksonAnnotations implements AnnotationGenerator {
57
@Override
68
public String getSerializeName(String jsonKey) {

src/com/mighty16/json/annotations/MoshiAnnotations.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mighty16.json.annotations;
22

33

4+
import com.mighty16.json.core.AnnotationGenerator;
5+
46
public class MoshiAnnotations implements AnnotationGenerator {
57

68

src/com/mighty16/json/annotations/AnnotationGenerator.java renamed to src/com/mighty16/json/core/AnnotationGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mighty16.json.annotations;
1+
package com.mighty16.json.core;
22

33

44
public interface AnnotationGenerator {
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.mighty16.json.core;
2+
3+
4+
public abstract class FileSaver {
5+
6+
protected Listener listener;
7+
8+
public abstract void saveFile(String fileName, String fileContent);
9+
10+
public void setListener(Listener listener) {
11+
this.listener = listener;
12+
}
13+
14+
public interface Listener {
15+
boolean shouldOverwriteFile(String fileName);
16+
}
17+
18+
}

src/com/mighty16/json/resolver/LanguageResolver.java renamed to src/com/mighty16/json/core/LanguageResolver.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package com.mighty16.json.resolver;
1+
package com.mighty16.json.core;
22

3-
import com.intellij.openapi.fileTypes.FileType;
4-
import com.mighty16.json.models.FieldModel;
3+
import com.mighty16.json.core.models.FieldModel;
54

65
public abstract class LanguageResolver {
76

@@ -21,6 +20,12 @@ public abstract class LanguageResolver {
2120

2221
public abstract String getArrayType(String type);
2322

23+
public abstract String getArrayOriginalValue();
24+
25+
public abstract String getObjectOriginalValue();
26+
27+
public abstract String getArrayItemOriginalValue(String type);
28+
2429
public abstract String getModifier(boolean mutable);
2530

2631
public abstract String getFieldTypeAndValue(FieldModel field);
@@ -29,8 +34,6 @@ public abstract class LanguageResolver {
2934

3035
public abstract String getFileName(String className);
3136

32-
public abstract FileType getFileType();
33-
3437
public int getNoCharPosition(String name) {
3538
char[] chars = name.toCharArray();
3639
int pos = 0;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.mighty16.json.core;
2+
3+
import com.mighty16.json.core.models.ClassModel;
4+
import com.mighty16.json.core.models.FieldModel;
5+
import java.util.List;
6+
7+
public abstract class SourceFilesGenerator {
8+
9+
protected LanguageResolver resolver;
10+
protected AnnotationGenerator annotations;
11+
protected FileSaver fileSaver;
12+
protected Listener listener;
13+
14+
public SourceFilesGenerator(LanguageResolver resolver, AnnotationGenerator annotations,FileSaver fileSaver) {
15+
this.resolver = resolver;
16+
this.annotations = annotations;
17+
this.fileSaver = fileSaver;
18+
}
19+
20+
public void setListener(Listener listener) {
21+
this.listener = listener;
22+
}
23+
24+
public abstract void generateFiles(String packageName, List<ClassModel> classDataList);
25+
26+
public interface Listener {
27+
void onFilesGenerated(int filesCount);
28+
}
29+
}

src/com/mighty16/json/models/ClassModel.java renamed to src/com/mighty16/json/core/models/ClassModel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mighty16.json.models;
1+
package com.mighty16.json.core.models;
22

33
import java.util.ArrayList;
44
import java.util.List;

src/com/mighty16/json/models/FieldModel.java renamed to src/com/mighty16/json/core/models/FieldModel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mighty16.json.models;
1+
package com.mighty16.json.core.models;
22

33
public class FieldModel {
44

src/com/mighty16/json/parser/JsonParser.java renamed to src/com/mighty16/json/core/parser/JsonParser.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package com.mighty16.json.parser;
1+
package com.mighty16.json.core.parser;
22

33

4-
import com.mighty16.json.resolver.LanguageResolver;
5-
import com.mighty16.json.models.ClassModel;
4+
import com.mighty16.json.core.LanguageResolver;
5+
import com.mighty16.json.core.models.ClassModel;
66
import org.json.JSONObject;
77
import java.util.List;
88

0 commit comments

Comments
 (0)