SDK:
- improve ProjectAssetManager classpath scanning and updating git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10078 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
e3236e20b4
commit
2c6e8cbb2a
@ -35,6 +35,8 @@ import com.jme3.asset.AssetEventListener;
|
|||||||
import com.jme3.asset.AssetKey;
|
import com.jme3.asset.AssetKey;
|
||||||
import com.jme3.asset.AssetManager;
|
import com.jme3.asset.AssetManager;
|
||||||
import com.jme3.asset.DesktopAssetManager;
|
import com.jme3.asset.DesktopAssetManager;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@ -64,6 +66,7 @@ import org.openide.filesystems.FileRenameEvent;
|
|||||||
import org.openide.filesystems.XMLFileSystem;
|
import org.openide.filesystems.XMLFileSystem;
|
||||||
import org.openide.util.Exceptions;
|
import org.openide.util.Exceptions;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
|
import org.openide.util.Mutex;
|
||||||
import org.openide.util.lookup.Lookups;
|
import org.openide.util.lookup.Lookups;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -78,8 +81,10 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
private final List<AssetEventListener> assetEventListeners = Collections.synchronizedList(new LinkedList<AssetEventListener>());
|
private final List<AssetEventListener> assetEventListeners = Collections.synchronizedList(new LinkedList<AssetEventListener>());
|
||||||
private final List<ClassPathChangeListener> classPathListeners = Collections.synchronizedList(new LinkedList<ClassPathChangeListener>());
|
private final List<ClassPathChangeListener> classPathListeners = Collections.synchronizedList(new LinkedList<ClassPathChangeListener>());
|
||||||
private URLClassLoader loader;
|
private URLClassLoader loader;
|
||||||
|
private final List<ClassPath> classPaths = Collections.synchronizedList(new LinkedList<ClassPath>());
|
||||||
|
private final List<ClassPathItem> classPathItems = Collections.synchronizedList(new LinkedList<ClassPathItem>());
|
||||||
private LinkedList<FileObject> jarItems = new LinkedList<FileObject>();
|
private LinkedList<FileObject> jarItems = new LinkedList<FileObject>();
|
||||||
private LinkedList<ClassPathItem> classPathItems = new LinkedList<ClassPathItem>();
|
private final Mutex mutex = new Mutex();
|
||||||
|
|
||||||
public ProjectAssetManager(Project prj, String folderName) {
|
public ProjectAssetManager(Project prj, String folderName) {
|
||||||
super(true);
|
super(true);
|
||||||
@ -88,11 +93,7 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
di.prepareManager(this);
|
di.prepareManager(this);
|
||||||
}
|
}
|
||||||
addFolderLocator(folderName);
|
addFolderLocator(folderName);
|
||||||
ProjectManager.mutex().postWriteRequest(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
updateClassLoader();
|
updateClassLoader();
|
||||||
}
|
|
||||||
});
|
|
||||||
prepAssetEventListeners();
|
prepAssetEventListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,17 +118,25 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void clearClassLoader() {
|
private void clearClassLoader() {
|
||||||
|
if (jarItems.isEmpty() && classPathItems.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Logger.getLogger(ProjectAssetManager.class.getName()).log(Level.INFO, "Clear {0} classpath entries and {1} url locators for project {2}", new Object[]{classPathItems.size(), jarItems.size(), project.toString()});
|
||||||
for (FileObject fileObject : jarItems) {
|
for (FileObject fileObject : jarItems) {
|
||||||
Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Remove locator:{0}", fileObject.toURL());
|
Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Remove locator:{0}", fileObject.toURL());
|
||||||
unregisterLocator(fileObject.toURL().toExternalForm(),
|
unregisterLocator(fileObject.toURL().toExternalForm(),
|
||||||
com.jme3.asset.plugins.UrlLocator.class);
|
com.jme3.asset.plugins.UrlLocator.class);
|
||||||
}
|
}
|
||||||
jarItems.clear();
|
jarItems.clear();
|
||||||
for (ClassPathItem fileObject : classPathItems) {
|
for (ClassPathItem fileObject : classPathItems) {
|
||||||
Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Remove classpath:{0}", fileObject.object);
|
Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Remove classpath:{0}", fileObject.object);
|
||||||
fileObject.object.removeRecursiveListener(fileObject.listener);
|
fileObject.object.removeRecursiveListener(fileObject.listener);
|
||||||
}
|
}
|
||||||
classPathItems.clear();
|
classPathItems.clear();
|
||||||
|
for (ClassPath classPath : classPaths) {
|
||||||
|
classPath.removePropertyChangeListener(classPathListener);
|
||||||
|
}
|
||||||
|
classPaths.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void loadClassLoader() {
|
private synchronized void loadClassLoader() {
|
||||||
@ -141,45 +150,18 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
for (SourceGroup sourceGroup : groups) {
|
for (SourceGroup sourceGroup : groups) {
|
||||||
ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE);
|
ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE);
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
|
classPaths.add(path);
|
||||||
|
path.addPropertyChangeListener(classPathListener);
|
||||||
FileObject[] roots = path.getRoots();
|
FileObject[] roots = path.getRoots();
|
||||||
for (FileObject fileObject : roots) {
|
for (FileObject fileObject : roots) {
|
||||||
if (!fileObject.equals(getAssetFolder())) {
|
if (!fileObject.equals(getAssetFolder())) {
|
||||||
FileChangeListener listener = new FileChangeListener() {
|
|
||||||
public void fileFolderCreated(FileEvent fe) {
|
|
||||||
// notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fileDataCreated(FileEvent fe) {
|
|
||||||
if (!fe.isExpected()) {
|
|
||||||
notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fileChanged(FileEvent fe) {
|
|
||||||
if (!fe.isExpected()) {
|
|
||||||
notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fileDeleted(FileEvent fe) {
|
|
||||||
// notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fileRenamed(FileRenameEvent fre) {
|
|
||||||
// notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fileAttributeChanged(FileAttributeEvent fae) {
|
|
||||||
// notifyClassPathListeners();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fileObject.addRecursiveListener(listener);
|
fileObject.addRecursiveListener(listener);
|
||||||
Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Add classpath:{0}", fileObject);
|
Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Add classpath:{0}", fileObject);
|
||||||
classPathItems.add(new ClassPathItem(fileObject, listener));
|
classPathItems.add(new ClassPathItem(fileObject, listener));
|
||||||
urls.add(fileObject.toURL());
|
urls.add(fileObject.toURL());
|
||||||
}
|
}
|
||||||
if (fileObject.toURL().toExternalForm().startsWith("jar")) {
|
if (fileObject.toURL().toExternalForm().startsWith("jar")) {
|
||||||
Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Add locator:{0}", fileObject.toURL());
|
Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Add locator:{0}", fileObject.toURL());
|
||||||
jarItems.add(fileObject);
|
jarItems.add(fileObject);
|
||||||
registerLocator(fileObject.toURL().toExternalForm(),
|
registerLocator(fileObject.toURL().toExternalForm(),
|
||||||
"com.jme3.asset.plugins.UrlLocator");
|
"com.jme3.asset.plugins.UrlLocator");
|
||||||
@ -189,13 +171,63 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
}
|
}
|
||||||
loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
|
loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
|
||||||
addClassLoader(loader);
|
addClassLoader(loader);
|
||||||
|
Logger.getLogger(ProjectAssetManager.class.getName()).log(Level.INFO, "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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fileDataCreated(FileEvent fe) {
|
||||||
|
fireChange(fe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fileChanged(FileEvent fe) {
|
||||||
|
fireChange(fe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fileDeleted(FileEvent fe) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fileRenamed(FileRenameEvent fe) {
|
||||||
|
fireChange(fe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fileAttributeChanged(FileAttributeEvent fae) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fireChange(FileEvent fe) {
|
||||||
|
Logger.getLogger(ProjectAssetManager.class.getName()).log(Level.FINE, "Classpath item changed: {0}", fe);
|
||||||
|
// if (!fe.isExpected()) {
|
||||||
|
updateClassLoader();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private PropertyChangeListener classPathListener = new PropertyChangeListener() {
|
||||||
|
public void propertyChange(PropertyChangeEvent evt) {
|
||||||
|
Logger.getLogger(ProjectAssetManager.class.getName()).log(Level.FINE, "Classpath event: {0}", evt);
|
||||||
|
if (ClassPath.PROP_ROOTS.equals(evt.getPropertyName())) {
|
||||||
|
updateClassLoader();
|
||||||
|
} else if (ClassPath.PROP_ENTRIES.equals(evt.getPropertyName())) {
|
||||||
|
updateClassLoader();
|
||||||
|
} else if (ClassPath.PROP_INCLUDES.equals(evt.getPropertyName())) {
|
||||||
|
updateClassLoader();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private synchronized void updateClassLoader() {
|
private synchronized void updateClassLoader() {
|
||||||
|
ProjectManager.mutex().postWriteRequest(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
synchronized (classPathItems) {
|
||||||
clearClassLoader();
|
clearClassLoader();
|
||||||
loadClassLoader();
|
loadClassLoader();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
notifyClassPathListeners();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAssetEventListener(AssetEventListener listener) {
|
public void setAssetEventListener(AssetEventListener listener) {
|
||||||
@ -338,6 +370,7 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (classPathItems != null) {
|
if (classPathItems != null) {
|
||||||
|
synchronized (classPathItems) {
|
||||||
// TODO I need to find out if classPathItems contains all jars added to a project
|
// TODO I need to find out if classPathItems contains all jars added to a project
|
||||||
Iterator<ClassPathItem> classPathItemsIter = classPathItems.iterator();
|
Iterator<ClassPathItem> classPathItemsIter = classPathItems.iterator();
|
||||||
while (classPathItemsIter.hasNext()) {
|
while (classPathItemsIter.hasNext()) {
|
||||||
@ -356,13 +389,14 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return list.toArray(new String[list.size()]);
|
return list.toArray(new String[list.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InputStream getResourceAsStream(String name) {
|
public InputStream getResourceAsStream(String name) {
|
||||||
InputStream in = null;//JmeSystem.getResourceAsStream(name);
|
InputStream in = null;//JmeSystem.getResourceAsStream(name);
|
||||||
|
synchronized (classPathItems) {
|
||||||
if (in == null && classPathItems != null) {
|
if (in == null && classPathItems != null) {
|
||||||
// TODO I need to find out if classPathItems contains all jars added to a project
|
// TODO I need to find out if classPathItems contains all jars added to a project
|
||||||
Iterator<ClassPathItem> classPathItemsIter = classPathItems.iterator();
|
Iterator<ClassPathItem> classPathItemsIter = classPathItems.iterator();
|
||||||
@ -384,7 +418,7 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,24 +477,31 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addAssetEventListener(AssetEventListener listener) {
|
public void addAssetEventListener(AssetEventListener listener) {
|
||||||
|
synchronized (assetEventListeners) {
|
||||||
assetEventListeners.add(listener);
|
assetEventListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeAssetEventListener(AssetEventListener listener) {
|
public void removeAssetEventListener(AssetEventListener listener) {
|
||||||
|
synchronized (assetEventListeners) {
|
||||||
assetEventListeners.remove(listener);
|
assetEventListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void addClassPathEventListener(ClassPathChangeListener listener) {
|
public void addClassPathEventListener(ClassPathChangeListener listener) {
|
||||||
|
synchronized (classPathListeners) {
|
||||||
classPathListeners.add(listener);
|
classPathListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void removeClassPathEventListener(ClassPathChangeListener listener) {
|
public void removeClassPathEventListener(ClassPathChangeListener listener) {
|
||||||
|
synchronized (classPathListeners) {
|
||||||
classPathListeners.remove(listener);
|
classPathListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void notifyClassPathListeners() {
|
private void notifyClassPathListeners() {
|
||||||
updateClassLoader();
|
|
||||||
final ProjectAssetManager pm = this;
|
final ProjectAssetManager pm = this;
|
||||||
java.awt.EventQueue.invokeLater(new Runnable() {
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -473,6 +514,10 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Mutex mutex() {
|
||||||
|
return mutex;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For situations with no Project
|
* For situations with no Project
|
||||||
*/
|
*/
|
||||||
@ -505,6 +550,7 @@ public class ProjectAssetManager extends DesktopAssetManager {
|
|||||||
|
|
||||||
private static class ClassPathItem {
|
private static class ClassPathItem {
|
||||||
|
|
||||||
|
ClassPath path;
|
||||||
FileObject object;
|
FileObject object;
|
||||||
FileChangeListener listener;
|
FileChangeListener listener;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user