IDEA插件开发.02之“异味”代码收集插件

news2024/11/6 3:00:11
  1. 前言

许久没更新IDEA插件开发系列了。最近刚好在汇总日常开发中常见的代码“异味”,共享文档复制黏贴略显麻烦,所以想着是否可以搞一个IDEA插件来帮忙收集常见代码,毕竟IDEA作为后端程序员必备的开发工具,显然会方便很多。

于是,说干就干......

  1. 制定需求

功能需求大概包含如下:

  1. 选择“异味”代码,鼠标右键点击添加该代码片段;

  1. 添加代码片段,弹出信息添加弹窗,基本信息包含:代码标题简述,修改建议;

  1. 将添加的代码片段进行数据集中管理(存储);

  1. 添加消息推送功能;

  1. 开撸

  1. 新建工程bugs-collect

  1. 配置plugin.xml

配置中提前配置了插件详细信息,以及插件对应的行为。

下面的配置信息可以用devkit插件生成,描述了该插件功能添加的位置,菜单等等。

<action id="BugsCollectPluginId" class="com.shamee.plugins.bugscollect.action.EditorBugsPopupAction"
                text="添加Bug代码" description="右击添加该选中代码记录bug系统">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
            <keyboard-shortcut keymap="$default" first-keystroke="alt B"/>
        </action>

下面为完整配置:

<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
    <id>com.shamee.ide.plugins.bug-collect</id>

    <name>BugsCollect</name>

    <vendor email="xxxxx" url="https://xxxxxx">shamee</vendor>

    <description>
        <![CDATA[
            Common odor codes can be added to the bug collection system with the right mouse button
          ]]>
    </description>

    <depends>com.intellij.modules.platform</depends>

    <extensions defaultExtensionNs="com.intellij">

    </extensions>

    <actions>
        <!-- Add your actions here -->
        <action id="BugsCollectPluginId" class="com.shamee.plugins.bugscollect.action.EditorBugsPopupAction"
                text="添加Bug代码" description="右击添加该选中代码记录bug系统">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
            <keyboard-shortcut keymap="$default" first-keystroke="alt B"/>
        </action>
    </actions>
</idea-plugin>
  1. 设置获取选中代码片段行为类

EditorBugsPopupAction继承了AnAction,并重写actionPerformed方法。作用是获取idea编辑界面选中的文本内容,并且打开信息填写对话框。

public class EditorBugsPopupAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        // 获取到idea编辑界面实例
        Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        // 获取编辑实例选择模式
        SelectionModel selectionModel = editor.getSelectionModel();
        // 获取选中文本信息
        String selectedText = selectionModel.getSelectedText();
        // 设置数据中心数据
        DataCenter.SELECT_CODE = selectedText;
        // 开启弹窗
        new BugCollectDialog().show();

    }
}
  1. 新建BugCollectDialog,用于填写异味代码详细信息

BugCollectDialog为代码信息填写的对话框。该对话框绘制了标题填写栏editorTextFieldTitle,建议填写栏editorTextFieldSuggest,以及按钮组件addButton。使用jpanel绘制弹窗布局。

public class BugCollectDialog extends DialogWrapper {

    private static final Logger logger = LoggerFactory.getLogger(BugCollectDialog.class);

    private EditorTextField editorTextFieldTitle;

    private EditorTextField editorTextFieldSuggest;

    public BugCollectDialog() {
        super(true);
        init();
        setTitle("添加Bug代码片段信息");
    }

    @Override
    protected @Nullable
    JComponent createCenterPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        editorTextFieldTitle = new EditorTextField("异味代码描述");
        editorTextFieldSuggest = new EditorTextField("异味代码修改建议");
        editorTextFieldSuggest.setPreferredSize(new Dimension(300, 200));
        panel.add(editorTextFieldTitle, BorderLayout.NORTH);
        panel.add(editorTextFieldSuggest, BorderLayout.CENTER);
        return panel;
    }

    @Override
    protected JComponent createSouthPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        JButton addButton = new JButton("添加到异味代码列表");
        // 按钮点击事件
        addButton.addActionListener(e -> {
            
        });
        panel.add(addButton);
        return panel;
    }
  1. 添加按钮监听

BugCollectDialog底部按钮添加事件监听。当填写完代码信息后点击该按钮,将详细信息,代码片段统一入库。

