View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.io;
20  
21  import org.eclipse.jetty.io.nio.DirectNIOBuffer;
22  import org.eclipse.jetty.io.nio.IndirectNIOBuffer;
23  
24  public abstract class AbstractBuffers implements Buffers
25  {
26      protected final Buffers.Type _headerType;
27      protected final int _headerSize;
28      protected final Buffers.Type _bufferType;
29      protected final int _bufferSize;
30      protected final Buffers.Type _otherType;
31  
32      /* ------------------------------------------------------------ */
33      public AbstractBuffers(Buffers.Type headerType, int headerSize, Buffers.Type bufferType, int bufferSize, Buffers.Type otherType)
34      {
35          _headerType=headerType;
36          _headerSize=headerSize;
37          _bufferType=bufferType;
38          _bufferSize=bufferSize;
39          _otherType=otherType;
40      }
41  
42      /* ------------------------------------------------------------ */
43      /**
44       * @return Returns the buffer size in bytes.
45       */
46      public int getBufferSize()
47      {
48          return _bufferSize;
49      }
50  
51      /* ------------------------------------------------------------ */
52      /**
53       * @return Returns the header size in bytes.
54       */
55      public int getHeaderSize()
56      {
57          return _headerSize;
58      }
59  
60  
61      /* ------------------------------------------------------------ */
62      /**
63       * Create a new header Buffer
64       * @return new Buffer
65       */
66      final protected Buffer newHeader()
67      {
68          switch(_headerType)
69          {
70              case BYTE_ARRAY:
71                  return new ByteArrayBuffer(_headerSize);
72              case DIRECT:
73                  return new DirectNIOBuffer(_headerSize);
74              case INDIRECT:
75                  return new IndirectNIOBuffer(_headerSize);
76          }
77          throw new IllegalStateException();
78      }
79  
80      /* ------------------------------------------------------------ */
81      /**
82       * Create a new content Buffer
83       * @return new Buffer
84       */
85      final protected Buffer newBuffer()
86      {
87         switch(_bufferType)
88         {
89             case BYTE_ARRAY:
90                 return new ByteArrayBuffer(_bufferSize);
91             case DIRECT:
92                 return new DirectNIOBuffer(_bufferSize);
93             case INDIRECT:
94                 return new IndirectNIOBuffer(_bufferSize);
95         }
96         throw new IllegalStateException();
97      }
98  
99      /* ------------------------------------------------------------ */
100     /**
101      * Create a new content Buffer
102      * @param size
103      * @return new Buffer
104      */
105     final protected Buffer newBuffer(int size)
106     {
107        switch(_otherType)
108        {
109            case BYTE_ARRAY:
110                return new ByteArrayBuffer(size);
111            case DIRECT:
112                return new DirectNIOBuffer(size);
113            case INDIRECT:
114                return new IndirectNIOBuffer(size);
115        }
116        throw new IllegalStateException();
117     }
118 
119     /* ------------------------------------------------------------ */
120     /**
121      * @param buffer
122      * @return True if the buffer is the correct type to be a Header buffer
123      */
124     public final boolean isHeader(Buffer buffer)
125     {
126         if (buffer.capacity()==_headerSize)
127         {
128             switch(_headerType)
129             {
130                 case BYTE_ARRAY:
131                     return buffer instanceof ByteArrayBuffer && !(buffer instanceof  IndirectNIOBuffer);
132                 case DIRECT:
133                     return buffer instanceof  DirectNIOBuffer;
134                 case INDIRECT:
135                     return buffer instanceof  IndirectNIOBuffer;
136             }
137         }
138         return false;
139     }
140 
141     /* ------------------------------------------------------------ */
142     /**
143      * @param buffer
144      * @return True if the buffer is the correct type to be a Header buffer
145      */
146     public final boolean isBuffer(Buffer buffer)
147     {
148         if (buffer.capacity()==_bufferSize)
149         {
150             switch(_bufferType)
151             {
152                 case BYTE_ARRAY:
153                     return buffer instanceof ByteArrayBuffer && !(buffer instanceof  IndirectNIOBuffer);
154                 case DIRECT:
155                     return buffer instanceof  DirectNIOBuffer;
156                 case INDIRECT:
157                     return buffer instanceof  IndirectNIOBuffer;
158             }
159         }
160         return false;
161     }
162 
163     /* ------------------------------------------------------------ */
164     public String toString()
165     {
166         return String.format("%s [%d,%d]", getClass().getSimpleName(), _headerSize, _bufferSize);
167     }
168 }