Skip to content

Commit db4d548

Browse files
committed
1.添加加载项目子module插件功能
1 parent 1ee0114 commit db4d548

4 files changed

Lines changed: 88 additions & 4 deletions

File tree

littleTools/x-ImageTool/src/main/resources/config/toolFxmlLoaderConfiguration.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<resourceBundleName>locale.ImageTool</resourceBundleName>
77
<className></className>
88
<title>Title</title>
9-
<iconPath>/images/ImageToolIcon.png</iconPath>
9+
<iconPath>/images/ImageToolIcon.png</iconPath>
1010
<isDefaultShow></isDefaultShow>
1111
<menuId></menuId>
1212
<menuParentId>p-littleTools</menuParentId>

xJavaFxTool/src/main/java/com/xwintop/xJavaFxTool/controller/IndexController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private void initEvent() {
9393

9494
private void initService() {
9595
PluginManager pluginManager = PluginManager.getInstance();
96+
pluginManager.loadDevPluginConfiguration();
9697
pluginManager.loadLocalDevPluginConfiguration();
9798
loadPlugins(); // 加载插件列表到界面上
9899
AppEvents.addEventHandler(PluginEvent.PLUGIN_DOWNLOADED, pluginEvent -> loadPlugins());
@@ -112,6 +113,7 @@ public void loadPlugins() {
112113
pluginManager.loadLocalPlugins();
113114
pluginManager.getEnabledPluginList().forEach(this::loadPlugin);
114115
pluginManager.getDevPluginList().forEach(this::loadPlugin);
116+
pluginManager.getLocalDevPluginList().forEach(this::loadPlugin);
115117
}
116118

117119
/**
@@ -135,8 +137,8 @@ private void loadPlugin(PluginJarInfo jarInfo) {
135137
}
136138
String categoryName = jarInfo.getIsFavorite() ? FAVORITE_CATEGORY_NAME : XJavaFxToolApplication.RESOURCE_BUNDLE.getString(menuParentTitle);
137139
PluginCategoryController category = categoryControllers.computeIfAbsent(
138-
categoryName, __ -> {
139-
PluginCategoryController _category = PluginCategoryController.newInstance(categoryName);
140+
categoryName, key -> {
141+
PluginCategoryController _category = PluginCategoryController.newInstance(key);
140142
addCategory(_category);
141143
return _category;
142144
}

xJavaFxTool/src/main/java/com/xwintop/xJavaFxTool/plugin/PluginManager.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
import lombok.Data;
66
import lombok.extern.slf4j.Slf4j;
77
import org.apache.commons.io.FileUtils;
8+
import org.apache.commons.lang3.StringUtils;
89

910
import java.io.File;
1011
import java.io.IOException;
12+
import java.net.URL;
1113
import java.nio.charset.StandardCharsets;
1214
import java.nio.file.Files;
1315
import java.nio.file.Path;
1416
import java.nio.file.Paths;
1517
import java.util.ArrayList;
18+
import java.util.Enumeration;
1619
import java.util.List;
1720
import java.util.Objects;
1821
import java.util.stream.Collectors;
@@ -35,6 +38,8 @@ public static PluginManager getInstance() {
3538

3639
private final List<PluginJarInfo> devPluginList = new ArrayList<>(); // dev插件列表
3740

41+
private final List<PluginJarInfo> localDevPluginList = new ArrayList<>(); // 本地开发插件列表
42+
3843
public PluginManager() {
3944
this.loadLocalPluginConfiguration();
4045
}
@@ -68,7 +73,8 @@ private void loadLocalPluginConfiguration() {
6873
}
6974
}
7075

71-
public void loadLocalDevPluginConfiguration() {
76+
//加载开发libs包中插件
77+
public void loadDevPluginConfiguration() {
7278
try {
7379
// 系统类库路径
7480
File libPath = new File("devLibs/");
@@ -93,6 +99,33 @@ public void loadLocalDevPluginConfiguration() {
9399
}
94100
}
95101

102+
//加载本地开发插件
103+
public void loadLocalDevPluginConfiguration() {
104+
try {
105+
ClassLoader classLoader = getClass().getClassLoader();
106+
Enumeration<URL> urlEnumeration = classLoader.getResources("config/toolFxmlLoaderConfiguration.xml");
107+
while (urlEnumeration.hasMoreElements()) {
108+
URL url = urlEnumeration.nextElement();
109+
System.out.println(url.getPath());
110+
if(url.getPath().endsWith("x-ImageTool/out/production/resources/config/toolFxmlLoaderConfiguration.xml")) {
111+
System.out.println(FileUtils.readFileToString(new File(url.getFile())));
112+
try {
113+
PluginJarInfo plugin = new PluginJarInfo();
114+
plugin.setLocalPath(StringUtils.removeEnd(url.getPath(),"/config/toolFxmlLoaderConfiguration.xml"));
115+
plugin.setIsEnable(true);
116+
plugin.setIsDownload(true);
117+
PluginParser.parse(url, plugin);
118+
localDevPluginList.add(plugin);
119+
} catch (Exception e) {
120+
log.error("解析失败", e);
121+
}
122+
}
123+
}
124+
} catch (Exception e) {
125+
log.error("添加libs中jar包到系统中异常:", e);
126+
}
127+
}
128+
96129
/**
97130
* 解析本地插件文件
98131
*/
@@ -105,6 +138,7 @@ public void loadLocalPlugins() {
105138
PluginParser.initParse(pluginFile, plugin);
106139
} catch (Exception e) {
107140
log.error("解析失败", e);
141+
removeList.add(plugin);
108142
}
109143
} else {
110144
removeList.add(plugin);

xJavaFxTool/src/main/java/com/xwintop/xJavaFxTool/plugin/PluginParser.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.io.File;
1515
import java.io.IOException;
1616
import java.io.InputStream;
17+
import java.net.URL;
1718
import java.util.HashMap;
1819
import java.util.List;
1920
import java.util.Map;
@@ -90,6 +91,53 @@ public static void parse(File pluginFile, PluginJarInfo pluginJarInfo, ClassLoad
9091
}
9192
}
9293

94+
public static void parse(URL pluginConfigUrl, PluginJarInfo pluginJarInfo) {
95+
try {
96+
File pluginConfigFile = new File(pluginConfigUrl.getFile());
97+
ClassLoader classLoader = PluginClassLoader.create(pluginConfigFile);
98+
// FileUtils.readFileToString(new File(url.getFile()));
99+
SAXReader saxReader = new SAXReader();
100+
Document document = saxReader.read(new File(pluginConfigUrl.getFile()));
101+
Element root = document.getRootElement();
102+
List<Element> menuElements = selectElements(root, "/root/ToolFxmlLoaderConfiguration[@isMenu='true']");
103+
Element pluginElement = selectSingleElement(root, "/root/ToolFxmlLoaderConfiguration[not(@isMenu)]");
104+
105+
Map<String, String> menuTitles = new HashMap<>();
106+
for (Element menuElement : menuElements) {
107+
menuTitles.put(menuElement.attributeValue("menuId"), menuElement.attributeValue("title"));
108+
}
109+
110+
String resourceBundleName = getChildNodeText(pluginElement, "resourceBundleName");
111+
String title = getTitleFromResourceBundle(new File(pluginJarInfo.getLocalPath()), classLoader, pluginElement, resourceBundleName);
112+
String menuId = getChildNodeText(pluginElement, "menuParentId");
113+
String url = getChildNodeText(pluginElement, "url");
114+
String controllerType = getChildNodeText(pluginElement, "controllerType");
115+
String menuTitle = menuTitles.get(menuId);
116+
117+
pluginJarInfo.setMenuParentId(menuId);
118+
pluginJarInfo.setMenuParentTitle(menuTitle);
119+
pluginJarInfo.setBundleName(resourceBundleName);
120+
pluginJarInfo.setControllerType(controllerType);
121+
pluginJarInfo.setTitle(title);
122+
pluginJarInfo.setIconPath(pluginElement.elementTextTrim("iconPath"));
123+
if (StringUtils.isNotBlank(pluginJarInfo.getIconPath())) {
124+
// Image iconImage = new Image(new FileInputStream(pluginJarInfo.getLocalPath() + pluginJarInfo.getIconPath()));
125+
Image iconImage = new Image(classLoader.getResourceAsStream(StringUtils.removeStart(pluginJarInfo.getIconPath(),"/")));
126+
pluginJarInfo.setIconImage(iconImage);
127+
}
128+
129+
if (controllerType.equals("Node")) {
130+
pluginJarInfo.setFxmlPath(url);
131+
} else if (controllerType.equals("WebView")) {
132+
pluginJarInfo.setPagePath(url);
133+
}
134+
135+
pluginJarInfo.setName(StringUtils.defaultString(pluginJarInfo.getName(), title));
136+
} catch (Exception e) {
137+
throw new AppException(e);
138+
}
139+
}
140+
93141
//简单解析插件信息
94142
public static void initParse(File pluginFile, PluginJarInfo pluginJarInfo) {
95143
try (JarFile jarFile = new JarFile(pluginFile)) {

0 commit comments

Comments
 (0)