package org.codehaus.jackson.io; import java.io.IOException; import java.io.InputStream; import java.io.Reader; /** * Simple basic class for optimized readers in this package; implements * "cookie-cutter" methods that are used by all actual implementations. */ abstract class BaseReader extends Reader { /** * JSON actually limits available Unicode range in the high end * to the same as xml (to basically limit UTF-8 max byte sequence * length to 4) */ final protected static int LAST_VALID_UNICODE_CHAR = 0x10FFFF; final protected static char NULL_CHAR = (char) 0; final protected static char NULL_BYTE = (byte) 0; final protected IOContext mContext; protected InputStream mIn; protected byte[] mBuffer; protected int mPtr; protected int mLength; /* //////////////////////////////////////// // Life-cycle //////////////////////////////////////// */ protected BaseReader(IOContext context, InputStream in, byte[] buf, int ptr, int len) { mContext = context; mIn = in; mBuffer = buf; mPtr = ptr; mLength = len; } /* //////////////////////////////////////// // Reader API //////////////////////////////////////// */ public void close() throws IOException { InputStream in = mIn; if (in != null) { mIn = null; freeBuffers(); in.close(); } } char[] mTmpBuf = null; /** * Although this method is implemented by the base class, AND it should * never be called by main code, let's still implement it bit more * efficiently just in case */ public int read() throws IOException { if (mTmpBuf == null) { mTmpBuf = new char[1]; } if (read(mTmpBuf, 0, 1) < 1) { return -1; } return mTmpBuf[0]; } /* //////////////////////////////////////// // Internal/package methods: //////////////////////////////////////// */ /** * This method should be called along with (or instead of) normal * close. After calling this method, no further reads should be tried. * Method will try to recycle read buffers (if any). */ public final void freeBuffers() { byte[] buf = mBuffer; if (buf != null) { mBuffer = null; mContext.releaseReadIOBuffer(buf); } } protected void reportBounds(char[] cbuf, int start, int len) throws IOException { throw new ArrayIndexOutOfBoundsException("read(buf,"+start+","+len+"), cbuf["+cbuf.length+"]"); } protected void reportStrangeStream() throws IOException { throw new IOException("Strange I/O stream, returned 0 bytes on read"); } }