Skip to content

Commit 2e08535

Browse files
committed
优化插件管理
1 parent 0aa7f62 commit 2e08535

4 files changed

Lines changed: 176 additions & 58 deletions

File tree

src/main/java/com/xwintop/xJavaFxTool/controller/index/PluginManageController.java

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import javafx.event.ActionEvent;
1111
import javafx.fxml.FXML;
1212
import javafx.fxml.FXMLLoader;
13+
import javafx.scene.control.*;
14+
import javafx.scene.input.MouseButton;
15+
import javafx.util.Callback;
1316
import lombok.Getter;
1417
import lombok.Setter;
1518
import lombok.extern.slf4j.Slf4j;
@@ -49,21 +52,64 @@ private void initView() {
4952
JavaFxViewUtil.setTableColumnMapValueFactory(synopsisTableColumn, "synopsisTableColumn");
5053
JavaFxViewUtil.setTableColumnMapValueFactory(versionTableColumn, "versionTableColumn");
5154
JavaFxViewUtil.setTableColumnMapValueFactory(isDownloadTableColumn, "isDownloadTableColumn");
52-
JavaFxViewUtil.setTableColumnMapAsCheckBoxValueFactory(isEnableTableColumn, "isEnableTableColumn");
53-
JavaFxViewUtil.setTableColumnButonFactory(downloadTableColumn, "下载", (me, index) -> {
54-
try {
55-
Map<String, String> dataRow = pluginDataTableData.get(index);
56-
pluginManageService.downloadPluginJar(dataRow);
57-
TooltipUtil.showToast("下载插件完成");
58-
} catch (Exception e) {
59-
log.error("下载插件失败:", e);
60-
TooltipUtil.showToast("下载插件失败:" + e.getMessage());
55+
JavaFxViewUtil.setTableColumnMapAsCheckBoxValueFactory(isEnableTableColumn, "isEnableTableColumn", (mouseEvent, index) -> {
56+
pluginManageService.setIsEnableTableColumn(index);
57+
});
58+
59+
downloadTableColumn.setCellFactory(new Callback<TableColumn<Map<String, String>, String>, TableCell<Map<String, String>, String>>() {
60+
@Override
61+
public TableCell<Map<String, String>, String> call(TableColumn<Map<String, String>, String> param) {
62+
TableCell<Map<String, String>, String> cell = new TableCell<Map<String, String>, String>() {
63+
@Override
64+
protected void updateItem(String item, boolean empty) {
65+
super.updateItem(item, empty);
66+
this.setText(null);
67+
this.setGraphic(null);
68+
if (!empty) {
69+
Map<String, String> dataRow = pluginDataTableData.get(this.getIndex());
70+
Button downloadButton = new Button(dataRow.get("isDownloadTableColumn"));
71+
if ("已下载".equals(dataRow.get("isDownloadTableColumn"))) {
72+
downloadButton.setDisable(true);
73+
}
74+
this.setContentDisplay(ContentDisplay.CENTER);
75+
downloadButton.setOnMouseClicked((me) -> {
76+
try {
77+
pluginManageService.downloadPluginJar(dataRow);
78+
dataRow.put("isDownloadTableColumn", "已下载");
79+
downloadButton.setText("已下载");
80+
downloadButton.setDisable(true);
81+
TooltipUtil.showToast("插件 " + dataRow.get("nameTableColumn") + " 下载完成");
82+
} catch (Exception e) {
83+
log.error("下载插件失败:", e);
84+
TooltipUtil.showToast("下载插件失败:" + e.getMessage());
85+
}
86+
});
87+
this.setGraphic(downloadButton);
88+
}
89+
}
90+
};
91+
return cell;
6192
}
6293
});
94+
6395
pluginDataTableView.setItems(pluginDataTableData);
6496
}
6597

6698
private void initEvent() {
99+
pluginDataTableView.setOnMouseClicked(event -> {
100+
if (event.getButton() == MouseButton.SECONDARY) {
101+
MenuItem menuSave = new MenuItem("保存配置");
102+
menuSave.setOnAction(event1 -> {
103+
try {
104+
pluginManageService.savePluginJarList();
105+
TooltipUtil.showToast("保存配置成功");
106+
} catch (Exception e) {
107+
log.error("保存配置失败", e);
108+
}
109+
});
110+
pluginDataTableView.setContextMenu(new ContextMenu(menuSave));
111+
}
112+
});
67113
}
68114

69115
private void initService() {
@@ -72,5 +118,6 @@ private void initService() {
72118

73119
@FXML
74120
private void selectPluginAction(ActionEvent event) {
121+
pluginManageService.selectPluginAction();
75122
}
76123
}

src/main/java/com/xwintop/xJavaFxTool/services/index/PluginManageService.java

Lines changed: 94 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
import com.alibaba.fastjson.JSONObject;
77
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
88
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
9-
import com.xwintop.xJavaFxTool.utils.XJavaFxSystemUtil;
9+
import com.xwintop.xJavaFxTool.utils.ConfigureUtil;
1010
import com.xwintop.xcore.util.javafx.TooltipUtil;
1111
import lombok.Getter;
1212
import lombok.Setter;
1313
import lombok.extern.slf4j.Slf4j;
14-
import okhttp3.OkHttpClient;
14+
import org.apache.commons.io.FileUtils;
15+
import org.apache.commons.lang3.StringUtils;
1516

1617
import java.io.File;
1718
import java.util.HashMap;
19+
import java.util.List;
1820
import java.util.Map;
1921

2022
/**
@@ -29,46 +31,50 @@
2931
@Slf4j
3032
public class PluginManageService {
3133
private PluginManageController pluginManageController;
32-
private OkHttpClient client = new OkHttpClient();
34+
public final static Map<String, PluginJarInfo> PLUGIN_JAR_INFO_MAP = new HashMap<>();
35+
private JSONArray jsonArray = null;
3336

3437
public PluginManageService(PluginManageController pluginManageController) {
3538
this.pluginManageController = pluginManageController;
3639
}
3740

3841
public void getPluginList() {
3942
try {
40-
// String jsonString = HttpUtil.get("https://xwintop.gitee.io/xjavafxtool-plugin/plugin-list.json");
41-
String jsonString = "[{\"name\":\"Zookeeper工具\",\"synopsis\":\"Zookeeper工具(方便对zookeeper的一系列操作,包括新增、修改、删除(包括子文件)、重命名、复制、添加变更通知)\",\"version\":\"0.0.1\",\"downloadUrl\":\"https://xwintop.gitee.io/xjavafxtool-plugin/plugin-libs/x-ZookeeperTool-0.0.1.jar\"}]";
42-
JSONArray jsonArray = JSON.parseArray(jsonString);
43+
String jsonString = HttpUtil.get("https://xwintop.gitee.io/xjavafxtool-plugin/plugin-list.json");
44+
// String jsonString = "[{\"name\":\"Zookeeper工具\",\"synopsis\":\"Zookeeper工具(方便对zookeeper的一系列操作,包括新增、修改、删除(包括子文件)、重命名、复制、添加变更通知)\",\"version\":\"0.0.1\",\"jarName\": \"x-ZookeeperTool\",\"versionNumber\": 1,\"downloadUrl\":\"https://xwintop.gitee.io/xjavafxtool-plugin/plugin-libs/x-ZookeeperTool-0.0.1.jar\"}]";
45+
jsonArray = JSON.parseArray(jsonString);
4346
for (Object json : jsonArray) {
44-
JSONObject data = (JSONObject) json;
45-
PluginJarInfo pluginJarInfo = XJavaFxSystemUtil.pluginJarInfoMap.get(data.getString("jarName"));
46-
Map<String, String> dataRow = new HashMap<String, String>();
47-
dataRow.put("nameTableColumn", data.getString("name"));
48-
dataRow.put("synopsisTableColumn", data.getString("synopsis"));
49-
dataRow.put("versionTableColumn", data.getString("version"));
50-
if (pluginJarInfo == null) {
51-
dataRow.put("isDownloadTableColumn", "否");
52-
dataRow.put("isEnableTableColumn", "false");
53-
} else {
54-
if (Integer.parseInt(data.getString("versionNumber")) > pluginJarInfo.getVersionNumber()) {
55-
dataRow.put("isDownloadTableColumn", "更新");
56-
} else {
57-
dataRow.put("isDownloadTableColumn", "是");
58-
}
59-
dataRow.put("isEnableTableColumn", pluginJarInfo.getIsDownload().toString());
60-
}
61-
dataRow.put("jarName", data.getString("jarName"));
62-
dataRow.put("downloadUrl", data.getString("downloadUrl"));
63-
dataRow.put("versionNumber", data.getString("versionNumber"));
64-
pluginManageController.getPluginDataTableData().add(dataRow);
47+
addDataRow((JSONObject) json);
6548
}
6649
} catch (Exception e) {
6750
log.error("获取列表失败:", e);
6851
TooltipUtil.showToast("获取列表失败:" + e.getMessage());
6952
}
7053
}
7154

55+
private void addDataRow(JSONObject data) {
56+
PluginJarInfo pluginJarInfo = PLUGIN_JAR_INFO_MAP.get(data.getString("jarName"));
57+
Map<String, String> dataRow = new HashMap<String, String>();
58+
dataRow.put("nameTableColumn", data.getString("name"));
59+
dataRow.put("synopsisTableColumn", data.getString("synopsis"));
60+
dataRow.put("versionTableColumn", data.getString("version"));
61+
if (pluginJarInfo == null) {
62+
dataRow.put("isDownloadTableColumn", "下载");
63+
dataRow.put("isEnableTableColumn", "false");
64+
} else {
65+
if (Integer.parseInt(data.getString("versionNumber")) > pluginJarInfo.getVersionNumber()) {
66+
dataRow.put("isDownloadTableColumn", "更新");
67+
} else {
68+
dataRow.put("isDownloadTableColumn", "已下载");
69+
}
70+
dataRow.put("isEnableTableColumn", pluginJarInfo.getIsEnable().toString());
71+
}
72+
dataRow.put("jarName", data.getString("jarName"));
73+
dataRow.put("downloadUrl", data.getString("downloadUrl"));
74+
dataRow.put("versionNumber", data.getString("versionNumber"));
75+
pluginManageController.getPluginDataTableData().add(dataRow);
76+
}
77+
7278
public void downloadPluginJar(Map<String, String> dataRow) throws Exception {
7379
PluginJarInfo pluginJarInfo = new PluginJarInfo();
7480
pluginJarInfo.setName(dataRow.get("nameTableColumn"));
@@ -82,6 +88,66 @@ public void downloadPluginJar(Map<String, String> dataRow) throws Exception {
8288
// File file = new File("libs/", StringUtils.substring(downloadUrl, 56, downloadUrl.length()));
8389
File file = new File("libs/", pluginJarInfo.getJarName() + "-" + pluginJarInfo.getVersion() + ".jar");
8490
HttpUtil.downloadFile(pluginJarInfo.getDownloadUrl(), file);
85-
XJavaFxSystemUtil.pluginJarInfoMap.put(pluginJarInfo.getJarName(), pluginJarInfo);
91+
PLUGIN_JAR_INFO_MAP.put(pluginJarInfo.getJarName(), pluginJarInfo);
92+
PluginManageService.savePluginJarList();
93+
}
94+
95+
public void setIsEnableTableColumn(Integer index) {
96+
Map<String, String> dataRow = pluginManageController.getPluginDataTableData().get(index);
97+
String jarName = dataRow.get("jarName");
98+
PluginJarInfo pluginJarInfo = PLUGIN_JAR_INFO_MAP.get(jarName);
99+
if (pluginJarInfo != null) {
100+
pluginJarInfo.setIsEnable(Boolean.parseBoolean(dataRow.get("isEnableTableColumn")));
101+
}
102+
}
103+
104+
public void selectPluginAction() {
105+
pluginManageController.getPluginDataTableData().clear();
106+
String selectText = pluginManageController.getSelectPluginTextField().getText();
107+
for (Object json : jsonArray) {
108+
JSONObject data = (JSONObject) json;
109+
if (StringUtils.containsIgnoreCase(data.toString(),selectText)) {
110+
addDataRow(data);
111+
}
112+
}
113+
}
114+
115+
/*加载插件列表*/
116+
public static void reloadPluginJarList() {
117+
File systemPluginListfile = ConfigureUtil.getConfigureFile("system_plugin_list.json");
118+
if (systemPluginListfile.exists()) {
119+
try {
120+
List<PluginJarInfo> pluginJarInfoList = JSON.parseArray(FileUtils.readFileToString(systemPluginListfile, "utf-8"), PluginJarInfo.class);
121+
for (PluginJarInfo pluginJarInfo : pluginJarInfoList) {
122+
PLUGIN_JAR_INFO_MAP.put(pluginJarInfo.getJarName(), pluginJarInfo);
123+
}
124+
} catch (Exception e) {
125+
log.error("读取插件jar包配置文件失败:", e);
126+
}
127+
}
128+
}
129+
130+
/*保存插件列表*/
131+
public static void savePluginJarList() {
132+
File systemPluginListfile = ConfigureUtil.getConfigureFile("system_plugin_list.json");
133+
String systemPluginListString = JSON.toJSONString(PLUGIN_JAR_INFO_MAP.values());
134+
try {
135+
FileUtils.writeStringToFile(systemPluginListfile, systemPluginListString, "utf-8");
136+
} catch (Exception e) {
137+
log.error("保存插件jar包配置文件失败:", e);
138+
}
139+
}
140+
141+
142+
/**
143+
* 判断插件是否启用
144+
*/
145+
public static boolean getPluginJarIsEnable(String fileName) {
146+
String jarName = StringUtils.substring(fileName, 0, StringUtils.lastIndexOf(fileName, "-"));
147+
PluginJarInfo pluginJarInfo = PLUGIN_JAR_INFO_MAP.get(jarName);
148+
if (pluginJarInfo != null && !pluginJarInfo.getIsEnable()) {
149+
return false;
150+
}
151+
return true;
86152
}
87153
}

src/main/java/com/xwintop/xJavaFxTool/utils/JavaFxViewUtil.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,10 +398,14 @@ protected void updateItem(String item, boolean empty) {
398398
});
399399
}
400400

401+
public static void setTableColumnMapAsCheckBoxValueFactory(TableColumn tableColumn, String name) {
402+
setTableColumnMapAsCheckBoxValueFactory(tableColumn, name, null);
403+
}
404+
401405
/**
402406
* 初始化选择框表格属性
403407
*/
404-
public static void setTableColumnMapAsCheckBoxValueFactory(TableColumn tableColumn, String name) {
408+
public static void setTableColumnMapAsCheckBoxValueFactory(TableColumn tableColumn, String name, MouseEventCallFunc mouseEventCallFunc) {
405409
tableColumn.setCellValueFactory(new MapValueFactory(name));
406410
tableColumn.setCellFactory(
407411
new Callback<TableColumn<Map<String, String>, String>, TableCell<Map<String, String>, String>>() {
@@ -419,6 +423,9 @@ protected void updateItem(String item, boolean empty) {
419423
checkBox.setSelected(Boolean.valueOf(tableData.get(this.getIndex()).get(name)));
420424
checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> {
421425
tableData.get(this.getIndex()).put(name, newVal.toString());
426+
if (mouseEventCallFunc != null) {
427+
mouseEventCallFunc.callFun(null, this.getIndex());
428+
}
422429
});
423430
this.setGraphic(checkBox);
424431
}

src/main/java/com/xwintop/xJavaFxTool/utils/XJavaFxSystemUtil.java

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package com.xwintop.xJavaFxTool.utils;
22

3-
import com.alibaba.fastjson.JSON;
4-
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
53
import com.xwintop.xJavaFxTool.model.ToolFxmlLoaderConfiguration;
6-
import lombok.Getter;
7-
import lombok.Setter;
4+
import com.xwintop.xJavaFxTool.services.index.PluginManageService;
85
import lombok.extern.slf4j.Slf4j;
96
import org.apache.commons.beanutils.BeanUtils;
107
import org.apache.commons.configuration.PropertiesConfiguration;
118
import org.apache.commons.configuration.XMLConfiguration;
129
import org.apache.commons.configuration.tree.ConfigurationNode;
13-
import org.apache.commons.io.FileUtils;
1410
import org.apache.commons.lang3.StringUtils;
1511
import org.dom4j.Document;
1612
import org.dom4j.Element;
@@ -39,7 +35,6 @@
3935
*/
4036
@Slf4j
4137
public class XJavaFxSystemUtil {
42-
public final static Map<String, PluginJarInfo> pluginJarInfoMap = new HashMap<>();
4338

4439
/**
4540
* @Title: initSystemLocal
@@ -96,21 +91,28 @@ public static List<ToolFxmlLoaderConfiguration> loaderToolFxmlLoaderConfiguratio
9691
*/
9792
@SuppressWarnings({"unchecked", "resource"})
9893
public static List<ToolFxmlLoaderConfiguration> loaderPlugInToolFxmlLoaderConfiguration() {
99-
List<ToolFxmlLoaderConfiguration> toolList = new ArrayList<ToolFxmlLoaderConfiguration>();
94+
Map<String, ToolFxmlLoaderConfiguration> toolMap = new HashMap<>();
95+
List<ToolFxmlLoaderConfiguration> toolList = new ArrayList<>();
10096
try {
10197
File libPath = new File("libs/");
10298
// 获取所有的.jar和.zip文件
10399
File[] jarFiles = libPath.listFiles(new FilenameFilter() {
104100
@Override
105101
public boolean accept(File dir, String name) {
106-
return name.endsWith(".jar") || name.endsWith(".zip");
102+
return name.endsWith(".jar");
107103
}
108104
});
109105
if (jarFiles != null) {
110106
for (File file : jarFiles) {
107+
if (!PluginManageService.getPluginJarIsEnable(file.getName())) {
108+
continue;
109+
}
111110
JarFile jarFile = new JarFile(file);
112111
try {
113112
JarEntry entry = jarFile.getJarEntry("config/toolFxmlLoaderConfiguration.xml");
113+
if (entry == null) {
114+
continue;
115+
}
114116
InputStream input = jarFile.getInputStream(entry);
115117
SAXReader saxReader = new SAXReader();
116118
Document document = saxReader.read(input);
@@ -131,12 +133,17 @@ public boolean accept(File dir, String name) {
131133
if (StringUtils.isEmpty(toolFxmlLoaderConfiguration.getMenuParentId())) {
132134
toolFxmlLoaderConfiguration.setMenuParentId("moreToolsMenu");
133135
}
134-
toolList.add(toolFxmlLoaderConfiguration);
136+
if (toolFxmlLoaderConfiguration.getIsMenu()) {
137+
toolMap.putIfAbsent(toolFxmlLoaderConfiguration.getMenuId(), toolFxmlLoaderConfiguration);
138+
} else {
139+
toolList.add(toolFxmlLoaderConfiguration);
140+
}
135141
}
136142
} finally {
137143
jarFile.close();
138144
}
139145
}
146+
toolList.addAll(toolMap.values());
140147
}
141148
} catch (Exception e) {
142149
log.error("加载libs下jar包中工具配置失败", e);
@@ -149,14 +156,8 @@ public boolean accept(File dir, String name) {
149156
* @Description: 添加libs中jar包到系统中
150157
*/
151158
public static void addJarByLibs() {
152-
File systemPluginListfile = ConfigureUtil.getConfigureFile("system_plugin_list.json");
159+
PluginManageService.reloadPluginJarList();
153160
try {
154-
if (systemPluginListfile.exists()) {
155-
List<PluginJarInfo> pluginJarInfoList = JSON.parseArray(FileUtils.readFileToString(systemPluginListfile, "utf-8"), PluginJarInfo.class);
156-
for (PluginJarInfo pluginJarInfo : pluginJarInfoList) {
157-
pluginJarInfoMap.put(pluginJarInfo.getJarName(), pluginJarInfo);
158-
}
159-
}
160161
// 系统类库路径
161162
File libPath = new File("libs/");
162163
// 获取所有的.jar和.zip文件
@@ -178,10 +179,7 @@ public boolean accept(File dir, String name) {
178179
// 获取系统类加载器
179180
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
180181
for (File file : jarFiles) {
181-
String fileName = file.getName();
182-
String jarName = StringUtils.substring(fileName, 0, StringUtils.lastIndexOf(fileName, "-"));
183-
PluginJarInfo pluginJarInfo = pluginJarInfoMap.get(jarName);
184-
if (pluginJarInfo != null && !pluginJarInfo.getIsEnable()) {
182+
if (!PluginManageService.getPluginJarIsEnable(file.getName())) {
185183
continue;
186184
}
187185
URL url = file.toURI().toURL();

0 commit comments

Comments
 (0)