왜? 인텔리제이 플러그인 개발하니
쿼리 테스트 해야는데
자꾸 맞는 문법인지 찾으러 인터넷사이트 돌아다녀서 하나하나 붙여서 테스트 하는게, 보안적으로 걱정도 되고 귀찮기도 해서 직접 만듦.
Intellij version :
프로젝트 생성 :
preference settings :
build.gradle.kts 설정 :
plugins {
id("java")
id("org.jetbrains.intellij") version "1.12.0"
}
group = "com.org"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
// Configure Gradle IntelliJ Plugin
// Read more: <https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html>
intellij {
version.set("2022.1.4")
type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */))
}
java {
sourceCompatibility = org.gradle.api.JavaVersion.VERSION_17
}
dependencies {
// <https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser>
implementation("com.github.jsqlparser:jsqlparser:4.5")
}
tasks {
buildSearchableOptions {
enabled = false
}
// Set the JVM compatibility versions
withType {
sourceCompatibility = "11"
targetCompatibility = "11"
}
patchPluginXml {
sinceBuild.set("221")
untilBuild.set("231.*")
}
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
}
내가 원하는 마우스 우클릭에 해당하는 툴바는
Editor Popup Menu에 해당한다.
그러니까 여기에 ( 소스 파일에 우클릭을 해야 Plugin DevKit 항목이 보임에 유의 )
데브킷을 통해 만든다.
위 항목 선택하고 만들면 IDE가 알아서 클래스 파일을 생성해주고, build.gradle.kts 파일에 태그 액션을 만들어준다.
SqlSyntaxChecker.java
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import org.apache.commons.lang3.ObjectUtils;
public class SqlSyntaxChecker extends AnAction {
@Override
public void actionPerformed(AnActionEvent event) {
Project currentProject = event.getProject();
DataContext dataContext = event.getDataContext();
Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
if (editor != null) {
SelectionModel selectionModel = editor.getSelectionModel();
if (ObjectUtils.isEmpty(selectionModel.getSelectedText())) {
Messages.showMessageDialog(currentProject, "Please block the sentence to check the query syntax", "not verifiable statement" , Messages.getInformationIcon());
return;
}
String selectedText = selectionModel.getSelectedText();
selectedText = selectedText.trim();
if (selectedText.startsWith("\"")) {
selectedText = selectedText.substring(0,1);
}
try {
CCJSqlParserUtil.parse(selectedText);
Messages.showMessageDialog(currentProject, selectedText, "AVAILABLE", Messages.getInformationIcon());
} catch( JSQLParserException jsqlParserException) {
Messages.showMessageDialog(currentProject,selectedText + System.lineSeparator()+ jsqlParserException.getMessage(), "NOT AVAILABLE" , Messages.getInformationIcon());
} catch ( Exception t) {
Messages.showMessageDialog(currentProject, selectedText + System.lineSeparator()+ t.getMessage(), "SORRY PLUGIN ERROR ㅜ_ㅜ" , Messages.getInformationIcon());
}
}
}
}
plugin.xml 세팅 :
<idea-plugin>
<!-- Unique identifier of the plugin. It should be FQN. It cannot be changed between the plugin versions. -->
<id>com.org.intellijplugin</id>
<name>Intellijplugin</name>
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="jaemanc93@gmail.com" url="jaemanc93@gmail.com">jaemanCC</vendor>
<description><![CDATA[
SQL GRAMMAR SYNTAX CHECK PLUGINS. PLEASE HELP ME!!! GOD!!
]]></description>
<depends>com.intellij.modules.platform</depends>
<actions>
<action id="SqlSyntaxChecker" class="SqlSyntaxChecker" text="SQL syntax Check" description="SQL syntax Check">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
</action>
</actions>
<extensions defaultExtensionNs="com.intellij">
</extensions>
</idea-plugin>
플러그인을 로컬에서 실행하며 테스트 할 수 있다.
빌드부터 →
테스트까지
실행하면 다음과 같은 화면이 나온다.
처음이라 당황했는데, 플러그인을 테스트하는것이라서인지 Intellij 툴을 실행하는 것처럼 보인다.
동일한 프로젝트를 연다면 동일한 프로젝트의 코드 내용을 동시에 보며 테스트를 할 수 있다.
sql syntax 검증 코드를 추가하고 플러그인을 테스트를 해보았다.
블록 지정을 정확히 안한 경우 :
블록 지정을 해달라는 안내메세지 팝업을 뱉어낸다.
테스트용 쿼리문으로 플러그인을 실행해보았다.
안된다면,
되는걸로 다시 해보면 된다.
Syntax 체크에 통과한 쿼리라면 다음과 같은 팝업이 뜬다.
적합과 부적합을 판별해주고, 부적합일 경우 부적합한 내용이 어떤 부분인지 체크해준다.
복잡한 쿼리나 장문의 쿼리는 정확도가 떨어질 수있다.
쿼리 검증은 JSQLParser 라는 라이브러리를 통해 검증하도록 했다.
생각보다 간단하게 구현이 가능하지만 삽질을 좀 했다.
참고 :
https://plugins.jetbrains.com/docs/intellij/code-samples.html#setting-up-code-samples
https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html#idea-plugin__name
'TIPS' 카테고리의 다른 글
[Intellij plugin] 인텔리제이 플러그인 만들기 2 (0) | 2023.07.19 |
---|---|
[Intellij plugin] intellij plugin 적용 및 배포 (0) | 2023.07.14 |
[intelliJ] new Project gradle not found (0) | 2023.07.12 |
Logi Options+ memory leak (0) | 2023.05.31 |
Intellij 처음 시작 시, 프로젝트 선택 화면 설정 (0) | 2023.02.24 |