Skip to content

Merge v1.3.2-dev into main #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
</div>
<br/>
<div align="center">
<img src="https://img.shields.io/badge/version-v1.3.1-blue">
<img src="https://img.shields.io/badge/version-v1.3.2-blue">
<img src="https://img.shields.io/badge/license-Apache%202-red">
<img src="https://img.shields.io/badge/size-600%20kB-yellowgreen">
<img src="https://img.shields.io/badge/downloads-3.1k-green">
<img src="https://img.shields.io/badge/size-3.96%20MB-yellowgreen">
<img src="https://img.shields.io/badge/download-3.2k-green">
</div>

JetBrains Intellij IDEA ObjectHelper 插件旨在减少开发者重复低效的劳动,使开发者能够更专注于业务逻辑的开发。
Expand All @@ -25,30 +25,36 @@ JetBrains Intellij IDEA ObjectHelper 插件旨在减少开发者重复低效的

- Java类转JSON

![](https://image.bigcoder.cn/20210227223302.gif)
![](https://image.bigcoder.cn/20231224171155.gif)

- Java类转Thrift IDL

![](https://image.bigcoder.cn/6eee7a02-8e4e-4f11-9b8c-81d661a920c5.gif)

- Java类转XML

![](https://image.bigcoder.cn/20220916170144.gif)
![](https://image.bigcoder.cn/20231224171113.gif)

- 插件配置

File->Settings->Tools->Object Helper 即可进入插件的配置页面

![](https://image.bigcoder.cn/20220916173227.png)
![](https://image.bigcoder.cn/20231224170305.png)

- `generate field mode = target` 代表以方法返回类型的字段为基础生成对象拷贝;
`generate field mode = source` 代表以方法入参类型的字段为基础生成对象拷贝。

- `non-existent field generate annotation = yes` 代表当目标字段在源对象中不存在时,是否以注释的形式生成代码,如果为 `no`,则代表不生成这一个字段拷贝代码。

## 未来功能支持计划

object-helper插件未来功能支持计划:

- [x] Class转IDL(Class To Thrift IDL)
- [x] Class转XML(Class To XML)
- [x] Class 转 IDL(Class To Thrift IDL)
- [x] Class 转 XML(Class To XML)
- [x] 个性化配置
- [ ] JSON转Class(JSON TO Class)
- [ ] Class转Protobuf IDL(JSON TO Class)
- [ ] Object Copy Method 功能支持 Lambda 表达式
- [ ] JSON 转 Class(JSON To Class)
- [ ] Class 转 Protobuf IDL(JSON To Class)
- [ ] All Setter
- [ ] 菜单分组显示
9 changes: 7 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,21 @@ plugins {
}

group 'cn.bigcoder.plugin'
version '1.3.1'
version '1.3.2'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.apache.commons:commons-lang3:3.13.0'
/ object 转 xml 依赖 开始/
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3'
/ object 转 xml 依赖 结束/
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
implementation 'org.apache.commons:commons-lang3:3.13.0'
}

// See https://github.com/JetBrains/gradle-intellij-plugin/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package cn.bigcoder.plugin.objecthelper.action;

import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;

/**
* @author: Jindong.Tian
* @date: 2023-12-24
**/
public abstract class AbstractClassAnAction extends AnAction {

/**
* 是否开启该功能
* @return true代表开启该功能,false表示关闭该功能
*/
public abstract boolean actionShow(AnActionEvent anActionEvent);

@Override
public void update(@NotNull AnActionEvent anActionEvent) {
if (!actionShow(anActionEvent)) {
setActionInvisible(anActionEvent);
}
super.update(anActionEvent);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
package cn.bigcoder.plugin.objecthelper.action;

import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum;
import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils;
import cn.bigcoder.plugin.objecthelper.config.PluginConfigState;
import cn.bigcoder.plugin.objecthelper.generator.Generator;
import cn.bigcoder.plugin.objecthelper.generator.json.ClassJsonGenerator;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ide.CopyPasteManager;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;

import java.awt.datatransfer.StringSelection;

import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass;
import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible;

public class ClassToJsonAction extends AnAction {
public class ClassToJsonAction extends AbstractClassAnAction {

@Override
public void actionPerformed(AnActionEvent anAction) {
Expand All @@ -31,14 +29,9 @@ public void actionPerformed(AnActionEvent anAction) {
}

@Override
public void update(@NotNull AnActionEvent anActionEvent) {
if (!PluginConfigState.getInstance().isJsonSwitch()) {
setActionInvisible(anActionEvent);
} else if (getOperatePsiClass(anActionEvent) == null) {
// 如果当前光标不在类名上,则不显示ConvertToJson组件
setActionInvisible(anActionEvent);
}
super.update(anActionEvent);
public boolean actionShow(AnActionEvent anActionEvent) {
return PluginConfigState.getInstance().getJsonSwitch() == FunctionSwitchEnum.OPEN
&& getOperatePsiClass(anActionEvent) != null;
}

protected Generator getGenerator(PsiClass psiClass) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package cn.bigcoder.plugin.objecthelper.action;

import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum;
import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils;
import cn.bigcoder.plugin.objecthelper.config.PluginConfigState;
import cn.bigcoder.plugin.objecthelper.generator.idl.ThriftIDLGenerator;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ide.CopyPasteManager;
import com.intellij.psi.PsiClass;
Expand All @@ -12,13 +12,12 @@
import java.awt.datatransfer.StringSelection;

import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass;
import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible;

/**
* @author: Jindong.Tian
* @date: 2021-08-21
**/
public class ClassToThriftIDLAction extends AnAction {
public class ClassToThriftIDLAction extends AbstractClassAnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
PsiClass psiClass = getOperatePsiClass(anActionEvent);
Expand All @@ -31,13 +30,8 @@ public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
}

@Override
public void update(@NotNull AnActionEvent anActionEvent) {
if (!PluginConfigState.getInstance().isThriftSwitch()) {
setActionInvisible(anActionEvent);
} else if (getOperatePsiClass(anActionEvent) == null) {
// 如果当前光标不在类名上,则不显示ConvertToJson组件
setActionInvisible(anActionEvent);
}
super.update(anActionEvent);
public boolean actionShow(@NotNull AnActionEvent anActionEvent) {
return PluginConfigState.getInstance().getThriftSwitch() == FunctionSwitchEnum.OPEN
&& getOperatePsiClass(anActionEvent) != null;
}
}
Original file line number Diff line number Diff line change
@@ -1,45 +1,37 @@
package cn.bigcoder.plugin.objecthelper.action;

import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum;
import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils;
import cn.bigcoder.plugin.objecthelper.config.PluginConfigState;
import cn.bigcoder.plugin.objecthelper.generator.Generator;
import cn.bigcoder.plugin.objecthelper.generator.json.ClassJsonGenerator;
import cn.bigcoder.plugin.objecthelper.generator.xml.ClassXMLGenerator;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ide.CopyPasteManager;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;

import groovy.json.StringEscapeUtils;
import java.awt.datatransfer.StringSelection;
import org.jetbrains.annotations.NotNull;

import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass;
import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible;

public class ClassToXMLAction extends AnAction {
public class ClassToXMLAction extends AbstractClassAnAction {

@Override
public void actionPerformed(AnActionEvent anAction) {
PsiClass psiClass = getOperatePsiClass(anAction);
if (psiClass == null) {
return;
}
String json = getGenerator(psiClass).generate();
CopyPasteManager.getInstance().setContents(new StringSelection(json));
NotificationUtils.notifyInfo(anAction.getProject(), "XML字符串成功置入剪贴板:<br>" + json);
String xmlStr = getGenerator(psiClass).generate();
CopyPasteManager.getInstance().setContents(new StringSelection(xmlStr));
NotificationUtils.notifyInfo(anAction.getProject(), "XML字符串成功置入剪贴板");
}

@Override
public void update(@NotNull AnActionEvent anActionEvent) {
if (!PluginConfigState.getInstance().isXmlSwitch()) {
setActionInvisible(anActionEvent);
} else if (getOperatePsiClass(anActionEvent) == null) {
// 如果当前光标不在类名上,则不显示ConvertToJson组件
setActionInvisible(anActionEvent);
}
super.update(anActionEvent);
public boolean actionShow(@NotNull AnActionEvent anActionEvent) {
return PluginConfigState.getInstance().getXmlSwitch() == FunctionSwitchEnum.OPEN
&& getOperatePsiClass(anActionEvent) != null;
}

protected Generator getGenerator(PsiClass psiClass) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
package cn.bigcoder.plugin.objecthelper.action;

import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum;
import cn.bigcoder.plugin.objecthelper.common.util.PsiUtils;
import cn.bigcoder.plugin.objecthelper.common.util.StringUtils;
import cn.bigcoder.plugin.objecthelper.config.PluginConfigState;
import cn.bigcoder.plugin.objecthelper.generator.Generator;
import cn.bigcoder.plugin.objecthelper.generator.method.ObjectCopyMethodGenerator;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiMethod;
import org.jetbrains.annotations.NotNull;

import static cn.bigcoder.plugin.objecthelper.common.constant.JavaKeyWord.VOID;
import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass;
import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible;

public class ObjectCopyMethodAction extends AnAction {
public class ObjectCopyMethodAction extends AbstractClassAnAction {

@Override
public void actionPerformed(AnActionEvent anActionEvent) {
Expand All @@ -27,14 +24,9 @@ public void actionPerformed(AnActionEvent anActionEvent) {
}

@Override
public void update(@NotNull AnActionEvent anActionEvent) {
if (!PluginConfigState.getInstance().isObjectCopySwitch()) {
PsiUtils.setActionDisabled(anActionEvent);
} else if (!check(PsiUtils.getCursorPsiMethod(anActionEvent))) {
// 如果当前光标不在方法中,则不显示Object Copy组件
PsiUtils.setActionDisabled(anActionEvent);
}
super.update(anActionEvent);
public boolean actionShow(AnActionEvent anActionEvent) {
return PluginConfigState.getInstance().getObjectCopySwitch() == FunctionSwitchEnum.OPEN
&& check(PsiUtils.getCursorPsiMethod(anActionEvent));
}

private void generateO2O(PsiMethod psiMethod) {
Expand Down Expand Up @@ -64,7 +56,7 @@ private void generateO2O(PsiMethod psiMethod) {
*/
private boolean check(PsiMethod psiMethod) {
if (psiMethod == null
|| PsiUtils.getPsiParameters(psiMethod).size() == 0
|| PsiUtils.getPsiParameters(psiMethod).isEmpty()
|| VOID.equals(PsiUtils.getMethodReturnClassName(psiMethod))) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ public class JavaClassName {
public static final String LOCAL_DATE_TYPE = "java.time.LocalDate";
public static final String LOCAL_DATE_TIME_TYPE = "java.time.LocalDateTime";
public static final String BIG_DECIMAL = "java.math.BigDecimal";
public static final String BASE_INT_TYPE = "int";
public static final String BASE_LONG_TYPE = "long";
public static final String BASE_SHORT_TYPE = "short";
public static final String BASE_BYTE_TYPE = "byte";
public static final String BASE_DOUBLE_TYPE = "double";
public static final String BASE_FLOAT_TYPE = "float";

public static final String COLLECTION_TYPE = "java.util.Collection";
public static final String MAP_TYPE = "java.util.Map";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package cn.bigcoder.plugin.objecthelper.common.enums;

/**
* @author: Jindong.Tian
* @date: 2023-12-24
* @description:
**/
public interface CommonEnum {

String getCode();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package cn.bigcoder.plugin.objecthelper.common.enums;

/**
* @author: Jindong.Tian
* @date: 2023-12-24
**/
public enum FieldGenerateModeEnum implements CommonEnum {
SOURCE("source"),
TARGET("target"),
;
private String code;

FieldGenerateModeEnum(String code) {
this.code = code;
}


public static FieldGenerateModeEnum nameOf(String modify) {
if (modify == null) {
return null;
}
for (FieldGenerateModeEnum item : values()) {
if (modify.equals(item.getCode())) {
return item;
}
}
return null;
}

@Override
public String getCode() {
return code;
}
}
Loading