From ebf6555619ae66b2ad423fdae8fc3c9cecd49991 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Wed, 1 Feb 2023 20:21:59 +0200 Subject: [PATCH 1/2] Fix NPE and reduce nesting --- .../gde/core/assets/ProjectAssetManager.java | 147 ++++++++++-------- 1 file changed, 79 insertions(+), 68 deletions(-) diff --git a/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java b/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java index 0c358cca4..daad3f6f0 100644 --- a/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java +++ b/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java @@ -157,79 +157,90 @@ private void clearClassLoader() { private void loadClassLoader() { Sources sources = ProjectUtils.getSources(project); - if (sources != null) { - if (loader != null) { - removeClassLoader(loader); + if (sources == null) { + return; + } + + if (loader != null) { + removeClassLoader(loader); + } + SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + List urls = new LinkedList(); + for (SourceGroup sourceGroup : groups) { + ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE); + if (path == null) { + continue; } - SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); - List urls = new LinkedList(); - for (SourceGroup sourceGroup : groups) { - ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE); - if (path != null) { - classPaths.add(path); - path.addPropertyChangeListener(classPathListener); - FileObject[] roots = path.getRoots(); - for (FileObject fileObject : roots) { - if (!fileObject.equals(getAssetFolder())) { - fileObject.addRecursiveListener(listener); - logger.log(Level.FINE, "Add classpath:{0}", fileObject); - classPathItems.add(new ClassPathItem(fileObject, listener)); - urls.add(fileObject.toURL()); - } - if (fileObject.toURL().toExternalForm().startsWith("jar")) { - logger.log(Level.FINE, "Add locator:{0}", fileObject.toURL()); - jarItems.add(fileObject); - registerLocator(fileObject.toURL().toExternalForm(), - "com.jme3.asset.plugins.UrlLocator"); - } - } + + classPaths.add(path); + path.addPropertyChangeListener(classPathListener); + FileObject[] roots = path.getRoots(); + for (FileObject fileObject : roots) { + if (!fileObject.equals(getAssetFolder())) { + fileObject.addRecursiveListener(listener); + logger.log(Level.FINE, "Add classpath:{0}", fileObject); + classPathItems.add(new ClassPathItem(fileObject, listener)); + urls.add(fileObject.toURL()); + } + if (fileObject.toURL().toExternalForm().startsWith("jar")) { + logger.log(Level.FINE, "Add locator:{0}", fileObject.toURL()); + jarItems.add(fileObject); + registerLocator(fileObject.toURL().toExternalForm(), + "com.jme3.asset.plugins.UrlLocator"); } } - - // Gradle - FileObject rootDir = FileUtil.toFileObject(GradleBaseProject.get(project).getRootDir()); - Set runtimeFiles = new HashSet<>(); - try { - Project rootPrj = ProjectManager.getDefault().findProject(rootDir); - GradleJavaProject rootGjp = GradleJavaProject.get(rootPrj); - for(GradleJavaSourceSet sourceSet : rootGjp.getSourceSets().values()) { - if(sourceSet.getName().equals("main")) { - runtimeFiles = sourceSet.getRuntimeClassPath(); - } - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } catch (IllegalArgumentException ex) { - Exceptions.printStackTrace(ex); + } + + // Gradle + GradleBaseProject gradleProject = GradleBaseProject.get(project); + if (gradleProject == null) { + + // Not a Gradle project + return; + } + + FileObject rootDir = FileUtil.toFileObject(gradleProject.getRootDir()); + Set runtimeFiles = new HashSet<>(); + try { + Project rootPrj = ProjectManager.getDefault().findProject(rootDir); + GradleJavaProject rootGjp = GradleJavaProject.get(rootPrj); + for (GradleJavaSourceSet sourceSet : rootGjp.getSourceSets().values()) { + if (sourceSet.getName().equals("main")) { + runtimeFiles = sourceSet.getRuntimeClassPath(); + } } - - for(File file : runtimeFiles) { - // logger.info(file.getName() + " : " + file.getAbsolutePath()); - FileObject fo = FileUtil.toFileObject(file); - if(fo != null && !fo.isFolder()) { - logger.info(fo.toURL().toExternalForm()); - if (!fo.equals(getAssetFolder())) { - fo.addRecursiveListener(listener); - logger.log(Level.FINE, "Add classpath:{0}", fo); - classPathItems.add(new ClassPathItem(fo, listener)); - urls.add(fo.toURL()); - } - if (fo.toURL().toExternalForm().startsWith("jar")) { - logger.log(Level.FINE, "Add Gradle locator:{0}", fo.toURL()); - jarItems.add(fo); - registerLocator(fo.toURL().toExternalForm(), - "com.jme3.asset.plugins.UrlLocator"); - } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } catch (IllegalArgumentException ex) { + Exceptions.printStackTrace(ex); + } + + for (File file : runtimeFiles) { + // logger.info(file.getName() + " : " + file.getAbsolutePath()); + FileObject fo = FileUtil.toFileObject(file); + if (fo != null && !fo.isFolder()) { + logger.info(fo.toURL().toExternalForm()); + if (!fo.equals(getAssetFolder())) { + fo.addRecursiveListener(listener); + logger.log(Level.FINE, "Add classpath:{0}", fo); + classPathItems.add(new ClassPathItem(fo, listener)); + urls.add(fo.toURL()); + } + if (fo.toURL().toExternalForm().startsWith("jar")) { + logger.log(Level.FINE, "Add Gradle locator:{0}", fo.toURL()); + jarItems.add(fo); + registerLocator(fo.toURL().toExternalForm(), + "com.jme3.asset.plugins.UrlLocator"); } - - } - - loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader()); - addClassLoader(loader); - logger.log(Level.FINE, "Updated {0} classpath entries and {1} url locators for project {2}", new Object[]{classPathItems.size(), jarItems.size(), project.toString()}); + } + + loader = new URLClassLoader(urls.toArray(URL[]::new), getClass().getClassLoader()); + addClassLoader(loader); + logger.log(Level.FINE, "Updated {0} classpath entries and {1} url locators for project {2}", new Object[]{classPathItems.size(), jarItems.size(), project.toString()}); } + FileChangeListener listener = new FileChangeListener() { public void fileFolderCreated(FileEvent fe) { fireChange(fe); @@ -258,6 +269,7 @@ private void fireChange(FileEvent fe) { updateClassLoader(); } }; + private PropertyChangeListener classPathListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { logger.log(Level.FINE, "Classpath event: {0}", evt); @@ -349,9 +361,8 @@ public FileObject getAssetFileObject(String name) { } synchronized (classPathItems) { // TODO I need to find out if classPathItems contains all jars added to a project - Iterator classPathItemsIter = classPathItems.iterator(); - while (classPathItemsIter.hasNext()) { - ClassPathItem classPathItem = classPathItemsIter.next(); + + for (ClassPathItem classPathItem : classPathItems) { FileObject jarFile = classPathItem.object; Enumeration jarEntry = (Enumeration) jarFile.getChildren(true); From d7425be33c2966d64aab77779d1082a751d99bb3 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Thu, 2 Feb 2023 22:21:10 +0200 Subject: [PATCH 2/2] Classloader should be added despite being a non-Gradle project --- .../gde/core/assets/ProjectAssetManager.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java b/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java index daad3f6f0..260d39c33 100644 --- a/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java +++ b/jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java @@ -165,7 +165,7 @@ private void loadClassLoader() { removeClassLoader(loader); } SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); - List urls = new LinkedList(); + List urls = new LinkedList<>(); for (SourceGroup sourceGroup : groups) { ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE); if (path == null) { @@ -191,11 +191,18 @@ private void loadClassLoader() { } } - // Gradle + loadGradleClassLoader(urls); + + loader = new URLClassLoader(urls.toArray(URL[]::new), getClass().getClassLoader()); + addClassLoader(loader); + logger.log(Level.FINE, "Updated {0} classpath entries and {1} url locators for project {2}", new Object[]{classPathItems.size(), jarItems.size(), project.toString()}); + } + + private void loadGradleClassLoader(List urls) { GradleBaseProject gradleProject = GradleBaseProject.get(project); if (gradleProject == null) { - // Not a Gradle project + // Ant, Maven etc. project return; } @@ -233,12 +240,7 @@ private void loadClassLoader() { "com.jme3.asset.plugins.UrlLocator"); } } - } - - loader = new URLClassLoader(urls.toArray(URL[]::new), getClass().getClassLoader()); - addClassLoader(loader); - logger.log(Level.FINE, "Updated {0} classpath entries and {1} url locators for project {2}", new Object[]{classPathItems.size(), jarItems.size(), project.toString()}); } FileChangeListener listener = new FileChangeListener() {