1   /**
2    * 
3    */
4   package org.mortbay.jetty.servlet;
5   
6   import java.io.File;
7   import java.io.IOException;
8   import java.io.InputStream;
9   
10  import org.mortbay.io.Buffer;
11  import org.mortbay.io.nio.NIOBuffer;
12  import org.mortbay.jetty.Connector;
13  import org.mortbay.jetty.HttpConnection;
14  import org.mortbay.jetty.MimeTypes;
15  import org.mortbay.jetty.ResourceCache;
16  import org.mortbay.jetty.ResourceCache.Content;
17  import org.mortbay.jetty.nio.NIOConnector;
18  import org.mortbay.log.Log;
19  import org.mortbay.resource.Resource;
20  
21  class NIOResourceCache extends ResourceCache
22  {
23      boolean _useFileMappedBuffer;
24      
25      /* ------------------------------------------------------------ */
26      public NIOResourceCache(MimeTypes mimeTypes)
27      {
28          super(mimeTypes);
29      }
30  
31      /* ------------------------------------------------------------ */
32      protected void fill(Content content) throws IOException
33      {
34          Buffer buffer=null;
35          Resource resource=content.getResource();
36          long length=resource.length();
37  
38          if (_useFileMappedBuffer && resource.getFile()!=null) 
39          {    
40              File file = resource.getFile();
41              if (file != null) 
42                  buffer = new NIOBuffer(file);
43          } 
44          else 
45          {
46              InputStream is = resource.getInputStream();
47              try
48              {
49                  Connector connector = HttpConnection.getCurrentConnection().getConnector();
50                  buffer = new NIOBuffer((int) length, ((NIOConnector)connector).getUseDirectBuffers()?NIOBuffer.DIRECT:NIOBuffer.INDIRECT);
51              }
52              catch(OutOfMemoryError e)
53              {
54                  Log.warn(e.toString());
55                  Log.debug(e);
56                  buffer = new NIOBuffer((int) length, NIOBuffer.INDIRECT);
57              }
58              buffer.readFrom(is,(int)length);
59              is.close();
60          }
61          content.setBuffer(buffer);
62      }
63  
64      public boolean isUseFileMappedBuffer()
65      {
66          return _useFileMappedBuffer;
67      }
68  
69      public void setUseFileMappedBuffer(boolean useFileMappedBuffer)
70      {
71          _useFileMappedBuffer = useFileMappedBuffer;
72      }
73  }