Minor robustification, javadoc improvements
diff --git a/src/main/java/com/fasterxml/jackson/core/TreeNode.java b/src/main/java/com/fasterxml/jackson/core/TreeNode.java
index 1e4f659..8d8f8d7 100644
--- a/src/main/java/com/fasterxml/jackson/core/TreeNode.java
+++ b/src/main/java/com/fasterxml/jackson/core/TreeNode.java
@@ -261,6 +261,15 @@
* Functionally equivalent to first serializing tree using
* {@link ObjectCodec} and then re-parsing but
* more efficient.
+ *<p>
+ * NOTE: constructed parser instance will NOT initially point to a token,
+ * so before passing it to deserializers, it is typically necessary to
+ * advance it to the first available token by calling {@link JsonParser#nextToken()}.
+ *<p>
+ * Also note that calling this method will <b>NOT</b> pass {@link ObjectCodec}
+ * reference, so data-binding callback methods like {@link JsonParser#readValueAs(Class)}
+ * will not work with calling {@link JsonParser#setCodec}).
+ * It is often better to call {@link #traverse(ObjectCodec)} to pass the codec explicitly.
*/
JsonParser traverse();
@@ -268,6 +277,10 @@
* Same as {@link #traverse()}, but additionally passes {@link com.fasterxml.jackson.core.ObjectCodec}
* to use if {@link JsonParser#readValueAs(Class)} is used (otherwise caller must call
* {@link JsonParser#setCodec} on response explicitly).
+ *<p>
+ * NOTE: constructed parser instance will NOT initially point to a token,
+ * so before passing it to deserializers, it is typically necessary to
+ * advance it to the first available token by calling {@link JsonParser#nextToken()}.
*
* @since 2.1
*/
diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
index b903eda..f41efdb 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
@@ -166,14 +166,18 @@
*/
@Override
- protected final boolean loadMore()
- throws IOException
+ protected final boolean loadMore() throws IOException
{
_currInputProcessed += _inputEnd;
_currInputRowStart -= _inputEnd;
if (_inputStream != null) {
- int count = _inputStream.read(_inputBuffer, 0, _inputBuffer.length);
+ int space = _inputBuffer.length;
+ if (space == 0) { // only occurs when we've been closed
+ return false;
+ }
+
+ int count = _inputStream.read(_inputBuffer, 0, space);
if (count > 0) {
_inputPtr = 0;
_inputEnd = count;
@@ -193,8 +197,7 @@
* Helper method that will try to load at least specified number bytes in
* input buffer, possible moving existing data around if necessary
*/
- protected final boolean _loadToHaveAtLeast(int minAvailable)
- throws IOException
+ protected final boolean _loadToHaveAtLeast(int minAvailable) throws IOException
{
// No input stream, no leading (either we are closed, or have non-stream input source)
if (_inputStream == null) {
@@ -257,7 +260,11 @@
if (_bufferRecyclable) {
byte[] buf = _inputBuffer;
if (buf != null) {
- _inputBuffer = null;
+ /* 21-Nov-2014, tatu: Let's not set it to null; this way should
+ * get slightly more meaningful error messages in case someone
+ * closes parser indirectly, without realizing.
+ */
+ _inputBuffer = ByteArrayBuilder.NO_BYTES;
_ioContext.releaseReadIOBuffer(buf);
}
}
diff --git a/src/main/java/com/fasterxml/jackson/core/util/ByteArrayBuilder.java b/src/main/java/com/fasterxml/jackson/core/util/ByteArrayBuilder.java
index 376ffe9..30a2622 100644
--- a/src/main/java/com/fasterxml/jackson/core/util/ByteArrayBuilder.java
+++ b/src/main/java/com/fasterxml/jackson/core/util/ByteArrayBuilder.java
@@ -23,7 +23,7 @@
*/
public final class ByteArrayBuilder extends OutputStream
{
- private final static byte[] NO_BYTES = new byte[0];
+ public final static byte[] NO_BYTES = new byte[0];
// Size of the first block we will allocate.
private final static int INITIAL_BLOCK_SIZE = 500;