LRU Cache for active sources.
authorTomas Zezula <tzezula@netbeans.org>
Thu, 06 Feb 2014 16:20:34 +0100
changeset 181635cfa53339563
parent 18162 4586a9fb7ed8
child 18164 87223a59fcc5
child 18165 90b713d6fd65
LRU Cache for active sources.
dew4nb/src/org/netbeans/modules/dew4nb/SourceProvider.java
     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,