LRU Cache for active sources.
1.1 --- a/dew4nb/src/org/netbeans/modules/dew4nb/SourceProvider.java Thu Feb 06 14:59:25 2014 +0100
1.2 +++ b/dew4nb/src/org/netbeans/modules/dew4nb/SourceProvider.java Thu Feb 06 16:20:34 2014 +0100
1.3 @@ -43,6 +43,7 @@
1.4 package org.netbeans.modules.dew4nb;
1.5
1.6 import java.io.ByteArrayInputStream;
1.7 +import java.io.Closeable;
1.8 import java.io.IOException;
1.9 import java.io.OutputStream;
1.10 import java.lang.ref.Reference;
1.11 @@ -79,6 +80,10 @@
1.12 */
1.13 public final class SourceProvider {
1.14
1.15 + private static final int DEFAULT_CACHE_SIZE = 10;
1.16 + private static final int CACHE_SIZE = Integer.getInteger(
1.17 + "SourceProvider.cacheSize", //NOI18N
1.18 + DEFAULT_CACHE_SIZE);
1.19 private static final Logger LOG = Logger.getLogger(SourceProvider.class.getName());
1.20
1.21 //@GuardedBy("SourceProvider.class")
1.22 @@ -87,7 +92,32 @@
1.23 FileUtil.createMemoryFileSystem();
1.24 //@GuardedBy("retain")
1.25 private final Map<FileObject, Reference<Source>> retain
1.26 - = Collections.synchronizedMap(new LinkedHashMap <FileObject,Reference<Source>>());
1.27 + = Collections.synchronizedMap(new LinkedHashMap <FileObject,Reference<Source>>(
1.28 + 16, 0.75f, true) {
1.29 + {
1.30 + LOG.log(
1.31 + Level.INFO,
1.32 + "SourceProvider.cacheSize={0}", //NOI18N
1.33 + CACHE_SIZE);
1.34 + }
1.35 + @Override
1.36 + protected boolean removeEldestEntry(@NonNull final Map.Entry<FileObject, Reference<Source>> eldest) {
1.37 + if (size() > CACHE_SIZE) {
1.38 + final Reference<? extends Source> ref = eldest.getValue();
1.39 + if (ref instanceof Closeable) {
1.40 + try {
1.41 + ((Closeable)ref).close();
1.42 + } catch (IOException ex) {
1.43 + Exceptions.printStackTrace(ex);
1.44 + }
1.45 + }
1.46 + ref.clear();
1.47 + return true;
1.48 + } else {
1.49 + return false;
1.50 + }
1.51 + }
1.52 + });
1.53
1.54
1.55 private SourceProvider() {
1.56 @@ -214,7 +244,7 @@
1.57
1.58
1.59
1.60 - private static final class SR extends SoftReference<Source> implements Runnable {
1.61 + private static final class SR extends SoftReference<Source> implements Runnable, Closeable {
1.62 private final FileObject file;
1.63 private final Map<FileObject, Reference<Source>> active;
1.64
1.65 @@ -247,6 +277,15 @@
1.66 }
1.67
1.68 @Override
1.69 + public void close() throws IOException {
1.70 + LOG.log(
1.71 + Level.FINE,
1.72 + "Deleting temporary file: {0}", //NOI18N
1.73 + FileUtil.getFileDisplayName(this.file));
1.74 + this.file.delete();
1.75 + }
1.76 +
1.77 + @Override
1.78 public void run() {
1.79 LOG.log(
1.80 Level.FINE,
1.81 @@ -254,7 +293,7 @@
1.82 FileUtil.getFileDisplayName(this.file));
1.83 active.remove(this.file);
1.84 try {
1.85 - this.file.delete();
1.86 + close();
1.87 } catch (IOException ex) {
1.88 LOG.log(
1.89 Level.WARNING,