Skip to content

Commit 8540249

Browse files
committed
feat: support realtime update
1 parent 85e711a commit 8540249

File tree

6 files changed

+53
-70
lines changed

6 files changed

+53
-70
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44
}
55

66
group 'org.linyimin'
7-
version '1.0.2'
7+
version '1.0.3'
88

99
repositories {
1010
maven { url 'https://maven.aliyun.com/repository/public/' }
@@ -14,7 +14,7 @@ repositories {
1414
dependencies {
1515
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
1616
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
17-
implementation 'org.mybatis:mybatis:3.5.9'
17+
implementation 'org.mybatis:mybatis:3.3.1'
1818
implementation 'com.alibaba:fastjson:1.2.79'
1919
implementation 'mysql:mysql-connector-java:8.0.25'
2020
implementation 'com.github.vertical-blank:sql-formatter:2.0.3'

src/main/java/io/github/linyimin/plugin/compile/MybatisPojoCompile.java

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,16 @@
44
import com.intellij.openapi.compiler.CompilerManager;
55
import com.intellij.openapi.project.Project;
66
import com.intellij.openapi.roots.OrderEnumerator;
7-
import com.intellij.openapi.roots.ProjectRootManager;
87
import com.intellij.openapi.ui.Messages;
98
import com.intellij.openapi.util.io.FileUtil;
10-
import com.intellij.openapi.vfs.VirtualFile;
119
import io.github.linyimin.plugin.utils.JavaUtils;
12-
import org.apache.commons.collections.CollectionUtils;
1310
import org.apache.commons.lang3.StringUtils;
1411

1512
import java.io.File;
16-
import java.io.IOException;
1713
import java.net.MalformedURLException;
1814
import java.net.URL;
1915
import java.util.*;
20-
import java.util.stream.Collectors;
21-
import java.util.stream.Stream;
16+
import java.util.concurrent.ConcurrentHashMap;
2217

2318

2419
/**
@@ -27,10 +22,12 @@
2722
**/
2823
public class MybatisPojoCompile {
2924

30-
// TODO: 需要优化成只编译Mybatis需要的类
25+
private static final Map<Project, ProjectLoader> projectClassLoaderMap = new ConcurrentHashMap<>();
3126

32-
public static ProjectLoader classLoader;
33-
public static List<String> preDependencies;
27+
public static ProjectLoader getClassLoader(Project project) {
28+
29+
return projectClassLoaderMap.get(project);
30+
}
3431

3532
public static void compile(Project project) {
3633

@@ -47,12 +44,16 @@ public static void setClassLoader(Project project) {
4744

4845
List<URL> urls = pathToURL(dependencies);
4946

50-
if (Objects.nonNull(classLoader)) {
51-
changeLoaderUrls(preDependencies, dependencies);
52-
} else {
53-
createProjectLoader(urls);
47+
ProjectLoader classLoader = projectClassLoaderMap.get(project);
48+
49+
try {
50+
classLoader.close();
51+
} catch (Throwable ignored) {
5452
}
55-
preDependencies = dependencies;
53+
54+
classLoader = createProjectLoader(urls);
55+
56+
projectClassLoaderMap.put(project, classLoader);
5657
}
5758

5859
private static List<URL> pathToURL(List<String> paths) {
@@ -96,44 +97,11 @@ private static List<String> getProjectDependencies(Project project) {
9697
return list;
9798
}
9899

99-
private static boolean isProjectModule(Project project, String path) {
100-
VirtualFile[] vFiles = ProjectRootManager.getInstance(project).getContentRootsFromAllModules();
101-
Set<String> moduleNames = Stream.of(vFiles).map(VirtualFile::getName).collect(Collectors.toSet());
102-
103-
moduleNames.add(project.getName());
104-
moduleNames.add(project.getBasePath());
105-
106-
return moduleNames.stream().anyMatch(path::contains);
107-
}
108-
109-
private static void createProjectLoader(List<URL> urls) {
100+
private static ProjectLoader createProjectLoader(List<URL> urls) {
110101

111102
URL[] urlArr = urls.toArray(new URL[0]);
112103

113-
classLoader = new ProjectLoader(urlArr, MybatisPojoCompile.class.getClassLoader());
114-
}
115-
116-
private static void changeLoaderUrls(List<String> preDependencies, List<String> dependencies) {
117-
118-
List<String> list = new ArrayList<>(dependencies);
119-
120-
for (String preDependency : preDependencies) {
121-
list.remove(preDependency);
122-
}
123-
124-
if (CollectionUtils.isEmpty(list)) {
125-
return;
126-
}
127-
128-
try {
129-
classLoader.close();
130-
} catch (IOException e) {
131-
throw new RuntimeException(e);
132-
}
133-
134-
List<URL> urls = pathToURL(dependencies);
135-
classLoader = new ProjectLoader(urls.toArray(new URL[0]), MybatisPojoCompile.class.getClassLoader());
136-
104+
return new ProjectLoader(urlArr, MybatisPojoCompile.class.getClassLoader());
137105
}
138106

139107
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ private void resetConfig(Project project) {
5757
* @param toolWindow {@link ToolWindow}
5858
*/
5959
private void activateWindow(ToolWindow toolWindow) {
60-
toolWindow.setAutoHide(true);
60+
toolWindow.setAutoHide(false);
6161
toolWindow.activate(null);
6262
Content content = toolWindow.getContentManager().getContent(0);
6363
assert content != null;

src/main/java/io/github/linyimin/plugin/service/SqlParamGenerateService.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.psi.xml.XmlToken;
1313
import com.siyeh.ig.psiutils.CollectionUtils;
1414
import io.github.linyimin.plugin.compile.MybatisPojoCompile;
15+
import io.github.linyimin.plugin.compile.ProjectLoader;
1516
import io.github.linyimin.plugin.dom.Constant;
1617
import io.github.linyimin.plugin.dom.model.MybatisConfiguration;
1718
import io.github.linyimin.plugin.provider.MapperXmlProcessor;
@@ -46,23 +47,28 @@ public String generateSql(Project project, String methodQualifiedName, String pa
4647

4748
List<String> mybatisConfigs = getMybatisConfigurations(project, psiMethods.get(0));
4849

49-
boolean isNeedCompile = checkNeedCompile(mybatisConfigs, methodQualifiedName, params);
50+
MybatisPojoCompile.compile(project);
5051

51-
if (isNeedCompile) {
52-
MybatisPojoCompile.compile(project);
52+
ProjectLoader loader = MybatisPojoCompile.getClassLoader(project);
53+
54+
if (Objects.isNull(loader)) {
55+
return "Oops! There are something wrong with the plugin. Please try later.";
5356
}
5457

55-
return getSql(mybatisConfigs, methodQualifiedName, params);
58+
return getSql(project, mybatisConfigs, methodQualifiedName, params);
5659

5760
}
5861

59-
private boolean checkNeedCompile(List<String> mybatisConfigs, String methodQualifiedName, String params) {
60-
if (Objects.isNull(MybatisPojoCompile.classLoader)) {
61-
return true;
62+
private boolean checkNeedCompile(Project project, List<String> mybatisConfigs, String methodQualifiedName, String params) {
63+
64+
ProjectLoader classLoader = MybatisPojoCompile.getClassLoader(project);
65+
66+
if (Objects.isNull(classLoader)) {
67+
return true;
6268
}
6369

6470
try {
65-
getSql(mybatisConfigs, methodQualifiedName, params);
71+
getSql(project, mybatisConfigs, methodQualifiedName, params);
6672
} catch (Throwable e) {
6773
return true;
6874
}
@@ -332,6 +338,7 @@ private String getParamAnnotationValue(PsiParameter param) {
332338

333339
return nameValuePairs.stream()
334340
.map(PsiNameValuePair::getLiteralValue)
341+
.filter(Objects::nonNull)
335342
.findFirst()
336343
.orElse(StringUtils.EMPTY);
337344
}
@@ -377,13 +384,15 @@ public ParamNameType(String name, PsiClass psiClass, PsiType psiType, boolean is
377384
}
378385
}
379386

380-
private String getSql(List<String> mybatisConfigurations, String qualifiedMethod, String params) {
387+
private String getSql(Project project, List<String> mybatisConfigurations, String qualifiedMethod, String params) {
381388

382389
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
383390

391+
ProjectLoader projectLoader = MybatisPojoCompile.getClassLoader(project);
392+
384393
try {
385-
Thread.currentThread().setContextClassLoader(MybatisPojoCompile.classLoader);
386-
Class<?> clazz = MybatisPojoCompile.classLoader.loadClass("io.github.linyimin.plugin.utils.MybatisSqlUtils");
394+
Thread.currentThread().setContextClassLoader(projectLoader);
395+
Class<?> clazz = projectLoader.loadClass("io.github.linyimin.plugin.utils.MybatisSqlUtils");
387396
Object object = clazz.newInstance();
388397
Method method = clazz.getDeclaredMethod("getSql", String.class, String.class, String.class);
389398

src/main/java/io/github/linyimin/plugin/utils/MybatisSqlUtils.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,27 @@
2626

2727
/**
2828
* @author yiminlin
29-
* @date 2022/02/05 3:15 上午
29+
* @date 2022/02/05 3:15 上午`
3030
**/
3131
public class MybatisSqlUtils {
3232

3333
private static final Pattern PATTERN = Pattern.compile("The expression '(.*)' evaluated to a null value");
3434
public String getSql(String mybatisConfiguration, String qualifiedMethod, String params) {
3535

36-
InputStream in = new ByteArrayInputStream(mybatisConfiguration.getBytes(Charsets.toCharset(Charset.defaultCharset())));
37-
Resources.setDefaultClassLoader(Thread.currentThread().getContextClassLoader());
36+
try {
37+
InputStream in = new ByteArrayInputStream(mybatisConfiguration.getBytes(Charsets.toCharset(Charset.defaultCharset())));
38+
Resources.setDefaultClassLoader(Thread.currentThread().getContextClassLoader());
39+
40+
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
41+
Configuration configuration = sqlSessionFactory.getConfiguration();
3842

39-
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
40-
Configuration configuration = sqlSessionFactory.getConfiguration();
43+
BoundSql sql = getBoundSql(configuration, qualifiedMethod, params);
4144

42-
BoundSql sql = getBoundSql(configuration, qualifiedMethod, params);
45+
return formatSql(configuration, sql);
46+
} catch (Throwable t) {
47+
return "Oops! There are something wrong when generate sql statement.\n" + t.getMessage();
48+
}
4349

44-
return formatSql(configuration, sql);
4550
}
4651

4752
private static String formatSql(Configuration configuration, BoundSql boundSql) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl

0 commit comments

Comments
 (0)