diff -r 5a4c01d9419f parsing.api/src/org/netbeans/modules/parsing/spi/indexing/support/IndexResult.java --- a/parsing.api/src/org/netbeans/modules/parsing/spi/indexing/support/IndexResult.java Tue Dec 17 21:53:05 2013 +0000 +++ b/parsing.api/src/org/netbeans/modules/parsing/spi/indexing/support/IndexResult.java Thu Dec 19 15:21:31 2013 +0200 @@ -46,6 +46,7 @@ import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.concurrent.ConcurrentHashMap; import org.netbeans.modules.parsing.impl.indexing.DeletedIndexable; import org.netbeans.modules.parsing.impl.indexing.FileObjectIndexable; import org.netbeans.modules.parsing.impl.indexing.SPIAccessor; @@ -66,6 +67,7 @@ private final org.netbeans.modules.parsing.lucene.support.IndexDocument spi; private final URL root; + private final static ConcurrentHashMap cachedUrls = new ConcurrentHashMap(10); private volatile URL cachedUrl; private volatile FileObject cachedFile; @@ -87,7 +89,10 @@ } public URL getUrl() { - if (cachedUrl == null) { + String cacheKey = root+spi.getPrimaryKey(); + if (cachedUrls.containsKey(cacheKey)) + cachedUrl = cachedUrls.get(cacheKey); + else if (cachedUrl == null) { URL url = null; try { url = Util.resolveUrl(root, spi.getPrimaryKey(), false); @@ -100,6 +105,16 @@ cachedUrl = url; } } + + /* Ensure the cached map retains maximal size of 10 */ + synchronized (cachedUrls) { + if (cachedUrls.size() >= 10) + { + String oldestCachedFile = cachedUrls.keys().nextElement(); + cachedUrls.remove(oldestCachedFile); + } + cachedUrls.putIfAbsent(cacheKey, cachedUrl); + } } return cachedUrl; }