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