Skip to content

Fix NPE and reduce nesting #462

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 2, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 81 additions & 68 deletions jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -157,79 +157,92 @@ 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<URL> 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<URL> urls = new LinkedList<URL>();
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<File> 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);
}

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<URL> urls) {
GradleBaseProject gradleProject = GradleBaseProject.get(project);
if (gradleProject == null) {

// Ant, Maven etc. project
return;
}

FileObject rootDir = FileUtil.toFileObject(gradleProject.getRootDir());
Set<File> 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()});
}
}

FileChangeListener listener = new FileChangeListener() {
public void fileFolderCreated(FileEvent fe) {
fireChange(fe);
Expand Down Expand Up @@ -258,6 +271,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);
Expand Down Expand Up @@ -349,9 +363,8 @@ public FileObject getAssetFileObject(String name) {
}
synchronized (classPathItems) {
// TODO I need to find out if classPathItems contains all jars added to a project
Iterator<ClassPathItem> classPathItemsIter = classPathItems.iterator();
while (classPathItemsIter.hasNext()) {
ClassPathItem classPathItem = classPathItemsIter.next();

for (ClassPathItem classPathItem : classPathItems) {
FileObject jarFile = classPathItem.object;

Enumeration<FileObject> jarEntry = (Enumeration<FileObject>) jarFile.getChildren(true);
Expand Down