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  /**
22   * A View on another buffer.  Allows operations that do not change the _content or
23   * indexes of the backing buffer.
24   * 
25   * 
26   * 
27   */
28  public class View extends AbstractBuffer
29  {
30      Buffer _buffer;
31  
32      /**
33       * @param buffer The <code>Buffer</code> on which we are presenting a <code>View</code>.
34       * @param mark The initial value of the {@link Buffer#markIndex mark index}
35       * @param get The initial value of the {@link Buffer#getIndex get index}
36       * @param put The initial value of the {@link Buffer#putIndex put index}
37       * @param access The access level - one of the constants from {@link Buffer}.
38       */
39      public View(Buffer buffer, int mark, int get, int put,int access)
40      {
41          super(READWRITE,!buffer.isImmutable());
42          _buffer=buffer.buffer();
43          setPutIndex(put);
44          setGetIndex(get);
45          setMarkIndex(mark);
46          _access=access;
47      }
48      
49      public View(Buffer buffer)
50      {
51          super(READWRITE,!buffer.isImmutable());
52          _buffer=buffer.buffer();
53          setPutIndex(buffer.putIndex());
54          setGetIndex(buffer.getIndex());
55          setMarkIndex(buffer.markIndex());
56          _access=buffer.isReadOnly()?READONLY:READWRITE;
57      }
58  
59      public View()
60      {
61          super(READWRITE,true);
62      }
63      
64      /**
65       * Update view to buffer
66       */
67      public void update(Buffer buffer)
68      {
69          _access=READWRITE;
70          _buffer=buffer.buffer();
71          setGetIndex(0);
72          setPutIndex(buffer.putIndex());
73          setGetIndex(buffer.getIndex());
74          setMarkIndex(buffer.markIndex());
75          _access=buffer.isReadOnly()?READONLY:READWRITE;
76      }
77  
78      public void update(int get, int put)
79      {
80          int a=_access;
81          _access=READWRITE;
82          setGetIndex(0);
83          setPutIndex(put);
84          setGetIndex(get);
85          setMarkIndex(-1);
86          _access=a;
87      }
88  
89      /**
90       * @return The {@link Buffer#array()} from the underlying buffer.
91       */
92      public byte[] array()
93      {
94          return _buffer.array();
95      }
96  
97      /**
98       * @return The {@link Buffer#buffer()} from the underlying buffer.
99       */
100     @Override
101     public Buffer buffer()
102     {
103         return _buffer.buffer();
104     }
105 
106     /**
107      * @return The {@link Buffer#capacity} of the underlying buffer.
108      */
109     public int capacity()
110     {
111         return _buffer.capacity();
112     }
113 
114     /**
115      *  
116      */
117     @Override
118     public void clear()
119     {
120         setMarkIndex(-1);
121         setGetIndex(0);
122         setPutIndex(_buffer.getIndex());
123         setGetIndex(_buffer.getIndex());
124     }
125 
126     /**
127      *  
128      */
129     @Override
130     public void compact()
131     {
132         // TODO
133     }
134 
135     /*
136      * (non-Javadoc)
137      * 
138      * @see java.lang.Object#equals(java.lang.Object)
139      */
140     @Override
141     public boolean equals(Object obj)
142     {
143         return  this==obj ||((obj instanceof Buffer)&& obj.equals(this)) || super.equals(obj);
144     }
145 
146     /**
147      * @return Whether the underlying buffer is {@link Buffer#isReadOnly read only}
148      */
149     @Override
150     public boolean isReadOnly()
151     {
152         return _buffer.isReadOnly();
153     }
154 
155     /**
156      * @return Whether the underlying buffer is {@link Buffer#isVolatile volatile}
157      */
158     @Override
159     public boolean isVolatile()
160     {
161         return true;
162     }
163 
164     /**
165      * @return The result of calling {@link Buffer#peek(int)} on the underlying buffer
166      */
167     public byte peek(int index)
168     {
169         return _buffer.peek(index);
170     }
171 
172     /**
173      * @return The result of calling {@link Buffer#peek(int, byte[], int, int)} on the underlying buffer
174      */
175     public int peek(int index, byte[] b, int offset, int length)
176     {
177         return _buffer.peek(index,b,offset,length);
178     }
179 
180     /**
181      * @return The result of calling {@link Buffer#peek(int, int)} on the underlying buffer
182      */
183     @Override
184     public Buffer peek(int index, int length)
185     {
186         return _buffer.peek(index, length);
187     }
188     
189     /**
190      * @param index
191      * @param src
192      */
193     @Override
194     public int poke(int index, Buffer src)
195     {
196         return _buffer.poke(index,src); 
197     }
198 
199     /**
200      * @param index
201      * @param b
202      */
203     public void poke(int index, byte b)
204     {
205         _buffer.poke(index,b);
206     }
207 
208     /**
209      * @param index
210      * @param b
211      * @param offset
212      * @param length
213      */
214     @Override
215     public int poke(int index, byte[] b, int offset, int length)
216     {
217         return _buffer.poke(index,b,offset,length);
218     }
219     
220     @Override
221     public String toString()
222     {
223         if (_buffer==null)
224             return "INVALID";
225         return super.toString();
226     }
227     
228     public static class CaseInsensitive extends View implements Buffer.CaseInsensitve
229     {
230         public CaseInsensitive()
231         {
232             super();
233         }
234 
235         public CaseInsensitive(Buffer buffer, int mark, int get, int put, int access)
236         {
237             super(buffer,mark,get,put,access);
238         }
239 
240         public CaseInsensitive(Buffer buffer)
241         {
242             super(buffer);
243         }
244         
245         @Override
246         public boolean equals(Object obj)
247         {
248             return  this==obj ||((obj instanceof Buffer)&&((Buffer)obj).equalsIgnoreCase(this)) || super.equals(obj);
249         }
250     }
251 }