diff -r 4e52836d327b masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/FileName.java --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/FileName.java Tue May 18 14:58:39 2010 +0200 +++ b/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/FileName.java Fri Jun 04 11:45:33 2010 +0200 @@ -58,6 +58,7 @@ private CharSequence name; private final FileNaming parent; private Integer id; + Object status; protected FileName(final FileNaming parent, final File file) { this.parent = parent; diff -r 4e52836d327b masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java Tue May 18 14:58:39 2010 +0200 +++ b/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java Fri Jun 04 11:45:33 2010 +0200 @@ -49,6 +49,7 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.*; +import java.util.logging.Logger; import org.netbeans.modules.masterfs.providers.ProvidedExtensions; /** @@ -56,6 +57,7 @@ */ public final class NamingFactory { private static final Map nameMap = new WeakHashMap(); + private static final Logger LOG = Logger.getLogger(NamingFactory.class.getName()); public static synchronized FileNaming fromFile(final File file) { final LinkedList list = new LinkedList(); @@ -233,36 +235,56 @@ private static List collectChildren(FileName parent) { assert Thread.holdsLock(NamingFactory.class); + long now = System.currentTimeMillis(); List retval = new ArrayList(); + Object isChild = new Object(); + Object isNotChild = new Object(); for (Object value : nameMap.values()) { if (value instanceof List) { for (Object item : (List) value) { Reference ref = (Reference) item; - FileNaming naming = (FileNaming) ref.get(); - if (isChild(parent, naming)) { + FileName naming = (FileName) ref.get(); + if (isChild(parent, naming, isChild, isNotChild)) { retval.add(naming); } } } else { Reference ref = (Reference) value; - FileNaming naming = (FileNaming) ref.get(); - if (isChild(parent, naming)) { + FileName naming = (FileName) ref.get(); + if (isChild(parent, naming, isChild, isNotChild)) { retval.add(naming); } } } + LOG.info(retval.size() + " children for " + parent + " took " + (System.currentTimeMillis() - now + " all names: " + nameMap.size())); return retval; } - private static boolean isChild(FileName parent, FileNaming naming) { - FileNaming temp = naming; + private static boolean isChild( + FileName parent, FileName naming, Object isChild, Object isNotChild + ) { + FileName temp = naming; + boolean found = false; while (temp != null) { if (temp == parent) { - return true; + found = true; + break; } - temp = temp.getParent(); + if (temp.status == isChild) { + found = true; + break; + } + if (temp.status == isNotChild) { + break; + } + temp = (FileName)temp.getParent(); } - return false; + FileName again = naming; + while (again != temp) { + again.status = found ? isChild : isNotChild; + again = (FileName)again.getParent(); + } + return found; } private static Reference getReference(final List list, final File f) {