// 按钮点击事件
        addButton.addActionListener(e -> {
            // 获取标题
            String title = editorTextFieldTitle.getText();
            // 获取建议
            String suggest = editorTextFieldSuggest.getText();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = sdf.format(new Date());
            String sql = "INSERT INTO `bugs-collect`.`bugs-collect-info` (title, suggest, code, create_date) VALUES('" + title + "', '" + suggest + "', '" + DataCenter.SELECT_CODE + "', '" + date + "');";
            Connection connection = null;
            Statement statement = null;
            try {
                connection = JdbcQuery.getConnection();
                statement = JdbcQuery.getStatement(connection);
                statement.executeUpdate(sql);



            } catch (SQLException ex) {
                logger.error(ex.getMessage(), ex);
                throw new RuntimeException(ex);
            } finally {
                JdbcQuery.relase(connection, statement, null);
            }

            MessageDialogBuilder.yesNo("操作结果", "添加成功").show();
            BugCollectDialog.this.dispose();
        });
  1. 数据库操作工具类

public class JdbcQuery {

    static {
        try {
            Class.forName(JdbcConstants.JDBC_DRIVER);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取链接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(JdbcConstants.JDBC_URL, JdbcConstants.JDBC_USERNAME, JdbcConstants.JDBC_PASSWORD);
    }

    public static Statement getStatement(Connection con) throws SQLException {
        return con.createStatement();
    }

    //释放连接资源
    public static void relase(Connection co, Statement st, ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (co != null) {
            try {
                co.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }
}
  1. 调试看效果

选中代码右键,可以看到“添加Bug代码”功能已添加:

点击添加Bug代码:

点击添加到异味代码列表,提示操作成功:

看一眼数据库数据:

  1. 待处理列表

数据统一收集后,便可以进行数据的分发推送操作处理。

  1. 代码推送管理;

  1. 每次添加都直接入库,看不到添加的效果;

  1. ......

  1. Gradle打包

点击Tasks -> intellij -> buildPlugin。

控制台提示打包完成后,查看工程build-> distributions下,已经生成了该插件压缩包。

  1. 安装试用

File -> Settings -> Plugins。

选择刚打包好的zip就可以直接安装使用啦。

Nice...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32开发(七)STM32F103 显示 —— 数码管显示 详解

文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示一、基础知识点 了解 TM1620芯片手册 。本实验是基于STM32F103开发 通过GPIO模拟时序 实现TM1620数码管显示。 准备好了吗&#xff1f;开始我的show time。 二、开发环境 1、硬件开…

flink sql (jdbc)如何支持where 条件下推数据库

背景 最近在使用 flink sql &#xff08;jdbc&#xff09;做离线数据同步&#xff08;历史数据修复&#xff09;&#xff0c;遇到一个问题&#xff0c;只同步几条数据的情况下&#xff0c;测试环境执行竟然需要30分钟。 进一步研究&#xff0c;发现where条件没有下推到数据库…

项目心得--网约车

一、RESTFULPost&#xff1a;新增Put&#xff1a;全量修改Patch&#xff1a;修改某个值Delete: 删除Get&#xff1a;查询删除接口也可以用POST请求url注意&#xff1a;url中不要带有敏感词&#xff08;用户id等&#xff09;url中的名词用复数形式url设计&#xff1a;api.xxx.co…

分形(Fractal)及分形维数(Fractal dimension)

文章目录1. 分形介绍2. 分形的定义3. 分形维数介绍4. 历史5. 缩放的作用&#xff08;Role of scaling&#xff09;6. D 不是唯一描述符7. 分形表面结构8. 例子8.8 Hausdorff dimension8.8.1 直观概念8.8.2 正式定义8.8.2.1 Hausdorff dimension8.8.2.2 Hausdorff content8.8.3 …

C++ 实现一个反射类

代码环境为VScode CMake GCC 8.1.0 首先&#xff0c;如何才能做到给我一个名字我就能拿到这个对象的这个值&#xff0c;也是比较难的一个地方&#xff0c;方法如下 #define OFFSET(className,fieldName) (size_t)&(((className*)0)->fieldName)这个能够得到该成员变…

数据结构3——线性表2:线性表的顺序结构

顺序结构的基本理解 定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻&#xff08;占用一片连续的存储单元&#xff0c;中间不能空出来&#xff09;的存储单元的存储结构 存储位置计算&#xff1a; LOC(a(i1))LOC(a(i))lLOC(a(i1))LOC(a(i))l LOC(a(i1))LOC(a(i))l L…

【pyqt】win10下使用pycharm安装并配置pyqt环境,并用其进行界面绘制

目录1.PyQt简介2.PyQt安装2.PyQt中界面绘制工具集在pycharm中的配置2.主程序引入生成的界面类1.PyQt简介 PyQt是一个基于Python语言的开源图形用户界面&#xff08;GUI&#xff09;框架&#xff0c;它是Qt跨平台应用程序框架的Python绑定&#xff0c;可以用于创建各种不同类型…

js 拷贝

一、浅拷贝 对数据拷贝的时候只拷贝一层&#xff0c;深层次的只拷贝了地址 1. &#xff08;1&#xff09;对于数组类型&#xff0c;可以使用slice(start, end)方法&#xff0c;返回一个新的数组。 var arr1 arr.slice(0); &#xff08;备注&#xff1a;slice 方法一直复制到…

(Fabric 超级账本学习【2】)Fabric2.4环境下部署自己编写的链码

&#xff08;Fabric 超级账本学习【2】&#xff09;Fabric2.4环境下部署自己编写的链码 1、前提是搭建好了Fabric 2.4&#xff08;Fabric2.x&#xff09;版本的区块链网络&#xff0c;并在以此环境下部署自己编写的链码&#xff0c;如下图先进入 test-network 文件夹目录下 2、…

23年PMP考试,应试技巧二十五条(含资料)

1.一定要认真阅读答案的全部四个选项。 千万不要看到某个选项是正确的&#xff0c;就不看其他选项&#xff0c;因为可能还有更正确的选项。PMP考的是选项的相对正确程度&#xff0c;而不是绝对正确程度&#xff0c;这与英语水平考试截然不同。可能四个选项都是正确或错误的&am…

Linux进程间通信详解(最全)

进程间的五种通信方式介绍 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。IPC的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享内存、Socket&#xff08;套接字&a…

项目实战典型案例20——内存长期占用导致系统慢

内存长期占用导致系统慢一&#xff1a;背景介绍出现的问题二&#xff1a;思路&方案下面是对于这三个原因的解决方案1.服务启动时分配的堆内存过小2. 具有大量大对象被创建&#xff0c;并且没有及时被GC回收或者由于具有引用GC无法回收3.当GC之后&#xff0c;虽然会清理堆内…

再获认可!腾讯安全NDR获Forrester权威推荐

近日&#xff0c;国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》&#xff08;以下简称“NAV报告”&#xff09;&#xff0c;从网络分析和可视化&#xff08;NAV&#xff09;厂商规模、产品功能、市场占有率及重点案例等…

LeetCode刷题——回溯法

文章目录[中等]全排列[中等]全排列 II[中等]组合总和[中等]组合总和 II[中等]复原 IP 地址[中等]括号生成[中等]子集[中等]单词搜索[中等]组合[中等]全排列 原题链接题解 class Solution { public:vector<vector<int>> ans;vector<int> num;int flag[10];v…

三天吃透消息队列面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

OSPF路由协议总结

OSPF路由协议总结一 OSPF协议的三个工作步骤二 5中OSPF协议报文三 4种网络类型&#xff0c;邻居和邻接3.1 P2P3.2 P2MP3.3 Broadcase3.4 NBMA&#xff08;非广播多路访问&#xff09;四 OSPF协议的度量方式五 LS&#xff08;链路状态&#xff09; LSA&#xff08;链路状态通告&…

JMU软件20 大数据技术复习(只写了对比18提纲的变动部分)

原博主 博客主页&#xff1a;https://xiaojujiang.blog.csdn.net/ 原博客链接&#xff1a;https://blog.csdn.net/qq_43058685/article/details/117883940 本复习提纲只适用于JMU软件工程大数据课程&#xff08;ckm授课&#xff09; 具体内容参考老师提纲的考纲&#xff0c;18和…

使用Tensorflow完成一个简单的手写数字识别

Tensorflow中文手册 介绍TensorFlow_w3cschool 模型结构图&#xff1a; 首先明确模型的输入及输出&#xff08;先不考虑batch&#xff09; 输入&#xff1a;一张手写数字图&#xff08;28x28x1像素矩阵&#xff09; 1是通道数 输出&#xff1a;预测的数字&#xff08;1x10的one…

100种思维模型之信息传递思维模型-028

人与人之间存有 认知偏差和理解偏差 &#xff0c;信息在传递过程中会 衰减、失真以及再加工 &#xff01; 信息传递思维模型 &#xff0c;一个有助于 提高信息传递质量 的思维模型。下面从三个方面进行介绍&#xff0c; 何谓信息传递思维模型、信息传递思模型生活中的运…

JVM系统优化实践(9):G1垃圾回收器

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;在JDK8及其之前&#xff0c;一直用的都是ParNewCMS的组合&#xff1a;ParNew负责年轻代的垃圾回收&#xff0c;而由CMS负责老年代的垃圾回收&#xff0c;但会产生…