工具思维-IDE的辅助plugin
前言
在带团队的时候,不止一次跟团队强调做技术要有从编码思维-工具思维-产品思维的上升意识,不要只做基础的编码实现。
本文也算抛砖引玉,介绍下在系统演进过程复用IDE的plugin机制实现的辅助小工具,解决一系列组件在运维测试过程中的痛点问题。
一、IDE插件开发
针对IDE的插件开发实现,模式相对来说较为简单,在IDE已经集成,直接创建插件工程。
生成后plugin.xml文件需要修改:
<idea-plugin>
<!-- 插件唯一id,不能和其他插件项目重复,所以推荐使用com.xxx.xxx的格式;插件不同版本之间不能更改,若没有指定,则与插件名称相同 -->
<id>com.your.company.unique.plugin.id</id>
<!-- 插件名称,别人在官方插件库搜索你的插件时使用的名称 -->
<name>PoisonChickenSoup</name>
<!-- 插件版本号 -->
<version>1.0</version>
<!-- 供应商主页和email(不能使用默认值,必须修改成自己的)-->
<vendor email="xxxxx@sina.com" url="http://www.zzz.com">Zte</vendor>
<!-- 插件的描述 (不能使用默认值,必须修改成自己的。并且需要大于40个字符)-->
<description><![CDATA[
This plugin tools just for URM debug located assist
]]></description>
<!-- 插件版本变更信息,支持HTML标签;
将展示在 settings | Plugins 对话框和插件仓库的Web页面 -->
<change-notes><![CDATA[
TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST
]]>
</change-notes>
<!-- 插件兼容IDEAbuild 号-->
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="173.0"/>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- 插件所依赖的其他插件的id -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
<extensions defaultExtensionNs="com.intellij">
<!-- 声明该插件对IDEA core或其他插件的扩展 -->
<!-- Add your extensions here -->
<toolWindow id="XXXXX"
secondary="true"
anchor="right" factoryClass="com.xxx.NoteListWindowFactory"
icon="/a1.png">
</toolWindow>
</extensions>
<application-components>
<component>
<implementation-class>com.xxxxx.pcs.dialog.TuantAppComponent</implementation-class>
</component>
</application-components>
<!-- 编写插件动作 -->
<actions>
<!-- Add your actions here -->
</actions>
</idea-plugin>
相关标签解释可以参考中文注释。
二、主体功能展示
以要实现的一个功能为例,该功能主要是针对波长信息进行解析,由于在数据库中波长信息是一个byte数组,而具体波长每一位被谁占用,哪一位空间,人工是无法一眼计算出来的,而这部分数据又是十分关键的数据,直接影响业务创建是否正常,所以在判断是否出现资源信息不一致性,则需要借助工具解析后,进行判断。
如数据库中定义的为:
AQICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
最终的占用明细如下,其中192个波,3个波被占用,剩余189个波;占用信息一目了然
{
"num0Count": 0,
"num2Count": 3,
"totalCount": 192,
"output": "122211111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
"num1Count": 189
}
最终的工具展示信息显示,通过侧边栏的方式,嵌入到IDE中
三、主体功能开发
1、创建NoteListWindowFactory
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowFactory;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import org.jetbrains.annotations.NotNull;
public class NoteListWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
//创建出NoteListWindow对象
NoteListWindow noteListWindow = new NoteListWindow();
//获取内容工厂的实例
ContentFactory contentFactory = ContentFactory.SERVICE.getInstance();
//获取用于toolWindow显示的内容
Content content = contentFactory.createContent(noteListWindow.getPanel1(), "", false);
//给toolWindow设置内容
toolWindow.getContentManager().addContent(content);
}
}
同时为了让IDE感知到该界面,需要在plugin.xml中配置
<extensions defaultExtensionNs="com.intellij">
<!-- 声明该插件对IDEA core或其他插件的扩展 -->
<!-- Add your extensions here -->
<toolWindow id="xxxx"
secondary="true"
anchor="right" factoryClass="com.xxxx.NoteListWindowFactory"
icon="/a1.png">
</toolWindow>
</extensions>
2、NoteListWindow
做为主界面,通过创建GUI Frame实现
关于布局问题,自已控制即可:
核心的回调函数是两个textArea焦点失去后的函数,包括
textArea1.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
final WaveResult waveResult = AssistServiceImpl.calWave(textArea1.getText().trim());
textArea3.setText(JSONUtil.toJsonPrettyStr(waveResult));
}
});
textArea2.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
System.out.println("AAAAAAAAAAA");
final List<MappingResult> mappingResults = AssistServiceImpl.calMapping(textArea2.getText().trim());
textArea3.setText(JSONUtil.toJsonPrettyStr(mappingResults));
}
});
当需要第三方工具类时,需要导入:
四、效果
五、总结
编码思维-工具思维-产品思维,当老板交给你一个活,编码也许需要2周,有工具也许需要5天,有产品的也许2天就可以搞定。
共勉!!!