1//
2//  ========================================================================
3//  Copyright (c) 1995-2014 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
19package 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 */
28public 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}
252