Skip to content

Commit 6595021

Browse files
committed
implemented auto-finding available controls.
1 parent b2cc9a3 commit 6595021

13 files changed

Lines changed: 197 additions & 95 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ dependencies {
5858
compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.7-M5'
5959

6060
compile 'com.github.JavaSaBr:RlibFX:4.1.2'
61-
compile 'com.github.JavaSaBr:RLib:6.3.2'
61+
compile 'com.github.JavaSaBr:RLib:6.3.4'
6262
compile 'com.github.JavaSaBr:JME3-JFX:1.6.0'
6363

6464
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

src/main/java/com/ss/editor/JFXApplication.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,11 @@ public static void main(final String[] args) throws IOException {
143143
return;
144144
}
145145

146+
InitializeManager.register(ClasspathManager.class);
146147
InitializeManager.register(ResourceManager.class);
147148
InitializeManager.register(JavaFXImageManager.class);
148149
InitializeManager.register(FileIconManager.class);
149150
InitializeManager.register(WorkspaceManager.class);
150-
InitializeManager.register(CustomClasspathManager.class);
151151
InitializeManager.register(PluginManager.class);
152152
InitializeManager.initialize();
153153

src/main/java/com/ss/editor/manager/CustomClasspathManager.java renamed to src/main/java/com/ss/editor/manager/ClasspathManager.java

Lines changed: 119 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import com.ss.editor.FileExtensions;
77
import com.ss.editor.annotation.FromAnyThread;
88
import com.ss.editor.config.EditorConfig;
9+
import com.ss.rlib.classpath.ClassPathScanner;
10+
import com.ss.rlib.classpath.ClassPathScannerFactory;
911
import com.ss.rlib.manager.InitializeManager;
12+
import com.ss.rlib.plugin.PluginContainer;
1013
import com.ss.rlib.util.FileUtils;
1114
import com.ss.rlib.util.Utils;
1215
import com.ss.rlib.util.array.Array;
@@ -19,13 +22,14 @@
1922
import java.nio.file.DirectoryStream;
2023
import java.nio.file.Files;
2124
import java.nio.file.Path;
25+
import java.nio.file.Paths;
2226

2327
/**
24-
* The class to manage custom classpath.
28+
* The class to manage classpath.
2529
*
2630
* @author JavaSaBr
2731
*/
28-
public class CustomClasspathManager {
32+
public class ClasspathManager {
2933

3034
@NotNull
3135
private static final EditorConfig EDITOR_CONFIG = EditorConfig.getInstance();
@@ -34,22 +38,37 @@ public class CustomClasspathManager {
3438
private static final String[] JAR_EXTENSIONS = toArray(FileExtensions.JAVA_LIBRARY);
3539

3640
@NotNull
37-
private static final String[] CLASSES_EXTENSIONS = toArray(FileExtensions.JAVA_CLASS);
41+
public static final Array<String> CORE_LIBRARIES_NAMES = ArrayFactory.asArray(
42+
"jme3-core", "jme3-terrain", "jme3-effects",
43+
"jme3-testdata", "jme3-plugins", "tonegod"
44+
);
3845

3946
@Nullable
40-
private static CustomClasspathManager instance;
47+
private static ClasspathManager instance;
4148

4249
/**
4350
* Gets instance.
4451
*
4552
* @return the instance
4653
*/
4754
@NotNull
48-
public static CustomClasspathManager getInstance() {
49-
if (instance == null) instance = new CustomClasspathManager();
55+
public static ClasspathManager getInstance() {
56+
if (instance == null) instance = new ClasspathManager();
5057
return instance;
5158
}
5259

60+
/**
61+
* The core classpath scanner.
62+
*/
63+
@NotNull
64+
private final ClassPathScanner coreScanner;
65+
66+
/**
67+
* The custom classpath scanner.
68+
*/
69+
@Nullable
70+
private volatile ClassPathScanner customScanner;
71+
5372
/**
5473
* The libraries class loader.
5574
*/
@@ -62,20 +81,86 @@ public static CustomClasspathManager getInstance() {
6281
@Nullable
6382
private volatile URLClassLoader classesLoader;
6483

65-
66-
private CustomClasspathManager() {
84+
private ClasspathManager() {
6785
InitializeManager.valid(getClass());
6886

87+
coreScanner = ClassPathScannerFactory.newManifestScanner(Editor.class, "Class-Path");
88+
coreScanner.setUseSystemClasspath(true);
89+
coreScanner.scan(path -> {
90+
91+
if (CORE_LIBRARIES_NAMES.search(path, (pattern, pth) -> pth.contains(pattern)) == null) {
92+
return false;
93+
} else if (path.contains("natives")) {
94+
return false;
95+
} else if (path.contains("sources") || path.contains("javadoc")) {
96+
return false;
97+
}
98+
99+
return true;
100+
});
101+
69102
final ExecutorManager executorManager = ExecutorManager.getInstance();
70-
executorManager.addJMETask(this::updateLibraries);
71-
executorManager.addJMETask(this::updateClasses);
103+
executorManager.addJMETask(this::reload);
104+
}
105+
106+
/**
107+
* Get all available resources from classpath.
108+
*
109+
* @return the list of resources.
110+
*/
111+
@NotNull
112+
public Array<String> getAllResources() {
113+
final Array<String> result = ArrayFactory.newArray(String.class);
114+
coreScanner.getAllResources(result);
115+
return result;
116+
}
117+
118+
/**
119+
* Reload custom classes and libraries.
120+
*/
121+
public synchronized void reload() {
122+
updateLibraries();
123+
updateClasses();
124+
125+
final URLClassLoader librariesLoader = getLibrariesLoader();
126+
final URLClassLoader classesLoader = getClassesLoader();
127+
final ClassLoader classLoader = classesLoader == null ? librariesLoader : classesLoader;
128+
129+
final ClassPathScanner scanner = classesLoader == null ? ClassPathScannerFactory.newDefaultScanner() :
130+
ClassPathScannerFactory.newDefaultScanner(classLoader);
131+
132+
if (librariesLoader == null && classesLoader == null) {
133+
this.customScanner = scanner;
134+
return;
135+
}
136+
137+
final Array<URL> urls = ArrayFactory.newArray(URL.class);
138+
139+
if (librariesLoader != null) {
140+
urls.addAll(librariesLoader.getURLs());
141+
}
142+
143+
if (classesLoader != null) {
144+
urls.addAll(classesLoader.getURLs());
145+
}
146+
147+
final String[] paths = urls.stream().map(url -> Utils.get(url, URL::toURI))
148+
.map(Paths::get)
149+
.map(Path::toString)
150+
.toArray(String[]::new);
151+
152+
scanner.addAdditionalPaths(paths);
153+
scanner.setUseSystemClasspath(false);
154+
scanner.scan(path -> true);
155+
156+
this.customScanner = scanner;
72157
}
73158

74159
/**
75160
* Update libraries loader.
76161
*/
77162
@FromAnyThread
78-
public synchronized void updateLibraries() {
163+
private void updateLibraries() {
79164

80165
final Editor editor = Editor.getInstance();
81166
final AssetManager assetManager = editor.getAssetManager();
@@ -104,7 +189,7 @@ public synchronized void updateLibraries() {
104189
* Update compiled classes loader.
105190
*/
106191
@FromAnyThread
107-
public synchronized void updateClasses() {
192+
private void updateClasses() {
108193

109194
final Editor editor = Editor.getInstance();
110195
final AssetManager assetManager = editor.getAssetManager();
@@ -178,4 +263,26 @@ private void setClassesLoader(@Nullable final URLClassLoader classesLoader) {
178263
private URLClassLoader getClassesLoader() {
179264
return classesLoader;
180265
}
266+
267+
/**
268+
* Find all implementations of the interface class.
269+
*
270+
* @return the list of all available implementations.
271+
*/
272+
@NotNull
273+
public <T> Array<Class<T>> findImplements(@NotNull final Class<T> interfaceClass) {
274+
275+
final Array<Class<T>> result = ArrayFactory.newArray(Class.class);
276+
277+
coreScanner.findImplements(result, interfaceClass);
278+
customScanner.findImplements(result, interfaceClass);
279+
280+
final PluginManager pluginManager = PluginManager.getInstance();
281+
pluginManager.handlePlugins(plugin -> {
282+
final PluginContainer container = plugin.getContainer();
283+
container.getScanner().findImplements(result, interfaceClass);
284+
});
285+
286+
return result;
287+
}
181288
}

src/main/java/com/ss/editor/manager/ResourceManager.java

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import com.ss.editor.ui.event.impl.*;
2525
import com.ss.editor.util.SimpleFileVisitor;
2626
import com.ss.editor.util.SimpleFolderVisitor;
27-
import com.ss.rlib.classpath.ClassPathScanner;
28-
import com.ss.rlib.classpath.ClassPathScannerFactory;
2927
import com.ss.rlib.concurrent.util.ThreadUtils;
3028
import com.ss.rlib.logging.Logger;
3129
import com.ss.rlib.logging.LoggerManager;
@@ -138,42 +136,22 @@ public static ResourceManager getInstance() {
138136
@NotNull
139137
private final Array<WatchKey> watchKeys;
140138

141-
/**
142-
* The classpath scanner.
143-
*/
144-
@NotNull
145-
private final ClassPathScanner classPathScanner;
146-
147139
/**
148140
* Instantiates a new Resource manager.
149141
*/
150142
private ResourceManager() {
151143
InitializeManager.valid(getClass());
152144

145+
final ClasspathManager classpathManager = ClasspathManager.getInstance();
146+
153147
this.assetCacheTable = DictionaryFactory.newObjectDictionary();
154148
this.additionalEnvs = ArrayFactory.newArray(Path.class);
155149
this.watchKeys = ArrayFactory.newArray(WatchKey.class);
156150
this.classLoaders = ArrayFactory.newArray(URLClassLoader.class);
157-
this.resourcesInClasspath = ArrayFactory.newArray(String.class);
151+
this.resourcesInClasspath = classpathManager.getAllResources();
158152
this.materialDefinitionsInClasspath = ArrayFactory.newArray(String.class);
159153
this.materialDefinitions = ArrayFactory.newArray(String.class);
160154

161-
classPathScanner = ClassPathScannerFactory.newManifestScanner(Editor.class, "Class-Path");
162-
classPathScanner.setUseSystemClasspath(true);
163-
classPathScanner.scan(path -> {
164-
165-
if (!(path.contains("jme3-core") || path.contains("jme3-effects") || path.contains("tonegod"))) {
166-
return false;
167-
} else if (path.contains("natives")) {
168-
return false;
169-
} else if (path.contains("sources") || path.contains("javadoc")) {
170-
return false;
171-
}
172-
173-
return true;
174-
});
175-
176-
classPathScanner.getAllResources(resourcesInClasspath);
177155
prepareClasspathResources();
178156

179157
final ExecutorManager executorManager = ExecutorManager.getInstance();
@@ -195,17 +173,6 @@ private ResourceManager() {
195173
start();
196174
}
197175

198-
/**
199-
* Get a classpath scanner.
200-
*
201-
* @return the classpath scanner.
202-
*/
203-
@NotNull
204-
@FromAnyThread
205-
public ClassPathScanner getClassPathScanner() {
206-
return classPathScanner;
207-
}
208-
209176
@Override
210177
@FromAnyThread
211178
public synchronized void assetLoaded(@NotNull final AssetKey key) {

src/main/java/com/ss/editor/plugin/EditorPlugin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,10 @@ public void onAfterCreateJavaFXContext(@NotNull final PluginSystem pluginSystem)
136136
@FXThread
137137
public void onFinishLoading(@NotNull final PluginSystem pluginSystem) {
138138
}
139+
140+
@NotNull
141+
@Override
142+
public PluginContainer getContainer() {
143+
return super.getContainer();
144+
}
139145
}

src/main/java/com/ss/editor/ui/component/bar/action/UpdateClasspathAndAssetCacheAction.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.jme3.asset.AssetManager;
44
import com.ss.editor.Editor;
55
import com.ss.editor.Messages;
6-
import com.ss.editor.manager.CustomClasspathManager;
6+
import com.ss.editor.manager.ClasspathManager;
77
import com.ss.editor.manager.ExecutorManager;
88
import javafx.scene.control.MenuItem;
99

@@ -27,13 +27,13 @@ public UpdateClasspathAndAssetCacheAction() {
2727
*/
2828
private void process() {
2929
ExecutorManager.getInstance().addJMETask(() -> {
30+
31+
final ClasspathManager classpathManager = ClasspathManager.getInstance();
32+
classpathManager.reload();
33+
3034
final Editor editor = Editor.getInstance();
3135
final AssetManager assetManager = editor.getAssetManager();
3236
assetManager.clearCache();
33-
34-
final CustomClasspathManager classpathManager = CustomClasspathManager.getInstance();
35-
classpathManager.updateLibraries();
36-
classpathManager.updateClasses();
3737
});
3838
}
3939
}

src/main/java/com/ss/editor/ui/control/model/node/control/ControlTreeNode.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.ss.editor.ui.control.model.node.control;
22

33
import com.jme3.scene.control.Control;
4+
import com.ss.editor.extension.Named;
5+
import com.ss.editor.extension.scene.control.EditableControl;
46
import com.ss.editor.ui.Icons;
57
import com.ss.editor.ui.control.model.tree.action.RemoveControlAction;
68
import com.ss.editor.ui.control.tree.NodeTree;
79
import com.ss.editor.ui.control.tree.node.TreeNode;
8-
import com.ss.editor.extension.scene.control.EditableControl;
9-
10-
import org.jetbrains.annotations.NotNull;
11-
import org.jetbrains.annotations.Nullable;
12-
1310
import javafx.collections.ObservableList;
1411
import javafx.scene.control.MenuItem;
1512
import javafx.scene.image.Image;
13+
import org.jetbrains.annotations.NotNull;
14+
import org.jetbrains.annotations.Nullable;
1615

1716
/**
1817
* The implementation of the {@link TreeNode} to show a {@link Control} in the tree.
@@ -62,6 +61,8 @@ public String getName() {
6261

6362
if (element instanceof EditableControl) {
6463
return ((EditableControl) element).getName();
64+
} else if (element instanceof Named) {
65+
return ((Named) element).getName();
6566
}
6667

6768
return element.getClass().getSimpleName();

0 commit comments

Comments
 (0)