Skip to content

Commit 157b545

Browse files
author
banzhe
committed
feat: support mapper file scan
1 parent e563bce commit 157b545

12 files changed

+141
-37
lines changed

src/main/java/io/github/linyimin/plugin/constant/Constant.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,6 @@ public class Constant {
109109

110110
public static final String ROOT_NAME = "Mybatis Sql";
111111

112+
public static final String DATASOURCE_CONNECTED = "Server Connected.";
113+
112114
}

src/main/java/io/github/linyimin/plugin/message/ConfigChangeNotifier.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,14 @@
1111
public interface ConfigChangeNotifier {
1212

1313
Topic<ConfigChangeNotifier> PARAM_CHANGE_TOPIC = Topic.create(String.format("%s_window_active", APPLICATION_NAME), ConfigChangeNotifier.class);
14+
Topic<ConfigChangeNotifier> SCAN_ICON_CLICK_TOPIC = Topic.create(String.format("%s_scan_icon_click", APPLICATION_NAME), ConfigChangeNotifier.class);
1415
/**
1516
*/
1617
default void configChanged() {
1718

1819
}
20+
21+
default void configChanged(String config) {
22+
23+
}
1924
}

src/main/java/io/github/linyimin/plugin/provider/generate/MapperInterfaceGenerateSqlLineMakerProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.github.linyimin.plugin.utils.JavaUtils;
1111
import org.jetbrains.annotations.NotNull;
1212

13+
import javax.swing.*;
1314
import java.util.Objects;
1415

