Mercurial Hosting > luan
view src/org/eclipse/jetty/io/JBuffer.java @ 1048:2b769da7f67d
remove Buffer
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 07 Nov 2016 23:15:42 -0700 |
parents | a8c92b0a08ed |
children | 4afdf0f0c5bc |
line wrap: on
line source
// tmp class to implement Buffer until I can get rid of it package org.eclipse.jetty.io; import java.io.InputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.jetty.util.TypeUtil; public final class JBuffer { private static final Logger LOG = LoggerFactory.getLogger(JBuffer.class); private final ByteBuffer bb; public JBuffer(ByteBuffer bb) { this.bb = bb; } public byte[] array() { return bb.hasArray() ? bb.array() : null; } public JBuffer duplicate() { return new JBuffer(bb.duplicate()); } public int remaining() { return bb.remaining(); } public boolean isReadOnly() { return bb.isReadOnly(); } public boolean hasRemaining() { return bb.hasRemaining(); } public byte get() { return bb.get(); } public void compact() { int n = bb.remaining(); bb.compact(); bb.position(0); bb.limit(n); } public int capacity() { return bb.capacity(); } public boolean isDirect() { return bb.isDirect(); } public ByteBuffer getByteBuffer() { ByteBuffer dup = bb.duplicate(); dup.limit(dup.capacity()); return dup; } public int getIndex() { return bb.position(); } public void clear() { bb.position(0); bb.limit(0); } public int space() { return bb.capacity() - bb.limit(); } public JBuffer buffer() { return this; } public JBuffer get(int length) { ByteBuffer dup = bb.duplicate(); int end = bb.position()+length; dup.limit(end); bb.position(end); return new JBuffer(dup); } public int get(byte[] b, int offset, int length) { int remaining = bb.remaining(); if( remaining == 0 ) return -1; if( length > remaining ) length = remaining; bb.get(b,offset,length); return length; } public int put(JBuffer src) { return put(src.asArray()); } public void put(byte b) { ByteBuffer dup = bb.duplicate(); dup.position(bb.limit()); dup.limit(bb.capacity()); dup.put(b); bb.limit(bb.limit()+1); } public int put(byte[] b, int offset, int length) { ByteBuffer dup = bb.duplicate(); int put = bb.limit(); int capacity = bb.capacity(); dup.position(put); dup.limit(capacity); if( length > capacity - put ) length = capacity - put; dup.put(b,offset,length); bb.limit(put+length); return length; } public int put(byte[] b) { return put(b,0,b.length); } public final int putIndex() { return bb.limit(); } public void setGetIndex(int getIndex) { bb.position(getIndex); } public void setPutIndex(int putIndex) { bb.limit(putIndex); } public int skip(int n) { if (remaining() < n) n = remaining(); bb.position(bb.position() + n); return n; } public JBuffer slice() { return duplicate(); } public final JBuffer sliceFrom(int index) { ByteBuffer dup = bb.duplicate(); dup.position(index); dup.limit(bb.position()-1); return new JBuffer(dup); } public int readFrom(InputStream in,int max) throws IOException { ByteBuffer dup = bb.duplicate(); int put = bb.limit(); dup.limit( Math.min(put+max,bb.capacity()) ); dup.position(put); ReadableByteChannel chan = Channels.newChannel(in); int n = chan.read(dup); if( n > 0 ) bb.limit(put+n); return n; } public final byte[] asArray() { byte[] bytes = new byte[remaining()]; bb.duplicate().get(bytes); return bytes; } @Override public String toString() { return toString("ISO-8859-1"); } public final String toString(int index, int length) { ByteBuffer dup = bb.duplicate(); dup.limit(index+length); dup.position(index); return new JBuffer(dup).toString(); } public final String toString(String charset) { byte[] bytes = asArray(); try { return new String(bytes,charset); } catch(Exception e) { LOG.warn("",e); return new String(bytes); } } public String toDetailString() { StringBuilder buf = new StringBuilder(); buf.append("["); buf.append(super.hashCode()); buf.append(","); buf.append(this.buffer().hashCode()); buf.append(",g="); buf.append(getIndex()); buf.append(",p="); buf.append(putIndex()); buf.append(",c="); buf.append(capacity()); buf.append("]={"); int count = 0; for (int i = getIndex(); i < putIndex(); i++) { byte b = peek(i); TypeUtil.toHex(b,buf); if (count++ == 50) { if (putIndex() - i > 20) { buf.append(" ... "); i = putIndex() - 20; } } } buf.append('}'); return buf.toString(); } private JBuffer pokeBuffer(int index) { JBuffer dup = duplicate(); dup.setPutIndex(index); return dup; } public int poke(int index, byte b[], int offset, int length) { return pokeBuffer(index).put(b,offset,length); } public void poke(int index, byte b) { pokeBuffer(index).put(b); } public int poke(int index, JBuffer src) { return pokeBuffer(index).put(src); } private JBuffer peekBuffer(int index) { JBuffer dup = duplicate(); dup.setGetIndex(index); dup.setPutIndex(dup.capacity()); return dup; } public int peek(int index, byte[] b, int offset, int length) { return peekBuffer(index).get(b,offset,length); } public byte peek(int index) { return bb.get(index); } public byte peek() { return peek(bb.position()); } }