Skip to content

Package: ByteBufferWrapper

ByteBufferWrapper

nameinstructionbranchcomplexitylinemethod
ByteBufferWrapper()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
ByteBufferWrapper(ByteBuffer)
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
allowBufferDispose()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
allowBufferDispose(boolean)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
array()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
arrayOffset()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
asReadOnlyBuffer()
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
capacity()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
checkDispose()
M: 11 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
clear()
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
compact()
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
compareTo(Buffer)
M: 46 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 10 C: 0
0%
M: 1 C: 0
0%
dispose()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
dumpHex(Appendable)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
duplicate()
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
equals(Object)
M: 49 C: 0
0%
M: 8 C: 0
0%
M: 5 C: 0
0%
M: 12 C: 0
0%
M: 1 C: 0
0%
flip()
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
get()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
get(ByteBuffer)
M: 41 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 10 C: 0
0%
M: 1 C: 0
0%
get(ByteBuffer, int, int)
M: 54 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 13 C: 0
0%
M: 1 C: 0
0%
get(byte[])
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
get(byte[], int, int)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
get(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getChar()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getChar(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getDouble()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getDouble(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getFloat()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getFloat(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getInt()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getInt(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getLong()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getLong(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getShort()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getShort(int)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
hasArray()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
hasRemaining()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
hashCode()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isComposite()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isDirect()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
isExternal()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isReadOnly()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
limit()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
limit(int)
M: 16 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
mark()
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
order()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
order(ByteOrder)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
position()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
position(int)
M: 16 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
prepareDispose()
M: 7 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
prepend(Buffer)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
put(Buffer)
M: 15 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
put(Buffer, int, int)
M: 32 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 8 C: 0
0%
M: 1 C: 0
0%
put(ByteBuffer)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
put(ByteBuffer, int, int)
M: 25 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
put(byte)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
put(byte[])
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
put(byte[], int, int)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
put(int, byte)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
put8BitString(String)
M: 30 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
putChar(char)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putChar(int, char)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putDouble(double)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putDouble(int, double)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putFloat(float)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putFloat(int, float)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putInt(int)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putInt(int, int)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putLong(int, long)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putLong(long)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putShort(int, short)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
putShort(short)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
release()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
remaining()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
reset()
M: 17 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
rewind()
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
shrink()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
slice()
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
slice(int, int)
M: 28 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
split(int)
M: 97 C: 0
0%
M: 12 C: 0
0%
M: 7 C: 0
0%
M: 24 C: 0
0%
M: 1 C: 0
0%
static {...}
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
toBufferArray()
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
toBufferArray(BufferArray)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
toBufferArray(BufferArray, int, int)
M: 22 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%
toBufferArray(int, int)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
toByteBuffer()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
toByteBuffer(int, int)
M: 35 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 9 C: 0
0%
M: 1 C: 0
0%
toByteBufferArray()
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
toByteBufferArray(ByteBufferArray)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
toByteBufferArray(ByteBufferArray, int, int)
M: 23 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%
toByteBufferArray(int, int)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
toString()
M: 23 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
toStringContent()
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
toStringContent(Charset)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
toStringContent(Charset, int, int)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
trim()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
tryDispose()
M: 9 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
underlying()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
wrapByteBuffer(ByteBuffer)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*
2: * Copyright (c) 2008, 2020 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Public License v. 2.0, which is available at
6: * http://www.eclipse.org/legal/epl-2.0.
7: *
8: * This Source Code may also be made available under the following Secondary
9: * Licenses when the conditions for such availability set forth in the
10: * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
11: * version 2 with the GNU Classpath Exception, which is available at
12: * https://www.gnu.org/software/classpath/license.html.
13: *
14: * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15: */
16:
17: package org.glassfish.grizzly.memory;
18:
19: import java.nio.BufferOverflowException;
20: import java.nio.BufferUnderflowException;
21: import java.nio.ByteBuffer;
22: import java.nio.ByteOrder;
23: import java.nio.InvalidMarkException;
24: import java.nio.charset.Charset;
25:
26: import org.glassfish.grizzly.Buffer;
27:
28: /**
29: * {@link Buffer} implementation, which uses the {@link ByteBuffer} underneath.
30: *
31: * @see Buffer
32: * @see MemoryManager
33: * @see ByteBuffer
34: *
35: * @author Ken Cavanaugh
36: * @author John Vieten
37: * @author Alexey Stashok
38: */
39: public class ByteBufferWrapper implements Buffer {
40: public static volatile boolean DEBUG_MODE = false;
41:
42: protected ByteBuffer visible;
43:
44: // Maintain our own mark instead of allowing the ByteBuffer to maintain it.
45: // This is necessary in order to provide feature parity with other Buffer implementations.
46: protected int mark = -1;
47:
48: // Dispose underlying Buffer flag
49: protected boolean allowBufferDispose = false;
50:
51: protected Exception disposeStackTrace;
52:
53: protected ByteBufferWrapper() {
54: this(null);
55: }
56:
57: public ByteBufferWrapper(final ByteBuffer underlyingByteBuffer) {
58: visible = underlyingByteBuffer;
59: }
60:
61: @Override
62: public final boolean isComposite() {
63: return false;
64: }
65:
66: @Override
67: public ByteBufferWrapper prepend(final Buffer header) {
68: checkDispose();
69: return this;
70: }
71:
72: @Override
73: public void trim() {
74: checkDispose();
75: flip();
76: }
77:
78: @Override
79: public void shrink() {
80: checkDispose();
81: }
82:
83: @Override
84: public boolean isDirect() {
85: checkDispose();
86: return visible.isDirect();
87: }
88:
89: @Override
90: public final boolean allowBufferDispose() {
91: return allowBufferDispose;
92: }
93:
94: @Override
95: public final void allowBufferDispose(boolean allowBufferDispose) {
96: this.allowBufferDispose = allowBufferDispose;
97: }
98:
99: @Override
100: public final boolean tryDispose() {
101:• if (allowBufferDispose) {
102: dispose();
103: return true;
104: }
105:
106: return false;
107: }
108:
109: @Override
110: public void dispose() {
111: prepareDispose();
112: visible = null;
113: }
114:
115: protected final void prepareDispose() {
116: checkDispose();
117:• if (DEBUG_MODE) { // if debug is on - clear the buffer content
118: // Use static logic class to help JIT optimize the code
119: DebugLogic.doDebug(this);
120: }
121: }
122:
123: @Override
124: public ByteBuffer underlying() {
125: checkDispose();
126: return visible;
127: }
128:
129: @Override
130: public final int capacity() {
131: return visible.capacity();
132: }
133:
134: @Override
135: public final int position() {
136: checkDispose();
137: return visible.position();
138: }
139:
140: @Override
141: public final ByteBufferWrapper position(final int newPosition) {
142: checkDispose();
143: visible.position(newPosition);
144:• if (mark > newPosition) {
145: mark = -1;
146: }
147: return this;
148: }
149:
150: @Override
151: public final int limit() {
152: checkDispose();
153: return visible.limit();
154: }
155:
156: @Override
157: public final ByteBufferWrapper limit(final int newLimit) {
158: checkDispose();
159: visible.limit(newLimit);
160:• if (mark > newLimit) {
161: mark = -1;
162: }
163: return this;
164: }
165:
166: @Override
167: public final ByteBufferWrapper mark() {
168: checkDispose();
169: mark = visible.position();
170: return this;
171: }
172:
173: @Override
174: public final ByteBufferWrapper reset() {
175: checkDispose();
176:• if (mark < 0) {
177: throw new InvalidMarkException();
178: }
179: visible.position(mark);
180: return this;
181: }
182:
183: @Override
184: public final ByteBufferWrapper clear() {
185: checkDispose();
186: visible.clear();
187: mark = -1;
188: return this;
189: }
190:
191: @Override
192: public final ByteBufferWrapper flip() {
193: checkDispose();
194: visible.flip();
195: mark = -1;
196: return this;
197: }
198:
199: @Override
200: public final ByteBufferWrapper rewind() {
201: checkDispose();
202: visible.rewind();
203: mark = -1;
204: return this;
205: }
206:
207: @Override
208: public final int remaining() {
209: checkDispose();
210: return visible.remaining();
211: }
212:
213: @Override
214: public final boolean hasRemaining() {
215: checkDispose();
216: return visible.hasRemaining();
217: }
218:
219: @Override
220: public boolean isReadOnly() {
221: checkDispose();
222: return visible.isReadOnly();
223: }
224:
225: @Override
226: public Buffer split(final int splitPosition) {
227: checkDispose();
228: final int cap = capacity();
229:
230:• if (splitPosition < 0 || splitPosition > cap) {
231: throw new IllegalArgumentException("Invalid splitPosition value, should be 0 <= splitPosition <= capacity");
232: }
233:
234:• if (splitPosition == cap) {
235: return Buffers.EMPTY_BUFFER;
236: }
237:
238:• if (mark >= splitPosition) {
239: mark = -1;
240: }
241:
242: final int oldPosition = position();
243: final int oldLimit = limit();
244:
245: Buffers.setPositionLimit(visible, 0, splitPosition);
246: ByteBuffer slice1 = visible.slice();
247: Buffers.setPositionLimit(visible, splitPosition, visible.capacity());
248: ByteBuffer slice2 = visible.slice();
249:
250:• if (oldPosition < splitPosition) {
251: slice1.position(oldPosition);
252: } else {
253: slice1.position(slice1.capacity());
254: slice2.position(oldPosition - splitPosition);
255: }
256:
257:• if (oldLimit < splitPosition) {
258: slice1.limit(oldLimit);
259: slice2.limit(0);
260: } else {
261: slice2.limit(oldLimit - splitPosition);
262: }
263:
264: this.visible = slice1;
265:
266: return wrapByteBuffer(slice2);
267: // return memoryManager.wrap(slice2);
268: }
269:
270: @Override
271: public ByteBufferWrapper slice() {
272: return slice(position(), limit());
273: }
274:
275: @Override
276: public ByteBufferWrapper slice(int position, int limit) {
277: checkDispose();
278: final int oldPosition = position();
279: final int oldLimit = limit();
280:
281: try {
282: Buffers.setPositionLimit(visible, position, limit);
283:
284: final ByteBuffer slice = visible.slice();
285: return wrapByteBuffer(slice);
286: } finally {
287: Buffers.setPositionLimit(visible, oldPosition, oldLimit);
288: }
289: }
290:
291: @Override
292: public ByteBufferWrapper duplicate() {
293: checkDispose();
294: final ByteBuffer duplicate = visible.duplicate();
295: return wrapByteBuffer(duplicate);
296: }
297:
298: @Override
299: public ByteBufferWrapper asReadOnlyBuffer() {
300: checkDispose();
301: return wrapByteBuffer(visible.asReadOnlyBuffer());
302: }
303:
304: @Override
305: public byte get() {
306: checkDispose();
307: return visible.get();
308: }
309:
310: @Override
311: public byte get(int index) {
312: checkDispose();
313: return visible.get(index);
314: }
315:
316: @Override
317: public ByteBufferWrapper put(byte b) {
318: checkDispose();
319: visible.put(b);
320: return this;
321: }
322:
323: @Override
324: public ByteBufferWrapper put(int index, byte b) {
325: checkDispose();
326: visible.put(index, b);
327: return this;
328: }
329:
330: @Override
331: public ByteBufferWrapper get(final byte[] dst) {
332: return get(dst, 0, dst.length);
333: }
334:
335: @Override
336: public ByteBufferWrapper get(final byte[] dst, final int offset, final int length) {
337: checkDispose();
338: Buffers.get(visible, dst, offset, length);
339: return this;
340: }
341:
342: @Override
343: public ByteBufferWrapper put(final Buffer src) {
344: put(src, src.position(), src.remaining());
345: src.position(src.limit());
346: return this;
347: }
348:
349: @Override
350: public ByteBufferWrapper put(final Buffer src, final int position, final int length) {
351: final int oldPos = src.position();
352: final int oldLim = limit();
353:
354: src.position(position);
355: limit(position() + length);
356:
357: try {
358: src.get(visible);
359: } finally {
360: src.position(oldPos);
361: limit(oldLim);
362: }
363:
364: return this;
365: }
366:
367: @Override
368: public Buffer get(final ByteBuffer dst) {
369: checkDispose();
370: final int length = dst.remaining();
371:
372:• if (visible.remaining() < length) {
373: throw new BufferUnderflowException();
374: }
375:
376: final int srcPos = visible.position();
377: final int oldSrcLim = visible.limit();
378: try {
379: visible.limit(srcPos + length);
380: dst.put(visible);
381: } finally {
382: visible.limit(oldSrcLim);
383: }
384:
385: return this;
386: }
387:
388: @Override
389: public Buffer get(final ByteBuffer dst, final int position, final int length) {
390: checkDispose();
391:• if (visible.remaining() < length) {
392: throw new BufferUnderflowException();
393: }
394:
395: final int srcPos = visible.position();
396: final int oldSrcLim = visible.limit();
397: final int oldDstPos = dst.position();
398: final int oldDstLim = dst.limit();
399:
400: Buffers.setPositionLimit(dst, position, position + length);
401: try {
402: visible.limit(srcPos + length);
403: dst.put(visible);
404: } finally {
405: visible.limit(oldSrcLim);
406: Buffers.setPositionLimit(dst, oldDstPos, oldDstLim);
407: }
408:
409: return this;
410: }
411:
412: @Override
413: public Buffer put(final ByteBuffer src) {
414: checkDispose();
415: visible.put(src);
416: return this;
417: }
418:
419: @Override
420: public Buffer put(final ByteBuffer src, final int position, final int length) {
421: checkDispose();
422: final int oldPos = src.position();
423: final int oldLim = src.limit();
424:
425: try {
426: Buffers.setPositionLimit(src, position, position + length);
427: visible.put(src);
428: } finally {
429: Buffers.setPositionLimit(src, oldPos, oldLim);
430: }
431:
432: return this;
433: }
434:
435: @Override
436: public ByteBufferWrapper put(byte[] src) {
437: return put(src, 0, src.length);
438: }
439:
440: @Override
441: public ByteBufferWrapper put(byte[] src, int offset, int length) {
442: checkDispose();
443: Buffers.put(src, offset, length, visible);
444: return this;
445: }
446:
447: @SuppressWarnings("deprecation")
448: @Override
449: public Buffer put8BitString(final String s) {
450: checkDispose();
451: final int len = s.length();
452:• if (remaining() < len) {
453: throw new BufferOverflowException();
454: }
455:
456:• for (int i = 0; i < len; i++) {
457: visible.put((byte) s.charAt(i));
458: }
459:
460: return this;
461: }
462:
463: @Override
464: public ByteBufferWrapper compact() {
465: checkDispose();
466: visible.compact();
467: return this;
468: }
469:
470: @Override
471: public ByteOrder order() {
472: checkDispose();
473: return visible.order();
474: }
475:
476: @Override
477: public ByteBufferWrapper order(ByteOrder bo) {
478: checkDispose();
479: visible.order(bo);
480: return this;
481: }
482:
483: @Override
484: public char getChar() {
485: checkDispose();
486: return visible.getChar();
487: }
488:
489: @Override
490: public char getChar(int index) {
491: checkDispose();
492: return visible.getChar(index);
493: }
494:
495: @Override
496: public ByteBufferWrapper putChar(char value) {
497: checkDispose();
498: visible.putChar(value);
499: return this;
500: }
501:
502: @Override
503: public ByteBufferWrapper putChar(int index, char value) {
504: checkDispose();
505: visible.putChar(index, value);
506: return this;
507: }
508:
509: @Override
510: public short getShort() {
511: checkDispose();
512: return visible.getShort();
513: }
514:
515: @Override
516: public short getShort(int index) {
517: checkDispose();
518: return visible.getShort(index);
519: }
520:
521: @Override
522: public ByteBufferWrapper putShort(short value) {
523: checkDispose();
524: visible.putShort(value);
525: return this;
526: }
527:
528: @Override
529: public ByteBufferWrapper putShort(int index, short value) {
530: checkDispose();
531: visible.putShort(index, value);
532: return this;
533: }
534:
535: @Override
536: public int getInt() {
537: checkDispose();
538: return visible.getInt();
539: }
540:
541: @Override
542: public int getInt(int index) {
543: checkDispose();
544: return visible.getInt(index);
545: }
546:
547: @Override
548: public ByteBufferWrapper putInt(int value) {
549: checkDispose();
550: visible.putInt(value);
551: return this;
552: }
553:
554: @Override
555: public ByteBufferWrapper putInt(int index, int value) {
556: checkDispose();
557: visible.putInt(index, value);
558: return this;
559: }
560:
561: @Override
562: public long getLong() {
563: checkDispose();
564: return visible.getLong();
565: }
566:
567: @Override
568: public long getLong(int index) {
569: checkDispose();
570: return visible.getLong(index);
571: }
572:
573: @Override
574: public ByteBufferWrapper putLong(long value) {
575: checkDispose();
576: visible.putLong(value);
577: return this;
578: }
579:
580: @Override
581: public ByteBufferWrapper putLong(int index, long value) {
582: checkDispose();
583: visible.putLong(index, value);
584: return this;
585: }
586:
587: @Override
588: public float getFloat() {
589: checkDispose();
590: return visible.getFloat();
591: }
592:
593: @Override
594: public float getFloat(int index) {
595: checkDispose();
596: return visible.getFloat(index);
597: }
598:
599: @Override
600: public ByteBufferWrapper putFloat(float value) {
601: checkDispose();
602: visible.putFloat(value);
603: return this;
604: }
605:
606: @Override
607: public ByteBufferWrapper putFloat(int index, float value) {
608: checkDispose();
609: visible.putFloat(index, value);
610: return this;
611: }
612:
613: @Override
614: public double getDouble() {
615: checkDispose();
616: return visible.getDouble();
617: }
618:
619: @Override
620: public double getDouble(int index) {
621: checkDispose();
622: return visible.getDouble(index);
623: }
624:
625: @Override
626: public ByteBufferWrapper putDouble(double value) {
627: checkDispose();
628: visible.putDouble(value);
629: return this;
630: }
631:
632: @Override
633: public ByteBufferWrapper putDouble(int index, double value) {
634: checkDispose();
635: visible.putDouble(index, value);
636: return this;
637: }
638:
639: @Override
640: public int hashCode() {
641: return visible.hashCode();
642: }
643:
644: @Override
645: public boolean equals(Object obj) {
646:• if (obj instanceof Buffer) {
647: Buffer that = (Buffer) obj;
648:• if (this.remaining() != that.remaining()) {
649: return false;
650: }
651: int p = this.position();
652:• for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) {
653: byte v1 = this.get(i);
654: byte v2 = that.get(j);
655:• if (v1 != v2) {
656: return false;
657: }
658: }
659: return true;
660: }
661:
662: return false;
663: }
664:
665: @Override
666: public int compareTo(Buffer o) {
667: // taken from ByteBuffer#compareTo(...)
668: int n = position() + Math.min(remaining(), o.remaining());
669:• for (int i = this.position(), j = o.position(); i < n; i++, j++) {
670: byte v1 = this.get(i);
671: byte v2 = o.get(j);
672:• if (v1 == v2) {
673: continue;
674: }
675:• if (v1 < v2) {
676: return -1;
677: }
678: return +1;
679: }
680:
681: return remaining() - o.remaining();
682: }
683:
684: protected void checkDispose() {
685:• if (visible == null) {
686: throw new IllegalStateException("BufferWrapper has already been disposed", disposeStackTrace);
687: }
688: }
689:
690: @Override
691: public String toString() {
692: StringBuilder sb = new StringBuilder("ByteBufferWrapper (" + System.identityHashCode(this) + ") [");
693: sb.append("visible=[").append(visible).append(']');
694: sb.append(']');
695: return sb.toString();
696: }
697:
698: @Override
699: public String toStringContent() {
700: return toStringContent(Charset.defaultCharset(), position(), limit());
701: }
702:
703: @Override
704: public String toStringContent(Charset charset) {
705: return toStringContent(charset, position(), limit());
706: }
707:
708: @Override
709: public String toStringContent(Charset charset, int position, int limit) {
710: checkDispose();
711: return Buffers.toStringContent(visible, charset, position, limit);
712: }
713:
714: @Override
715: public void dumpHex(java.lang.Appendable appendable) {
716: Buffers.dumpBuffer(appendable, this);
717: }
718:
719: /**
720: * {@inheritDoc}
721: */
722: @Override
723: public final ByteBuffer toByteBuffer() {
724: checkDispose();
725: return visible;
726: }
727:
728: /**
729: * {@inheritDoc}
730: */
731: @Override
732: public final ByteBuffer toByteBuffer(int position, int limit) {
733: checkDispose();
734: final int currentPosition = visible.position();
735: final int currentLimit = visible.limit();
736:
737:• if (position == currentPosition && limit == currentLimit) {
738: return toByteBuffer();
739: }
740:
741: Buffers.setPositionLimit(visible, position, limit);
742:
743: final ByteBuffer resultBuffer = visible.slice();
744:
745: Buffers.setPositionLimit(visible, currentPosition, currentLimit);
746:
747: return resultBuffer;
748: }
749:
750: /**
751: * {@inheritDoc}
752: */
753: @Override
754: public final ByteBufferArray toByteBufferArray() {
755: checkDispose();
756: final ByteBufferArray array = ByteBufferArray.create();
757: array.add(visible);
758:
759: return array;
760: }
761:
762: /**
763: * {@inheritDoc}
764: */
765: @Override
766: public final ByteBufferArray toByteBufferArray(final int position, final int limit) {
767: return toByteBufferArray(ByteBufferArray.create(), position, limit);
768: }
769:
770: /**
771: * {@inheritDoc}
772: */
773: @Override
774: public final ByteBufferArray toByteBufferArray(final ByteBufferArray array) {
775: checkDispose();
776: array.add(visible);
777: return array;
778: }
779:
780: /**
781: * {@inheritDoc}
782: */
783: @Override
784: public final ByteBufferArray toByteBufferArray(final ByteBufferArray array, final int position, final int limit) {
785: checkDispose();
786:
787: final int oldPos = visible.position();
788: final int oldLim = visible.limit();
789:
790: Buffers.setPositionLimit(visible, position, limit);
791: array.add(visible, oldPos, oldLim);
792:
793: return array;
794: }
795:
796: /**
797: * {@inheritDoc}
798: */
799: @Override
800: public final BufferArray toBufferArray() {
801: checkDispose();
802: final BufferArray array = BufferArray.create();
803: array.add(this);
804:
805: return array;
806: }
807:
808: /**
809: * {@inheritDoc}
810: */
811: @Override
812: public final BufferArray toBufferArray(final int position, final int limit) {
813: return toBufferArray(BufferArray.create(), position, limit);
814: }
815:
816: /**
817: * {@inheritDoc}
818: */
819: @Override
820: public final BufferArray toBufferArray(final BufferArray array) {
821: checkDispose();
822: array.add(this);
823: return array;
824: }
825:
826: /**
827: * {@inheritDoc}
828: */
829: @Override
830: public final BufferArray toBufferArray(final BufferArray array, final int position, final int limit) {
831: checkDispose();
832:
833: final int oldPos = visible.position();
834: final int oldLim = visible.limit();
835:
836: Buffers.setPositionLimit(visible, position, limit);
837: array.add(this, oldPos, oldLim);
838:
839: return array;
840: }
841:
842: @Override
843: public boolean release() {
844: return tryDispose();
845: }
846:
847: /**
848: * {@inheritDoc}
849: */
850: @Override
851: public boolean isExternal() {
852: return false;
853: }
854:
855: @Override
856: public boolean hasArray() {
857: return visible.hasArray();
858: }
859:
860: @Override
861: public byte[] array() {
862: return visible.array();
863: }
864:
865: @Override
866: public int arrayOffset() {
867: return visible.arrayOffset();
868: }
869:
870: protected ByteBufferWrapper wrapByteBuffer(final ByteBuffer byteBuffer) {
871: return new ByteBufferWrapper(byteBuffer);
872: }
873:
874: private static class DebugLogic {
875: static void doDebug(ByteBufferWrapper wrapper) {
876: wrapper.visible.clear();
877: while (wrapper.visible.hasRemaining()) {
878: wrapper.visible.put((byte) 0xFF);
879: }
880: wrapper.visible.flip();
881: wrapper.disposeStackTrace = new Exception("ByteBufferWrapper was disposed from: ");
882: }
883: }
884: }