001         package com.croftsoft.core.util.cache;
002    
003         import java.io.*;
004         import java.lang.ref.*;
005         import java.util.*;
006    
007         import com.croftsoft.core.util.id.Id;
008    
009         /*********************************************************************
010         * A Cache implementation that dumps its content when memory is low.
011         *
012         * <P>
013         *
014         * Backed by a WeakCache.  Note that the content will not be dumped if
015         * its Id remains strongly reachable.
016         *
017         * <P>
018         *
019         * @see
020         *   WeakCache
021         * @see
022         *   java.lang.ref.SoftReference
023         *
024         * @version
025         *   1999-04-20
026         * @author
027         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
028         *********************************************************************/
029    
030         public class  SoftCache implements Cache
031         //////////////////////////////////////////////////////////////////////
032         //////////////////////////////////////////////////////////////////////
033         {
034    
035         private WeakCache       weakCache      = new WeakCache      ( );
036         private ReferenceQueue  referenceQueue = new ReferenceQueue ( );
037         private Set             softSet        = new HashSet        ( );
038    
039         //////////////////////////////////////////////////////////////////////
040         //////////////////////////////////////////////////////////////////////
041    
042         public Id  validate ( Id  id, ContentAccessor  contentAccessor )
043           throws IOException
044         //////////////////////////////////////////////////////////////////////
045         {
046           clearQueue ( );
047    
048           if ( isAvailable ( id ) ) return id;
049    
050           InputStream  inputStream = contentAccessor.getInputStream ( );
051    
052           if ( inputStream == null ) return null;
053    
054           return store ( inputStream );
055         }
056    
057    /*
058         public Id  store ( InputStream  in, Id  id ) throws IOException
059         //////////////////////////////////////////////////////////////////////
060         {
061           clearQueue ( );
062    
063           id = weakCache.store ( in, id );
064    
065           softSet.add ( new SoftReference ( id, referenceQueue ) );
066    
067           return id;
068         }
069    */
070    
071         public Id  store ( InputStream  in ) throws IOException
072         //////////////////////////////////////////////////////////////////////
073         {
074           clearQueue ( );
075    
076           Id  id = weakCache.store ( in );
077    
078           softSet.add ( new SoftReference ( id, referenceQueue ) );
079    
080           return id;
081         }
082    
083         public InputStream  retrieve ( Id  id ) throws IOException
084         //////////////////////////////////////////////////////////////////////
085         {
086           clearQueue ( );
087    
088           return weakCache.retrieve ( id );
089         }
090    
091         public boolean  isAvailable ( Id  id )
092         //////////////////////////////////////////////////////////////////////
093         {
094           clearQueue ( );
095    
096           return weakCache.isAvailable ( id );
097         }
098    
099         //////////////////////////////////////////////////////////////////////
100         //////////////////////////////////////////////////////////////////////
101    
102         public void  clearQueue ( )
103         //////////////////////////////////////////////////////////////////////
104         {
105           Reference  reference = null;
106           while ( ( reference = referenceQueue.poll ( ) ) != null )
107           {
108             softSet.remove ( reference );
109           }
110         }
111    
112         //////////////////////////////////////////////////////////////////////
113         //////////////////////////////////////////////////////////////////////
114         }