diff -r c70bc28359a1 openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java --- a/openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java Tue Sep 08 10:54:52 2015 +0200 +++ b/openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java Tue Sep 08 16:58:43 2015 +0200 @@ -37,6 +37,21 @@ */ package org.netbeans.modules.openide.loaders; +import java.io.File; +import java.nio.file.FileStore; +import java.nio.file.FileSystems; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; import org.openide.util.RequestProcessor; /** Currently allows to share RP for nodes used by different packages @@ -46,11 +61,101 @@ */ public final class DataNodeUtils { private static final RequestProcessor RP = new RequestProcessor("Data System Nodes"); // NOI18N - + + /* mount points, sorted by path, ascending */ + private static String MOUNT_POINTS[] = null; + private static final Map MOUNT_TO_RP + = new HashMap(); + static { + synchronized (MOUNT_TO_RP) { + MOUNT_POINTS = readMountPoints(); + } + } + private DataNodeUtils() { } public static RequestProcessor reqProcessor() { return RP; } + + /** + * Get request processor for a file. + * + * @param fo + * @return The proper request processor. + */ + public static RequestProcessor reqProcessor(FileObject fo) { + if (fo == null) { + return RP; + } else { + synchronized (MOUNT_TO_RP) { + for (String mp: MOUNT_POINTS) { + if (fo.getPath().startsWith(mp)) { + RequestProcessor rp = MOUNT_TO_RP.get(mp); + if (rp == null) { + rp = new RequestProcessor( + "Data System Nodes for " + mp); //NOI18N + MOUNT_TO_RP.put(mp, rp); + } + return rp; + } + } + } + return RP; + } + } + + /** + * @return Array or FileObjects' paths of mount points, sorted by length, + * descending. + */ + private static String[] readMountPoints() { + ArrayList mountPoints = new ArrayList(); + for (FileStore fs : FileSystems.getDefault().getFileStores()) { + try { + String str = fs.toString(); + int firstSpace = str.indexOf(' '); + if (firstSpace > 0) { + String path = str.substring(0, firstSpace); + File f = new File(path); + File norm = FileUtil.normalizeFile(f); + FileObject fo = FileUtil.toFileObject(norm); + if (fo != null) { + mountPoints.add(fo.getPath()); + } + } + } catch (Exception e) { + Logger.getLogger(DataNodeUtils.class.getName()) + .log(Level.INFO, null, e); + } + } + Collections.sort(mountPoints, new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.length() - o1.length(); + } + }); + return mountPoints.toArray(new String[mountPoints.size()]); + } + + /** + * Remove unused keys from a map. + * + * @param map The map. + * @param activeKeys Array of active keys. + */ + private void clearUnusedEntries(Map map, String[] activeKeys) { + Set activeKeySet = new HashSet(); + Collections.addAll(activeKeySet, activeKeys); + List toRemove = new ArrayList(); + for (String usedKey: map.keySet()) { + if (!activeKeySet.contains(usedKey)) { + toRemove.add(usedKey); + } + } + for (String remove: toRemove) { + map.remove(remove); + } + } } diff -r c70bc28359a1 openide.loaders/src/org/openide/loaders/FolderChildren.java --- a/openide.loaders/src/org/openide/loaders/FolderChildren.java Tue Sep 08 10:54:52 2015 +0200 +++ b/openide.loaders/src/org/openide/loaders/FolderChildren.java Tue Sep 08 16:58:43 2015 +0200 @@ -230,7 +230,7 @@ run.run(); } else { run.op = operation; - refTask = DataNodeUtils.reqProcessor().post(run); + refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run); } }