jackson/jackson-1.9.11-to-1.9.13.patch
2020-04-23 11:30:35 +08:00

416 lines
17 KiB
Diff

diff -Nru jackson-src-1.9.11/src/java/org/codehaus/jackson/impl/Utf8StreamParser.java jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/impl/Utf8StreamParser.java
--- jackson-src-1.9.11/src/java/org/codehaus/jackson/impl/Utf8StreamParser.java 2012-11-06 17:24:50.000000000 +0100
+++ jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/impl/Utf8StreamParser.java 2013-02-13 18:45:26.000000000 +0100
@@ -730,7 +730,7 @@
{
// very first thing: common case, colon, value, no white space
int i;
- if (_inputPtr < _inputEnd && _inputBuffer[_inputPtr] == INT_COLON) { // fast case first
+ if (_inputPtr < (_inputEnd-1) && _inputBuffer[_inputPtr] == INT_COLON) { // fast case first
++_inputPtr;
i = _inputBuffer[_inputPtr++];
if (i == INT_QUOTE) {
@@ -2359,6 +2359,7 @@
switch (i) {
case INT_SPACE:
case INT_TAB:
+ break;
case INT_CR:
_skipCR();
break;
@@ -2374,11 +2375,11 @@
}
break space_loop;
}
+ if (_inputPtr >= _inputEnd) {
+ loadMoreGuaranteed();
+ }
+ i = _inputBuffer[_inputPtr++] & 0xFF;
}
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- i = _inputBuffer[_inputPtr++] & 0xFF;
if (i != INT_COLON) {
_reportUnexpectedChar(i, "was expecting a colon to separate field name and value");
}
diff -Nru jackson-src-1.9.11/src/java/org/codehaus/jackson/io/JsonStringEncoder.java jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
--- jackson-src-1.9.11/src/java/org/codehaus/jackson/io/JsonStringEncoder.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/io/JsonStringEncoder.java 2013-01-15 21:03:48.000000000 +0100
@@ -129,8 +129,12 @@
}
}
// something to escape; 2 or 6-char variant?
- int escCode = escCodes[input.charAt(inPtr++)];
- int length = _appendSingleEscape(escCode, _quoteBuffer);
+ char d = input.charAt(inPtr++);
+ int escCode = escCodes[d];
+ int length = (escCode < 0)
+ ? _appendNumericEscape(d, _quoteBuffer)
+ : _appendNamedEscape(escCode, _quoteBuffer);
+ ;
if ((outPtr + length) > outputBuffer.length) {
int first = outputBuffer.length - outPtr;
if (first > 0) {
@@ -144,7 +148,6 @@
System.arraycopy(_quoteBuffer, 0, outputBuffer, outPtr, length);
outPtr += length;
}
-
}
textBuffer.setCurrentLength(outPtr);
return textBuffer.contentsAsArray();
@@ -249,6 +252,7 @@
* Will encode given String as UTF-8 (without any quoting), return
* resulting byte array.
*/
+ @SuppressWarnings("resource")
public byte[] encodeAsUTF8(String text)
{
ByteArrayBuilder byteBuilder = _byteBuilder;
@@ -341,16 +345,17 @@
/**********************************************************
*/
- private int _appendSingleEscape(int escCode, char[] quoteBuffer)
+ private int _appendNumericEscape(int value, char[] quoteBuffer)
+ {
+ quoteBuffer[1] = 'u';
+ // We know it's a control char, so only the last 2 chars are non-0
+ quoteBuffer[4] = HEX_CHARS[value >> 4];
+ quoteBuffer[5] = HEX_CHARS[value & 0xF];
+ return 6;
+ }
+
+ private int _appendNamedEscape(int escCode, char[] quoteBuffer)
{
- if (escCode < 0) { // control char, value -(char + 1)
- int value = -(escCode + 1);
- quoteBuffer[1] = 'u';
- // We know it's a control char, so only the last 2 chars are non-0
- quoteBuffer[4] = HEX_CHARS[value >> 4];
- quoteBuffer[5] = HEX_CHARS[value & 0xF];
- return 6;
- }
quoteBuffer[1] = (char) escCode;
return 2;
}
diff -Nru jackson-src-1.9.11/src/java/org/codehaus/jackson/io/UTF32Reader.java jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/io/UTF32Reader.java
--- jackson-src-1.9.11/src/java/org/codehaus/jackson/io/UTF32Reader.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/java/org/codehaus/jackson/io/UTF32Reader.java 2012-11-15 18:51:10.000000000 +0100
@@ -2,52 +2,54 @@
import java.io.*;
-
/**
* Since JDK does not come with UTF-32/UCS-4, let's implement a simple
* decoder to use.
*/
-public final class UTF32Reader
+public class UTF32Reader
extends BaseReader
{
- final boolean mBigEndian;
+ protected final boolean _bigEndian;
/**
* Although input is fine with full Unicode set, Java still uses
* 16-bit chars, so we may have to split high-order chars into
* surrogate pairs.
*/
- char mSurrogate = NULL_CHAR;
+ protected char _surrogate = NULL_CHAR;
/**
* Total read character count; used for error reporting purposes
*/
- int mCharCount = 0;
+ protected int _charCount = 0;
/**
* Total read byte count; used for error reporting purposes
*/
- int mByteCount = 0;
+ protected int _byteCount = 0;
+ protected final boolean _managedBuffers;
+
/*
- ////////////////////////////////////////
- // Life-cycle
- ////////////////////////////////////////
- */
+ /**********************************************************
+ /* Life-cycle
+ /**********************************************************
+ */
public UTF32Reader(IOContext ctxt,
- InputStream in, byte[] buf, int ptr, int len,
- boolean isBigEndian)
+ InputStream in, byte[] buf, int ptr, int len,
+ boolean isBigEndian)
{
super(ctxt, in, buf, ptr, len);
- mBigEndian = isBigEndian;
+ _bigEndian = isBigEndian;
+ _managedBuffers = (in != null);
}
/*
- ////////////////////////////////////////
- // Public API
- ////////////////////////////////////////
- */
+ /**********************************************************
+ /* Public API
+ /**********************************************************
+ */
@Override
public int read(char[] cbuf, int start, int len)
@@ -69,9 +71,9 @@
int outPtr = start;
// Ok, first; do we have a surrogate from last round?
- if (mSurrogate != NULL_CHAR) {
- cbuf[outPtr++] = mSurrogate;
- mSurrogate = NULL_CHAR;
+ if (_surrogate != NULL_CHAR) {
+ cbuf[outPtr++] = _surrogate;
+ _surrogate = NULL_CHAR;
// No need to load more, already got one char
} else {
/* Note: we'll try to avoid blocking as much as possible. As a
@@ -90,7 +92,7 @@
int ptr = _ptr;
int ch;
- if (mBigEndian) {
+ if (_bigEndian) {
ch = (_buffer[ptr] << 24) | ((_buffer[ptr+1] & 0xFF) << 16)
| ((_buffer[ptr+2] & 0xFF) << 8) | (_buffer[ptr+3] & 0xFF);
} else {
@@ -112,7 +114,7 @@
ch = (0xDC00 | (ch & 0x03FF));
// Room for second part?
if (outPtr >= len) { // nope
- mSurrogate = (char) ch;
+ _surrogate = (char) ch;
break main_loop;
}
}
@@ -123,36 +125,34 @@
}
len = outPtr - start;
- mCharCount += len;
+ _charCount += len;
return len;
}
/*
- ////////////////////////////////////////
- // Internal methods
- ////////////////////////////////////////
- */
+ /**********************************************************
+ /* Internal methods
+ /**********************************************************
+ */
private void reportUnexpectedEOF(int gotBytes, int needed)
throws IOException
{
- int bytePos = mByteCount + gotBytes;
- int charPos = mCharCount;
+ int bytePos = _byteCount + gotBytes;
+ int charPos = _charCount;
throw new CharConversionException("Unexpected EOF in the middle of a 4-byte UTF-32 char: got "
- +gotBytes+", needed "+needed
- +", at char #"+charPos+", byte #"+bytePos+")");
+ +gotBytes+", needed "+needed+", at char #"+charPos+", byte #"+bytePos+")");
}
private void reportInvalid(int value, int offset, String msg)
throws IOException
{
- int bytePos = mByteCount + _ptr - 1;
- int charPos = mCharCount + offset;
+ int bytePos = _byteCount + _ptr - 1;
+ int charPos = _charCount + offset;
throw new CharConversionException("Invalid UTF-32 character 0x"
- +Integer.toHexString(value)
- +msg+" at char #"+charPos+", byte #"+bytePos+")");
+ +Integer.toHexString(value)+msg+" at char #"+charPos+", byte #"+bytePos+")");
}
/**
@@ -164,7 +164,7 @@
private boolean loadMore(int available)
throws IOException
{
- mByteCount += (_length - available);
+ _byteCount += (_length - available);
// Bytes that need to be moved to the beginning of buffer?
if (available > 0) {
@@ -180,11 +180,13 @@
* so let's do a separate read right away:
*/
_ptr = 0;
- int count = _in.read(_buffer);
+ int count = (_in == null) ? -1 : _in.read(_buffer);
if (count < 1) {
_length = 0;
if (count < 0) { // -1
- freeBuffers(); // to help GC?
+ if (_managedBuffers) {
+ freeBuffers(); // to help GC?
+ }
return false;
}
// 0 count is no good; let's err out
@@ -197,10 +199,12 @@
* error.
*/
while (_length < 4) {
- int count = _in.read(_buffer, _length, _buffer.length - _length);
+ int count = (_in == null) ? -1 : _in.read(_buffer, _length, _buffer.length - _length);
if (count < 1) {
if (count < 0) { // -1, EOF... no good!
- freeBuffers(); // to help GC?
+ if (_managedBuffers) {
+ freeBuffers(); // to help GC?
+ }
reportUnexpectedEOF(_length, 4);
}
// 0 count is no good; let's err out
@@ -211,4 +215,3 @@
return true;
}
}
-
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/AnnotationIntrospector.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/AnnotationIntrospector.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/AnnotationIntrospector.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/AnnotationIntrospector.java 2012-11-08 13:26:56.000000000 +0100
@@ -637,10 +637,15 @@
* Method for determining the String value to use for serializing
* given enumeration entry; used when serializing enumerations
* as Strings (the standard method).
+ *<p>
+ * NOTE: implemented since 1.9.11, to make things work even when
+ * annotation introspection is disabled.
*
* @return Serialized enum value.
*/
- public abstract String findEnumValue(Enum<?> value);
+ public String findEnumValue(Enum<?> value) {
+ return value.name();
+ }
/*
/**********************************************************
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/deser/std/ClassDeserializer.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/deser/std/ClassDeserializer.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/deser/std/ClassDeserializer.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/deser/std/ClassDeserializer.java 2012-11-16 19:30:42.000000000 +0100
@@ -7,6 +7,7 @@
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.annotate.JacksonStdImpl;
+import org.codehaus.jackson.map.util.ClassUtil;
/**
*
@@ -26,20 +27,8 @@
// Currently will only accept if given simple class name
if (curr == JsonToken.VALUE_STRING) {
String className = jp.getText();
- // [JACKSON-597]: support primitive types (and void)
- if (className.indexOf('.') < 0) {
- if ("int".equals(className)) return Integer.TYPE;
- if ("long".equals(className)) return Long.TYPE;
- if ("float".equals(className)) return Float.TYPE;
- if ("double".equals(className)) return Double.TYPE;
- if ("boolean".equals(className)) return Boolean.TYPE;
- if ("byte".equals(className)) return Byte.TYPE;
- if ("char".equals(className)) return Character.TYPE;
- if ("short".equals(className)) return Short.TYPE;
- if ("void".equals(className)) return Void.TYPE;
- }
try {
- return Class.forName(jp.getText());
+ return ClassUtil.findClass(className);
} catch (ClassNotFoundException e) {
throw ctxt.instantiationException(_valueClass, e);
}
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializerProvider.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializerProvider.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializerProvider.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializerProvider.java 2013-03-01 19:29:20.000000000 +0100
@@ -469,6 +469,16 @@
// should never happen? (if it can, could call on that object)
throw new IllegalStateException("Type-wrapped deserializer's deserializeWithType should never get called");
}
- }
+ @Override
+ public Object deserialize(JsonParser jp, DeserializationContext ctxt,
+ Object intoValue)
+ throws IOException, JsonProcessingException
+ {
+ /* 01-Mar-2013, tatu: Hmmh. Tough call as to what to do... need
+ * to delegate, but will this work reliably? Let's just hope so:
+ */
+ return _deserializer.deserialize(jp, ctxt, intoValue);
+ }
+ }
}
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/introspect/NopAnnotationIntrospector.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/introspect/NopAnnotationIntrospector.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/introspect/NopAnnotationIntrospector.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/introspect/NopAnnotationIntrospector.java 2012-11-08 13:31:02.000000000 +0100
@@ -42,7 +42,8 @@
@Override
public String findEnumValue(Enum<?> value) {
- return null;
+ // as per [JACKSON-875]
+ return value.name();
}
/*
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/JsonDeserializer.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/JsonDeserializer.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/JsonDeserializer.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/JsonDeserializer.java 2013-03-01 19:28:18.000000000 +0100
@@ -61,7 +61,8 @@
T intoValue)
throws IOException, JsonProcessingException
{
- throw new UnsupportedOperationException();
+ throw new UnsupportedOperationException("Can not update object of type "
+ +intoValue.getClass().getName()+" (by deserializer of type "+getClass().getName()+")");
}
/**
diff -Nru jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/type/TypeBindings.java jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/type/TypeBindings.java
--- jackson-src-1.9.11/src/mapper/java/org/codehaus/jackson/map/type/TypeBindings.java 2012-11-06 17:24:51.000000000 +0100
+++ jackson-src-1.9.11-gil/src/mapper/java/org/codehaus/jackson/map/type/TypeBindings.java 2013-02-08 22:11:42.000000000 +0100
@@ -287,7 +287,14 @@
* need to call getEnclosingClass since anonymous classes declare
* generics
*/
- _resolveBindings(raw.getDeclaringClass());
+ Class<?> decl = raw.getDeclaringClass();
+ /* 08-Feb-2013, tatu: Except that if context is also super-class, we must
+ * skip it; context will be checked anyway, and we'd get StackOverflow if
+ * we went there.
+ */
+ if (decl != null && !decl.isAssignableFrom(raw)) {
+ _resolveBindings(raw.getDeclaringClass());
+ }
/* 24-Mar-2010, tatu: Can not have true generics definitions, but can
* have lower bounds ("<T extends BeanBase>") in declaration itself
*/