1516
/**
@@ -26,7 +27,7 @@ public LineMarkerInfo<?> getLineMarkerInfo(@NotNull PsiElement element) {
2627
}
2728

2829
// 只处理Mapper接口中的内容
29-
if (!JavaUtils.isMapperMethod(element)) {
30+
if (!JavaUtils.isMapperInterface(element) && !JavaUtils.isMapperMethod(element)) {
3031
return null;
3132
}
3233

src/main/java/io/github/linyimin/plugin/provider/generate/MapperXmlGenerateSqlLineMakerProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.github.linyimin.plugin.configuration.GlobalConfig;
1111
import io.github.linyimin.plugin.constant.Constant;
1212
import io.github.linyimin.plugin.utils.IconUtils;
13+
import org.apache.commons.lang3.StringUtils;
1314
import org.jetbrains.annotations.NotNull;
1415

1516
/**
@@ -33,7 +34,7 @@ public LineMarkerInfo<?> getLineMarkerInfo(@NotNull PsiElement element) {
3334

3435
XmlTag xmlTag = (XmlTag) tag;
3536

36-
if (!Constant.MYBATIS_OPS.contains(xmlTag.getName())) {
37+
if (!Constant.MYBATIS_OPS.contains(xmlTag.getName()) && !StringUtils.equals(xmlTag.getName(), Constant.MAPPER)) {
3738
return null;
3839
}
3940

src/main/java/io/github/linyimin/plugin/provider/generate/SqlGenerateNavigationHandler.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44
import com.intellij.openapi.project.Project;
55
import com.intellij.openapi.wm.ToolWindow;
66
import com.intellij.openapi.wm.ToolWindowManager;
7+
import com.intellij.psi.PsiClass;
78
import com.intellij.psi.PsiElement;
9+
import com.intellij.psi.xml.XmlAttribute;
10+
import com.intellij.psi.xml.XmlTag;
811
import com.intellij.ui.content.Content;
912
import com.intellij.util.messages.MessageBus;
13+
import io.github.linyimin.plugin.constant.Constant;
1014
import io.github.linyimin.plugin.message.ConfigChangeNotifier;
1115
import io.github.linyimin.plugin.configuration.MybatisSqlStateComponent;
1216
import io.github.linyimin.plugin.component.SqlParamGenerateComponent;
1317
import io.github.linyimin.plugin.configuration.model.MybatisSqlConfiguration;
1418
import io.github.linyimin.plugin.pojo2json.POJO2JSONParserFactory;
19+
import org.apache.commons.lang3.StringUtils;
1520

1621
import java.awt.event.MouseEvent;
1722
import java.util.Objects;
@@ -36,10 +41,24 @@ public void navigate(MouseEvent e, PsiElement elt) {
3641

3742
if (!mybatisSqlViewerToolWindow.isActive()) {
3843

39-
SqlParamGenerateComponent.generate(elt, POJO2JSONParserFactory.RANDOM_POJO_2_JSON_PARSER, true);
40-
4144
activateWindow(mybatisSqlViewerToolWindow);
42-
notifyParamChange(elt.getProject());
45+
46+
if (elt.getParent() instanceof PsiClass || StringUtils.equals(((XmlTag) elt.getParent()).getName(), Constant.MAPPER)) {
47+
String namespace = StringUtils.EMPTY;
48+
if (elt.getParent() instanceof PsiClass) {
49+
namespace = ((PsiClass) elt.getParent()).getQualifiedName();
50+
} else {
51+
XmlAttribute attribute = ((XmlTag) elt.getParent()).getAttribute("namespace");
52+
if (attribute != null) {
53+
namespace = attribute.getValue();
54+
}
55+
}
56+
notifyScanIconClick(elt.getProject(), namespace);
57+
} else {
58+
SqlParamGenerateComponent.generate(elt, POJO2JSONParserFactory.RANDOM_POJO_2_JSON_PARSER, true);
59+
notifyParamChange(elt.getProject());
60+
}
61+
4362
}
4463
}
4564

@@ -72,4 +91,11 @@ private void notifyParamChange(Project project) {
7291
notifier.configChanged();
7392
}
7493

94+
private void notifyScanIconClick(Project project, String namespace) {
95+
MessageBus messageBus = project.getMessageBus();
96+
messageBus.connect();
97+
ConfigChangeNotifier notifier = messageBus.syncPublisher(ConfigChangeNotifier.SCAN_ICON_CLICK_TOPIC);
98+
notifier.configChanged(namespace);
99+
}
100+
75101
}

src/main/java/io/github/linyimin/plugin/sql/executor/SqlExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.intellij.openapi.project.Project;
44
import com.intellij.util.containers.ContainerUtil;
5+
import io.github.linyimin.plugin.constant.Constant;
56
import io.github.linyimin.plugin.sql.DatasourceComponent;
67
import io.github.linyimin.plugin.sql.converter.ResultConverter;
78
import io.github.linyimin.plugin.sql.parser.SqlParser;
@@ -37,7 +38,7 @@ public static String testConnected(Project project) {
3738
DatasourceComponent datasourceComponent = project.getService(DatasourceComponent.class);
3839

3940
try (Connection ignored = datasourceComponent.getConnection()) {
40-
return "Server Connected.";
41+
return Constant.DATASOURCE_CONNECTED;
4142
} catch (Exception e) {
4243
StringWriter sw = new StringWriter();
4344
e.printStackTrace(new PrintWriter(sw));

src/main/java/io/github/linyimin/plugin/ui/DatasourceDialog.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,22 +130,35 @@ private void initDatasource() {
130130
String urlText = String.format(Constant.DATABASE_URL_TEMPLATE, component.getHost(), component.getPort(), component.getDatabase());
131131
url.setText(urlText);
132132

133-
nameComboBox.addActionListener(e -> {
133+
nameComboBox.addActionListener(e -> datasourceChange());
134134

135-
String current = (String) nameComboBox.getSelectedItem();
136-
component.setCurrent(current);
135+
}
136+
137+
private void datasourceChange() {
138+
DatasourceConfigComponent component = ApplicationManager.getApplication().getComponent(DatasourceConfigComponent.class);
137139

138-
host.setText(component.getHost());
139-
port.setText(component.getPort());
140-
user.setText(component.getUser());
141-
password.setText(component.getPassword());
142-
database.setText(component.getDatabase());
140+
String current = (String) nameComboBox.getSelectedItem();
143141

144-
DatasourceComponent datasourceComponent = project.getService(DatasourceComponent.class);
145-
datasourceComponent.updateDatasource();
142+
component.setCurrent(current);
146143

147-
});
144+
host.setText(component.getHost());
145+
port.setText(component.getPort());
146+
user.setText(component.getUser());
147+
password.setText(component.getPassword());
148+
database.setText(component.getDatabase());
148149

150+
DatasourceComponent datasourceComponent = project.getService(DatasourceComponent.class);
151+
datasourceComponent.updateDatasource();
152+
153+
backgroundTaskQueue.run(new Task.Backgroundable(project, Constant.APPLICATION_NAME) {
154+
@Override
155+
public void run(@NotNull ProgressIndicator indicator) {
156+
String connectionInfo = SqlExecutor.testConnected(project);
157+
ApplicationManager.getApplication().invokeLater(() -> {
158+
testResult.setText(connectionInfo);
159+
});
160+
}
161+
});
149162
}
150163

151164
private void updateDatasourceForPersistent() {

src/main/java/io/github/linyimin/plugin/ui/MybatisSqlScannerPanel.java

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@
2525
import io.github.linyimin.plugin.sql.checker.CheckerHolder;
2626
import io.github.linyimin.plugin.sql.checker.Report;
2727
import io.github.linyimin.plugin.sql.checker.enums.CheckScopeEnum;
28+
import io.github.linyimin.plugin.sql.checker.enums.LevelEnum;
29+
import io.github.linyimin.plugin.sql.executor.SqlExecutor;
2830
import io.github.linyimin.plugin.sql.parser.SqlParser;
2931
import io.github.linyimin.plugin.ui.tree.MethodTreeNode;
3032
import io.github.linyimin.plugin.ui.tree.NamespaceTreeNode;
3133
import io.github.linyimin.plugin.ui.tree.RootTreeNode;
3234
import io.github.linyimin.plugin.ui.tree.TreeListener;
3335
import io.github.linyimin.plugin.utils.IconUtils;
3436
import org.apache.commons.collections.CollectionUtils;
37+
import org.apache.commons.lang3.StringUtils;
3538
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
3639
import org.fife.ui.rtextarea.RTextScrollPane;
3740
import org.jetbrains.annotations.NotNull;
@@ -40,9 +43,9 @@
4043
import javax.swing.border.EmptyBorder;
4144
import java.awt.*;
4245
import java.awt.event.ActionEvent;
43-
import java.util.ArrayList;
4446
import java.util.Arrays;
4547
import java.util.List;
48+
import java.util.Optional;
4649
import java.util.Set;
4750

4851
/**
@@ -82,6 +85,8 @@ public class MybatisSqlScannerPanel implements TabbedChangeListener {
8285

8386
private final BackgroundTaskQueue backgroundTaskQueue;
8487

88+
private String namespace;
89+
8590
public MybatisSqlScannerPanel(Project project) {
8691
this.project = project;
8792
this.infoPane = new InfoPane();
@@ -242,8 +247,15 @@ public void run(@NotNull ProgressIndicator indicator) {
242247
scannerResultPanel.add(infoPane.getInfoPane());
243248
infoPane.setText("Scan mybatis sql...");
244249
});
245-
allRoot = scanMybatisSql();
246-
createTree(allRoot);
250+
if (StringUtils.isBlank(namespace)) {
251+
allRoot = scanMybatisSql();
252+
createTree(allRoot);
253+
} else {
254+
allRoot = new RootTreeNode(Constant.ROOT_NAME);
255+
boolean isConnected = StringUtils.equals(SqlExecutor.testConnected(project), Constant.DATASOURCE_CONNECTED);
256+
scanMybatisSql(allRoot, namespace, isConnected);
257+
createTree(allRoot);
258+
}
247259
ApplicationManager.getApplication().invokeLater(() -> {
248260
scannerResultPanel.remove(infoPane.getInfoPane());
249261
scannerResultPanel.add(scannerResultContentPanel);
@@ -323,7 +335,7 @@ private void createTree(RootTreeNode root) {
323335

324336
}
325337

326-
private void scanMybatisSql(RootTreeNode root, String namespace) {
338+
private void scanMybatisSql(RootTreeNode root, String namespace, boolean isConnected) {
327339

328340
NamespaceTreeNode namespaceTreeNode = new NamespaceTreeNode(root, namespace);
329341
root.add(namespaceTreeNode);
@@ -345,7 +357,7 @@ private void scanMybatisSql(RootTreeNode root, String namespace) {
345357

346358
if (sqlResult.isSuccess()) {
347359
configuration.setSql(sqlResult.getData());
348-
Icon icon = sqlCheck(sqlResult.getData());
360+
Icon icon = sqlCheck(sqlResult.getData(), isConnected);
349361
methodTreeNode = new MethodTreeNode(namespaceTreeNode, configuration.getMethod(), icon);
350362

351363
} else {
@@ -360,7 +372,7 @@ private void scanMybatisSql(RootTreeNode root, String namespace) {
360372
}
361373
}
362374

363-
private Icon sqlCheck(String sql) {
375+
private Icon sqlCheck(String sql, boolean isConnected) {
364376
try {
365377
// 语法校验
366378
ProcessResult<String> validateResult = SqlParser.validate(sql);
@@ -370,13 +382,15 @@ private Icon sqlCheck(String sql) {
370382
}
371383

372384
// 索引检查
373-
ProcessResult<Boolean> indexCheckResult = checkIndex(sql);
374-
if (!indexCheckResult.isSuccess()) {
375-
return IconUtils.ERROR_ICON;
376-
}
385+
if (isConnected) {
386+
ProcessResult<Boolean> indexCheckResult = checkIndex(sql);
387+
if (!indexCheckResult.isSuccess()) {
388+
return IconUtils.ERROR_ICON;
389+
}
377390

378-
if (!indexCheckResult.getData()) {
379-
return IconUtils.FULL_SCAN_ICON;
391+
if (!indexCheckResult.getData()) {
392+
return IconUtils.FULL_SCAN_ICON;
393+
}
380394
}
381395

382396
ProcessResult<Boolean> ruleCheckResult = checkRule(sql);
@@ -397,6 +411,13 @@ private Icon sqlCheck(String sql) {
397411
private ProcessResult<Boolean> checkIndex(String sql) {
398412
Checker checker = CheckerHolder.getChecker(CheckScopeEnum.index_hit);
399413
List<Report> reports = checker.check(project, sql);
414+
415+
Optional<Report> error = reports.stream().filter(report -> report.getLevel() == LevelEnum.error).findAny();
416+
417+
if (error.isPresent()) {
418+
return ProcessResult.fail(error.get().getDesc());
419+
}
420+
400421
boolean allPass = reports.stream().allMatch(Report::isPass);
401422
return ProcessResult.success(allPass);
402423
}
@@ -421,11 +442,15 @@ private ProcessResult<Boolean> checkRule(String sql) {
421442
}
422443

423444
private RootTreeNode scanMybatisSql() {
445+
424446
RootTreeNode root = new RootTreeNode(Constant.ROOT_NAME);
447+
448+
boolean isConnected = StringUtils.equals(SqlExecutor.testConnected(project), Constant.DATASOURCE_CONNECTED);
449+
425450
// mapper 列表节点
426451
List<String> namespaces = ApplicationManager.getApplication().runReadAction((Computable<List<String>>) () -> MybatisXmlContentCache.acquireByNamespace(project, true));
427452
for (String namespace : namespaces) {
428-
scanMybatisSql(root, namespace);
453+
scanMybatisSql(root, namespace, isConnected);
429454
}
430455

431456
return root;
@@ -443,6 +468,14 @@ public JScrollPane getIndexScrollPane() {
443468
return indexScrollPane;
444469
}
445470

471+
public String getNamespace() {
472+
return namespace;
473+
}
474+
475+
public void setNamespace(String namespace) {
476+
this.namespace = namespace;
477+
}
478+
446479
public enum FilterType {
447480

448481
all(null),

src/main/java/io/github/linyimin/plugin/ui/MybatisSqlViewerToolWindow.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ public void mouseClicked(MouseEvent event) {
100100

101101
}
102102

103+
public void scanMybatisSql(String namespace) {
104+
int projectIndex = this.totalTabbedPanel.indexOfTab(TabbedComponentType.project.name());
105+
if (projectIndex < 0) {
106+
this.totalTabbedPanel.insertTab(TabbedComponentType.project.name(), null, this.mybatisSqlScannerPanel.getScannerResultPanel(), null, TabbedComponentType.project.index);
107+
}
108+
this.mybatisSqlScannerPanel.setNamespace(namespace);
109+
int selectedIndex = this.totalTabbedPanel.getSelectedIndex();
110+
if (projectIndex == selectedIndex) {
111+
this.mybatisSqlScannerPanel.listen();
112+
} else {
113+
this.totalTabbedPanel.setSelectedIndex(TabbedComponentType.project.index);
114+
}
115+
}
116+
103117
/**
104118
* 刷新tool window配置内容
105119
*/
@@ -128,13 +142,7 @@ private void addComponentListener() {
128142
datasourceButton.addMouseListener(new MouseCursorAdapter(this.datasourceButton));
129143

130144
this.mybatisSqlScanButton.addMouseListener(new MouseCursorAdapter(this.mybatisSqlScanButton));
131-
this.mybatisSqlScanButton.addActionListener(e -> {
132-
int projectIndex = this.totalTabbedPanel.indexOfTab(TabbedComponentType.project.name());
133-
if (projectIndex < 0) {
134-
this.totalTabbedPanel.insertTab(TabbedComponentType.project.name(), null, this.mybatisSqlScannerPanel.getScannerResultPanel(), null, TabbedComponentType.project.index);
135-
}
136-
this.totalTabbedPanel.setSelectedIndex(TabbedComponentType.project.index);
137-
});
145+
this.mybatisSqlScanButton.addActionListener(e -> scanMybatisSql(StringUtils.EMPTY));
138146

139147
jumpButton.addMouseListener(new MouseCursorAdapter(this.jumpButton));
140148
jumpButton.addActionListener(e -> {

src/main/java/io/github/linyimin/plugin/ui/MybatisSqlViewerToolWindowFactory.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo
3434
windowMap.put(project, mybatisSqlViewerToolWindow);
3535

3636
subscribeParamChange(project);
37+
subscribeScanIconClick(project);
3738

3839
}
3940

@@ -48,4 +49,15 @@ public void configChanged() {
4849
});
4950
}
5051

52+
private void subscribeScanIconClick(Project project) {
53+
MessageBus messageBus = project.getMessageBus();
54+
MessageBusConnection connect = messageBus.connect();
55+
connect.subscribe(ConfigChangeNotifier.SCAN_ICON_CLICK_TOPIC, new ConfigChangeNotifier() {
56+
@Override
57+
public void configChanged(String config) {
58+
windowMap.get(project).scanMybatisSql(config);
59+
}
60+
});
61+
}
62+
5163
}

0 commit comments

Comments
 (0)