2323import java .nio .file .Files ;
2424import java .nio .file .Path ;
2525import java .nio .file .Paths ;
26+ import java .util .EnumSet ;
27+ import java .util .Set ;
2628
2729/**
2830 * The class to manage classpath.
3133 */
3234public class ClasspathManager {
3335
36+ public enum Scope {
37+ CORE ,
38+ CUSTOM ,
39+ PLUGINS ,;
40+
41+ @ NotNull
42+ public static final Set <Scope > ONLY_CORE = EnumSet .of (CORE );
43+
44+ @ NotNull
45+ public static final Set <Scope > ALL = EnumSet .allOf (Scope .class );
46+ }
47+
3448 @ NotNull
3549 private static final EditorConfig EDITOR_CONFIG = EditorConfig .getInstance ();
3650
@@ -40,7 +54,7 @@ public class ClasspathManager {
4054 @ NotNull
4155 public static final Array <String > CORE_LIBRARIES_NAMES = ArrayFactory .asArray (
4256 "jme3-core" , "jme3-terrain" , "jme3-effects" ,
43- "jme3-testdata" , "jme3-plugins" , "tonegod"
57+ "jme3-testdata" , "jme3-plugins" , "tonegod" , "jmonkeybuilder"
4458 );
4559
4660 @ Nullable
@@ -88,7 +102,9 @@ private ClasspathManager() {
88102 coreScanner .setUseSystemClasspath (true );
89103 coreScanner .scan (path -> {
90104
91- if (CORE_LIBRARIES_NAMES .search (path , (pattern , pth ) -> pth .contains (pattern )) == null ) {
105+ if (Files .isDirectory (Paths .get (path ))) {
106+ return true ;
107+ } else if (CORE_LIBRARIES_NAMES .search (path , (pattern , pth ) -> pth .contains (pattern )) == null ) {
92108 return false ;
93109 } else if (path .contains ("natives" )) {
94110 return false ;
@@ -260,7 +276,6 @@ private void setClassesLoader(@Nullable final URLClassLoader classesLoader) {
260276 public @ Nullable URLClassLoader getClassesLoader () {
261277 return classesLoader ;
262278 }
263-
264279 /**
265280 * Find all implementations of the interface class.
266281 *
@@ -269,17 +284,47 @@ private void setClassesLoader(@Nullable final URLClassLoader classesLoader) {
269284 * @return the list of all available implementations.
270285 */
271286 public @ NotNull <T > Array <Class <T >> findImplements (@ NotNull final Class <T > interfaceClass ) {
287+ return findImplements (interfaceClass , Scope .ONLY_CORE );
288+ }
289+
290+ /**
291+ * Get the custom scanner.
292+ *
293+ * @return the custom scanner.
294+ */
295+ private @ Nullable ClassPathScanner getCustomScanner () {
296+ return customScanner ;
297+ }
298+
299+ /**
300+ * Find all implementations of the interface class.
301+ *
302+ * @param <T> the type of an interface.
303+ * @param interfaceClass the interface class.
304+ * @param scope the scope.
305+ * @return the list of all available implementations.
306+ */
307+ public @ NotNull <T > Array <Class <T >> findImplements (@ NotNull final Class <T > interfaceClass ,
308+ @ NotNull final Set <Scope > scope ) {
272309
273310 final Array <Class <T >> result = ArrayFactory .newArray (Class .class );
274311
275- coreScanner .findImplements (result , interfaceClass );
276- customScanner .findImplements (result , interfaceClass );
312+ if (scope .contains (Scope .CORE )) {
313+ coreScanner .findImplements (result , interfaceClass );
314+ }
277315
278- final PluginManager pluginManager = PluginManager .getInstance ();
279- pluginManager .handlePlugins (plugin -> {
280- final PluginContainer container = plugin .getContainer ();
281- container .getScanner ().findImplements (result , interfaceClass );
282- });
316+ final ClassPathScanner customScanner = getCustomScanner ();
317+ if (customScanner != null && scope .contains (Scope .CUSTOM )) {
318+ customScanner .findImplements (result , interfaceClass );
319+ }
320+
321+ if (scope .contains (Scope .PLUGINS )) {
322+ final PluginManager pluginManager = PluginManager .getInstance ();
323+ pluginManager .handlePlugins (plugin -> {
324+ final PluginContainer container = plugin .getContainer ();
325+ container .getScanner ().findImplements (result , interfaceClass );
326+ });
327+ }
283328
284329 return result ;
285330 }
0 commit comments