newForSerialization(Object context) {
- return this;
- }
-
- @Override
- public UUID generateId(Object forPojo) {
- return UUID.randomUUID();
- }
-
- @Override
- public IdKey key(Object key) {
- return new IdKey(getClass(), null, key);
- }
-
- /**
- * Since UUIDs are always unique, let's fully ignore scope definition
- */
- @Override
- public boolean canUseFor(ObjectIdGenerator> gen) {
- return (gen.getClass() == getClass());
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/PropertyAccessor.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/PropertyAccessor.java
deleted file mode 100644
index 107a9a9a8..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/PropertyAccessor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.fr.third.fasterxml.jackson.annotation;
-
-/**
- * Enumeration used to define kinds of elements (called "property accessors")
- * that annotations like {@link JsonAutoDetect} apply to.
- *
- * In addition to method types (GETTER/IS_GETTER, SETTER, CREATOR) and the
- * field type (FIELD), 2 pseudo-types
- * are defined for convenience: ALWAYS
and NONE
. These
- * can be used to indicate, all or none of available method types (respectively),
- * for use by annotations that takes JsonMethod
argument.
- */
-public enum PropertyAccessor
-{
- /**
- * Getters are methods used to get a POJO field value for serialization,
- * or, under certain conditions also for de-serialization. Latter
- * can be used for effectively setting Collection or Map values
- * in absence of setters, iff returned value is not a copy but
- * actual value of the logical property.
- *
- * Since version 1.3, this does NOT include "is getters" (methods
- * that return boolean and named 'isXxx' for property 'xxx'); instead,
- * {@link #IS_GETTER} is used}.
- */
- GETTER,
-
- /**
- * Setters are methods used to set a POJO value for deserialization.
- */
- SETTER,
-
- /**
- * Creators are constructors and (static) factory methods used to
- * construct POJO instances for deserialization
- */
- CREATOR,
-
- /**
- * Field refers to fields of regular Java objects. Although
- * they are not really methods, addition of optional field-discovery
- * in version 1.1 meant that there was need to enable/disable
- * their auto-detection, and this is the place to add it in.
- */
- FIELD,
-
- /**
- * "Is getters" are getter-like methods that are named "isXxx"
- * (instead of "getXxx" for getters) and return boolean value
- * (either primitive, or {@link java.lang.Boolean}).
- *
- */
- IS_GETTER,
-
- /**
- * This pseudo-type indicates that none of accessors if affected.
- */
- NONE,
-
- /**
- * This pseudo-type indicates that all accessors are affected.
- */
- ALL
- ;
-
- private PropertyAccessor() { }
-
- public boolean creatorEnabled() {
- return (this == CREATOR) || (this == ALL);
- }
-
- public boolean getterEnabled() {
- return (this == GETTER) || (this == ALL);
- }
-
- public boolean isGetterEnabled() {
- return (this == IS_GETTER) || (this == ALL);
- }
-
- public boolean setterEnabled() {
- return (this == SETTER) || (this == ALL);
- }
-
- public boolean fieldEnabled() {
- return (this == FIELD) || (this == ALL);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/package-info.java
deleted file mode 100644
index d3cac6f83..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/annotation/package-info.java
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Public core annotations, most of which are used to configure how
- * Data Mapping/Binding works. Annotations in this package can only
- * have dependencies to non-annotation classes in Core package;
- * annotations that have dependencies to Mapper classes are included
- * in Mapper module (under org.codehaus.jackson.map.annotate
).
- * Also contains parameter types (mostly enums) needed by annotations.
- *
- * Note that prior versions (1.x) contained these annotations within
- * 'core' jar, as part of Streaming API.
- */
-package com.fr.third.fasterxml.jackson.annotation;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variant.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variant.java
deleted file mode 100644
index a24f1774e..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variant.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-package com.fr.third.fasterxml.jackson.core;
-
-import java.util.Arrays;
-
-import com.fr.third.fasterxml.jackson.core.util.ByteArrayBuilder;
-
-/**
- * Abstract base class used to define specific details of which
- * variant of Base64 encoding/decoding is to be used. Although there is
- * somewhat standard basic version (so-called "MIME Base64"), other variants
- * exists, see Base64 Wikipedia entry for details.
- *
- * @author Tatu Saloranta
- */
-public final class Base64Variant
- implements java.io.Serializable
-{
- private final static int INT_SPACE = 0x20;
-
- // We'll only serialize name
- private static final long serialVersionUID = 1L;
-
- /**
- * Placeholder used by "no padding" variant, to be used when a character
- * value is needed.
- */
- final static char PADDING_CHAR_NONE = '\0';
-
- /**
- * Marker used to denote ascii characters that do not correspond
- * to a 6-bit value (in this variant), and is not used as a padding
- * character.
- */
- public final static int BASE64_VALUE_INVALID = -1;
-
- /**
- * Marker used to denote ascii character (in decoding table) that
- * is the padding character using this variant (if any).
- */
- public final static int BASE64_VALUE_PADDING = -2;
-
- /*
- /**********************************************************
- /* Encoding/decoding tables
- /**********************************************************
- */
-
- /**
- * Decoding table used for base 64 decoding.
- */
- private final transient int[] _asciiToBase64 = new int[128];
-
- /**
- * Encoding table used for base 64 decoding when output is done
- * as characters.
- */
- private final transient char[] _base64ToAsciiC = new char[64];
-
- /**
- * Alternative encoding table used for base 64 decoding when output is done
- * as ascii bytes.
- */
- private final transient byte[] _base64ToAsciiB = new byte[64];
-
- /*
- /**********************************************************
- /* Other configuration
- /**********************************************************
- */
-
- /**
- * Symbolic name of variant; used for diagnostics/debugging.
- *
- * Note that this is the only non-transient field; used when reading
- * back from serialized state
- */
- protected final String _name;
-
- /**
- * Whether this variant uses padding or not.
- */
- protected final transient boolean _usesPadding;
-
- /**
- * Characted used for padding, if any ({@link #PADDING_CHAR_NONE} if not).
- */
- protected final transient char _paddingChar;
-
- /**
- * Maximum number of encoded base64 characters to output during encoding
- * before adding a linefeed, if line length is to be limited
- * ({@link java.lang.Integer#MAX_VALUE} if not limited).
- *
- * Note: for some output modes (when writing attributes) linefeeds may
- * need to be avoided, and this value ignored.
- */
- protected final transient int _maxLineLength;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public Base64Variant(String name, String base64Alphabet, boolean usesPadding, char paddingChar, int maxLineLength)
- {
- _name = name;
- _usesPadding = usesPadding;
- _paddingChar = paddingChar;
- _maxLineLength = maxLineLength;
-
- // Ok and then we need to create codec tables.
-
- // First the main encoding table:
- int alphaLen = base64Alphabet.length();
- if (alphaLen != 64) {
- throw new IllegalArgumentException("Base64Alphabet length must be exactly 64 (was "+alphaLen+")");
- }
-
- // And then secondary encoding table and decoding table:
- base64Alphabet.getChars(0, alphaLen, _base64ToAsciiC, 0);
- Arrays.fill(_asciiToBase64, BASE64_VALUE_INVALID);
- for (int i = 0; i < alphaLen; ++i) {
- char alpha = _base64ToAsciiC[i];
- _base64ToAsciiB[i] = (byte) alpha;
- _asciiToBase64[alpha] = i;
- }
-
- // Plus if we use padding, add that in too
- if (usesPadding) {
- _asciiToBase64[(int) paddingChar] = BASE64_VALUE_PADDING;
- }
- }
-
- /**
- * "Copy constructor" that can be used when the base alphabet is identical
- * to one used by another variant except for the maximum line length
- * (and obviously, name).
- */
- public Base64Variant(Base64Variant base, String name, int maxLineLength)
- {
- this(base, name, base._usesPadding, base._paddingChar, maxLineLength);
- }
-
- /**
- * "Copy constructor" that can be used when the base alphabet is identical
- * to one used by another variant, but other details (padding, maximum
- * line length) differ
- */
- public Base64Variant(Base64Variant base, String name, boolean usesPadding, char paddingChar, int maxLineLength)
- {
- _name = name;
- byte[] srcB = base._base64ToAsciiB;
- System.arraycopy(srcB, 0, this._base64ToAsciiB, 0, srcB.length);
- char[] srcC = base._base64ToAsciiC;
- System.arraycopy(srcC, 0, this._base64ToAsciiC, 0, srcC.length);
- int[] srcV = base._asciiToBase64;
- System.arraycopy(srcV, 0, this._asciiToBase64, 0, srcV.length);
-
- _usesPadding = usesPadding;
- _paddingChar = paddingChar;
- _maxLineLength = maxLineLength;
- }
-
- /*
- /**********************************************************
- /* Serializable overrides
- /**********************************************************
- */
-
- /**
- * Method used to "demote" deserialized instances back to
- * canonical ones
- */
- protected Object readResolve() {
- return Base64Variants.valueOf(_name);
- }
-
- /*
- /**********************************************************
- /* Public accessors
- /**********************************************************
- */
-
- public String getName() { return _name; }
-
- public boolean usesPadding() { return _usesPadding; }
- public boolean usesPaddingChar(char c) { return c == _paddingChar; }
- public boolean usesPaddingChar(int ch) { return ch == (int) _paddingChar; }
- public char getPaddingChar() { return _paddingChar; }
- public byte getPaddingByte() { return (byte)_paddingChar; }
-
- public int getMaxLineLength() { return _maxLineLength; }
-
- /*
- /**********************************************************
- /* Decoding support
- /**********************************************************
- */
-
- /**
- * @return 6-bit decoded value, if valid character;
- */
- public int decodeBase64Char(char c)
- {
- int ch = (int) c;
- return (ch <= 127) ? _asciiToBase64[ch] : BASE64_VALUE_INVALID;
- }
-
- public int decodeBase64Char(int ch)
- {
- return (ch <= 127) ? _asciiToBase64[ch] : BASE64_VALUE_INVALID;
- }
-
- public int decodeBase64Byte(byte b)
- {
- int ch = (int) b;
- return (ch <= 127) ? _asciiToBase64[ch] : BASE64_VALUE_INVALID;
- }
-
- /*
- /**********************************************************
- /* Encoding support
- /**********************************************************
- */
-
- public char encodeBase64BitsAsChar(int value)
- {
- /* Let's assume caller has done necessary checks; this
- * method must be fast and inlinable
- */
- return _base64ToAsciiC[value];
- }
-
- /**
- * Method that encodes given right-aligned (LSB) 24-bit value
- * into 4 base64 characters, stored in given result buffer.
- */
- public int encodeBase64Chunk(int b24, char[] buffer, int ptr)
- {
- buffer[ptr++] = _base64ToAsciiC[(b24 >> 18) & 0x3F];
- buffer[ptr++] = _base64ToAsciiC[(b24 >> 12) & 0x3F];
- buffer[ptr++] = _base64ToAsciiC[(b24 >> 6) & 0x3F];
- buffer[ptr++] = _base64ToAsciiC[b24 & 0x3F];
- return ptr;
- }
-
- public void encodeBase64Chunk(StringBuilder sb, int b24)
- {
- sb.append(_base64ToAsciiC[(b24 >> 18) & 0x3F]);
- sb.append(_base64ToAsciiC[(b24 >> 12) & 0x3F]);
- sb.append(_base64ToAsciiC[(b24 >> 6) & 0x3F]);
- sb.append(_base64ToAsciiC[b24 & 0x3F]);
- }
-
- /**
- * Method that outputs partial chunk (which only encodes one
- * or two bytes of data). Data given is still aligned same as if
- * it as full data; that is, missing data is at the "right end"
- * (LSB) of int.
- *
- * @param outputBytes Number of encoded bytes included (either 1 or 2)
- */
- public int encodeBase64Partial(int bits, int outputBytes, char[] buffer, int outPtr)
- {
- buffer[outPtr++] = _base64ToAsciiC[(bits >> 18) & 0x3F];
- buffer[outPtr++] = _base64ToAsciiC[(bits >> 12) & 0x3F];
- if (_usesPadding) {
- buffer[outPtr++] = (outputBytes == 2) ?
- _base64ToAsciiC[(bits >> 6) & 0x3F] : _paddingChar;
- buffer[outPtr++] = _paddingChar;
- } else {
- if (outputBytes == 2) {
- buffer[outPtr++] = _base64ToAsciiC[(bits >> 6) & 0x3F];
- }
- }
- return outPtr;
- }
-
- public void encodeBase64Partial(StringBuilder sb, int bits, int outputBytes)
- {
- sb.append(_base64ToAsciiC[(bits >> 18) & 0x3F]);
- sb.append(_base64ToAsciiC[(bits >> 12) & 0x3F]);
- if (_usesPadding) {
- sb.append((outputBytes == 2) ?
- _base64ToAsciiC[(bits >> 6) & 0x3F] : _paddingChar);
- sb.append(_paddingChar);
- } else {
- if (outputBytes == 2) {
- sb.append(_base64ToAsciiC[(bits >> 6) & 0x3F]);
- }
- }
- }
-
- public byte encodeBase64BitsAsByte(int value)
- {
- // As with above, assuming it is 6-bit value
- return _base64ToAsciiB[value];
- }
-
- /**
- * Method that encodes given right-aligned (LSB) 24-bit value
- * into 4 base64 bytes (ascii), stored in given result buffer.
- */
- public int encodeBase64Chunk(int b24, byte[] buffer, int ptr)
- {
- buffer[ptr++] = _base64ToAsciiB[(b24 >> 18) & 0x3F];
- buffer[ptr++] = _base64ToAsciiB[(b24 >> 12) & 0x3F];
- buffer[ptr++] = _base64ToAsciiB[(b24 >> 6) & 0x3F];
- buffer[ptr++] = _base64ToAsciiB[b24 & 0x3F];
- return ptr;
- }
-
- /**
- * Method that outputs partial chunk (which only encodes one
- * or two bytes of data). Data given is still aligned same as if
- * it as full data; that is, missing data is at the "right end"
- * (LSB) of int.
- *
- * @param outputBytes Number of encoded bytes included (either 1 or 2)
- */
- public int encodeBase64Partial(int bits, int outputBytes, byte[] buffer, int outPtr)
- {
- buffer[outPtr++] = _base64ToAsciiB[(bits >> 18) & 0x3F];
- buffer[outPtr++] = _base64ToAsciiB[(bits >> 12) & 0x3F];
- if (_usesPadding) {
- byte pb = (byte) _paddingChar;
- buffer[outPtr++] = (outputBytes == 2) ?
- _base64ToAsciiB[(bits >> 6) & 0x3F] : pb;
- buffer[outPtr++] = pb;
- } else {
- if (outputBytes == 2) {
- buffer[outPtr++] = _base64ToAsciiB[(bits >> 6) & 0x3F];
- }
- }
- return outPtr;
- }
-
- /*
- /**********************************************************
- /* Convenience conversion methods for String to/from bytes
- /* use case.
- /**********************************************************
- */
-
- /**
- * Convenience method for converting given byte array as base64 encoded
- * String using this variant's settings.
- * Resulting value is "raw", that is, not enclosed in double-quotes.
- *
- * @param input Byte array to encode
- */
- public String encode(byte[] input)
- {
- return encode(input, false);
- }
-
- /**
- * Convenience method for converting given byte array as base64 encoded String
- * using this variant's settings,
- * optionally enclosed in double-quotes.
- *
- * @param input Byte array to encode
- * @param addQuotes Whether to surround resulting value in double quotes or not
- */
- public String encode(byte[] input, boolean addQuotes)
- {
- int inputEnd = input.length;
- StringBuilder sb;
- {
- // let's approximate... 33% overhead, ~= 3/8 (0.375)
- int outputLen = inputEnd + (inputEnd >> 2) + (inputEnd >> 3);
- sb = new StringBuilder(outputLen);
- }
- if (addQuotes) {
- sb.append('"');
- }
-
- int chunksBeforeLF = getMaxLineLength() >> 2;
-
- // Ok, first we loop through all full triplets of data:
- int inputPtr = 0;
- int safeInputEnd = inputEnd-3; // to get only full triplets
-
- while (inputPtr <= safeInputEnd) {
- // First, mash 3 bytes into lsb of 32-bit int
- int b24 = ((int) input[inputPtr++]) << 8;
- b24 |= ((int) input[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) input[inputPtr++]) & 0xFF);
- encodeBase64Chunk(sb, b24);
- if (--chunksBeforeLF <= 0) {
- // note: must quote in JSON value, so not really useful...
- sb.append('\\');
- sb.append('n');
- chunksBeforeLF = getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- int inputLeft = inputEnd - inputPtr; // 0, 1 or 2
- if (inputLeft > 0) { // yes, but do we have room for output?
- int b24 = ((int) input[inputPtr++]) << 16;
- if (inputLeft == 2) {
- b24 |= (((int) input[inputPtr++]) & 0xFF) << 8;
- }
- encodeBase64Partial(sb, b24, inputLeft);
- }
-
- if (addQuotes) {
- sb.append('"');
- }
- return sb.toString();
- }
-
- /**
- * Convenience method for decoding contents of a Base64-encoded String,
- * using this variant's settings.
- *
- * @param input
- *
- * @since 2.2.3
- *
- * @throws IllegalArgumentException if input is not valid base64 encoded data
- */
- @SuppressWarnings("resource")
- public byte[] decode(String input) throws IllegalArgumentException
- {
- ByteArrayBuilder b = new ByteArrayBuilder();
- decode(input, b);
- return b.toByteArray();
- }
-
- /**
- * Convenience method for decoding contents of a Base64-encoded String,
- * using this variant's settings
- * and appending decoded binary data using provided {@link ByteArrayBuilder}.
- *
- * NOTE: builder will NOT be reset before decoding (nor cleared afterwards);
- * assumption is that caller will ensure it is given in proper state, and
- * used as appropriate afterwards.
- *
- * @since 2.2.3
- *
- * @throws IllegalArgumentException if input is not valid base64 encoded data
- */
- public void decode(String str, ByteArrayBuilder builder) throws IllegalArgumentException
- {
- int ptr = 0;
- int len = str.length();
-
- main_loop:
- while (ptr < len) {
- // first, we'll skip preceding white space, if any
- char ch;
- do {
- ch = str.charAt(ptr++);
- if (ptr >= len) {
- break main_loop;
- }
- } while (ch <= INT_SPACE);
- int bits = decodeBase64Char(ch);
- if (bits < 0) {
- _reportInvalidBase64(ch, 0, null);
- }
- int decodedData = bits;
- // then second base64 char; can't get padding yet, nor ws
- if (ptr >= len) {
- _reportBase64EOF();
- }
- ch = str.charAt(ptr++);
- bits = decodeBase64Char(ch);
- if (bits < 0) {
- _reportInvalidBase64(ch, 1, null);
- }
- decodedData = (decodedData << 6) | bits;
- // third base64 char; can be padding, but not ws
- if (ptr >= len) {
- // but as per [JACKSON-631] can be end-of-input, iff not using padding
- if (!usesPadding()) {
- decodedData >>= 4;
- builder.append(decodedData);
- break;
- }
- _reportBase64EOF();
- }
- ch = str.charAt(ptr++);
- bits = decodeBase64Char(ch);
-
- // First branch: can get padding (-> 1 byte)
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- _reportInvalidBase64(ch, 2, null);
- }
- // Ok, must get padding
- if (ptr >= len) {
- _reportBase64EOF();
- }
- ch = str.charAt(ptr++);
- if (!usesPaddingChar(ch)) {
- _reportInvalidBase64(ch, 3, "expected padding character '"+getPaddingChar()+"'");
- }
- // Got 12 bits, only need 8, need to shift
- decodedData >>= 4;
- builder.append(decodedData);
- continue;
- }
- // Nope, 2 or 3 bytes
- decodedData = (decodedData << 6) | bits;
- // fourth and last base64 char; can be padding, but not ws
- if (ptr >= len) {
- // but as per [JACKSON-631] can be end-of-input, iff not using padding
- if (!usesPadding()) {
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- break;
- }
- _reportBase64EOF();
- }
- ch = str.charAt(ptr++);
- bits = decodeBase64Char(ch);
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- _reportInvalidBase64(ch, 3, null);
- }
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- } else {
- // otherwise, our triple is now complete
- decodedData = (decodedData << 6) | bits;
- builder.appendThreeBytes(decodedData);
- }
- }
- }
-
- /*
- /**********************************************************
- /* Overridden standard methods
- /**********************************************************
- */
-
- @Override
- public String toString() { return _name; }
-
- @Override
- public boolean equals(Object o) {
- // identity comparison should be dine
- return (o == this);
- }
-
- @Override
- public int hashCode() {
- return _name.hashCode();
- }
-
- /*
- /**********************************************************
- /* Internal helper methods
- /**********************************************************
- */
-
- /**
- * @param bindex Relative index within base64 character unit; between 0
- * and 3 (as unit has exactly 4 characters)
- */
- protected void _reportInvalidBase64(char ch, int bindex, String msg)
- throws IllegalArgumentException
- {
- String base;
- if (ch <= INT_SPACE) {
- base = "Illegal white space character (code 0x"+Integer.toHexString(ch)+") as character #"+(bindex+1)+" of 4-char base64 unit: can only used between units";
- } else if (usesPaddingChar(ch)) {
- base = "Unexpected padding character ('"+getPaddingChar()+"') as character #"+(bindex+1)+" of 4-char base64 unit: padding only legal as 3rd or 4th character";
- } else if (!Character.isDefined(ch) || Character.isISOControl(ch)) {
- // Not sure if we can really get here... ? (most illegal xml chars are caught at lower level)
- base = "Illegal character (code 0x"+Integer.toHexString(ch)+") in base64 content";
- } else {
- base = "Illegal character '"+ch+"' (code 0x"+Integer.toHexString(ch)+") in base64 content";
- }
- if (msg != null) {
- base = base + ": " + msg;
- }
- throw new IllegalArgumentException(base);
- }
-
- protected void _reportBase64EOF() throws IllegalArgumentException {
- throw new IllegalArgumentException("Unexpected end-of-String in base64 content");
- }
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variants.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variants.java
deleted file mode 100644
index abf3f1ed1..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Base64Variants.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Container for commonly used Base64 variants:
- *
- * {@link #MIME}
- * {@link #MIME_NO_LINEFEEDS}
- * {@link #PEM}
- * {@link #MODIFIED_FOR_URL}
- *
- *
- * @author Tatu Saloranta
- */
-public final class Base64Variants
-{
- final static String STD_BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
- /**
- * This variant is what most people would think of "the standard"
- * Base64 encoding.
- *
- * See wikipedia Base64 entry for details.
- *
- * Note that although this can be thought of as the standard variant,
- * it is not the default for Jackson: no-linefeeds alternative
- * is because of JSON requirement of escaping all linefeeds.
- */
- public final static Base64Variant MIME;
- static {
- MIME = new Base64Variant("MIME", STD_BASE64_ALPHABET, true, '=', 76);
- }
-
- /**
- * Slightly non-standard modification of {@link #MIME} which does not
- * use linefeeds (max line length set to infinite). Useful when linefeeds
- * wouldn't work well (possibly in attributes), or for minor space savings
- * (save 1 linefeed per 76 data chars, ie. ~1.4% savings).
- */
- public final static Base64Variant MIME_NO_LINEFEEDS;
- static {
- MIME_NO_LINEFEEDS = new Base64Variant(MIME, "MIME-NO-LINEFEEDS", Integer.MAX_VALUE);
- }
-
- /**
- * This variant is the one that predates {@link #MIME}: it is otherwise
- * identical, except that it mandates shorter line length.
- */
- public final static Base64Variant PEM = new Base64Variant(MIME, "PEM", true, '=', 64);
-
- /**
- * This non-standard variant is usually used when encoded data needs to be
- * passed via URLs (such as part of GET request). It differs from the
- * base {@link #MIME} variant in multiple ways.
- * First, no padding is used: this also means that it generally can not
- * be written in multiple separate but adjacent chunks (which would not
- * be the usual use case in any case). Also, no linefeeds are used (max
- * line length set to infinite). And finally, two characters (plus and
- * slash) that would need quoting in URLs are replaced with more
- * optimal alternatives (hyphen and underscore, respectively).
- */
- public final static Base64Variant MODIFIED_FOR_URL;
- static {
- StringBuffer sb = new StringBuffer(STD_BASE64_ALPHABET);
- // Replace plus with hyphen, slash with underscore (and no padding)
- sb.setCharAt(sb.indexOf("+"), '-');
- sb.setCharAt(sb.indexOf("/"), '_');
- /* And finally, let's not split lines either, wouldn't work too
- * well with URLs
- */
- MODIFIED_FOR_URL = new Base64Variant("MODIFIED-FOR-URL", sb.toString(), false, Base64Variant.PADDING_CHAR_NONE, Integer.MAX_VALUE);
- }
-
- /**
- * Method used to get the default variant ("MIME_NO_LINEFEEDS") for cases
- * where caller does not explicitly specify the variant.
- * We will prefer no-linefeed version because linefeeds in JSON values
- * must be escaped, making linefeed-containing variants sub-optimal.
- */
- public static Base64Variant getDefaultVariant() {
- return MIME_NO_LINEFEEDS;
- }
-
- /**
- * @since 2.1
- */
- public static Base64Variant valueOf(String name) throws IllegalArgumentException
- {
- if (MIME._name.equals(name)) {
- return MIME;
- }
- if (MIME_NO_LINEFEEDS._name.equals(name)) {
- return MIME_NO_LINEFEEDS;
- }
- if (PEM._name.equals(name)) {
- return PEM;
- }
- if (MODIFIED_FOR_URL._name.equals(name)) {
- return MODIFIED_FOR_URL;
- }
- if (name == null) {
- name = "";
- } else {
- name = "'"+name+"'";
- }
- throw new IllegalArgumentException("No Base64Variant with name "+name);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/FormatSchema.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/FormatSchema.java
deleted file mode 100644
index 3d5196222..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/FormatSchema.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Simple tag interface used to mark schema objects that are used by some
- * {@link JsonParser} and {@link JsonGenerator} implementations to further
- * specify structure of expected format.
- * Basic JSON-based parsers and generators do not use schemas, but some data
- * formats (like many binary data formats like Thrift, protobuf) mandate
- * use of schemas.
- *
- * Since there is little commonality between schemas for different data formats,
- * this interface does not define much meaningful functionality for accessing
- * schema details; rather, specific parser and generator implementations need
- * to cast to schema implementations they use. This marker interface is mostly
- * used for tagging "some kind of schema" -- instead of passing opaque
- * {@link java.lang.Object} -- for documentation purposes.
- */
-public interface FormatSchema
-{
- /**
- * Method that can be used to get an identifier that can be used for diagnostics
- * purposes, to indicate what kind of data format this schema is used for: typically
- * it is a short name of format itself, but it can also contain additional information
- * in cases where data format supports multiple types of schemas.
- */
- String getSchemaType();
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonEncoding.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonEncoding.java
deleted file mode 100644
index cd7aaea4d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonEncoding.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Enumeration that defines legal encodings that can be used
- * for JSON content, based on list of allowed encodings from
- * JSON specification .
- *
- * Note: if application want to explicitly disregard Encoding
- * limitations (to read in JSON encoded using an encoding not
- * listed as allowed), they can use {@link java.io.Reader} /
- * {@link java.io.Writer} instances as input
- */
-public enum JsonEncoding {
- UTF8("UTF-8", false, 8), // N/A for big-endian, really
- UTF16_BE("UTF-16BE", true, 16),
- UTF16_LE("UTF-16LE", false, 16),
- UTF32_BE("UTF-32BE", true, 32),
- UTF32_LE("UTF-32LE", false, 32)
- ;
-
- protected final String _javaName;
-
- protected final boolean _bigEndian;
-
- protected final int _bits;
-
- JsonEncoding(String javaName, boolean bigEndian, int bits)
- {
- _javaName = javaName;
- _bigEndian = bigEndian;
- _bits = bits;
- }
-
- /**
- * Method for accessing encoding name that JDK will support.
- *
- * @return Matching encoding name that JDK will support.
- */
- public String getJavaName() { return _javaName; }
-
- /**
- * Whether encoding is big-endian (if encoding supports such
- * notion). If no such distinction is made (as is the case for
- * {@link #UTF8}), return value is undefined.
- *
- * @return True for big-endian encodings; false for little-endian
- * (or if not applicable)
- */
- public boolean isBigEndian() { return _bigEndian; }
-
- public int bits() { return _bits; }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonFactory.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonFactory.java
deleted file mode 100644
index c647ede76..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonFactory.java
+++ /dev/null
@@ -1,1461 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.*;
-import java.lang.ref.SoftReference;
-import java.net.URL;
-
-import com.fr.third.fasterxml.jackson.core.format.InputAccessor;
-import com.fr.third.fasterxml.jackson.core.format.MatchStrength;
-import com.fr.third.fasterxml.jackson.core.io.*;
-import com.fr.third.fasterxml.jackson.core.json.*;
-import com.fr.third.fasterxml.jackson.core.sym.BytesToNameCanonicalizer;
-import com.fr.third.fasterxml.jackson.core.sym.CharsToNameCanonicalizer;
-import com.fr.third.fasterxml.jackson.core.util.BufferRecycler;
-import com.fr.third.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-
-/**
- * The main factory class of Jackson package, used to configure and
- * construct reader (aka parser, {@link JsonParser})
- * and writer (aka generator, {@link JsonGenerator})
- * instances.
- *
- * Factory instances are thread-safe and reusable after configuration
- * (if any). Typically applications and services use only a single
- * globally shared factory instance, unless they need differently
- * configured factories. Factory reuse is important if efficiency matters;
- * most recycling of expensive construct is done on per-factory basis.
- *
- * Creation of a factory instance is a light-weight operation,
- * and since there is no need for pluggable alternative implementations
- * (as there is no "standard" JSON processor API to implement),
- * the default constructor is used for constructing factory
- * instances.
- *
- * @author Tatu Saloranta
- */
-@SuppressWarnings("resource")
-public class JsonFactory
- implements Versioned, java.io.Serializable // since 2.1 (for Android, mostly)
-{
- /**
- * Computed for Jackson 2.3.0 release
- */
- private static final long serialVersionUID = 3194418244231611666L;
-
- /*
- /**********************************************************
- /* Helper types
- /**********************************************************
- */
-
- /**
- * Enumeration that defines all on/off features that can only be
- * changed for {@link JsonFactory}.
- */
- public enum Feature {
-
- // // // Symbol handling (interning etc)
-
- /**
- * Feature that determines whether JSON object field names are
- * to be canonicalized using {@link String#intern} or not:
- * if enabled, all field names will be intern()ed (and caller
- * can count on this being true for all such names); if disabled,
- * no intern()ing is done. There may still be basic
- * canonicalization (that is, same String will be used to represent
- * all identical object property names for a single document).
- *
- * Note: this setting only has effect if
- * {@link #CANONICALIZE_FIELD_NAMES} is true -- otherwise no
- * canonicalization of any sort is done.
- *
- * This setting is enabled by default.
- */
- INTERN_FIELD_NAMES(true),
-
- /**
- * Feature that determines whether JSON object field names are
- * to be canonicalized (details of how canonicalization is done
- * then further specified by
- * {@link #INTERN_FIELD_NAMES}).
- *
- * This setting is enabled by default.
- */
- CANONICALIZE_FIELD_NAMES(true)
-
- ;
-
- /**
- * Whether feature is enabled or disabled by default.
- */
- private final boolean _defaultState;
-
- /**
- * Method that calculates bit set (flags) of all features that
- * are enabled by default.
- */
- public static int collectDefaults()
- {
- int flags = 0;
- for (Feature f : values()) {
- if (f.enabledByDefault()) {
- flags |= f.getMask();
- }
- }
- return flags;
- }
-
- private Feature(boolean defaultState) {
- _defaultState = defaultState;
- }
-
- public boolean enabledByDefault() { return _defaultState; }
-
- public boolean enabledIn(int flags) { return (flags & getMask()) != 0; }
-
- public int getMask() { return (1 << ordinal()); }
- }
-
- /*
- /**********************************************************
- /* Constants
- /**********************************************************
- */
-
- /**
- * Name used to identify JSON format
- * (and returned by {@link #getFormatName()}
- */
- public final static String FORMAT_NAME_JSON = "JSON";
-
- /**
- * Bitfield (set of flags) of all factory features that are enabled by default.
- */
- protected final static int DEFAULT_FACTORY_FEATURE_FLAGS = JsonFactory.Feature.collectDefaults();
-
- /**
- * Bitfield (set of flags) of all parser features that are enabled
- * by default.
- */
- protected final static int DEFAULT_PARSER_FEATURE_FLAGS = JsonParser.Feature.collectDefaults();
-
- /**
- * Bitfield (set of flags) of all generator features that are enabled
- * by default.
- */
- protected final static int DEFAULT_GENERATOR_FEATURE_FLAGS = JsonGenerator.Feature.collectDefaults();
-
- private final static SerializableString DEFAULT_ROOT_VALUE_SEPARATOR = DefaultPrettyPrinter.DEFAULT_ROOT_VALUE_SEPARATOR;
-
- /*
- /**********************************************************
- /* Buffer, symbol table management
- /**********************************************************
- */
-
- /**
- * This ThreadLocal
contains a {@link java.lang.ref.SoftReference}
- * to a {@link BufferRecycler} used to provide a low-cost
- * buffer recycling between reader and writer instances.
- */
- final protected static ThreadLocal> _recyclerRef
- = new ThreadLocal>();
-
- /**
- * Each factory comes equipped with a shared root symbol table.
- * It should not be linked back to the original blueprint, to
- * avoid contents from leaking between factories.
- */
- protected final transient CharsToNameCanonicalizer _rootCharSymbols = CharsToNameCanonicalizer.createRoot();
-
- /**
- * Alternative to the basic symbol table, some stream-based
- * parsers use different name canonicalization method.
- *
- * TODO: should clean up this; looks messy having 2 alternatives
- * with not very clear differences.
- */
- protected final transient BytesToNameCanonicalizer _rootByteSymbols = BytesToNameCanonicalizer.createRoot();
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Object that implements conversion functionality between
- * Java objects and JSON content. For base JsonFactory implementation
- * usually not set by default, but can be explicitly set.
- * Sub-classes (like @link org.codehaus.jackson.map.MappingJsonFactory}
- * usually provide an implementation.
- */
- protected ObjectCodec _objectCodec;
-
- /**
- * Currently enabled factory features.
- */
- protected int _factoryFeatures = DEFAULT_FACTORY_FEATURE_FLAGS;
-
- /**
- * Currently enabled parser features.
- */
- protected int _parserFeatures = DEFAULT_PARSER_FEATURE_FLAGS;
-
- /**
- * Currently enabled generator features.
- */
- protected int _generatorFeatures = DEFAULT_GENERATOR_FEATURE_FLAGS;
-
- /**
- * Definition of custom character escapes to use for generators created
- * by this factory, if any. If null, standard data format specific
- * escapes are used.
- */
- protected CharacterEscapes _characterEscapes;
-
- /**
- * Optional helper object that may decorate input sources, to do
- * additional processing on input during parsing.
- */
- protected InputDecorator _inputDecorator;
-
- /**
- * Optional helper object that may decorate output object, to do
- * additional processing on output during content generation.
- */
- protected OutputDecorator _outputDecorator;
-
- /**
- * Separator used between root-level values, if any; null indicates
- * "do not add separator".
- * Default separator is a single space character.
- *
- * @since 2.1
- */
- protected SerializableString _rootValueSeparator = DEFAULT_ROOT_VALUE_SEPARATOR;
-
- /*
- /**********************************************************
- /* Construction
- /**********************************************************
- */
-
- /**
- * Default constructor used to create factory instances.
- * Creation of a factory instance is a light-weight operation,
- * but it is still a good idea to reuse limited number of
- * factory instances (and quite often just a single instance):
- * factories are used as context for storing some reused
- * processing objects (such as symbol tables parsers use)
- * and this reuse only works within context of a single
- * factory instance.
- */
- public JsonFactory() { this((ObjectCodec) null); }
-
- public JsonFactory(ObjectCodec oc) { _objectCodec = oc; }
-
- /**
- * Constructor used when copy()ing a factory instance.
- *
- * @since 2.2.1
- */
- protected JsonFactory(JsonFactory src, ObjectCodec codec)
- {
- _objectCodec = null;
- _factoryFeatures = src._factoryFeatures;
- _parserFeatures = src._parserFeatures;
- _generatorFeatures = src._generatorFeatures;
- _characterEscapes = src._characterEscapes;
- _inputDecorator = src._inputDecorator;
- _outputDecorator = src._outputDecorator;
- _rootValueSeparator = src._rootValueSeparator;
-
- /* 27-Apr-2013, tatu: How about symbol table; should we try to
- * reuse shared symbol tables? Could be more efficient that way;
- * although can slightly add to concurrency overhead.
- */
- }
-
- /**
- * Method for constructing a new {@link JsonFactory} that has
- * the same settings as this instance, but is otherwise
- * independent (i.e. nothing is actually shared, symbol tables
- * are separate).
- * Note that {@link ObjectCodec} reference is not copied but is
- * set to null; caller typically needs to set it after calling
- * this method. Reason for this is that the codec is used for
- * callbacks, and assumption is that there is strict 1-to-1
- * mapping between codec, factory. Caller has to, then, explicitly
- * set codec after making the copy.
- *
- * @since 2.1
- */
- public JsonFactory copy()
- {
- _checkInvalidCopy(JsonFactory.class);
- // as per above, do clear ObjectCodec
- return new JsonFactory(this, null);
- }
-
- /**
- * @since 2.1
- * @param exp
- */
- protected void _checkInvalidCopy(Class> exp)
- {
- if (getClass() != exp) {
- throw new IllegalStateException("Failed copy(): "+getClass().getName()
- +" (version: "+version()+") does not override copy(); it has to");
- }
- }
-
- /*
- /**********************************************************
- /* Serializable overrides
- /**********************************************************
- */
-
- /**
- * Method that we need to override to actually make restoration go
- * through constructors etc.
- * Also: must be overridden by sub-classes as well.
- */
- protected Object readResolve() {
- return new JsonFactory(this, _objectCodec);
- }
-
- /*
- /**********************************************************
- /* Capability introspection
- /**********************************************************
- */
-
- /**
- * Introspection method that higher-level functionality may call
- * to see whether underlying data format requires a stable ordering
- * of object properties or not.
- * This is usually used for determining
- * whether to force a stable ordering (like alphabetic ordering by name)
- * if no ordering if explicitly specified.
- *
- * Default implementation returns false
as JSON does NOT
- * require stable ordering. Formats that require ordering include positional
- * textual formats like CSV
, and schema-based binary formats
- * like Avro
.
- *
- * @since 2.3
- */
- public boolean requiresPropertyOrdering() {
- return false;
- }
-
- /**
- * Introspection method that higher-level functionality may call
- * to see whether underlying data format can read and write binary
- * data natively; that is, embeded it as-is without using encodings
- * such as Base64.
- *
- * Default implementation returns false
as JSON does not
- * support native access: all binary content must use Base64 encoding.
- * Most binary formats (like Smile and Avro) support native binary content.
- *
- * @since 2.3
- */
- public boolean canHandleBinaryNatively() {
- return false;
- }
-
- /*
- /**********************************************************
- /* Format detection functionality (since 1.8)
- /**********************************************************
- */
-
- /**
- * Method that can be used to quickly check whether given schema
- * is something that parsers and/or generators constructed by this
- * factory could use. Note that this means possible use, at the level
- * of data format (i.e. schema is for same data format as parsers and
- * generators this factory constructs); individual schema instances
- * may have further usage restrictions.
- *
- * @since 2.1
- */
- public boolean canUseSchema(FormatSchema schema) {
- String ourFormat = getFormatName();
- return (ourFormat != null) && ourFormat.equals(schema.getSchemaType());
- }
-
- /**
- * Method that returns short textual id identifying format
- * this factory supports.
- *
- * Note: sub-classes should override this method; default
- * implementation will return null for all sub-classes
- */
- public String getFormatName()
- {
- /* Somewhat nasty check: since we can't make this abstract
- * (due to backwards compatibility concerns), need to prevent
- * format name "leakage"
- */
- if (getClass() == JsonFactory.class) {
- return FORMAT_NAME_JSON;
- }
- return null;
- }
-
- public MatchStrength hasFormat(InputAccessor acc) throws IOException
- {
- // since we can't keep this abstract, only implement for "vanilla" instance
- if (getClass() == JsonFactory.class) {
- return hasJSONFormat(acc);
- }
- return null;
- }
-
- /**
- * Method that can be called to determine if a custom
- * {@link ObjectCodec} is needed for binding data parsed
- * using {@link JsonParser} constructed by this factory
- * (which typically also implies the same for serialization
- * with {@link JsonGenerator}).
- *
- * @return True if custom codec is needed with parsers and
- * generators created by this factory; false if a general
- * {@link ObjectCodec} is enough
- *
- * @since 2.1
- */
- public boolean requiresCustomCodec() {
- return false;
- }
-
- /**
- * Helper method that can be called to determine if content accessed
- * using given accessor seems to be JSON content.
- */
- protected MatchStrength hasJSONFormat(InputAccessor acc) throws IOException
- {
- return ByteSourceJsonBootstrapper.hasJSONFormat(acc);
- }
-
- /*
- /**********************************************************
- /* Versioned
- /**********************************************************
- */
-
- @Override
- public Version version() {
- return PackageVersion.VERSION;
- }
-
- /*
- /**********************************************************
- /* Configuration, factory features
- /**********************************************************
- */
-
- /**
- * Method for enabling or disabling specified parser feature
- * (check {@link JsonParser.Feature} for list of features)
- */
- public final JsonFactory configure(JsonFactory.Feature f, boolean state) {
- return state ? enable(f) : disable(f);
- }
-
- /**
- * Method for enabling specified parser feature
- * (check {@link JsonFactory.Feature} for list of features)
- */
- public JsonFactory enable(JsonFactory.Feature f) {
- _factoryFeatures |= f.getMask();
- return this;
- }
-
- /**
- * Method for disabling specified parser features
- * (check {@link JsonFactory.Feature} for list of features)
- */
- public JsonFactory disable(JsonFactory.Feature f) {
- _factoryFeatures &= ~f.getMask();
- return this;
- }
-
- /**
- * Checked whether specified parser feature is enabled.
- */
- public final boolean isEnabled(JsonFactory.Feature f) {
- return (_factoryFeatures & f.getMask()) != 0;
- }
-
- /*
- /**********************************************************
- /* Configuration, parser configuration
- /**********************************************************
- */
-
- /**
- * Method for enabling or disabling specified parser feature
- * (check {@link JsonParser.Feature} for list of features)
- */
- public final JsonFactory configure(JsonParser.Feature f, boolean state) {
- return state ? enable(f) : disable(f);
- }
-
- /**
- * Method for enabling specified parser feature
- * (check {@link JsonParser.Feature} for list of features)
- */
- public JsonFactory enable(JsonParser.Feature f) {
- _parserFeatures |= f.getMask();
- return this;
- }
-
- /**
- * Method for disabling specified parser features
- * (check {@link JsonParser.Feature} for list of features)
- */
- public JsonFactory disable(JsonParser.Feature f) {
- _parserFeatures &= ~f.getMask();
- return this;
- }
-
- /**
- * Checked whether specified parser feature is enabled.
- */
- public final boolean isEnabled(JsonParser.Feature f) {
- return (_parserFeatures & f.getMask()) != 0;
- }
-
- /**
- * Method for getting currently configured input decorator (if any;
- * there is no default decorator).
- */
- public InputDecorator getInputDecorator() {
- return _inputDecorator;
- }
-
- /**
- * Method for overriding currently configured input decorator
- */
- public JsonFactory setInputDecorator(InputDecorator d) {
- _inputDecorator = d;
- return this;
- }
-
- /*
- /**********************************************************
- /* Configuration, generator settings
- /**********************************************************
- */
-
- /**
- * Method for enabling or disabling specified generator feature
- * (check {@link JsonGenerator.Feature} for list of features)
- */
- public final JsonFactory configure(JsonGenerator.Feature f, boolean state) {
- return state ? enable(f) : disable(f);
- }
-
-
- /**
- * Method for enabling specified generator features
- * (check {@link JsonGenerator.Feature} for list of features)
- */
- public JsonFactory enable(JsonGenerator.Feature f) {
- _generatorFeatures |= f.getMask();
- return this;
- }
-
- /**
- * Method for disabling specified generator feature
- * (check {@link JsonGenerator.Feature} for list of features)
- */
- public JsonFactory disable(JsonGenerator.Feature f) {
- _generatorFeatures &= ~f.getMask();
- return this;
- }
-
- /**
- * Check whether specified generator feature is enabled.
- */
- public final boolean isEnabled(JsonGenerator.Feature f) {
- return (_generatorFeatures & f.getMask()) != 0;
- }
-
- /**
- * Method for accessing custom escapes factory uses for {@link JsonGenerator}s
- * it creates.
- */
- public CharacterEscapes getCharacterEscapes() {
- return _characterEscapes;
- }
-
- /**
- * Method for defining custom escapes factory uses for {@link JsonGenerator}s
- * it creates.
- */
- public JsonFactory setCharacterEscapes(CharacterEscapes esc) {
- _characterEscapes = esc;
- return this;
- }
-
- /**
- * Method for getting currently configured output decorator (if any;
- * there is no default decorator).
- */
- public OutputDecorator getOutputDecorator() {
- return _outputDecorator;
- }
-
- /**
- * Method for overriding currently configured output decorator
- */
- public JsonFactory setOutputDecorator(OutputDecorator d) {
- _outputDecorator = d;
- return this;
- }
-
- /**
- * Method that allows overriding String used for separating root-level
- * JSON values (default is single space character)
- *
- * @param sep Separator to use, if any; null means that no separator is
- * automatically added
- *
- * @since 2.1
- */
- public JsonFactory setRootValueSeparator(String sep) {
- _rootValueSeparator = (sep == null) ? null : new SerializedString(sep);
- return this;
- }
-
- /**
- * @since 2.1
- */
- public String getRootValueSeparator() {
- return (_rootValueSeparator == null) ? null : _rootValueSeparator.getValue();
- }
-
- /*
- /**********************************************************
- /* Configuration, other
- /**********************************************************
- */
-
- /**
- * Method for associating a {@link ObjectCodec} (typically
- * a com.fr.third.fasterxml.jackson.databind.ObjectMapper
)
- * with this factory (and more importantly, parsers and generators
- * it constructs). This is needed to use data-binding methods
- * of {@link JsonParser} and {@link JsonGenerator} instances.
- */
- public JsonFactory setCodec(ObjectCodec oc) {
- _objectCodec = oc;
- return this;
- }
-
- public ObjectCodec getCodec() { return _objectCodec; }
-
- /*
- /**********************************************************
- /* Parser factories (new ones, as per [Issue-25])
- /**********************************************************
- */
-
- /**
- * Method for constructing JSON parser instance to parse
- * contents of specified file. Encoding is auto-detected
- * from contents according to JSON specification recommended
- * mechanism.
- *
- * Underlying input stream (needed for reading contents)
- * will be owned (and managed, i.e. closed as need be) by
- * the parser, since caller has no access to it.
- *
- * @param f File that contains JSON content to parse
- *
- * @since 2.1
- */
- public JsonParser createParser(File f)
- throws IOException, JsonParseException
- {
- // true, since we create InputStream from File
- IOContext ctxt = _createContext(f, true);
- InputStream in = new FileInputStream(f);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- in = _inputDecorator.decorate(ctxt, in);
- }
- return _createParser(in, ctxt);
- }
-
- /**
- * Method for constructing JSON parser instance to parse
- * contents of resource reference by given URL.
- * Encoding is auto-detected
- * from contents according to JSON specification recommended
- * mechanism.
- *
- * Underlying input stream (needed for reading contents)
- * will be owned (and managed, i.e. closed as need be) by
- * the parser, since caller has no access to it.
- *
- * @param url URL pointing to resource that contains JSON content to parse
- *
- * @since 2.1
- */
- public JsonParser createParser(URL url)
- throws IOException, JsonParseException
- {
- // true, since we create InputStream from URL
- IOContext ctxt = _createContext(url, true);
- InputStream in = _optimizedStreamFromURL(url);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- in = _inputDecorator.decorate(ctxt, in);
- }
- return _createParser(in, ctxt);
- }
-
- /**
- * Method for constructing JSON parser instance to parse
- * the contents accessed via specified input stream.
- *
- * The input stream will not be owned by
- * the parser, it will still be managed (i.e. closed if
- * end-of-stream is reacher, or parser close method called)
- * if (and only if) {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature#AUTO_CLOSE_SOURCE}
- * is enabled.
- *
- * Note: no encoding argument is taken since it can always be
- * auto-detected as suggested by JSON RFC.
- *
- * @param in InputStream to use for reading JSON content to parse
- *
- * @since 2.1
- */
- public JsonParser createParser(InputStream in)
- throws IOException, JsonParseException
- {
- IOContext ctxt = _createContext(in, false);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- in = _inputDecorator.decorate(ctxt, in);
- }
- return _createParser(in, ctxt);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents accessed via specified Reader.
-
- * The read stream will not be owned by
- * the parser, it will still be managed (i.e. closed if
- * end-of-stream is reacher, or parser close method called)
- * if (and only if) {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature#AUTO_CLOSE_SOURCE}
- * is enabled.
- *
- * @param r Reader to use for reading JSON content to parse
- *
- * @since 2.1
- */
- public JsonParser createParser(Reader r)
- throws IOException, JsonParseException
- {
- // false -> we do NOT own Reader (did not create it)
- IOContext ctxt = _createContext(r, false);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- r = _inputDecorator.decorate(ctxt, r);
- }
- return _createParser(r, ctxt);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents of given byte array.
- *
- * @since 2.1
- */
- public JsonParser createParser(byte[] data)
- throws IOException, JsonParseException
- {
- IOContext ctxt = _createContext(data, true);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- InputStream in = _inputDecorator.decorate(ctxt, data, 0, data.length);
- if (in != null) {
- return _createParser(in, ctxt);
- }
- }
- return _createParser(data, 0, data.length, ctxt);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents of given byte array.
- *
- * @param data Buffer that contains data to parse
- * @param offset Offset of the first data byte within buffer
- * @param len Length of contents to parse within buffer
- *
- * @since 2.1
- */
- public JsonParser createParser(byte[] data, int offset, int len)
- throws IOException, JsonParseException
- {
- IOContext ctxt = _createContext(data, true);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- InputStream in = _inputDecorator.decorate(ctxt, data, offset, len);
- if (in != null) {
- return _createParser(in, ctxt);
- }
- }
- return _createParser(data, offset, len, ctxt);
- }
-
- /**
- * Method for constructing parser for parsing
- * contents of given String.
- *
- * @since 2.1
- */
- public JsonParser createParser(String content)
- throws IOException, JsonParseException
- {
- Reader r = new StringReader(content);
- // true -> we own the Reader (and must close); not a big deal
- IOContext ctxt = _createContext(r, true);
- // [JACKSON-512]: allow wrapping with InputDecorator
- if (_inputDecorator != null) {
- r = _inputDecorator.decorate(ctxt, r);
- }
- return _createParser(r, ctxt);
- }
-
- /*
- /**********************************************************
- /* Parser factories (old ones, as per [Issue-25])
- /**********************************************************
- */
-
- /**
- * Method for constructing JSON parser instance to parse
- * contents of specified file. Encoding is auto-detected
- * from contents according to JSON specification recommended
- * mechanism.
- *
- * Underlying input stream (needed for reading contents)
- * will be owned (and managed, i.e. closed as need be) by
- * the parser, since caller has no access to it.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @param f File that contains JSON content to parse
- *
- * @deprecated Since 2.2, use {@link #createParser(File)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(File f)
- throws IOException, JsonParseException
- {
- return createParser(f);
- }
-
- /**
- * Method for constructing JSON parser instance to parse
- * contents of resource reference by given URL.
- * Encoding is auto-detected
- * from contents according to JSON specification recommended
- * mechanism.
- *
- * Underlying input stream (needed for reading contents)
- * will be owned (and managed, i.e. closed as need be) by
- * the parser, since caller has no access to it.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @param url URL pointing to resource that contains JSON content to parse
- *
- * @deprecated Since 2.2, use {@link #createParser(URL)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(URL url)
- throws IOException, JsonParseException
- {
- return createParser(url);
- }
-
- /**
- * Method for constructing JSON parser instance to parse
- * the contents accessed via specified input stream.
- *
- * The input stream will not be owned by
- * the parser, it will still be managed (i.e. closed if
- * end-of-stream is reacher, or parser close method called)
- * if (and only if) {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature#AUTO_CLOSE_SOURCE}
- * is enabled.
- *
- * Note: no encoding argument is taken since it can always be
- * auto-detected as suggested by JSON RFC.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @param in InputStream to use for reading JSON content to parse
- *
- * @deprecated Since 2.2, use {@link #createParser(InputStream)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(InputStream in)
- throws IOException, JsonParseException
- {
- return createParser(in);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents accessed via specified Reader.
-
- * The read stream will not be owned by
- * the parser, it will still be managed (i.e. closed if
- * end-of-stream is reacher, or parser close method called)
- * if (and only if) {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature#AUTO_CLOSE_SOURCE}
- * is enabled.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @param r Reader to use for reading JSON content to parse
- *
- * @deprecated Since 2.2, use {@link #createParser(Reader)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(Reader r)
- throws IOException, JsonParseException
- {
- return createParser(r);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents of given byte array.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @deprecated Since 2.2, use {@link #createParser(byte[])} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(byte[] data)
- throws IOException, JsonParseException
- {
- return createParser(data);
- }
-
- /**
- * Method for constructing parser for parsing
- * the contents of given byte array.
- *
- * NOTE: as of 2.1, should not be used (will be deprecated in 2.2);
- * instead, should call createParser
.
- *
- * @param data Buffer that contains data to parse
- * @param offset Offset of the first data byte within buffer
- * @param len Length of contents to parse within buffer
- *
- * @deprecated Since 2.2, use {@link #createParser(byte[],int,int)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(byte[] data, int offset, int len)
- throws IOException, JsonParseException
- {
- return createParser(data, offset, len);
- }
-
- /**
- * Method for constructing parser for parsing
- * contents of given String.
- *
- * @deprecated Since 2.2, use {@link #createParser(String)} instead.
- */
- @Deprecated
- public JsonParser createJsonParser(String content)
- throws IOException, JsonParseException
- {
- return createParser(content);
- }
-
- /*
- /**********************************************************
- /* Generator factories, new (as per [Issue-25]
- /**********************************************************
- */
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * using specified output stream.
- * Encoding to use must be specified, and needs to be one of available
- * types (as per JSON specification).
- *
- * Underlying stream is NOT owned by the generator constructed,
- * so that generator will NOT close the output stream when
- * {@link JsonGenerator#close} is called (unless auto-closing
- * feature,
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature#AUTO_CLOSE_TARGET}
- * is enabled).
- * Using application needs to close it explicitly if this is the case.
- *
- * Note: there are formats that use fixed encoding (like most binary data formats)
- * and that ignore passed in encoding.
- *
- * @param out OutputStream to use for writing JSON content
- * @param enc Character encoding to use
- *
- * @since 2.1
- */
- public JsonGenerator createGenerator(OutputStream out, JsonEncoding enc)
- throws IOException
- {
- // false -> we won't manage the stream unless explicitly directed to
- IOContext ctxt = _createContext(out, false);
- ctxt.setEncoding(enc);
- if (enc == JsonEncoding.UTF8) {
- // [JACKSON-512]: allow wrapping with _outputDecorator
- if (_outputDecorator != null) {
- out = _outputDecorator.decorate(ctxt, out);
- }
- return _createUTF8Generator(out, ctxt);
- }
- Writer w = _createWriter(out, enc, ctxt);
- // [JACKSON-512]: allow wrapping with _outputDecorator
- if (_outputDecorator != null) {
- w = _outputDecorator.decorate(ctxt, w);
- }
- return _createGenerator(w, ctxt);
- }
-
- /**
- * Convenience method for constructing generator that uses default
- * encoding of the format (UTF-8 for JSON and most other data formats).
- *
- * Note: there are formats that use fixed encoding (like most binary data formats).
- *
- * @since 2.1
- */
- public JsonGenerator createGenerator(OutputStream out) throws IOException {
- return createGenerator(out, JsonEncoding.UTF8);
- }
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * using specified Writer.
- *
- * Underlying stream is NOT owned by the generator constructed,
- * so that generator will NOT close the Reader when
- * {@link JsonGenerator#close} is called (unless auto-closing
- * feature,
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature#AUTO_CLOSE_TARGET} is enabled).
- * Using application needs to close it explicitly.
- *
- * @since 2.1
- *
- * @param out Writer to use for writing JSON content
- */
- public JsonGenerator createGenerator(Writer out)
- throws IOException
- {
- IOContext ctxt = _createContext(out, false);
- // [JACKSON-512]: allow wrapping with _outputDecorator
- if (_outputDecorator != null) {
- out = _outputDecorator.decorate(ctxt, out);
- }
- return _createGenerator(out, ctxt);
- }
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * to specified file, overwriting contents it might have (or creating
- * it if such file does not yet exist).
- * Encoding to use must be specified, and needs to be one of available
- * types (as per JSON specification).
- *
- * Underlying stream is owned by the generator constructed,
- * i.e. generator will handle closing of file when
- * {@link JsonGenerator#close} is called.
- *
- * @param f File to write contents to
- * @param enc Character encoding to use
- *
- * @since 2.1
- */
- public JsonGenerator createGenerator(File f, JsonEncoding enc)
- throws IOException
- {
- OutputStream out = new FileOutputStream(f);
- // true -> yes, we have to manage the stream since we created it
- IOContext ctxt = _createContext(out, true);
- ctxt.setEncoding(enc);
- if (enc == JsonEncoding.UTF8) {
- // [JACKSON-512]: allow wrapping with _outputDecorator
- if (_outputDecorator != null) {
- out = _outputDecorator.decorate(ctxt, out);
- }
- return _createUTF8Generator(out, ctxt);
- }
- Writer w = _createWriter(out, enc, ctxt);
- // [JACKSON-512]: allow wrapping with _outputDecorator
- if (_outputDecorator != null) {
- w = _outputDecorator.decorate(ctxt, w);
- }
- return _createGenerator(w, ctxt);
- }
-
- /*
- /**********************************************************
- /* Generator factories, old (as per [Issue-25]
- /**********************************************************
- */
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * using specified output stream.
- * Encoding to use must be specified, and needs to be one of available
- * types (as per JSON specification).
- *
- * Underlying stream is NOT owned by the generator constructed,
- * so that generator will NOT close the output stream when
- * {@link JsonGenerator#close} is called (unless auto-closing
- * feature,
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature#AUTO_CLOSE_TARGET}
- * is enabled).
- * Using application needs to close it explicitly if this is the case.
- *
- * Note: there are formats that use fixed encoding (like most binary data formats)
- * and that ignore passed in encoding.
- *
- * @param out OutputStream to use for writing JSON content
- * @param enc Character encoding to use
- *
- * @deprecated Since 2.2, use {@link #createGenerator(OutputStream, JsonEncoding)} instead.
- */
- @Deprecated
- public JsonGenerator createJsonGenerator(OutputStream out, JsonEncoding enc)
- throws IOException
- {
- return createGenerator(out, enc);
- }
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * using specified Writer.
- *
- * Underlying stream is NOT owned by the generator constructed,
- * so that generator will NOT close the Reader when
- * {@link JsonGenerator#close} is called (unless auto-closing
- * feature,
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature#AUTO_CLOSE_TARGET} is enabled).
- * Using application needs to close it explicitly.
- *
- * @param out Writer to use for writing JSON content
- *
- * @deprecated Since 2.2, use {@link #createGenerator(Writer)} instead.
- */
- @Deprecated
- public JsonGenerator createJsonGenerator(Writer out)
- throws IOException
- {
- return createGenerator(out);
- }
-
- /**
- * Convenience method for constructing generator that uses default
- * encoding of the format (UTF-8 for JSON and most other data formats).
- *
- * Note: there are formats that use fixed encoding (like most binary data formats).
- *
- * @deprecated Since 2.2, use {@link #createGenerator(OutputStream)} instead.
- */
- @Deprecated
- public JsonGenerator createJsonGenerator(OutputStream out) throws IOException {
- return createGenerator(out, JsonEncoding.UTF8);
- }
-
- /**
- * Method for constructing JSON generator for writing JSON content
- * to specified file, overwriting contents it might have (or creating
- * it if such file does not yet exist).
- * Encoding to use must be specified, and needs to be one of available
- * types (as per JSON specification).
- *
- * Underlying stream is owned by the generator constructed,
- * i.e. generator will handle closing of file when
- * {@link JsonGenerator#close} is called.
- *
- * @param f File to write contents to
- * @param enc Character encoding to use
- *
- *
- * @deprecated Since 2.2, use {@link #createGenerator(File,JsonEncoding)} instead.
- */
- @Deprecated
- public JsonGenerator createJsonGenerator(File f, JsonEncoding enc)
- throws IOException
- {
- return createGenerator(f, enc);
- }
-
- /*
- /**********************************************************
- /* Factory methods used by factory for creating parser instances,
- /* overridable by sub-classes
- /**********************************************************
- */
-
- /**
- * Overridable factory method that actually instantiates desired parser
- * given {@link InputStream} and context object.
- *
- * This method is specifically designed to remain
- * compatible between minor versions so that sub-classes can count
- * on it being called as expected. That is, it is part of official
- * interface from sub-class perspective, although not a public
- * method available to users of factory implementations.
- *
- * @since 2.1
- */
- protected JsonParser _createParser(InputStream in, IOContext ctxt)
- throws IOException, JsonParseException
- {
- // As per [JACKSON-259], may want to fully disable canonicalization:
- return new ByteSourceJsonBootstrapper(ctxt, in).constructParser(_parserFeatures,
- _objectCodec, _rootByteSymbols, _rootCharSymbols,
- isEnabled(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES),
- isEnabled(JsonFactory.Feature.INTERN_FIELD_NAMES));
- }
-
- /**
- * @deprecated since 2.1 -- use {@link #_createParser(InputStream, IOContext)} instead
- */
- @Deprecated
- protected JsonParser _createJsonParser(InputStream in, IOContext ctxt) throws IOException, JsonParseException {
- return _createParser(in, ctxt);
- }
-
- /**
- * Overridable factory method that actually instantiates parser
- * using given {@link Reader} object for reading content.
- *
- * This method is specifically designed to remain
- * compatible between minor versions so that sub-classes can count
- * on it being called as expected. That is, it is part of official
- * interface from sub-class perspective, although not a public
- * method available to users of factory implementations.
- *
- * @since 2.1
- */
- protected JsonParser _createParser(Reader r, IOContext ctxt)
- throws IOException, JsonParseException
- {
- return new ReaderBasedJsonParser(ctxt, _parserFeatures, r, _objectCodec,
- _rootCharSymbols.makeChild(isEnabled(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES),
- isEnabled(JsonFactory.Feature.INTERN_FIELD_NAMES)));
- }
-
- /**
- * @deprecated since 2.1 -- use {@link #_createParser(Reader, IOContext)} instead
- */
- @Deprecated
- protected JsonParser _createJsonParser(Reader r, IOContext ctxt) throws IOException, JsonParseException {
- return _createParser(r, ctxt);
- }
-
- /**
- * Overridable factory method that actually instantiates parser
- * using given {@link Reader} object for reading content
- * passed as raw byte array.
- *
- * This method is specifically designed to remain
- * compatible between minor versions so that sub-classes can count
- * on it being called as expected. That is, it is part of official
- * interface from sub-class perspective, although not a public
- * method available to users of factory implementations.
- */
- protected JsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt)
- throws IOException, JsonParseException
- {
- return new ByteSourceJsonBootstrapper(ctxt, data, offset, len).constructParser(_parserFeatures,
- _objectCodec, _rootByteSymbols, _rootCharSymbols,
- isEnabled(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES),
- isEnabled(JsonFactory.Feature.INTERN_FIELD_NAMES));
- }
-
- /**
- * @deprecated since 2.1 -- use {@link #_createParser(byte[], int, int, IOContext)} instead
- */
- @Deprecated
- protected JsonParser _createJsonParser(byte[] data, int offset, int len, IOContext ctxt) throws IOException, JsonParseException {
- return _createParser(data, offset, len, ctxt);
- }
-
- /*
- /**********************************************************
- /* Factory methods used by factory for creating generator instances,
- /* overridable by sub-classes
- /**********************************************************
- */
-
- /**
- * Overridable factory method that actually instantiates generator for
- * given {@link Writer} and context object.
- *
- * This method is specifically designed to remain
- * compatible between minor versions so that sub-classes can count
- * on it being called as expected. That is, it is part of official
- * interface from sub-class perspective, although not a public
- * method available to users of factory implementations.
- */
- protected JsonGenerator _createGenerator(Writer out, IOContext ctxt)
- throws IOException
- {
- WriterBasedJsonGenerator gen = new WriterBasedJsonGenerator(ctxt,
- _generatorFeatures, _objectCodec, out);
- if (_characterEscapes != null) {
- gen.setCharacterEscapes(_characterEscapes);
- }
- SerializableString rootSep = _rootValueSeparator;
- if (rootSep != DEFAULT_ROOT_VALUE_SEPARATOR) {
- gen.setRootValueSeparator(rootSep);
- }
- return gen;
- }
-
- /**
- * @deprecated since 2.1 -- use {@link #_createGenerator(Writer, IOContext)} instead
- */
- @Deprecated
- protected JsonGenerator _createJsonGenerator(Writer out, IOContext ctxt)
- throws IOException
- {
- /* NOTE: MUST call the deprecated method until it is deleted, just so
- * that override still works as expected, for now.
- */
- return _createGenerator(out, ctxt);
- }
-
- /**
- * Overridable factory method that actually instantiates generator for
- * given {@link OutputStream} and context object, using UTF-8 encoding.
- *
- * This method is specifically designed to remain
- * compatible between minor versions so that sub-classes can count
- * on it being called as expected. That is, it is part of official
- * interface from sub-class perspective, although not a public
- * method available to users of factory implementations.
- */
- protected JsonGenerator _createUTF8Generator(OutputStream out, IOContext ctxt) throws IOException {
- UTF8JsonGenerator gen = new UTF8JsonGenerator(ctxt,
- _generatorFeatures, _objectCodec, out);
- if (_characterEscapes != null) {
- gen.setCharacterEscapes(_characterEscapes);
- }
- SerializableString rootSep = _rootValueSeparator;
- if (rootSep != DEFAULT_ROOT_VALUE_SEPARATOR) {
- gen.setRootValueSeparator(rootSep);
- }
- return gen;
- }
-
- /**
- * @deprecated since 2.1
- */
- @Deprecated
- protected JsonGenerator _createUTF8JsonGenerator(OutputStream out, IOContext ctxt)
- throws IOException
- {
- return _createUTF8Generator(out, ctxt);
- }
-
- protected Writer _createWriter(OutputStream out, JsonEncoding enc, IOContext ctxt) throws IOException
- {
- // note: this should not get called any more (caller checks, dispatches)
- if (enc == JsonEncoding.UTF8) { // We have optimized writer for UTF-8
- return new UTF8Writer(ctxt, out);
- }
- // not optimal, but should do unless we really care about UTF-16/32 encoding speed
- return new OutputStreamWriter(out, enc.getJavaName());
- }
-
- /*
- /**********************************************************
- /* Internal factory methods, other
- /**********************************************************
- */
-
- /**
- * Overridable factory method that actually instantiates desired
- * context object.
- */
- protected IOContext _createContext(Object srcRef, boolean resourceManaged)
- {
- return new IOContext(_getBufferRecycler(), srcRef, resourceManaged);
- }
-
- /**
- * Method used by factory to create buffer recycler instances
- * for parsers and generators.
- *
- * Note: only public to give access for ObjectMapper
- */
- public BufferRecycler _getBufferRecycler()
- {
- SoftReference ref = _recyclerRef.get();
- BufferRecycler br = (ref == null) ? null : ref.get();
-
- if (br == null) {
- br = new BufferRecycler();
- _recyclerRef.set(new SoftReference(br));
- }
- return br;
- }
-
- /**
- * Helper methods used for constructing an optimal stream for
- * parsers to use, when input is to be read from an URL.
- * This helps when reading file content via URL.
- */
- protected InputStream _optimizedStreamFromURL(URL url)
- throws IOException
- {
- if ("file".equals(url.getProtocol())) {
- /* Can not do this if the path refers
- * to a network drive on windows. This fixes the problem;
- * might not be needed on all platforms (NFS?), but should not
- * matter a lot: performance penalty of extra wrapping is more
- * relevant when accessing local file system.
- */
- String host = url.getHost();
- if (host == null || host.length() == 0) {
- // [Issue#48]: Let's try to avoid probs with URL encoded stuff
- String path = url.getPath();
- if (path.indexOf('%') < 0) {
- return new FileInputStream(url.getPath());
-
- }
- // otherwise, let's fall through and let URL decoder do its magic
- }
- }
- return url.openStream();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerationException.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerationException.java
deleted file mode 100644
index 1e7938878..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerationException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Exception type for exceptions during JSON writing, such as trying
- * to output content in wrong context (non-matching end-array or end-object,
- * for example).
- */
-public class JsonGenerationException
- extends JsonProcessingException
-{
- private final static long serialVersionUID = 123; // Stupid eclipse...
-
- public JsonGenerationException(Throwable rootCause)
- {
- super(rootCause);
- }
-
- public JsonGenerationException(String msg)
- {
- super(msg, (JsonLocation)null);
- }
-
- public JsonGenerationException(String msg, Throwable rootCause)
- {
- super(msg, (JsonLocation)null, rootCause);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerator.java
deleted file mode 100644
index a344a7733..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonGenerator.java
+++ /dev/null
@@ -1,1637 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-package com.fr.third.fasterxml.jackson.core;
-
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_EMBEDDED_OBJECT;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_END_ARRAY;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_END_OBJECT;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_FALSE;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_FIELD_NAME;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_NOT_AVAILABLE;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_NULL;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_NUMBER_FLOAT;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_NUMBER_INT;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_START_ARRAY;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_START_OBJECT;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_STRING;
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.ID_TRUE;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-import com.fr.third.fasterxml.jackson.core.JsonParser.NumberType;
-import com.fr.third.fasterxml.jackson.core.io.CharacterEscapes;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-/**
- * Base class that defines public API for writing JSON content.
- * Instances are created using factory methods of
- * a {@link JsonFactory} instance.
- *
- * @author Tatu Saloranta
- */
-public abstract class JsonGenerator
- implements Closeable, Flushable, // as of 2.1
- Versioned
-{
- /**
- * Enumeration that defines all togglable features for generators.
- */
- public enum Feature {
- /**
- * Feature that determines whether generator will automatically
- * close underlying output target that is NOT owned by the
- * generator.
- * If disabled, calling application has to separately
- * close the underlying {@link OutputStream} and {@link Writer}
- * instances used to create the generator. If enabled, generator
- * will handle closing, as long as generator itself gets closed:
- * this happens when end-of-input is encountered, or generator
- * is closed by a call to {@link JsonGenerator#close}.
- *
- * Feature is enabled by default.
- */
- AUTO_CLOSE_TARGET(true),
-
- /**
- * Feature that determines what happens when the generator is
- * closed while there are still unmatched
- * {@link JsonToken#START_ARRAY} or {@link JsonToken#START_OBJECT}
- * entries in output content. If enabled, such Array(s) and/or
- * Object(s) are automatically closed; if disabled, nothing
- * specific is done.
- *
- * Feature is enabled by default.
- */
- AUTO_CLOSE_JSON_CONTENT(true),
-
- /**
- * Feature that determines whether JSON Object field names are
- * quoted using double-quotes, as specified by JSON specification
- * or not. Ability to disable quoting was added to support use
- * cases where they are not usually expected, which most commonly
- * occurs when used straight from Javascript.
- *
- * Feature is enabled by default (since it is required by JSON specification).
- */
- QUOTE_FIELD_NAMES(true),
-
- /**
- * Feature that determines whether "exceptional" (not real number)
- * float/double values are output as quoted strings.
- * The values checked are Double.Nan,
- * Double.POSITIVE_INFINITY and Double.NEGATIVE_INIFINTY (and
- * associated Float values).
- * If feature is disabled, these numbers are still output using
- * associated literal values, resulting in non-conformant
- * output.
- *
- * Feature is enabled by default.
- */
- QUOTE_NON_NUMERIC_NUMBERS(true),
-
- /**
- * Feature that forces all Java numbers to be written as JSON strings.
- * Default state is 'false', meaning that Java numbers are to
- * be serialized using basic numeric serialization (as JSON
- * numbers, integral or floating point). If enabled, all such
- * numeric values are instead written out as JSON Strings.
- *
- * One use case is to avoid problems with Javascript limitations:
- * since Javascript standard specifies that all number handling
- * should be done using 64-bit IEEE 754 floating point values,
- * result being that some 64-bit integer values can not be
- * accurately represent (as mantissa is only 51 bit wide).
- *
- * Feature is disabled by default.
- */
- WRITE_NUMBERS_AS_STRINGS(false),
-
- /**
- * Feature that determines whether {@link java.math.BigDecimal} entries are
- * serialized using {@link java.math.BigDecimal#toPlainString()} to prevent
- * values to be written using scientific notation.
- *
- * Feature is disabled by default, so default output mode is used; this generally
- * depends on how {@link BigDecimal} has been created.
- *
- * @since 2.3
- */
- WRITE_BIGDECIMAL_AS_PLAIN(false),
-
- /**
- * Feature that specifies that calls to {@link #flush} will cause
- * matching flush()
to underlying {@link OutputStream}
- * or {@link Writer}; if disabled this will not be done.
- * Main reason to disable this feature is to prevent flushing at
- * generator level, if it is not possible to prevent method being
- * called by other code (like ObjectMapper
or third
- * party libraries).
- *
- * Feature is enabled by default.
- */
- FLUSH_PASSED_TO_STREAM(true),
-
- /**
- * Feature that specifies that all characters beyond 7-bit ASCII
- * range (i.e. code points of 128 and above) need to be output
- * using format-specific escapes (for JSON, backslash escapes),
- * if format uses escaping mechanisms (which is generally true
- * for textual formats but not for binary formats).
- *
- * Feature is disabled by default.
- */
- ESCAPE_NON_ASCII(false),
-
- /**
- * Feature that determines whether {@link JsonGenerator} will explicitly
- * check that no duplicate JSON Object field names are written.
- * If enabled, generator will check all names within context and report
- * duplicates by throwing a {@link JsonGenerationException}; if disabled,
- * no such checking will be done. Assumption in latter case is
- * that caller takes care of not trying to write duplicate names.
- *
- * Note that enabling this feature will incur performance overhead
- * due to having to store and check additional information.
- *
- * @since 2.3
- */
- STRICT_DUPLICATE_DETECTION(false),
- ;
-
- private final boolean _defaultState;
-
- private final int _mask;
-
- /**
- * Method that calculates bit set (flags) of all features that
- * are enabled by default.
- */
- public static int collectDefaults()
- {
- int flags = 0;
- for (Feature f : values()) {
- if (f.enabledByDefault()) {
- flags |= f.getMask();
- }
- }
- return flags;
- }
-
- private Feature(boolean defaultState) {
- _mask = (1 << ordinal());
- _defaultState = defaultState;
- }
-
- public boolean enabledByDefault() { return _defaultState; }
-
- /**
- * @since 2.3
- */
- public boolean enabledIn(int flags) { return (flags & _mask) != 0; }
-
- public int getMask() { return _mask; }
- }
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Object that handles pretty-printing (usually additional
- * white space to make results more human-readable) during
- * output. If null, no pretty-printing is done.
- */
- protected PrettyPrinter _cfgPrettyPrinter;
-
- /*
- /**********************************************************
- /* Construction, initialization
- /**********************************************************
- */
-
- protected JsonGenerator() { }
-
- /**
- * Method that can be called to set or reset the object to
- * use for writing Java objects as JsonContent
- * (using method {@link #writeObject}).
- *
- * @return Generator itself (this), to allow chaining
- */
- public abstract JsonGenerator setCodec(ObjectCodec oc);
-
- /**
- * Method for accessing the object used for writing Java
- * object as Json content
- * (using method {@link #writeObject}).
- */
- public abstract ObjectCodec getCodec();
-
- /**
- * Accessor for finding out version of the bundle that provided this generator instance.
- */
- @Override
- public abstract Version version();
-
- /**
- * Method that can be used to get access to object that is used
- * as target for generated output; this is usually either
- * {@link OutputStream} or {@link Writer}, depending on what
- * generator was constructed with.
- * Note that returned value may be null in some cases; including
- * case where implementation does not want to exposed raw
- * source to caller.
- * In cases where output has been decorated, object returned here
- * is the decorated version; this allows some level of interaction
- * between users of generator and decorator object.
- *
- * In general use of this accessor should be considered as
- * "last effort", i.e. only used if no other mechanism is applicable.
- */
- public Object getOutputTarget() {
- return null;
- }
-
- /*
- /**********************************************************
- /* Public API, Feature configuration
- /**********************************************************
- */
-
- /**
- * Method for enabling specified parser features:
- * check {@link Feature} for list of available features.
- *
- * @return Generator itself (this), to allow chaining
- */
- public abstract JsonGenerator enable(Feature f);
-
- /**
- * Method for disabling specified features
- * (check {@link Feature} for list of features)
- *
- * @return Generator itself (this), to allow chaining
- */
- public abstract JsonGenerator disable(Feature f);
-
- /**
- * Method for enabling or disabling specified feature:
- * check {@link Feature} for list of available features.
- *
- * @return Generator itself (this), to allow chaining
- */
- public final JsonGenerator configure(Feature f, boolean state)
- {
- if (state) {
- enable(f);
- } else {
- disable(f);
- }
- return this;
- }
-
- /**
- * Method for checking whether given feature is enabled.
- * Check {@link Feature} for list of available features.
- */
- public abstract boolean isEnabled(Feature f);
-
-
- /**
- * Bulk access method for getting state of all standard {@link Feature}s.
- *
- * @return Bit mask that defines current states of all standard {@link Feature}s.
- *
- * @since 2.3
- */
- public abstract int getFeatureMask();
-
- /**
- * Bulk set method for (re)settting states of all standard {@link Feature}s
- *
- * @since 2.3
- *
- * @return This parser object, to allow chaining of calls
- */
- public abstract JsonGenerator setFeatureMask(int mask);
-
- /*
- /**********************************************************
- /* Public API, Schema configuration
- /**********************************************************
- */
-
- /**
- * Method to call to make this generator use specified schema.
- * Method must be called before generating any content, right after instance
- * has been created.
- * Note that not all generators support schemas; and those that do usually only
- * accept specific types of schemas: ones defined for data format this generator
- * produces.
- *
- * If generator does not support specified schema, {@link UnsupportedOperationException}
- * is thrown.
- *
- * @param schema Schema to use
- *
- * @throws UnsupportedOperationException if generator does not support schema
- */
- public void setSchema(FormatSchema schema)
- {
- throw new UnsupportedOperationException("Generator of type "+getClass().getName()+" does not support schema of type '"
- +schema.getSchemaType()+"'");
- }
-
- /**
- * Method for accessing Schema that this parser uses, if any.
- * Default implementation returns null.
- *
- * @since 2.1
- */
- public FormatSchema getSchema() {
- return null;
- }
-
- /*
- /**********************************************************
- /* Public API, other configuration
- /**********************************************************
- */
-
- /**
- * Method for setting a custom pretty printer, which is usually
- * used to add indentation for improved human readability.
- * By default, generator does not do pretty printing.
- *
- * To use the default pretty printer that comes with core
- * Jackson distribution, call {@link #useDefaultPrettyPrinter}
- * instead.
- *
- * @return Generator itself (this), to allow chaining
- */
- public JsonGenerator setPrettyPrinter(PrettyPrinter pp) {
- _cfgPrettyPrinter = pp;
- return this;
- }
-
- /**
- * Accessor for checking whether this generator has a configured
- * {@link PrettyPrinter}; returns it if so, null if none configured.
- *
- * @since 2.1
- */
- public PrettyPrinter getPrettyPrinter() {
- return _cfgPrettyPrinter;
- }
-
- /**
- * Convenience method for enabling pretty-printing using
- * the default pretty printer
- * ({@link com.fr.third.fasterxml.jackson.core.util.DefaultPrettyPrinter}).
- *
- * @return Generator itself (this), to allow chaining
- */
- public abstract JsonGenerator useDefaultPrettyPrinter();
-
- /**
- * Method that can be called to request that generator escapes
- * all character codes above specified code point (if positive value);
- * or, to not escape any characters except for ones that must be
- * escaped for the data format (if -1).
- * To force escaping of all non-ASCII characters, for example,
- * this method would be called with value of 127.
- *
- * Note that generators are NOT required to support setting of value
- * higher than 127, because there are other ways to affect quoting
- * (or lack thereof) of character codes between 0 and 127.
- * Not all generators support concept of escaping, either; if so,
- * calling this method will have no effect.
- *
- * Default implementation does nothing; sub-classes need to redefine
- * it according to rules of supported data format.
- *
- * @param charCode Either -1 to indicate that no additional escaping
- * is to be done; or highest code point not to escape (meaning higher
- * ones will be), if positive value.
- */
- public JsonGenerator setHighestNonEscapedChar(int charCode) {
- return this;
- }
-
- /**
- * Accessor method for testing what is the highest unescaped character
- * configured for this generator. This may be either positive value
- * (when escaping configuration has been set and is in effect), or
- * 0 to indicate that no additional escaping is in effect.
- * Some generators may not support additional escaping: for example,
- * generators for binary formats that do not use escaping should
- * simply return 0.
- *
- * @return Currently active limitation for highest non-escaped character,
- * if defined; or -1 to indicate no additional escaping is performed.
- */
- public int getHighestEscapedChar() {
- return 0;
- }
-
- /**
- * Method for accessing custom escapes factory uses for {@link JsonGenerator}s
- * it creates.
- */
- public CharacterEscapes getCharacterEscapes() {
- return null;
- }
-
- /**
- * Method for defining custom escapes factory uses for {@link JsonGenerator}s
- * it creates.
- */
- public JsonGenerator setCharacterEscapes(CharacterEscapes esc) {
- return this;
- }
-
- /**
- * Method that allows overriding String used for separating root-level
- * JSON values (default is single space character)
- *
- * @param sep Separator to use, if any; null means that no separator is
- * automatically added
- *
- * @since 2.1
- */
- public JsonGenerator setRootValueSeparator(SerializableString sep) {
- throw new UnsupportedOperationException();
- }
-
- /*
- /**********************************************************
- /* Public API, capability introspection methods
- /**********************************************************
- */
-
- /**
- * Method that can be used to verify that given schema can be used with
- * this generator (using {@link #setSchema}).
- *
- * @param schema Schema to check
- *
- * @return True if this generator can use given schema; false if not
- */
- public boolean canUseSchema(FormatSchema schema) {
- return false;
- }
-
- /**
- * Introspection method that may be called to see if the underlying
- * data format supports some kind of Object Ids natively (many do not;
- * for example, JSON doesn't).
- * This method must be called prior to calling
- * {@link #writeObjectId} or {@link #writeObjectRef}.
- *
- * Default implementation returns false; overridden by data formats
- * that do support native Object Ids. Caller is expected to either
- * use a non-native notation (explicit property or such), or fail,
- * in case it can not use native object ids.
- *
- * @since 2.3
- */
- public boolean canWriteObjectId() {
- return false;
- }
-
- /**
- * Introspection method that may be called to see if the underlying
- * data format supports some kind of Type Ids natively (many do not;
- * for example, JSON doesn't).
- * This method must be called prior to calling
- * {@link #writeTypeId}.
- *
- * Default implementation returns false; overridden by data formats
- * that do support native Type Ids. Caller is expected to either
- * use a non-native notation (explicit property or such), or fail,
- * in case it can not use native type ids.
- *
- * @since 2.3
- */
- public boolean canWriteTypeId() {
- return false;
- }
-
- /**
- * Introspection method that may be called to see if the underlying
- * data format supports "native" binary data; that is, an efficient
- * output of binary content without encoding.
- *
- * Default implementation returns false; overridden by data formats
- * that do support native binary content.
- *
- * @since 2.3
- */
- public boolean canWriteBinaryNatively() {
- return false;
- }
-
- /**
- * Introspection method to call to check whether it is ok to omit
- * writing of Object fields or not. Most formats do allow omission,
- * but certain positional formats (such as CSV) require output of
- * placeholders, even if no real values are to be emitted.
- *
- * @since 2.3
- */
- public boolean canOmitFields() {
- return true;
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, structural
- /**********************************************************
- */
-
- /**
- * Method for writing starting marker of a JSON Array value
- * (character '['; plus possible white space decoration
- * if pretty-printing is enabled).
- *
- * Array values can be written in any context where values
- * are allowed: meaning everywhere except for when
- * a field name is expected.
- */
- public abstract void writeStartArray()
- throws IOException, JsonGenerationException;
-
- /**
- * Method for writing closing marker of a JSON Array value
- * (character ']'; plus possible white space decoration
- * if pretty-printing is enabled).
- *
- * Marker can be written if the innermost structured type
- * is Array.
- */
- public abstract void writeEndArray()
- throws IOException, JsonGenerationException;
-
- /**
- * Method for writing starting marker of a JSON Object value
- * (character '{'; plus possible white space decoration
- * if pretty-printing is enabled).
- *
- * Object values can be written in any context where values
- * are allowed: meaning everywhere except for when
- * a field name is expected.
- */
- public abstract void writeStartObject()
- throws IOException, JsonGenerationException;
-
- /**
- * Method for writing closing marker of a JSON Object value
- * (character '}'; plus possible white space decoration
- * if pretty-printing is enabled).
- *
- * Marker can be written if the innermost structured type
- * is Object, and the last written event was either a
- * complete value, or START-OBJECT marker (see JSON specification
- * for more details).
- */
- public abstract void writeEndObject()
- throws IOException, JsonGenerationException;
-
- /**
- * Method for writing a field name (JSON String surrounded by
- * double quotes: syntactically identical to a JSON String value),
- * possibly decorated by white space if pretty-printing is enabled.
- *
- * Field names can only be written in Object context (check out
- * JSON specification for details), when field name is expected
- * (field names alternate with values).
- */
- public abstract void writeFieldName(String name)
- throws IOException, JsonGenerationException;
-
- /**
- * Method similar to {@link #writeFieldName(String)}, main difference
- * being that it may perform better as some of processing (such as
- * quoting of certain characters, or encoding into external encoding
- * if supported by generator) can be done just once and reused for
- * later calls.
- *
- * Default implementation simple uses unprocessed name container in
- * serialized String; implementations are strongly encouraged to make
- * use of more efficient methods argument object has.
- */
- public abstract void writeFieldName(SerializableString name)
- throws IOException, JsonGenerationException;
-
- /*
- /**********************************************************
- /* Public API, write methods, text/String values
- /**********************************************************
- */
-
- /**
- * Method for outputting a String value. Depending on context
- * this means either array element, (object) field value or
- * a stand alone String; but in all cases, String will be
- * surrounded in double quotes, and contents will be properly
- * escaped as required by JSON specification.
- */
- public abstract void writeString(String text)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting a String value. Depending on context
- * this means either array element, (object) field value or
- * a stand alone String; but in all cases, String will be
- * surrounded in double quotes, and contents will be properly
- * escaped as required by JSON specification.
- */
- public abstract void writeString(char[] text, int offset, int len)
- throws IOException, JsonGenerationException;
-
- /**
- * Method similar to {@link #writeString(String)}, but that takes
- * {@link SerializableString} which can make this potentially
- * more efficient to call as generator may be able to reuse
- * quoted and/or encoded representation.
- *
- * Default implementation just calls {@link #writeString(String)};
- * sub-classes should override it with more efficient implementation
- * if possible.
- */
- public abstract void writeString(SerializableString text)
- throws IOException, JsonGenerationException;
-
- /**
- * Method similar to {@link #writeString(String)} but that takes as
- * its input a UTF-8 encoded String that is to be output as-is, without additional
- * escaping (type of which depends on data format; backslashes for JSON).
- * However, quoting that data format requires (like double-quotes for JSON) will be added
- * around the value if and as necessary.
- *
- * Note that some backends may choose not to support this method: for
- * example, if underlying destination is a {@link java.io.Writer}
- * using this method would require UTF-8 decoding.
- * If so, implementation may instead choose to throw a
- * {@link UnsupportedOperationException} due to ineffectiveness
- * of having to decode input.
- */
- public abstract void writeRawUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException;
-
- /**
- * Method similar to {@link #writeString(String)} but that takes as its input
- * a UTF-8 encoded String which has not been escaped using whatever
- * escaping scheme data format requires (for JSON that is backslash-escaping
- * for control characters and double-quotes; for other formats something else).
- * This means that textual JSON backends need to check if value needs
- * JSON escaping, but otherwise can just be copied as is to output.
- * Also, quoting that data format requires (like double-quotes for JSON) will be added
- * around the value if and as necessary.
- *
- * Note that some backends may choose not to support this method: for
- * example, if underlying destination is a {@link java.io.Writer}
- * using this method would require UTF-8 decoding.
- * In this case
- * generator implementation may instead choose to throw a
- * {@link UnsupportedOperationException} due to ineffectiveness
- * of having to decode input.
- */
- public abstract void writeUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException;
-
- /*
- /**********************************************************
- /* Public API, write methods, binary/raw content
- /**********************************************************
- */
-
- /**
- * Method that will force generator to copy
- * input text verbatim with no modifications (including
- * that no escaping is done and no separators are added even
- * if context [array, object] would otherwise require such).
- * If such separators are desired, use
- * {@link #writeRawValue(String)} instead.
- *
- * Note that not all generator implementations necessarily support
- * such by-pass methods: those that do not will throw
- * {@link UnsupportedOperationException}.
- */
- public abstract void writeRaw(String text)
- throws IOException, JsonGenerationException;
-
- /**
- * Method that will force generator to copy
- * input text verbatim with no modifications (including
- * that no escaping is done and no separators are added even
- * if context [array, object] would otherwise require such).
- * If such separators are desired, use
- * {@link #writeRawValue(String)} instead.
- *
- * Note that not all generator implementations necessarily support
- * such by-pass methods: those that do not will throw
- * {@link UnsupportedOperationException}.
- */
- public abstract void writeRaw(String text, int offset, int len)
- throws IOException, JsonGenerationException;
-
- /**
- * Method that will force generator to copy
- * input text verbatim with no modifications (including
- * that no escaping is done and no separators are added even
- * if context [array, object] would otherwise require such).
- * If such separators are desired, use
- * {@link #writeRawValue(String)} instead.
- *
- * Note that not all generator implementations necessarily support
- * such by-pass methods: those that do not will throw
- * {@link UnsupportedOperationException}.
- */
- public abstract void writeRaw(char[] text, int offset, int len)
- throws IOException, JsonGenerationException;
-
- /**
- * Method that will force generator to copy
- * input text verbatim with no modifications (including
- * that no escaping is done and no separators are added even
- * if context [array, object] would otherwise require such).
- * If such separators are desired, use
- * {@link #writeRawValue(String)} instead.
- *
- * Note that not all generator implementations necessarily support
- * such by-pass methods: those that do not will throw
- * {@link UnsupportedOperationException}.
- */
- public abstract void writeRaw(char c)
- throws IOException, JsonGenerationException;
-
- /**
- * Method that will force generator to copy
- * input text verbatim with no modifications (including
- * that no escaping is done and no separators are added even
- * if context [array, object] would otherwise require such).
- * If such separators are desired, use
- * {@link #writeRawValue(String)} instead.
- *
- * Note that not all generator implementations necessarily support
- * such by-pass methods: those that do not will throw
- * {@link UnsupportedOperationException}.
- *
- * The default implementation delegates to {@link #writeRaw(String)};
- * other backends that support raw inclusion of text are encouraged
- * to implement it in more efficient manner (especially if they
- * use UTF-8 encoding).
- *
- * @since 2.1
- */
- public void writeRaw(SerializableString raw)
- throws IOException, JsonGenerationException {
- writeRaw(raw.getValue());
- }
-
- /**
- * Method that will force generator to copy
- * input text verbatim without any modifications, but assuming
- * it must constitute a single legal JSON value (number, string,
- * boolean, null, Array or List). Assuming this, proper separators
- * are added if and as needed (comma or colon), and generator
- * state updated to reflect this.
- */
- public abstract void writeRawValue(String text)
- throws IOException, JsonGenerationException;
-
- public abstract void writeRawValue(String text, int offset, int len)
- throws IOException, JsonGenerationException;
-
- public abstract void writeRawValue(char[] text, int offset, int len)
- throws IOException, JsonGenerationException;
-
- /**
- * Method that will output given chunk of binary data as base64
- * encoded, as a complete String value (surrounded by double quotes).
- * This method defaults
- *
- * Note: because Json Strings can not contain unescaped linefeeds,
- * if linefeeds are included (as per last argument), they must be
- * escaped. This adds overhead for decoding without improving
- * readability.
- * Alternatively if linefeeds are not included,
- * resulting String value may violate the requirement of base64
- * RFC which mandates line-length of 76 characters and use of
- * linefeeds. However, all {@link JsonParser} implementations
- * are required to accept such "long line base64"; as do
- * typical production-level base64 decoders.
- *
- * @param b64variant Base64 variant to use: defines details such as
- * whether padding is used (and if so, using which character);
- * what is the maximum line length before adding linefeed,
- * and also the underlying alphabet to use.
- */
- public abstract void writeBinary(Base64Variant b64variant,
- byte[] data, int offset, int len)
- throws IOException, JsonGenerationException;
-
- /**
- * Similar to {@link #writeBinary(Base64Variant,byte[],int,int)},
- * but default to using the Jackson default Base64 variant
- * (which is {@link Base64Variants#MIME_NO_LINEFEEDS}).
- */
- public void writeBinary(byte[] data, int offset, int len)
- throws IOException, JsonGenerationException
- {
- writeBinary(Base64Variants.getDefaultVariant(), data, offset, len);
- }
-
- /**
- * Similar to {@link #writeBinary(Base64Variant,byte[],int,int)},
- * but assumes default to using the Jackson default Base64 variant
- * (which is {@link Base64Variants#MIME_NO_LINEFEEDS}). Also
- * assumes that whole byte array is to be output.
- */
- public void writeBinary(byte[] data)
- throws IOException, JsonGenerationException
- {
- writeBinary(Base64Variants.getDefaultVariant(), data, 0, data.length);
- }
-
- /**
- * Similar to {@link #writeBinary(Base64Variant,InputStream,int)},
- * but assumes default to using the Jackson default Base64 variant
- * (which is {@link Base64Variants#MIME_NO_LINEFEEDS}).
- *
- * @param data InputStream to use for reading binary data to write.
- * Will not be closed after successful write operation
- * @param dataLength (optional) number of bytes that will be available;
- * or -1 to be indicate it is not known. Note that implementations
- * need not support cases where length is not known in advance; this
- * depends on underlying data format: JSON output does NOT require length,
- * other formats may
- */
- public int writeBinary(InputStream data, int dataLength)
- throws IOException, JsonGenerationException {
- return writeBinary(Base64Variants.getDefaultVariant(), data, dataLength);
- }
-
- /**
- * Method similar to {@link #writeBinary(Base64Variant,byte[],int,int)},
- * but where input is provided through a stream, allowing for incremental
- * writes without holding the whole input in memory.
- *
- * @param b64variant Base64 variant to use
- * @param data InputStream to use for reading binary data to write.
- * Will not be closed after successful write operation
- * @param dataLength (optional) number of bytes that will be available;
- * or -1 to be indicate it is not known.
- * If a positive length is given, data
MUST provide at least
- * that many bytes: if not, an exception will be thrown.
- * Note that implementations
- * need not support cases where length is not known in advance; this
- * depends on underlying data format: JSON output does NOT require length,
- * other formats may.
- *
- * @return Number of bytes read from data
and written as binary payload
- *
- * @since 2.1
- */
- public abstract int writeBinary(Base64Variant b64variant,
- InputStream data, int dataLength)
- throws IOException, JsonGenerationException;
-
- /*
- /**********************************************************
- /* Public API, write methods, other value types
- /**********************************************************
- */
-
- /**
- * Method for outputting given value as Json number.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- *
- * @since 2.2
- */
- public void writeNumber(short v) throws IOException, JsonGenerationException {
- writeNumber((int) v);
- }
-
- /**
- * Method for outputting given value as Json number.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(int v)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting given value as Json number.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(long v)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting given value as Json number.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(BigInteger v)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting indicate Json numeric value.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(double d)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting indicate Json numeric value.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(float f)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting indicate Json numeric value.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNumber(BigDecimal dec)
- throws IOException, JsonGenerationException;
-
- /**
- * Write method that can be used for custom numeric types that can
- * not be (easily?) converted to "standard" Java number types.
- * Because numbers are not surrounded by double quotes, regular
- * {@link #writeString} method can not be used; nor
- * {@link #writeRaw} because that does not properly handle
- * value separators needed in Array or Object contexts.
- *
- * Note: because of lack of type safety, some generator
- * implementations may not be able to implement this
- * method. For example, if a binary json format is used,
- * it may require type information for encoding; similarly
- * for generator-wrappers around Java objects or Json nodes.
- * If implementation does not implement this method,
- * it needs to throw {@link UnsupportedOperationException}.
- */
- public abstract void writeNumber(String encodedValue)
- throws IOException, JsonGenerationException,
- UnsupportedOperationException;
-
- /**
- * Method for outputting literal Json boolean value (one of
- * Strings 'true' and 'false').
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeBoolean(boolean state)
- throws IOException, JsonGenerationException;
-
- /**
- * Method for outputting literal Json null value.
- * Can be called in any context where a value is expected
- * (Array value, Object field value, root-level value).
- * Additional white space may be added around the value
- * if pretty-printing is enabled.
- */
- public abstract void writeNull()
- throws IOException, JsonGenerationException;
-
- /*
- /**********************************************************
- /* Public API, write methods, Native Ids (type, object)
- /**********************************************************
- */
-
- /**
- * Method that can be called to output so-called native Object Id.
- * Note that it may only be called after ensuring this is legal
- * (with {@link #canWriteObjectId()}), as not all data formats
- * have native type id support; and some may only allow them in
- * certain positions or locations.
- * If output is not allowed by the data format in this position,
- * a {@link JsonGenerationException} will be thrown.
- *
- * @since 2.3
- */
- public void writeObjectId(Object id)
- throws IOException, JsonGenerationException
- {
- throw new JsonGenerationException("No native support for writing Object Ids");
- }
-
- /**
- * Method that can be called to output references to native Object Ids.
- * Note that it may only be called after ensuring this is legal
- * (with {@link #canWriteObjectId()}), as not all data formats
- * have native type id support; and some may only allow them in
- * certain positions or locations.
- * If output is not allowed by the data format in this position,
- * a {@link JsonGenerationException} will be thrown.
- */
- public void writeObjectRef(Object id)
- throws IOException, JsonGenerationException {
- throw new JsonGenerationException("No native support for writing Object Ids");
- }
-
- /**
- * Method that can be called to output so-called native Type Id.
- * Note that it may only be called after ensuring this is legal
- * (with {@link #canWriteTypeId()}), as not all data formats
- * have native type id support; and some may only allow them in
- * certain positions or locations.
- * If output is not allowed by the data format in this position,
- * a {@link JsonGenerationException} will be thrown.
- *
- * @since 2.3
- */
- public void writeTypeId(Object id)
- throws IOException, JsonGenerationException {
- throw new JsonGenerationException("No native support for writing Type Ids");
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, serializing Java objects
- /**********************************************************
- */
-
- /**
- * Method for writing given Java object (POJO) as Json.
- * Exactly how the object gets written depends on object
- * in question (ad on codec, its configuration); for most
- * beans it will result in Json object, but for others Json
- * array, or String or numeric value (and for nulls, Json
- * null literal.
- * NOTE : generator must have its object codec
- * set to non-null value; for generators created by a mapping
- * factory this is the case, for others not.
- */
- public abstract void writeObject(Object pojo)
- throws IOException, JsonProcessingException;
-
- /**
- * Method for writing given JSON tree (expressed as a tree
- * where given JsonNode is the root) using this generator.
- * This will generally just call
- * {@link #writeObject} with given node, but is added
- * for convenience and to make code more explicit in cases
- * where it deals specifically with trees.
- */
- public abstract void writeTree(TreeNode rootNode)
- throws IOException, JsonProcessingException;
-
- /*
- /**********************************************************
- /* Public API, convenience field write methods
- /**********************************************************
- */
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has a String value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeString(value);
- *
- *
- * Note: many performance-sensitive implementations override this method
- */
- public void writeStringField(String fieldName, String value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeString(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has a boolean value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeBoolean(value);
- *
- */
- public final void writeBooleanField(String fieldName, boolean value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeBoolean(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has JSON literal value null. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNull();
- *
- */
- public final void writeNullField(String fieldName)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNull();
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has the specified numeric value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNumber(value);
- *
- */
- public final void writeNumberField(String fieldName, int value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNumber(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has the specified numeric value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNumber(value);
- *
- */
- public final void writeNumberField(String fieldName, long value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNumber(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has the specified numeric value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNumber(value);
- *
- */
- public final void writeNumberField(String fieldName, double value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNumber(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has the specified numeric value. Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNumber(value);
- *
- */
- public final void writeNumberField(String fieldName, float value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNumber(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has the specified numeric value.
- * Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeNumber(value);
- *
- */
- public final void writeNumberField(String fieldName, BigDecimal value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeNumber(value);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that contains specified data in base64-encoded form.
- * Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeBinary(value);
- *
- */
- public final void writeBinaryField(String fieldName, byte[] data)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeBinary(data);
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * (that will contain a JSON Array value), and the START_ARRAY marker.
- * Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeStartArray();
- *
- *
- * Note: caller still has to take care to close the array
- * (by calling {#link #writeEndArray}) after writing all values
- * of the value Array.
- */
- public final void writeArrayFieldStart(String fieldName)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeStartArray();
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * (that will contain a JSON Object value), and the START_OBJECT marker.
- * Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeStartObject();
- *
- *
- * Note: caller still has to take care to close the Object
- * (by calling {#link #writeEndObject}) after writing all
- * entries of the value Object.
- */
- public final void writeObjectFieldStart(String fieldName)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeStartObject();
- }
-
- /**
- * Convenience method for outputting a field entry ("member")
- * that has contents of specific Java object as its value.
- * Equivalent to:
- *
- * writeFieldName(fieldName);
- * writeObject(pojo);
- *
- */
- public final void writeObjectField(String fieldName, Object pojo)
- throws IOException, JsonProcessingException
- {
- writeFieldName(fieldName);
- writeObject(pojo);
- }
-
- /**
- * Method called to indicate that a property in this position was
- * skipped. It is usually only called for generators that return
- * false
from {@link #canOmitFields()}.
- *
- * Default implementation does nothing.
- *
- * @since 2.3
- */
- public void writeOmittedField(String fieldName)
- throws IOException, JsonGenerationException
- {
- // default implementation does nothing
- }
-
- /*
- /**********************************************************
- /* Public API, copy-through methods
- /**********************************************************
- */
-
- /**
- * Method for copying contents of the current event that
- * the given parser instance points to.
- * Note that the method will not copy any other events,
- * such as events contained within Json Array or Object structures.
- *
- * Calling this method will not advance the given
- * parser, although it may cause parser to internally process
- * more data (if it lazy loads contents of value events, for example)
- */
- public void copyCurrentEvent(JsonParser jp)
- throws IOException, JsonProcessingException
- {
- JsonToken t = jp.getCurrentToken();
- // sanity check; what to do?
- if (t == null) {
- _reportError("No current event to copy");
- }
- switch (t.id()) {
- case ID_NOT_AVAILABLE:
- _reportError("No current event to copy");
- case ID_START_OBJECT:
- writeStartObject();
- break;
- case ID_END_OBJECT:
- writeEndObject();
- break;
- case ID_START_ARRAY:
- writeStartArray();
- break;
- case ID_END_ARRAY:
- writeEndArray();
- break;
- case ID_FIELD_NAME:
- writeFieldName(jp.getCurrentName());
- break;
- case ID_STRING:
- if (jp.hasTextCharacters()) {
- writeString(jp.getTextCharacters(), jp.getTextOffset(), jp.getTextLength());
- } else {
- writeString(jp.getText());
- }
- break;
- case ID_NUMBER_INT:
- {
- NumberType n = jp.getNumberType();
- if (n == NumberType.INT) {
- writeNumber(jp.getIntValue());
- } else if (n == NumberType.BIG_INTEGER) {
- writeNumber(jp.getBigIntegerValue());
- } else {
- writeNumber(jp.getLongValue());
- }
- break;
- }
- case ID_NUMBER_FLOAT:
- {
- NumberType n = jp.getNumberType();
- if (n == NumberType.BIG_DECIMAL) {
- writeNumber(jp.getDecimalValue());
- } else if (n == NumberType.FLOAT) {
- writeNumber(jp.getFloatValue());
- } else {
- writeNumber(jp.getDoubleValue());
- }
- break;
- }
- case ID_TRUE:
- writeBoolean(true);
- break;
- case ID_FALSE:
- writeBoolean(false);
- break;
- case ID_NULL:
- writeNull();
- break;
- case ID_EMBEDDED_OBJECT:
- writeObject(jp.getEmbeddedObject());
- break;
- default:
- _throwInternal();
- }
- }
-
- /**
- * Method for copying contents of the current event
- * and following events that it encloses
- * the given parser instance points to.
- *
- * So what constitutes enclosing? Here is the list of
- * events that have associated enclosed events that will
- * get copied:
- *
- * {@link JsonToken#START_OBJECT}:
- * all events up to and including matching (closing)
- * {@link JsonToken#END_OBJECT} will be copied
- *
- * {@link JsonToken#START_ARRAY}
- * all events up to and including matching (closing)
- * {@link JsonToken#END_ARRAY} will be copied
- *
- * {@link JsonToken#FIELD_NAME} the logical value (which
- * can consist of a single scalar value; or a sequence of related
- * events for structured types (Json Arrays, Objects)) will
- * be copied along with the name itself. So essentially the
- * whole field entry (name and value) will be copied.
- *
- *
- *
- * After calling this method, parser will point to the
- * last event that was copied. This will either be
- * the event parser already pointed to (if there were no
- * enclosed events), or the last enclosed event copied.
- */
- public void copyCurrentStructure(JsonParser jp)
- throws IOException, JsonProcessingException
- {
- JsonToken t = jp.getCurrentToken();
- if (t == null) {
- _reportError("No current event to copy");
- }
- // Let's handle field-name separately first
- int id = t.id();
- if (id == ID_FIELD_NAME) {
- writeFieldName(jp.getCurrentName());
- t = jp.nextToken();
- id = t.id();
- // fall-through to copy the associated value
- }
- switch (id) {
- case ID_START_OBJECT:
- writeStartObject();
- while (jp.nextToken() != JsonToken.END_OBJECT) {
- copyCurrentStructure(jp);
- }
- writeEndObject();
- break;
- case ID_START_ARRAY:
- writeStartArray();
- while (jp.nextToken() != JsonToken.END_ARRAY) {
- copyCurrentStructure(jp);
- }
- writeEndArray();
- break;
- default:
- copyCurrentEvent(jp);
- }
- }
-
- /*
- /**********************************************************
- /* Public API, context access
- /**********************************************************
- */
-
- /**
- * @return Context object that can give information about logical
- * position within generated json content.
- */
- public abstract JsonStreamContext getOutputContext();
-
- /*
- /**********************************************************
- /* Public API, buffer handling
- /**********************************************************
- */
-
- /**
- * Method called to flush any buffered content to the underlying
- * target (output stream, writer), and to flush the target itself
- * as well.
- */
- @Override
- public abstract void flush() throws IOException;
-
- /**
- * Method that can be called to determine whether this generator
- * is closed or not. If it is closed, no more output can be done.
- */
- public abstract boolean isClosed();
-
- /*
- /**********************************************************
- /* Closeable implementation
- /**********************************************************
- */
-
- /**
- * Method called to close this generator, so that no more content
- * can be written.
- *
- * Whether the underlying target (stream, writer) gets closed depends
- * on whether this generator either manages the target (i.e. is the
- * only one with access to the target -- case if caller passes a
- * reference to the resource such as File, but not stream); or
- * has feature {@link Feature#AUTO_CLOSE_TARGET} enabled.
- * If either of above is true, the target is also closed. Otherwise
- * (not managing, feature not enabled), target is not closed.
- */
- @Override
- public abstract void close() throws IOException;
-
- /*
- /**********************************************************
- /* Helper methods for sub-classes
- /**********************************************************
- */
-
- /**
- * Helper method used for constructing and throwing
- * {@link JsonGenerationException} with given base message.
- *
- * Note that sub-classes may override this method to add more detail
- * or use a {@link JsonGenerationException} sub-class.
- */
- protected void _reportError(String msg)
- throws JsonGenerationException
- {
- throw new JsonGenerationException(msg);
- }
-
- protected final void _throwInternal() {
- VersionUtil.throwInternal();
- }
-
- protected void _reportUnsupportedOperation() {
- throw new UnsupportedOperationException("Operation not supported by generator of type "+getClass().getName());
- }
-
- /**
- * Helper method to try to call appropriate write method for given
- * untyped Object. At this point, no structural conversions should be done,
- * only simple basic types are to be coerced as necessary.
- *
- * @param value Non-null value to write
- */
- protected void _writeSimpleObject(Object value)
- throws IOException, JsonGenerationException
- {
- /* 31-Dec-2009, tatu: Actually, we could just handle some basic
- * types even without codec. This can improve interoperability,
- * and specifically help with TokenBuffer.
- */
- if (value == null) {
- writeNull();
- return;
- }
- if (value instanceof String) {
- writeString((String) value);
- return;
- }
- if (value instanceof Number) {
- Number n = (Number) value;
- if (n instanceof Integer) {
- writeNumber(n.intValue());
- return;
- } else if (n instanceof Long) {
- writeNumber(n.longValue());
- return;
- } else if (n instanceof Double) {
- writeNumber(n.doubleValue());
- return;
- } else if (n instanceof Float) {
- writeNumber(n.floatValue());
- return;
- } else if (n instanceof Short) {
- writeNumber(n.shortValue());
- return;
- } else if (n instanceof Byte) {
- writeNumber(n.byteValue());
- return;
- } else if (n instanceof BigInteger) {
- writeNumber((BigInteger) n);
- return;
- } else if (n instanceof BigDecimal) {
- writeNumber((BigDecimal) n);
- return;
-
- // then Atomic types
-
- } else if (n instanceof AtomicInteger) {
- writeNumber(((AtomicInteger) n).get());
- return;
- } else if (n instanceof AtomicLong) {
- writeNumber(((AtomicLong) n).get());
- return;
- }
- } else if (value instanceof byte[]) {
- writeBinary((byte[]) value);
- return;
- } else if (value instanceof Boolean) {
- writeBoolean((Boolean) value);
- return;
- } else if (value instanceof AtomicBoolean) {
- writeBoolean(((AtomicBoolean) value).get());
- return;
- }
- throw new IllegalStateException("No ObjectCodec defined for the generator, can only serialize simple wrapper types (type passed "
- +value.getClass().getName()+")");
- }
-
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonLocation.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonLocation.java
deleted file mode 100644
index 32fb4ca5c..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonLocation.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Object that encapsulates Location information used for reporting
- * parsing (or potentially generation) errors, as well as current location
- * within input streams.
- */
-public class JsonLocation
- implements java.io.Serializable // as per [JACKSON-168]
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * Shared immutable "N/A location" that can be returned to indicate
- * that no location information is available
- */
- public final static JsonLocation NA = new JsonLocation("N/A", -1L, -1L, -1, -1);
-
- final long _totalBytes;
- final long _totalChars;
-
- final int _lineNr;
- final int _columnNr;
-
- /**
- * Displayable description for input source: file path, URL.
- *
- * NOTE: transient
since 2.2 so that Location itself is Serializable.
- */
- final transient Object _sourceRef;
-
- public JsonLocation(Object srcRef, long totalChars, int lineNr, int colNr)
- {
- /* Unfortunately, none of legal encodings are straight single-byte
- * encodings. Could determine offset for UTF-16/UTF-32, but the
- * most important one is UTF-8...
- * so for now, we'll just not report any real byte count
- */
- this(srcRef, -1L, totalChars, lineNr, colNr);
- }
-
- public JsonLocation(Object sourceRef, long totalBytes, long totalChars,
- int lineNr, int columnNr)
- {
- _sourceRef = sourceRef;
- _totalBytes = totalBytes;
- _totalChars = totalChars;
- _lineNr = lineNr;
- _columnNr = columnNr;
- }
-
- /**
- * Reference to the original resource being read, if one available.
- * For example, when a parser has been constructed by passing
- * a {@link java.io.File} instance, this method would return
- * that File. Will return null if no such reference is available,
- * for example when {@link java.io.InputStream} was used to
- * construct the parser instance.
- */
- public Object getSourceRef() { return _sourceRef; }
-
- /**
- * @return Line number of the location (1-based)
- */
- public int getLineNr() { return _lineNr; }
-
- /**
- * @return Column number of the location (1-based)
- */
- public int getColumnNr() { return _columnNr; }
-
- /**
- * @return Character offset within underlying stream, reader or writer,
- * if available; -1 if not.
- */
- public long getCharOffset() { return _totalChars; }
-
- /**
- * @return Byte offset within underlying stream, reader or writer,
- * if available; -1 if not.
- */
- public long getByteOffset()
- {
- return _totalBytes;
- }
-
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder(80);
- sb.append("[Source: ");
- if (_sourceRef == null) {
- sb.append("UNKNOWN");
- } else {
- sb.append(_sourceRef.toString());
- }
- sb.append("; line: ");
- sb.append(_lineNr);
- sb.append(", column: ");
- sb.append(_columnNr);
- sb.append(']');
- return sb.toString();
- }
-
- @Override
- public int hashCode()
- {
- int hash = (_sourceRef == null) ? 1 : _sourceRef.hashCode();
- hash ^= _lineNr;
- hash += _columnNr;
- hash ^= (int) _totalChars;
- hash += (int) _totalBytes;
- return hash;
- }
-
- @Override
- public boolean equals(Object other)
- {
- if (other == this) return true;
- if (other == null) return false;
- if (!(other instanceof JsonLocation)) return false;
- JsonLocation otherLoc = (JsonLocation) other;
-
- if (_sourceRef == null) {
- if (otherLoc._sourceRef != null) return false;
- } else if (!_sourceRef.equals(otherLoc._sourceRef)) return false;
-
- return (_lineNr == otherLoc._lineNr)
- && (_columnNr == otherLoc._columnNr)
- && (_totalChars == otherLoc._totalChars)
- && (getByteOffset() == otherLoc.getByteOffset())
- ;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParseException.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParseException.java
deleted file mode 100644
index 933ce74a2..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParseException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Exception type for parsing problems, used when non-well-formed content
- * (content that does not conform to JSON syntax as per specification)
- * is encountered.
- */
-public class JsonParseException
- extends JsonProcessingException
-{
- private static final long serialVersionUID = 1L;
-
- public JsonParseException(String msg, JsonLocation loc)
- {
- super(msg, loc);
- }
-
- public JsonParseException(String msg, JsonLocation loc, Throwable root)
- {
- super(msg, loc, root);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParser.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParser.java
deleted file mode 100644
index 5a7710595..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonParser.java
+++ /dev/null
@@ -1,1536 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Iterator;
-
-import com.fr.third.fasterxml.jackson.core.type.TypeReference;
-
-/**
- * Base class that defines public API for reading JSON content.
- * Instances are created using factory methods of
- * a {@link JsonFactory} instance.
- *
- * @author Tatu Saloranta
- */
-public abstract class JsonParser
- implements Closeable, Versioned
-{
- private final static int MIN_BYTE_I = (int) Byte.MIN_VALUE;
- // as per [JACKSON-804], allow range up to and including 255
- private final static int MAX_BYTE_I = (int) 255;
-
- private final static int MIN_SHORT_I = (int) Short.MIN_VALUE;
- private final static int MAX_SHORT_I = (int) Short.MAX_VALUE;
-
- /**
- * Enumeration of possible "native" (optimal) types that can be
- * used for numbers.
- */
- public enum NumberType {
- INT, LONG, BIG_INTEGER, FLOAT, DOUBLE, BIG_DECIMAL
- };
-
- /**
- * Enumeration that defines all on/off features for parsers.
- */
- public enum Feature {
-
- // // // Low-level I/O handling features:
-
- /**
- * Feature that determines whether parser will automatically
- * close underlying input source that is NOT owned by the
- * parser. If disabled, calling application has to separately
- * close the underlying {@link InputStream} and {@link Reader}
- * instances used to create the parser. If enabled, parser
- * will handle closing, as long as parser itself gets closed:
- * this happens when end-of-input is encountered, or parser
- * is closed by a call to {@link JsonParser#close}.
- *
- * Feature is enabled by default.
- */
- AUTO_CLOSE_SOURCE(true),
-
- // // // Support for non-standard data format constructs
-
- /**
- * Feature that determines whether parser will allow use
- * of Java/C++ style comments (both '/'+'*' and
- * '//' varieties) within parsed content or not.
- *
- * Since JSON specification does not mention comments as legal
- * construct,
- * this is a non-standard feature; however, in the wild
- * this is extensively used. As such, feature is
- * disabled by default for parsers and must be
- * explicitly enabled.
- */
- ALLOW_COMMENTS(false),
-
- /**
- * Feature that determines whether parser will allow use
- * of YAML comments, ones starting with '#' and continuing
- * until the end of the line. This commenting style is common
- * with scripting languages as well.
- *
- * Since JSON specification does not mention comments as legal
- * construct,
- * this is a non-standard feature. As such, feature is
- * disabled by default for parsers and must be
- * explicitly enabled.
- */
- ALLOW_YAML_COMMENTS(false),
-
- /**
- * Feature that determines whether parser will allow use
- * of unquoted field names (which is allowed by Javascript,
- * but not by JSON specification).
- *
- * Since JSON specification requires use of double quotes for
- * field names,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_UNQUOTED_FIELD_NAMES(false),
-
- /**
- * Feature that determines whether parser will allow use
- * of single quotes (apostrophe, character '\'') for
- * quoting Strings (names and String values). If so,
- * this is in addition to other acceptabl markers.
- * but not by JSON specification).
- *
- * Since JSON specification requires use of double quotes for
- * field names,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_SINGLE_QUOTES(false),
-
- /**
- * Feature that determines whether parser will allow
- * JSON Strings to contain unquoted control characters
- * (ASCII characters with value less than 32, including
- * tab and line feed characters) or not.
- * If feature is set false, an exception is thrown if such a
- * character is encountered.
- *
- * Since JSON specification requires quoting for all control characters,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_UNQUOTED_CONTROL_CHARS(false),
-
- /**
- * Feature that can be enabled to accept quoting of all character
- * using backslash qooting mechanism: if not enabled, only characters
- * that are explicitly listed by JSON specification can be thus
- * escaped (see JSON spec for small list of these characters)
- *
- * Since JSON specification requires quoting for all control characters,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),
-
- /**
- * Feature that determines whether parser will allow
- * JSON integral numbers to start with additional (ignorable)
- * zeroes (like: 000001). If enabled, no exception is thrown, and extra
- * nulls are silently ignored (and not included in textual representation
- * exposed via {@link JsonParser#getText}).
- *
- * Since JSON specification does not allow leading zeroes,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_NUMERIC_LEADING_ZEROS(false),
-
- /**
- * Feature that allows parser to recognize set of
- * "Not-a-Number" (NaN) tokens as legal floating number
- * values (similar to how many other data formats and
- * programming language source code allows it).
- * Specific subset contains values that
- * XML Schema
- * (see section 3.2.4.1, Lexical Representation)
- * allows (tokens are quoted contents, not including quotes):
- *
- * "INF" (for positive infinity), as well as alias of "Infinity"
- * "-INF" (for negative infinity), alias "-Infinity"
- * "NaN" (for other not-a-numbers, like result of division by zero)
- *
- *
- * Since JSON specification does not allow use of such values,
- * this is a non-standard feature, and as such disabled by default.
- */
- ALLOW_NON_NUMERIC_NUMBERS(false),
-
- /**
- * Feature that determines whether {@link JsonParser} will explicitly
- * check that no duplicate JSON Object field names are encountered.
- * If enabled, parser will check all names within context and report
- * duplicates by throwing a {@link JsonParseException}; if disabled,
- * parser will not do such checking. Assumption in latter case is
- * that caller takes care of handling duplicates at a higher level:
- * data-binding, for example, has features to specify detection to
- * be done there.
- *
- * Note that enabling this feature will incur performance overhead
- * due to having to store and check additional information: this typically
- * adds 20-30% to execution time for basic parsing.
- *
- * @since 2.3
- */
- STRICT_DUPLICATE_DETECTION(false),
- ;
-
- /**
- * Whether feature is enabled or disabled by default.
- */
- private final boolean _defaultState;
-
- private final int _mask;
-
- /**
- * Method that calculates bit set (flags) of all features that
- * are enabled by default.
- */
- public static int collectDefaults()
- {
- int flags = 0;
- for (Feature f : values()) {
- if (f.enabledByDefault()) {
- flags |= f.getMask();
- }
- }
- return flags;
- }
-
- private Feature(boolean defaultState) {
- _mask = (1 << ordinal());
- _defaultState = defaultState;
- }
-
- public boolean enabledByDefault() { return _defaultState; }
-
- /**
- * @since 2.3
- */
- public boolean enabledIn(int flags) { return (flags & _mask) != 0; }
-
- public int getMask() { return (1 << ordinal()); }
- }
-
- /*
- /**********************************************************
- /* Minimal configuration state
- /**********************************************************
- */
-
- /**
- * Bit flag composed of bits that indicate which
- * {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature}s
- * are enabled.
- */
- protected int _features;
-
- /*
- /**********************************************************
- /* Construction, configuration, initialization
- /**********************************************************
- */
-
- protected JsonParser() { }
- protected JsonParser(int features) {
- _features = features;
- }
-
- /**
- * Accessor for {@link ObjectCodec} associated with this
- * parser, if any. Codec is used by {@link #readValueAs(Class)}
- * method (and its variants).
- */
- public abstract ObjectCodec getCodec();
-
- /**
- * Setter that allows defining {@link ObjectCodec} associated with this
- * parser, if any. Codec is used by {@link #readValueAs(Class)}
- * method (and its variants).
- */
- public abstract void setCodec(ObjectCodec c);
-
- /**
- * Method that can be used to get access to object that is used
- * to access input being parsed; this is usually either
- * {@link InputStream} or {@link Reader}, depending on what
- * parser was constructed with.
- * Note that returned value may be null in some cases; including
- * case where parser implementation does not want to exposed raw
- * source to caller.
- * In cases where input has been decorated, object returned here
- * is the decorated version; this allows some level of interaction
- * between users of parser and decorator object.
- *
- * In general use of this accessor should be considered as
- * "last effort", i.e. only used if no other mechanism is applicable.
- */
- public Object getInputSource() {
- return null;
- }
-
- /*
- /**********************************************************
- /* Format support
- /**********************************************************
- */
-
- /**
- * Method to call to make this parser use specified schema. Method must
- * be called before trying to parse any content, right after parser instance
- * has been created.
- * Note that not all parsers support schemas; and those that do usually only
- * accept specific types of schemas: ones defined for data format parser can read.
- *
- * If parser does not support specified schema, {@link UnsupportedOperationException}
- * is thrown.
- *
- * @param schema Schema to use
- *
- * @throws UnsupportedOperationException if parser does not support schema
- */
- public void setSchema(FormatSchema schema)
- {
- throw new UnsupportedOperationException("Parser of type "+getClass().getName()+" does not support schema of type '"
- +schema.getSchemaType()+"'");
- }
-
- /**
- * Method for accessing Schema that this parser uses, if any.
- * Default implementation returns null.
- *
- * @since 2.1
- */
- public FormatSchema getSchema() {
- return null;
- }
-
- /**
- * Method that can be used to verify that given schema can be used with
- * this parser (using {@link #setSchema}).
- *
- * @param schema Schema to check
- *
- * @return True if this parser can use given schema; false if not
- */
- public boolean canUseSchema(FormatSchema schema) {
- return false;
- }
-
- /*
- /**********************************************************
- /* Capability introspection
- /**********************************************************
- */
-
- /**
- * Method that can be called to determine if a custom
- * {@link ObjectCodec} is needed for binding data parsed
- * using {@link JsonParser} constructed by this factory
- * (which typically also implies the same for serialization
- * with {@link JsonGenerator}).
- *
- * @return True if custom codec is needed with parsers and
- * generators created by this factory; false if a general
- * {@link ObjectCodec} is enough
- *
- * @since 2.1
- */
- public boolean requiresCustomCodec() {
- return false;
- }
-
- /*
- /**********************************************************
- /* Versioned
- /**********************************************************
- */
-
- /**
- * Accessor for getting version of the core package, given a parser instance.
- * Left for sub-classes to implement.
- */
- @Override
- public abstract Version version();
-
- /*
- /**********************************************************
- /* Closeable implementation
- /**********************************************************
- */
-
- /**
- * Closes the parser so that no further iteration or data access
- * can be made; will also close the underlying input source
- * if parser either owns the input source, or feature
- * {@link Feature#AUTO_CLOSE_SOURCE} is enabled.
- * Whether parser owns the input source depends on factory
- * method that was used to construct instance (so check
- * {@link com.fr.third.fasterxml.jackson.core.JsonFactory} for details,
- * but the general
- * idea is that if caller passes in closable resource (such
- * as {@link InputStream} or {@link Reader}) parser does NOT
- * own the source; but if it passes a reference (such as
- * {@link java.io.File} or {@link java.net.URL} and creates
- * stream or reader it does own them.
- */
- @Override
- public abstract void close() throws IOException;
-
- /*
- /**********************************************************
- /* Buffer handling
- /**********************************************************
- */
-
- /**
- * Method that can be called to push back any content that
- * has been read but not consumed by the parser. This is usually
- * done after reading all content of interest using parser.
- * Content is released by writing it to given stream if possible;
- * if underlying input is byte-based it can released, if not (char-based)
- * it can not.
- *
- * @return -1 if the underlying content source is not byte based
- * (that is, input can not be sent to {@link OutputStream};
- * otherwise number of bytes released (0 if there was nothing to release)
- *
- * @throws IOException if write to stream threw exception
- */
- public int releaseBuffered(OutputStream out) throws IOException
- {
- return -1;
- }
-
- /**
- * Method that can be called to push back any content that
- * has been read but not consumed by the parser.
- * This is usually
- * done after reading all content of interest using parser.
- * Content is released by writing it to given writer if possible;
- * if underlying input is char-based it can released, if not (byte-based)
- * it can not.
- *
- * @return -1 if the underlying content source is not char-based
- * (that is, input can not be sent to {@link Writer};
- * otherwise number of chars released (0 if there was nothing to release)
- *
- * @throws IOException if write using Writer threw exception
- */
- public int releaseBuffered(Writer w) throws IOException
- {
- return -1;
- }
-
- /*
- /***************************************************
- /* Public API, configuration
- /***************************************************
- */
-
- /**
- * Method for enabling specified parser feature
- * (check {@link Feature} for list of features)
- */
- public JsonParser enable(Feature f)
- {
- _features |= f.getMask();
- return this;
- }
-
- /**
- * Method for disabling specified feature
- * (check {@link Feature} for list of features)
- */
- public JsonParser disable(Feature f)
- {
- _features &= ~f.getMask();
- return this;
- }
-
- /**
- * Method for enabling or disabling specified feature
- * (check {@link Feature} for list of features)
- */
- public JsonParser configure(Feature f, boolean state)
- {
- if (state) {
- enable(f);
- } else {
- disable(f);
- }
- return this;
- }
-
- /**
- * Method for checking whether specified {@link Feature} is enabled.
- */
- public boolean isEnabled(Feature f) {
- return (_features & f.getMask()) != 0;
- }
-
- /**
- * Bulk access method for getting state of all standard {@link Feature}s.
- *
- * @return Bit mask that defines current states of all standard {@link Feature}s.
- *
- * @since 2.3
- */
- public int getFeatureMask() {
- return _features;
- }
-
- /**
- * Bulk set method for (re)settting states of all standard {@link Feature}s
- *
- * @since 2.3
- *
- * @return This parser object, to allow chaining of calls
- */
- public JsonParser setFeatureMask(int mask) {
- _features = mask;
- return this;
- }
-
- /*
- /**********************************************************
- /* Public API, traversal
- /**********************************************************
- */
-
- /**
- * Main iteration method, which will advance stream enough
- * to determine type of the next token, if any. If none
- * remaining (stream has no content other than possible
- * white space before ending), null will be returned.
- *
- * @return Next token from the stream, if any found, or null
- * to indicate end-of-input
- */
- public abstract JsonToken nextToken()
- throws IOException, JsonParseException;
-
- /**
- * Iteration method that will advance stream enough
- * to determine type of the next token that is a value type
- * (including JSON Array and Object start/end markers).
- * Or put another way, nextToken() will be called once,
- * and if {@link JsonToken#FIELD_NAME} is returned, another
- * time to get the value for the field.
- * Method is most useful for iterating over value entries
- * of JSON objects; field name will still be available
- * by calling {@link #getCurrentName} when parser points to
- * the value.
- *
- * @return Next non-field-name token from the stream, if any found,
- * or null to indicate end-of-input (or, for non-blocking
- * parsers, {@link JsonToken#NOT_AVAILABLE} if no tokens were
- * available yet)
- */
- public abstract JsonToken nextValue()
- throws IOException, JsonParseException;
-
- /**
- * Method that fetches next token (as if calling {@link #nextToken}) and
- * verifies whether it is {@link JsonToken#FIELD_NAME} with specified name
- * and returns result of that comparison.
- * It is functionally equivalent to:
- *
- * return (nextToken() == JsonToken.FIELD_NAME) && str.getValue().equals(getCurrentName());
- *
- * but may be faster for parser to verify, and can therefore be used if caller
- * expects to get such a property name from input next.
- *
- * @param str Property name to compare next token to (if next token is JsonToken.FIELD_NAME)
- */
- public boolean nextFieldName(SerializableString str)
- throws IOException, JsonParseException
- {
- return (nextToken() == JsonToken.FIELD_NAME) && str.getValue().equals(getCurrentName());
- }
-
- /**
- * Method that fetches next token (as if calling {@link #nextToken}) and
- * if it is {@link JsonToken#VALUE_STRING} returns contained String value;
- * otherwise returns null.
- * It is functionally equivalent to:
- *
- * return (nextToken() == JsonToken.VALUE_STRING) ? getText() : null;
- *
- * but may be faster for parser to process, and can therefore be used if caller
- * expects to get a String value next from input.
- */
- public String nextTextValue()
- throws IOException, JsonParseException
- {
- return (nextToken() == JsonToken.VALUE_STRING) ? getText() : null;
- }
-
- /**
- * Method that fetches next token (as if calling {@link #nextToken}) and
- * if it is {@link JsonToken#VALUE_NUMBER_INT} returns 32-bit int value;
- * otherwise returns specified default value
- * It is functionally equivalent to:
- *
- * return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getIntValue() : defaultValue;
- *
- * but may be faster for parser to process, and can therefore be used if caller
- * expects to get a String value next from input.
- */
- public int nextIntValue(int defaultValue)
- throws IOException, JsonParseException
- {
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getIntValue() : defaultValue;
- }
-
- /**
- * Method that fetches next token (as if calling {@link #nextToken}) and
- * if it is {@link JsonToken#VALUE_NUMBER_INT} returns 64-bit long value;
- * otherwise returns specified default value
- * It is functionally equivalent to:
- *
- * return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getLongValue() : defaultValue;
- *
- * but may be faster for parser to process, and can therefore be used if caller
- * expects to get a String value next from input.
- */
- public long nextLongValue(long defaultValue)
- throws IOException, JsonParseException
- {
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getLongValue() : defaultValue;
- }
-
- /**
- * Method that fetches next token (as if calling {@link #nextToken}) and
- * if it is {@link JsonToken#VALUE_TRUE} or {@link JsonToken#VALUE_FALSE}
- * returns matching Boolean value; otherwise return null.
- * It is functionally equivalent to:
- *
- * JsonToken t = nextToken();
- * if (t == JsonToken.VALUE_TRUE) return Boolean.TRUE;
- * if (t == JsonToken.VALUE_FALSE) return Boolean.FALSE;
- * return null;
- *
- * but may be faster for parser to process, and can therefore be used if caller
- * expects to get a String value next from input.
- */
- public Boolean nextBooleanValue()
- throws IOException, JsonParseException
- {
- JsonToken t = nextToken();
- if (t == JsonToken.VALUE_TRUE) {
- return Boolean.TRUE;
- }
- if (t == JsonToken.VALUE_FALSE) {
- return Boolean.FALSE;
- }
- return null;
- }
-
- /**
- * Method that will skip all child tokens of an array or
- * object token that the parser currently points to,
- * iff stream points to
- * {@link JsonToken#START_OBJECT} or {@link JsonToken#START_ARRAY}.
- * If not, it will do nothing.
- * After skipping, stream will point to matching
- * {@link JsonToken#END_OBJECT} or {@link JsonToken#END_ARRAY}
- * (possibly skipping nested pairs of START/END OBJECT/ARRAY tokens
- * as well as value tokens).
- * The idea is that after calling this method, application
- * will call {@link #nextToken} to point to the next
- * available token, if any.
- */
- public abstract JsonParser skipChildren()
- throws IOException, JsonParseException;
-
- /**
- * Method that can be called to determine whether this parser
- * is closed or not. If it is closed, no new tokens can be
- * retrieved by calling {@link #nextToken} (and the underlying
- * stream may be closed). Closing may be due to an explicit
- * call to {@link #close} or because parser has encountered
- * end of input.
- */
- public abstract boolean isClosed();
-
- /*
- /**********************************************************
- /* Public API, token accessors
- /**********************************************************
- */
-
- /**
- * Accessor to find which token parser currently points to, if any;
- * null will be returned if none.
- * If return value is non-null, data associated with the token
- * is available via other accessor methods.
- *
- * @return Type of the token this parser currently points to,
- * if any: null before any tokens have been read, and
- * after end-of-input has been encountered, as well as
- * if the current token has been explicitly cleared.
- */
- public abstract JsonToken getCurrentToken();
-
- /**
- * Method similar to {@link #getCurrentToken()} but that returns an
- * int
instead of {@link JsonToken} (enum value).
- *
- * Use of int directly is typically more efficient on switch statements,
- * so this method may be useful when building low-overhead codecs.
- * Note, however, that effect may not be big enough to matter: make sure
- * to profile performance before deciding to use this method.
- *
- * @since 2.3
- *
- * @return int
matching one of constants from {@link JsonTokenId}.
- */
- public abstract int getCurrentTokenId();
-
- /**
- * Method for checking whether parser currently points to
- * a token (and data for that token is available).
- * Equivalent to check for parser.getCurrentToken() != null
.
- *
- * @return True if the parser just returned a valid
- * token via {@link #nextToken}; false otherwise (parser
- * was just constructed, encountered end-of-input
- * and returned null from {@link #nextToken}, or the token
- * has been consumed)
- */
- public abstract boolean hasCurrentToken();
-
- /**
- * Method that can be called to get the name associated with
- * the current token: for {@link JsonToken#FIELD_NAME}s it will
- * be the same as what {@link #getText} returns;
- * for field values it will be preceding field name;
- * and for others (array values, root-level values) null.
- */
- public abstract String getCurrentName()
- throws IOException, JsonParseException;
-
- /**
- * Method that can be used to access current parsing context reader
- * is in. There are 3 different types: root, array and object contexts,
- * with slightly different available information. Contexts are
- * hierarchically nested, and can be used for example for figuring
- * out part of the input document that correspond to specific
- * array or object (for highlighting purposes, or error reporting).
- * Contexts can also be used for simple xpath-like matching of
- * input, if so desired.
- */
- public abstract JsonStreamContext getParsingContext();
-
- /**
- * Method that return the starting location of the current
- * token; that is, position of the first character from input
- * that starts the current token.
- */
- public abstract JsonLocation getTokenLocation();
-
- /**
- * Method that returns location of the last processed character;
- * usually for error reporting purposes.
- */
- public abstract JsonLocation getCurrentLocation();
-
- /**
- * Specialized accessor that can be used to verify that the current
- * token indicates start array (usually meaning that current token
- * is {@link JsonToken#START_ARRAY}) when start array is expected.
- * For some specialized parsers this can return true for other cases
- * as well; this is usually done to emulate arrays.
- *
- * Default implementation is equivalent to:
- *
- * getCurrentToken() == JsonToken.START_ARRAY
- *
- * but may be overridden by custom parser implementations.
- *
- * @return True if the current token can be considered as a
- * start-array marker (such {@link JsonToken#START_ARRAY});
- * false if not.
- */
- public boolean isExpectedStartArrayToken() {
- return getCurrentToken() == JsonToken.START_ARRAY;
- }
-
- /*
- /**********************************************************
- /* Public API, token state overrides
- /**********************************************************
- */
-
- /**
- * Method called to "consume" the current token by effectively
- * removing it so that {@link #hasCurrentToken} returns false, and
- * {@link #getCurrentToken} null).
- * Cleared token value can still be accessed by calling
- * {@link #getLastClearedToken} (if absolutely needed), but
- * usually isn't.
- *
- * Method was added to be used by the optional data binder, since
- * it has to be able to consume last token used for binding (so that
- * it will not be used again).
- */
- public abstract void clearCurrentToken();
-
- /**
- * Method that can be called to get the last token that was
- * cleared using {@link #clearCurrentToken}. This is not necessarily
- * the latest token read.
- * Will return null if no tokens have been cleared,
- * or if parser has been closed.
- */
- public abstract JsonToken getLastClearedToken();
-
- /**
- * Method that can be used to change what is considered to be
- * the current (field) name.
- * May be needed to support non-JSON data formats or unusual binding
- * conventions; not needed for typical processing.
- *
- * Note that use of this method should only be done as sort of last
- * resort, as it is a work-around for regular operation.
- *
- * @param name Name to use as the current name; may be null.
- *
- * @since 2.0
- */
- public abstract void overrideCurrentName(String name);
-
- /*
- /**********************************************************
- /* Public API, access to token information, text
- /**********************************************************
- */
-
- /**
- * Method for accessing textual representation of the current token;
- * if no current token (before first call to {@link #nextToken}, or
- * after encountering end-of-input), returns null.
- * Method can be called for any token type.
- */
- public abstract String getText()
- throws IOException, JsonParseException;
-
- /**
- * Method similar to {@link #getText}, but that will return
- * underlying (unmodifiable) character array that contains
- * textual value, instead of constructing a String object
- * to contain this information.
- * Note, however, that:
- *
- * Textual contents are not guaranteed to start at
- * index 0 (rather, call {@link #getTextOffset}) to
- * know the actual offset
- *
- * Length of textual contents may be less than the
- * length of returned buffer: call {@link #getTextLength}
- * for actual length of returned content.
- *
- *
- *
- * Note that caller MUST NOT modify the returned
- * character array in any way -- doing so may corrupt
- * current parser state and render parser instance useless.
- *
- * The only reason to call this method (over {@link #getText})
- * is to avoid construction of a String object (which
- * will make a copy of contents).
- */
- public abstract char[] getTextCharacters()
- throws IOException, JsonParseException;
-
- /**
- * Accessor used with {@link #getTextCharacters}, to know length
- * of String stored in returned buffer.
- *
- * @return Number of characters within buffer returned
- * by {@link #getTextCharacters} that are part of
- * textual content of the current token.
- */
- public abstract int getTextLength()
- throws IOException, JsonParseException;
-
- /**
- * Accessor used with {@link #getTextCharacters}, to know offset
- * of the first text content character within buffer.
- *
- * @return Offset of the first character within buffer returned
- * by {@link #getTextCharacters} that is part of
- * textual content of the current token.
- */
- public abstract int getTextOffset()
- throws IOException, JsonParseException;
-
- /**
- * Method that can be used to determine whether calling of
- * {@link #getTextCharacters} would be the most efficient
- * way to access textual content for the event parser currently
- * points to.
- *
- * Default implementation simply returns false since only actual
- * implementation class has knowledge of its internal buffering
- * state.
- * Implementations are strongly encouraged to properly override
- * this method, to allow efficient copying of content by other
- * code.
- *
- * @return True if parser currently has character array that can
- * be efficiently returned via {@link #getTextCharacters}; false
- * means that it may or may not exist
- */
- public abstract boolean hasTextCharacters();
-
- /*
- /**********************************************************
- /* Public API, access to token information, numeric
- /**********************************************************
- */
-
- /**
- * Generic number value accessor method that will work for
- * all kinds of numeric values. It will return the optimal
- * (simplest/smallest possible) wrapper object that can
- * express the numeric value just parsed.
- */
- public abstract Number getNumberValue()
- throws IOException, JsonParseException;
-
- /**
- * If current token is of type
- * {@link JsonToken#VALUE_NUMBER_INT} or
- * {@link JsonToken#VALUE_NUMBER_FLOAT}, returns
- * one of {@link NumberType} constants; otherwise returns null.
- */
- public abstract NumberType getNumberType()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_INT} and
- * it can be expressed as a value of Java byte primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_FLOAT};
- * if so, it is equivalent to calling {@link #getDoubleValue}
- * and then casting; except for possible overflow/underflow
- * exception.
- *
- * Note: if the resulting integer value falls outside range of
- * Java byte, a {@link JsonParseException}
- * will be thrown to indicate numeric overflow/underflow.
- */
- public byte getByteValue()
- throws IOException, JsonParseException
- {
- int value = getIntValue();
- // So far so good: but does it fit?
- // [JACKSON-804]: Let's actually allow range of [-128, 255], as those are uniquely mapped
- // (instead of just signed range of [-128, 127])
- if (value < MIN_BYTE_I || value > MAX_BYTE_I) {
- throw _constructError("Numeric value ("+getText()+") out of range of Java byte");
- }
- return (byte) value;
- }
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_INT} and
- * it can be expressed as a value of Java short primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_FLOAT};
- * if so, it is equivalent to calling {@link #getDoubleValue}
- * and then casting; except for possible overflow/underflow
- * exception.
- *
- * Note: if the resulting integer value falls outside range of
- * Java short, a {@link JsonParseException}
- * will be thrown to indicate numeric overflow/underflow.
- */
- public short getShortValue()
- throws IOException, JsonParseException
- {
- int value = getIntValue();
- if (value < MIN_SHORT_I || value > MAX_SHORT_I) {
- throw _constructError("Numeric value ("+getText()+") out of range of Java short");
- }
- return (short) value;
- }
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_INT} and
- * it can be expressed as a value of Java int primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_FLOAT};
- * if so, it is equivalent to calling {@link #getDoubleValue}
- * and then casting; except for possible overflow/underflow
- * exception.
- *
- * Note: if the resulting integer value falls outside range of
- * Java int, a {@link JsonParseException}
- * may be thrown to indicate numeric overflow/underflow.
- */
- public abstract int getIntValue()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_INT} and
- * it can be expressed as a Java long primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_FLOAT};
- * if so, it is equivalent to calling {@link #getDoubleValue}
- * and then casting to int; except for possible overflow/underflow
- * exception.
- *
- * Note: if the token is an integer, but its value falls
- * outside of range of Java long, a {@link JsonParseException}
- * may be thrown to indicate numeric overflow/underflow.
- */
- public abstract long getLongValue()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_INT} and
- * it can not be used as a Java long primitive type due to its
- * magnitude.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_FLOAT};
- * if so, it is equivalent to calling {@link #getDecimalValue}
- * and then constructing a {@link BigInteger} from that value.
- */
- public abstract BigInteger getBigIntegerValue()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_FLOAT} and
- * it can be expressed as a Java float primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_INT};
- * if so, it is equivalent to calling {@link #getLongValue}
- * and then casting; except for possible overflow/underflow
- * exception.
- *
- * Note: if the value falls
- * outside of range of Java float, a {@link JsonParseException}
- * will be thrown to indicate numeric overflow/underflow.
- */
- public abstract float getFloatValue()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_FLOAT} and
- * it can be expressed as a Java double primitive type.
- * It can also be called for {@link JsonToken#VALUE_NUMBER_INT};
- * if so, it is equivalent to calling {@link #getLongValue}
- * and then casting; except for possible overflow/underflow
- * exception.
- *
- * Note: if the value falls
- * outside of range of Java double, a {@link JsonParseException}
- * will be thrown to indicate numeric overflow/underflow.
- */
- public abstract double getDoubleValue()
- throws IOException, JsonParseException;
-
- /**
- * Numeric accessor that can be called when the current
- * token is of type {@link JsonToken#VALUE_NUMBER_FLOAT} or
- * {@link JsonToken#VALUE_NUMBER_INT}. No under/overflow exceptions
- * are ever thrown.
- */
- public abstract BigDecimal getDecimalValue()
- throws IOException, JsonParseException;
-
- /*
- /**********************************************************
- /* Public API, access to token information, other
- /**********************************************************
- */
-
- /**
- * Convenience accessor that can be called when the current
- * token is {@link JsonToken#VALUE_TRUE} or
- * {@link JsonToken#VALUE_FALSE}.
- *
- * Note: if the token is not of above-mentioned boolean types,
- an integer, but its value falls
- * outside of range of Java long, a {@link JsonParseException}
- * may be thrown to indicate numeric overflow/underflow.
- */
- public boolean getBooleanValue()
- throws IOException, JsonParseException
- {
- JsonToken t = getCurrentToken();
- if (t == JsonToken.VALUE_TRUE) return true;
- if (t == JsonToken.VALUE_FALSE) return false;
- throw new JsonParseException("Current token ("+t+") not of boolean type", getCurrentLocation());
- }
-
- /**
- * Accessor that can be called if (and only if) the current token
- * is {@link JsonToken#VALUE_EMBEDDED_OBJECT}. For other token types,
- * null is returned.
- *
- * Note: only some specialized parser implementations support
- * embedding of objects (usually ones that are facades on top
- * of non-streaming sources, such as object trees).
- */
- public abstract Object getEmbeddedObject()
- throws IOException, JsonParseException;
-
- /*
- /**********************************************************
- /* Public API, access to token information, binary
- /**********************************************************
- */
-
- /**
- * Method that can be used to read (and consume -- results
- * may not be accessible using other methods after the call)
- * base64-encoded binary data
- * included in the current textual JSON value.
- * It works similar to getting String value via {@link #getText}
- * and decoding result (except for decoding part),
- * but should be significantly more performant.
- *
- * Note that non-decoded textual contents of the current token
- * are not guaranteed to be accessible after this method
- * is called. Current implementation, for example, clears up
- * textual content during decoding.
- * Decoded binary content, however, will be retained until
- * parser is advanced to the next event.
- *
- * @param b64variant Expected variant of base64 encoded
- * content (see {@link Base64Variants} for definitions
- * of "standard" variants).
- *
- * @return Decoded binary data
- */
- public abstract byte[] getBinaryValue(Base64Variant b64variant) throws IOException, JsonParseException;
-
- /**
- * Convenience alternative to {@link #getBinaryValue(Base64Variant)}
- * that defaults to using
- * {@link Base64Variants#getDefaultVariant} as the default encoding.
- */
- public byte[] getBinaryValue() throws IOException, JsonParseException {
- return getBinaryValue(Base64Variants.getDefaultVariant());
- }
-
- /**
- * Method that can be used as an alternative to {@link #getBigIntegerValue()},
- * especially when value can be large. The main difference (beyond method
- * of returning content using {@link OutputStream} instead of as byte array)
- * is that content will NOT remain accessible after method returns: any content
- * processed will be consumed and is not buffered in any way. If caller needs
- * buffering, it has to implement it.
- *
- * @param out Output stream to use for passing decoded binary data
- *
- * @return Number of bytes that were decoded and written via {@link OutputStream}
- *
- * @since 2.1
- */
- public int readBinaryValue(OutputStream out) throws IOException, JsonParseException {
- return readBinaryValue(Base64Variants.getDefaultVariant(), out);
- }
-
- /**
- * Similar to {@link #readBinaryValue(OutputStream)} but allows explicitly
- * specifying base64 variant to use.
- *
- * @param b64variant base64 variant to use
- * @param out Output stream to use for passing decoded binary data
- *
- * @return Number of bytes that were decoded and written via {@link OutputStream}
- *
- * @since 2.1
- */
- public int readBinaryValue(Base64Variant b64variant, OutputStream out)
- throws IOException, JsonParseException
- {
- _reportUnsupportedOperation();
- return 0; // never gets here
- }
-
- /*
- /**********************************************************
- /* Public API, access to token information, coercion/conversion
- /**********************************************************
- */
-
- /**
- * Method that will try to convert value of current token to a
- * int .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured type
- * markers like start/end Object/Array)
- * default value of 0 will be returned; no exceptions are thrown.
- */
- public int getValueAsInt() throws IOException, JsonParseException {
- return getValueAsInt(0);
- }
-
- /**
- * Method that will try to convert value of current token to a
- * int .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured type
- * markers like start/end Object/Array)
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public int getValueAsInt(int defaultValue) throws IOException, JsonParseException {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of current token to a
- * long .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured type
- * markers like start/end Object/Array)
- * default value of 0 will be returned; no exceptions are thrown.
- */
- public long getValueAsLong() throws IOException, JsonParseException {
- return getValueAsLong(0);
- }
-
- /**
- * Method that will try to convert value of current token to a
- * long .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured type
- * markers like start/end Object/Array)
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public long getValueAsLong(long defaultValue) throws IOException, JsonParseException {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of current token to a Java
- * double .
- * Numbers are coerced using default Java rules; booleans convert to 0.0 (false)
- * and 1.0 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * default value of 0.0 will be returned; no exceptions are thrown.
- */
- public double getValueAsDouble() throws IOException, JsonParseException {
- return getValueAsDouble(0.0);
- }
-
- /**
- * Method that will try to convert value of current token to a
- * Java double .
- * Numbers are coerced using default Java rules; booleans convert to 0.0 (false)
- * and 1.0 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public double getValueAsDouble(double defaultValue) throws IOException, JsonParseException {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of current token to a
- * boolean .
- * JSON booleans map naturally; integer numbers other than 0 map to true, and
- * 0 maps to false
- * and Strings 'true' and 'false' map to corresponding values.
- *
- * If representation can not be converted to a boolean value (including structured types
- * like Objects and Arrays),
- * default value of false will be returned; no exceptions are thrown.
- */
- public boolean getValueAsBoolean() throws IOException, JsonParseException {
- return getValueAsBoolean(false);
- }
-
- /**
- * Method that will try to convert value of current token to a
- * boolean .
- * JSON booleans map naturally; integer numbers other than 0 map to true, and
- * 0 maps to false
- * and Strings 'true' and 'false' map to corresponding values.
- *
- * If representation can not be converted to a boolean value (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public boolean getValueAsBoolean(boolean defaultValue) throws IOException, JsonParseException {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of current token to a
- * {@link java.lang.String}.
- * JSON Strings map naturally; scalar values get converted to
- * their textual representation.
- * If representation can not be converted to a String value (including structured types
- * like Objects and Arrays and null token), default value of
- * null will be returned; no exceptions are thrown.
- *
- * @since 2.1
- */
- public String getValueAsString() throws IOException, JsonParseException {
- return getValueAsString(null);
- }
-
- /**
- * Method that will try to convert value of current token to a
- * {@link java.lang.String}.
- * JSON Strings map naturally; scalar values get converted to
- * their textual representation.
- * If representation can not be converted to a String value (including structured types
- * like Objects and Arrays and null token), specified default value
- * will be returned; no exceptions are thrown.
- *
- * @since 2.1
- */
- public abstract String getValueAsString(String defaultValue)
- throws IOException, JsonParseException;
-
- /*
- /**********************************************************
- /* Public API, Native Ids (type, object)
- /**********************************************************
- */
-
- /**
- * Introspection method that may be called to see if the underlying
- * data format supports some kind of Object Ids natively (many do not;
- * for example, JSON doesn't).
- *
- * Default implementation returns true; overridden by data formats
- * that do support native Object Ids. Caller is expected to either
- * use a non-native notation (explicit property or such), or fail,
- * in case it can not use native object ids.
- *
- * @since 2.3
- */
- public boolean canReadObjectId() {
- return false;
- }
-
- /**
- * Introspection method that may be called to see if the underlying
- * data format supports some kind of Type Ids natively (many do not;
- * for example, JSON doesn't).
- *
- * Default implementation returns true; overridden by data formats
- * that do support native Type Ids. Caller is expected to either
- * use a non-native notation (explicit property or such), or fail,
- * in case it can not use native type ids.
- *
- * @since 2.3
- */
- public boolean canReadTypeId() {
- return false;
- }
-
- /**
- * Method that can be called to check whether current token
- * (one that was just read) has an associated Object id, and if
- * so, return it.
- * Note that while typically caller should check with {@link #canReadObjectId}
- * first, it is not illegal to call this method even if that method returns
- * true; but if so, it will return null. This may be used to simplify calling
- * code.
- *
- * Default implementation will simply return null.
- *
- * @since 2.3
- */
- public Object getObjectId() throws IOException, JsonGenerationException {
- return null;
- }
-
- /**
- * Method that can be called to check whether current token
- * (one that was just read) has an associated type id, and if
- * so, return it.
- * Note that while typically caller should check with {@link #canReadTypeId}
- * first, it is not illegal to call this method even if that method returns
- * true; but if so, it will return null. This may be used to simplify calling
- * code.
- *
- * Default implementation will simply return null.
- *
- * @since 2.3
- */
- public Object getTypeId() throws IOException, JsonGenerationException {
- return null;
- }
-
- /*
- /**********************************************************
- /* Public API, optional data binding functionality
- /**********************************************************
- */
-
- /**
- * Method to deserialize JSON content into a non-container
- * type (it can be an array type, however): typically a bean, array
- * or a wrapper type (like {@link java.lang.Boolean}).
- * Note : method can only be called if the parser has
- * an object codec assigned; this is true for parsers constructed
- * by MappingJsonFactory
(from "jackson-databind" jar)
- * but not for {@link JsonFactory} (unless its setCodec
- * method has been explicitly called).
- *
- * This method may advance the event stream, for structured types
- * the current token will be the closing end marker (END_ARRAY,
- * END_OBJECT) of the bound structure. For non-structured Json types
- * (and for {@link JsonToken#VALUE_EMBEDDED_OBJECT})
- * stream is not advanced.
- *
- * Note: this method should NOT be used if the result type is a
- * container ({@link java.util.Collection} or {@link java.util.Map}.
- * The reason is that due to type erasure, key and value types
- * can not be introspected when using this method.
- */
- public T readValueAs(Class valueType)
- throws IOException, JsonProcessingException
- {
- ObjectCodec codec = getCodec();
- if (codec == null) {
- throw new IllegalStateException("No ObjectCodec defined for the parser, can not deserialize JSON into Java objects");
- }
- return codec.readValue(this, valueType);
- }
-
- /**
- * Method to deserialize JSON content into a Java type, reference
- * to which is passed as argument. Type is passed using so-called
- * "super type token"
- * and specifically needs to be used if the root type is a
- * parameterized (generic) container type.
- * Note : method can only be called if the parser has
- * an object codec assigned; this is true for parsers constructed
- * by MappingJsonFactory
(defined in 'jackson-databind' bundle)
- * but not for {@link JsonFactory} (unless its setCodec
- * method has been explicitly called).
- *
- * This method may advance the event stream, for structured types
- * the current token will be the closing end marker (END_ARRAY,
- * END_OBJECT) of the bound structure. For non-structured Json types
- * (and for {@link JsonToken#VALUE_EMBEDDED_OBJECT})
- * stream is not advanced.
- */
- @SuppressWarnings("unchecked")
- public T readValueAs(TypeReference> valueTypeRef)
- throws IOException, JsonProcessingException
- {
- ObjectCodec codec = getCodec();
- if (codec == null) {
- throw new IllegalStateException("No ObjectCodec defined for the parser, can not deserialize JSON into Java objects");
- }
- /* Ugh. Stupid Java type erasure... can't just chain call,s
- * must cast here also.
- */
- return (T) codec.readValue(this, valueTypeRef);
- }
-
- /**
- * Method for reading sequence of Objects from parser stream,
- * all with same specified value type.
- */
- public Iterator readValuesAs(Class valueType)
- throws IOException, JsonProcessingException
- {
- ObjectCodec codec = getCodec();
- if (codec == null) {
- throw new IllegalStateException("No ObjectCodec defined for the parser, can not deserialize JSON into Java objects");
- }
- return codec.readValues(this, valueType);
- }
-
- /**
- * Method for reading sequence of Objects from parser stream,
- * all with same specified value type.
- */
- public Iterator readValuesAs(TypeReference> valueTypeRef)
- throws IOException, JsonProcessingException
- {
- ObjectCodec codec = getCodec();
- if (codec == null) {
- throw new IllegalStateException("No ObjectCodec defined for the parser, can not deserialize JSON into Java objects");
- }
- return codec.readValues(this, valueTypeRef);
- }
-
- /**
- * Method to deserialize JSON content into equivalent "tree model",
- * represented by root {@link TreeNode} of resulting model.
- * For JSON Arrays it will an array node (with child nodes),
- * for objects object node (with child nodes), and for other types
- * matching leaf node type
- */
- @SuppressWarnings("unchecked")
- public T readValueAsTree()
- throws IOException, JsonProcessingException
- {
- ObjectCodec codec = getCodec();
- if (codec == null) {
- throw new IllegalStateException("No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree");
- }
- return (T) codec.readTree(this);
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- /**
- * Helper method for constructing {@link JsonParseException}s
- * based on current state of the parser
- */
- protected JsonParseException _constructError(String msg)
- {
- return new JsonParseException(msg, getCurrentLocation());
- }
-
- /**
- * Helper method to call for operations that are not supported by
- * parser implementation.
- *
- * @since 2.1
- */
- protected void _reportUnsupportedOperation() {
- throw new UnsupportedOperationException("Operation not supported by parser of type "+getClass().getName());
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonPointer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonPointer.java
deleted file mode 100644
index 4f446d9df..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonPointer.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package com.fr.third.fasterxml.jackson.core;
-
-import com.fr.third.fasterxml.jackson.core.io.NumberInput;
-
-/**
- * Implementation of
- * JSON Pointer
- * specification.
- * Pointer instances can be used to locate logical JSON nodes for things like
- * tree traversal (see {@link TreeNode#at}).
- * It may be used in future for filtering of streaming JSON content
- * as well (not implemented yet for 2.3).
- *
- * Instances are fully immutable and can be shared, cached.
- *
- * @author Tatu Saloranta
- *
- * @since 2.3
- */
-public class JsonPointer
-{
- /**
- * Marker instance used to represent segment that matches current
- * node or position.
- */
- protected final static JsonPointer EMPTY = new JsonPointer();
-
- /**
- * Reference to rest of the pointer beyond currently matching
- * segment (if any); null if this pointer refers to a matching
- * segment.
- */
- protected final JsonPointer _nextSegment;
-
- /**
- * We will retain representation of the pointer, as a String,
- * so that {@link #toString} should be as efficient as possible.
- */
- protected final String _asString;
-
- protected final String _matchingPropertyName;
-
- protected final int _matchingElementIndex;
-
- /*
- /**********************************************************
- /* Cosntruction
- /**********************************************************
- */
-
- /**
- * Constructor used for creating "empty" instance, used to represent
- * state that matches current node.
- */
- protected JsonPointer() {
- _nextSegment = null;
- _matchingPropertyName = "";
- _matchingElementIndex = -1;
- _asString = "";
- }
-
- /**
- * Constructor used for creating non-empty Segments
- */
- protected JsonPointer(String fullString, String segment, JsonPointer next) {
- _asString = fullString;
- _nextSegment = next;
- // Ok; may always be a property
- _matchingPropertyName = segment;
- _matchingElementIndex = _parseIndex(segment);
- }
-
- /*
- /**********************************************************
- /* Factory methods
- /**********************************************************
- */
-
- /**
- * Factory method that parses given input and construct matching pointer
- * instance, if it represents a valid JSON Pointer: if not, a
- * {@link IllegalArgumentException} is thrown.
- *
- * @throws IllegalArgumentException Thrown if the input does not present a valid JSON Pointer
- * expression: currently the only such expression is one that does NOT start with
- * a slash ('/').
- */
- public static JsonPointer compile(String input) throws IllegalArgumentException
- {
- // First quick checks for well-known 'empty' pointer
- if ((input == null) || input.length() == 0) {
- return EMPTY;
- }
- // And then quick validity check:
- if (input.charAt(0) != '/') {
- throw new IllegalArgumentException("Invalid input: JSON Pointer expression must start with '/': "+"\""+input+"\"");
- }
- return _parseTail(input);
- }
-
- /**
- * Alias for {@link #compile}; added to make instances automatically
- * deserializable by Jackson databind.
- */
- public static JsonPointer valueOf(String input) { return compile(input); }
-
- /* Factory method that composes a pointer instance, given a set
- * of 'raw' segments: raw meaning that no processing will be done,
- * no escaping may is present.
- *
- * @param segments
- *
- * @return Constructed path instance
- */
- /* TODO!
- public static JsonPointer fromSegment(String... segments)
- {
- if (segments.length == 0) {
- return EMPTY;
- }
- JsonPointer prev = null;
-
- for (String segment : segments) {
- JsonPointer next = new JsonPointer()
- }
- }
- */
-
- /*
- /**********************************************************
- /* Public API
- /**********************************************************
- */
-
- public boolean matches() { return _nextSegment == null; }
- public String getMatchingProperty() { return _matchingPropertyName; }
- public int getMatchingIndex() { return _matchingElementIndex; }
- public boolean mayMatchProperty() { return _matchingPropertyName != null; }
- public boolean mayMatchElement() { return _matchingElementIndex >= 0; }
-
- public JsonPointer matchProperty(String name) {
- if (_nextSegment == null || !_matchingPropertyName.equals(name)) {
- return null;
- }
- return _nextSegment;
- }
-
- public JsonPointer matchElement (int index) {
- if ((index != _matchingElementIndex) || (index < 0)) {
- return null;
- }
- return _nextSegment;
- }
-
- /**
- * Accessor for getting a "sub-pointer", instance where current segment
- * has been removed and pointer includes rest of segments;
- */
- public JsonPointer tail() {
- return _nextSegment;
- }
-
- /*
- /**********************************************************
- /* Standard method overrides
- /**********************************************************
- */
-
- @Override public String toString() { return _asString; }
- @Override public int hashCode() { return _asString.hashCode(); }
-
- @Override public boolean equals(Object o) {
- if (o == this) return true;
- if (o == null) return false;
- if (!(o instanceof JsonPointer)) return false;
- return _asString.equals(((JsonPointer) o)._asString);
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private final static int _parseIndex(String str) {
- final int len = str.length();
- // [Issue#133]: beware of super long indexes; assume we never
- // have arrays over 2 billion entries so ints are fine.
- if (len == 0 || len > 10) {
- return -1;
- }
- for (int i = 0; i < len; ++i) {
- char c = str.charAt(i++);
- if (c > '9' || c < '0') {
- return -1;
- }
- }
- if (len == 10) {
- long l = NumberInput.parseLong(str);
- if (l > Integer.MAX_VALUE) {
- return -1;
- }
- }
- return NumberInput.parseInt(str);
- }
-
- protected static JsonPointer _parseTail(String input) {
- final int end = input.length();
-
- // first char is the contextual slash, skip
- for (int i = 1; i < end; ) {
- char c = input.charAt(i);
- if (c == '/') { // common case, got a segment
- return new JsonPointer(input, input.substring(1, i),
- _parseTail(input.substring(i)));
- }
- ++i;
- // quoting is different; offline this case
- if (c == '~' && i < end) { // possibly, quote
- return _parseQuotedTail(input, i);
- }
- // otherwise, loop on
- }
- // end of the road, no escapes
- return new JsonPointer(input, input.substring(1), EMPTY);
- }
-
- /**
- * Method called to parse tail of pointer path, when a potentially
- * escaped character has been seen.
- *
- * @param input Full input for the tail being parsed
- * @param i Offset to character after tilde
- */
- protected static JsonPointer _parseQuotedTail(String input, int i) {
- final int end = input.length();
- StringBuilder sb = new StringBuilder(Math.max(16, end));
- if (i > 2) {
- sb.append(input, 1, i-1);
- }
- _appendEscape(sb, input.charAt(i++));
- while (i < end) {
- char c = input.charAt(i);
- if (c == '/') { // end is nigh!
- return new JsonPointer(input, sb.toString(),
- _parseTail(input.substring(i))); // need to push back slash
- }
- ++i;
- if (c == '~' && i < end) {
- _appendEscape(sb, input.charAt(i++));
- continue;
- }
- sb.append(c);
- }
- // end of the road, last segment
- return new JsonPointer(input, sb.toString(), EMPTY);
- }
-
- private static void _appendEscape(StringBuilder sb, char c) {
- if (c == '0') {
- c = '~';
- } else if (c == '1') {
- c = '/';
- } else {
- sb.append('~');
- }
- sb.append(c);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonProcessingException.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonProcessingException.java
deleted file mode 100644
index 97f563cc3..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonProcessingException.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Intermediate base class for all problems encountered when
- * processing (parsing, generating) JSON content
- * that are not pure I/O problems.
- * Regular {@link java.io.IOException}s will be passed through as is.
- * Sub-class of {@link java.io.IOException} for convenience.
- */
-public class JsonProcessingException
- extends java.io.IOException
-{
- final static long serialVersionUID = 123; // Stupid eclipse...
-
- protected JsonLocation _location;
-
- protected JsonProcessingException(String msg, JsonLocation loc, Throwable rootCause)
- {
- /* Argh. IOException(Throwable,String) is only available starting
- * with JDK 1.6...
- */
- super(msg);
- if (rootCause != null) {
- initCause(rootCause);
- }
- _location = loc;
- }
-
- protected JsonProcessingException(String msg)
- {
- super(msg);
- }
-
- protected JsonProcessingException(String msg, JsonLocation loc)
- {
- this(msg, loc, null);
- }
-
- protected JsonProcessingException(String msg, Throwable rootCause)
- {
- this(msg, null, rootCause);
- }
-
- protected JsonProcessingException(Throwable rootCause)
- {
- this(null, null, rootCause);
- }
-
- public JsonLocation getLocation() {
- return _location;
- }
-
- /*
- /**********************************************************
- /* Extended API
- /**********************************************************
- */
-
- /**
- * Method that allows accessing the original "message" argument,
- * without additional decorations (like location information)
- * that overridden {@link #getMessage} adds.
- *
- * @since 2.1
- */
- public String getOriginalMessage()
- {
- return super.getMessage();
- }
-
- /*
- /**********************************************************
- /* Methods for sub-classes to use, override
- /**********************************************************
- */
-
- /**
- * Accessor that sub-classes can override to append additional
- * information right after the main message, but before
- * source location information.
- */
- protected String getMessageSuffix() {
- return null;
- }
-
- /*
- /**********************************************************
- /* Overrides of standard methods
- /**********************************************************
- */
-
- /**
- * Default method overridden so that we can add location information
- */
- @Override
- public String getMessage()
- {
- String msg = super.getMessage();
- if (msg == null) {
- msg = "N/A";
- }
- JsonLocation loc = getLocation();
- String suffix = getMessageSuffix();
- // mild optimization, if nothing extra is needed:
- if (loc != null || suffix != null) {
- StringBuilder sb = new StringBuilder(100);
- sb.append(msg);
- if (suffix != null) {
- sb.append(suffix);
- }
- if (loc != null) {
- sb.append('\n');
- sb.append(" at ");
- sb.append(loc.toString());
- }
- msg = sb.toString();
- }
- return msg;
- }
-
- @Override
- public String toString() {
- return getClass().getName()+": "+getMessage();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonStreamContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonStreamContext.java
deleted file mode 100644
index 72099706a..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonStreamContext.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Shared base class for streaming processing contexts used during
- * reading and writing of Json content using Streaming API.
- * This context is also exposed to applications:
- * context object can be used by applications to get an idea of
- * relative position of the parser/generator within json content
- * being processed. This allows for some contextual processing: for
- * example, output within Array context can differ from that of
- * Object context.
- */
-public abstract class JsonStreamContext
-{
- // // // Type constants used internally
-
- protected final static int TYPE_ROOT = 0;
- protected final static int TYPE_ARRAY = 1;
- protected final static int TYPE_OBJECT = 2;
-
- protected int _type;
-
- /**
- * Index of the currently processed entry. Starts with -1 to signal
- * that no entries have been started, and gets advanced each
- * time a new entry is started, either by encountering an expected
- * separator, or with new values if no separators are expected
- * (the case for root context).
- */
- protected int _index;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected JsonStreamContext() { }
-
- /*
- /**********************************************************
- /* Public API, accessors
- /**********************************************************
- */
-
- /**
- * Accessor for finding parent context of this context; will
- * return null for root context.
- */
- public abstract JsonStreamContext getParent();
-
- /**
- * Method that returns true if this context is an Array context;
- * that is, content is being read from or written to a Json Array.
- */
- public final boolean inArray() { return _type == TYPE_ARRAY; }
-
- /**
- * Method that returns true if this context is a Root context;
- * that is, content is being read from or written to without
- * enclosing array or object structure.
- */
- public final boolean inRoot() { return _type == TYPE_ROOT; }
-
- /**
- * Method that returns true if this context is an Object context;
- * that is, content is being read from or written to a Json Object.
- */
- public final boolean inObject() { return _type == TYPE_OBJECT; }
-
- /**
- * Method for accessing simple type description of current context;
- * either ROOT (for root-level values), OBJECT (for field names and
- * values of JSON Objects) or ARRAY (for values of JSON Arrays)
- */
- public final String getTypeDesc() {
- switch (_type) {
- case TYPE_ROOT: return "ROOT";
- case TYPE_ARRAY: return "ARRAY";
- case TYPE_OBJECT: return "OBJECT";
- }
- return "?";
- }
-
- /**
- * @return Number of entries that are complete and started.
- */
- public final int getEntryCount()
- {
- return _index + 1;
- }
-
- /**
- * @return Index of the currently processed entry, if any
- */
- public final int getCurrentIndex()
- {
- return (_index < 0) ? 0 : _index;
- }
-
- /**
- * Method for accessing name associated with the current location.
- * Non-null for FIELD_NAME
and value events that directly
- * follow field names; null for root level and array values.
- */
- public abstract String getCurrentName();
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonToken.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonToken.java
deleted file mode 100644
index ca3ea320c..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonToken.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Enumeration for basic token types used for returning results
- * of parsing JSON content.
- */
-public enum JsonToken
-{
- /* Some notes on implementation:
- *
- * - Entries are to be ordered such that start/end array/object
- * markers come first, then field name marker (if any), and
- * finally scalar value tokens. This is assumed by some
- * typing checks.
- */
-
- /**
- * NOT_AVAILABLE can be returned if {@link JsonParser}
- * implementation can not currently return the requested
- * token (usually next one), or even if any will be
- * available, but that may be able to determine this in
- * future. This is the case with non-blocking parsers --
- * they can not block to wait for more data to parse and
- * must return something.
- */
- NOT_AVAILABLE(null, JsonTokenId.ID_NOT_AVAILABLE),
-
- /**
- * START_OBJECT is returned when encountering '{'
- * which signals starting of an Object value.
- */
- START_OBJECT("{", JsonTokenId.ID_START_OBJECT),
-
- /**
- * END_OBJECT is returned when encountering '}'
- * which signals ending of an Object value
- */
- END_OBJECT("}", JsonTokenId.ID_END_OBJECT),
-
- /**
- * START_ARRAY is returned when encountering '['
- * which signals starting of an Array value
- */
- START_ARRAY("[", JsonTokenId.ID_START_ARRAY),
-
- /**
- * END_ARRAY is returned when encountering ']'
- * which signals ending of an Array value
- */
- END_ARRAY("]", JsonTokenId.ID_END_ARRAY),
-
- /**
- * FIELD_NAME is returned when a String token is encountered
- * as a field name (same lexical value, different function)
- */
- FIELD_NAME(null, JsonTokenId.ID_FIELD_NAME),
-
- /**
- * Placeholder token returned when the input source has a concept
- * of embedded Object that are not accessible as usual structure
- * (of starting with {@link #START_OBJECT}, having values, ending with
- * {@link #END_OBJECT}), but as "raw" objects.
- *
- * Note: this token is never returned by regular JSON readers, but
- * only by readers that expose other kinds of source (like
- * JsonNode
-based JSON trees, Maps, Lists and such).
- */
- VALUE_EMBEDDED_OBJECT(null, JsonTokenId.ID_EMBEDDED_OBJECT),
-
- /**
- * VALUE_STRING is returned when a String token is encountered
- * in value context (array element, field value, or root-level
- * stand-alone value)
- */
- VALUE_STRING(null, JsonTokenId.ID_STRING),
-
- /**
- * VALUE_NUMBER_INT is returned when an integer numeric token is
- * encountered in value context: that is, a number that does
- * not have floating point or exponent marker in it (consists
- * only of an optional sign, followed by one or more digits)
- */
- VALUE_NUMBER_INT(null, JsonTokenId.ID_NUMBER_INT),
-
- /**
- * VALUE_NUMBER_INT is returned when a numeric token other
- * that is not an integer is encountered: that is, a number that does
- * have floating point or exponent marker in it, in addition
- * to one or more digits.
- */
- VALUE_NUMBER_FLOAT(null, JsonTokenId.ID_NUMBER_FLOAT),
-
- /**
- * VALUE_TRUE is returned when encountering literal "true" in
- * value context
- */
- VALUE_TRUE("true", JsonTokenId.ID_TRUE),
-
- /**
- * VALUE_FALSE is returned when encountering literal "false" in
- * value context
- */
- VALUE_FALSE("false", JsonTokenId.ID_FALSE),
-
- /**
- * VALUE_NULL is returned when encountering literal "null" in
- * value context
- */
- VALUE_NULL("null", JsonTokenId.ID_NULL),
- ;
-
- final String _serialized;
-
- final char[] _serializedChars;
-
- final byte[] _serializedBytes;
-
- final int _id;
-
- final boolean _isStructStart, _isStructEnd;
-
- final boolean _isNumber;
-
- final boolean _isBoolean;
-
- final boolean _isScalar;
-
- /**
- * @param token representation for this token, if there is a
- * single static representation; null otherwise
- */
- JsonToken(String token, int id)
- {
- if (token == null) {
- _serialized = null;
- _serializedChars = null;
- _serializedBytes = null;
- } else {
- _serialized = token;
- _serializedChars = token.toCharArray();
- // It's all in ascii, can just case...
- int len = _serializedChars.length;
- _serializedBytes = new byte[len];
- for (int i = 0; i < len; ++i) {
- _serializedBytes[i] = (byte) _serializedChars[i];
- }
- }
- _id = id;
-
- _isBoolean = (id == JsonTokenId.ID_FALSE || id == JsonTokenId.ID_TRUE);
- _isNumber = (id == JsonTokenId.ID_NUMBER_INT || id == JsonTokenId.ID_NUMBER_FLOAT);
-
- _isStructStart = (id == JsonTokenId.ID_START_OBJECT || id == JsonTokenId.ID_START_ARRAY);
- _isStructEnd = (id == JsonTokenId.ID_END_OBJECT || id == JsonTokenId.ID_END_ARRAY);
-
- _isScalar = !_isStructStart && !_isStructEnd
- && (id != JsonTokenId.ID_FIELD_NAME)
- && (id != JsonTokenId.ID_NOT_AVAILABLE);
- }
-
- public final int id() { return _id; }
-
- public final String asString() { return _serialized; }
- public final char[] asCharArray() { return _serializedChars; }
- public final byte[] asByteArray() { return _serializedBytes; }
-
- public final boolean isNumeric() {
- return _isNumber;
- }
-
- /**
- * Accessor that is functionally equivalent to:
- *
- * this == JsonToken.START_OBJECT || this == JsonToken.START_ARRAY
- *
- *
- * @since 2.3
- */
- public final boolean isStructStart() {
- return _isStructStart;
- }
-
- /**
- * Accessor that is functionally equivalent to:
- *
- * this == JsonToken.END_OBJECT || this == JsonToken.END_ARRAY
- *
- *
- * @since 2.3
- */
- public final boolean isStructEnd() {
- return _isStructEnd;
- }
-
- /**
- * Method that can be used to check whether this token represents
- * a valid non-structured value. This means all tokens other than
- * Object/Array start/end markers all field names.
- */
- public final boolean isScalarValue() {
- return _isScalar;
- }
-
- public final boolean isBoolean() {
- return _isBoolean;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonTokenId.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonTokenId.java
deleted file mode 100644
index 943061628..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/JsonTokenId.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Interface defined to contain ids accessible with {@link JsonToken#id()}.
- * Needed because it is impossible to define these constants in
- * {@link JsonToken} itself, as static constants (oddity of how Enums
- * are implemented by JVM).
- *
- * @since 2.3
- */
-public interface JsonTokenId
-{
- /**
- * Id used to represent {@link JsonToken#NOT_AVAILABLE}, used in
- * cases where a token may become available when more input
- * is available: this occurs in non-blocking use cases.
- */
- public final static int ID_NOT_AVAILABLE = -1;
-
- /**
- * Id used to represent the case where no {@link JsonToken}
- * is available: either because {@link JsonParser} has not been
- * advanced to first token, or because no more tokens will be
- * available (end-of-input or explicit closing of parser}.
- */
- public final static int ID_NO_TOKEN = 0;
-
- /**
- * Id used to represent {@link JsonToken#START_OBJECT}
- */
- public final static int ID_START_OBJECT = 1;
-
- /**
- * Id used to represent {@link JsonToken#END_OBJECT}
- */
- public final static int ID_END_OBJECT = 2;
-
- /**
- * Id used to represent {@link JsonToken#START_ARRAY}
- */
- public final static int ID_START_ARRAY = 3;
-
- /**
- * Id used to represent {@link JsonToken#END_ARRAY}
- */
- public final static int ID_END_ARRAY = 4;
-
- /**
- * Id used to represent {@link JsonToken#FIELD_NAME}
- */
- public final static int ID_FIELD_NAME = 5;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_STRING}
- */
- public final static int ID_STRING = 6;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_NUMBER_INT}
- */
- public final static int ID_NUMBER_INT = 7;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_NUMBER_FLOAT}
- */
- public final static int ID_NUMBER_FLOAT = 8;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_TRUE}
- */
- public final static int ID_TRUE = 9;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_FALSE}
- */
- public final static int ID_FALSE = 10;
- /**
- * Id used to represent {@link JsonToken#VALUE_NULL}
- */
-
- public final static int ID_NULL = 11;
-
- /**
- * Id used to represent {@link JsonToken#VALUE_EMBEDDED_OBJECT}
- */
- public final static int ID_EMBEDDED_OBJECT = 12;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/ObjectCodec.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/ObjectCodec.java
deleted file mode 100644
index d02c900d8..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/ObjectCodec.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.IOException;
-import java.util.Iterator;
-
-import com.fr.third.fasterxml.jackson.core.type.ResolvedType;
-import com.fr.third.fasterxml.jackson.core.type.TypeReference;
-
-/**
- * Abstract class that defines the interface that {@link JsonParser} and
- * {@link JsonGenerator} use to serialize and deserialize regular
- * Java objects (POJOs aka Beans).
- *
- * The standard implementation of this class is
- * com.fr.third.fasterxml.jackson.databind.ObjectMapper
,
- * defined in the "jackson-databind".
- */
-public abstract class ObjectCodec
- extends TreeCodec // since 2.3
- implements Versioned // since 2.3
-{
- protected ObjectCodec() { }
-
- // Since 2.3: need baseline implementation to avoid backwards compatibility
- @Override
- public Version version() {
- return Version.unknownVersion();
- }
-
- /*
- /**********************************************************
- /* API for de-serialization (JSON-to-Object)
- /**********************************************************
- */
-
- /**
- * Method to deserialize JSON content into a non-container
- * type (it can be an array type, however): typically a bean, array
- * or a wrapper type (like {@link java.lang.Boolean}).
- *
- * Note: this method should NOT be used if the result type is a
- * container ({@link java.util.Collection} or {@link java.util.Map}.
- * The reason is that due to type erasure, key and value types
- * can not be introspected when using this method.
- */
- public abstract T readValue(JsonParser jp, Class valueType)
- throws IOException, JsonProcessingException;
-
- /**
- * Method to deserialize JSON content into a Java type, reference
- * to which is passed as argument. Type is passed using so-called
- * "super type token"
- * and specifically needs to be used if the root type is a
- * parameterized (generic) container type.
- */
- public abstract T readValue(JsonParser jp, TypeReference> valueTypeRef)
- throws IOException, JsonProcessingException;
-
- /**
- * Method to deserialize JSON content into a POJO, type specified
- * with fully resolved type object (so it can be a generic type,
- * including containers like {@link java.util.Collection} and
- * {@link java.util.Map}).
- */
- public abstract T readValue(JsonParser jp, ResolvedType valueType)
- throws IOException, JsonProcessingException;
-
- /**
- * Method for reading sequence of Objects from parser stream,
- * all with same specified value type.
- */
- public abstract Iterator readValues(JsonParser jp, Class valueType)
- throws IOException, JsonProcessingException;
-
- /**
- * Method for reading sequence of Objects from parser stream,
- * all with same specified value type.
- */
- public abstract Iterator readValues(JsonParser jp, TypeReference> valueTypeRef)
- throws IOException, JsonProcessingException;
-
- /**
- * Method for reading sequence of Objects from parser stream,
- * all with same specified value type.
- */
- public abstract Iterator readValues(JsonParser jp, ResolvedType valueType)
- throws IOException, JsonProcessingException;
-
- /*
- /**********************************************************
- /* API for serialization (Object-to-JSON)
- /**********************************************************
- */
-
- /**
- * Method to serialize given Java Object, using generator
- * provided.
- */
- public abstract void writeValue(JsonGenerator jgen, Object value)
- throws IOException, JsonProcessingException;
-
- /*
- /**********************************************************
- /* TreeCodec pass-through methods
- /**********************************************************
- */
-
- /**
- * Method to deserialize JSON content as tree expressed
- * using set of {@link TreeNode} instances. Returns
- * root of the resulting tree (where root can consist
- * of just a single node if the current event is a
- * value event, not container).
- */
- @Override
- public abstract T readTree(JsonParser jp)
- throws IOException, JsonProcessingException;
-
- @Override
- public abstract void writeTree(JsonGenerator jg, TreeNode tree)
- throws IOException, JsonProcessingException;
-
- /**
- * Method for construct root level Object nodes
- * for Tree Model instances.
- */
- @Override
- public abstract TreeNode createObjectNode();
-
- /**
- * Method for construct root level Array nodes
- * for Tree Model instances.
- */
- @Override
- public abstract TreeNode createArrayNode();
-
- /**
- * Method for constructing a {@link JsonParser} for reading
- * contents of a JSON tree, as if it was external serialized
- * JSON content.
- */
- @Override
- public abstract JsonParser treeAsTokens(TreeNode n);
-
- /*
- /**********************************************************
- /* Extended tree conversions beyond TreeCodec
- /**********************************************************
- */
-
- /**
- * Convenience method for converting given JSON tree into instance of specified
- * value type. This is equivalent to first constructing a {@link JsonParser} to
- * iterate over contents of the tree, and using that parser for data binding.
- */
- public abstract T treeToValue(TreeNode n, Class valueType)
- throws JsonProcessingException;
-
- /*
- /**********************************************************
- /* Basic accessors
- /**********************************************************
- */
-
- /**
- * @deprecated Since 2.1: Use {@link #getFactory} instead.
- */
- @Deprecated
- public abstract JsonFactory getJsonFactory();
-
- /**
- * Accessor for finding underlying data format factory
- * ({@link JsonFactory}) codec will use for data binding.
- *
- * @since 2.1
- */
- public JsonFactory getFactory() {
- return getJsonFactory();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/PrettyPrinter.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/PrettyPrinter.java
deleted file mode 100644
index 1317d029b..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/PrettyPrinter.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.IOException;
-
-/**
- * Interface for objects that implement pretty printer functionality, such
- * as indentation.
- * Pretty printers are used to add white space in output JSON content,
- * to make results more human readable. Usually this means things like adding
- * linefeeds and indentation.
- *
- * Note: since Jackson 2.1, stateful implementations MUST implement
- * {@link com.fr.third.fasterxml.jackson.core.util.Instantiatable} interface,
- * to allow for constructing per-generation instances and avoid
- * state corruption (see [JACKSON-851] for details).
- * Stateless implementations need not do this; but those are less common.
- */
-public interface PrettyPrinter
-{
- /*
- /**********************************************************
- /* First methods that act both as events, and expect
- /* output for correct functioning (i.e something gets
- /* output even when not pretty-printing)
- /**********************************************************
- */
-
- // // // Root-level handling:
-
- /**
- * Method called after a root-level value has been completely
- * output, and before another value is to be output.
- *
- * Default
- * handling (without pretty-printing) will output a space, to
- * allow values to be parsed correctly. Pretty-printer is
- * to output some other suitable and nice-looking separator
- * (tab(s), space(s), linefeed(s) or any combination thereof).
- */
- void writeRootValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- // // Object handling
-
- /**
- * Method called when an Object value is to be output, before
- * any fields are output.
- *
- * Default handling (without pretty-printing) will output
- * the opening curly bracket.
- * Pretty-printer is
- * to output a curly bracket as well, but can surround that
- * with other (white-space) decoration.
- */
- void writeStartObject(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after an Object value has been completely output
- * (minus closing curly bracket).
- *
- * Default handling (without pretty-printing) will output
- * the closing curly bracket.
- * Pretty-printer is
- * to output a curly bracket as well, but can surround that
- * with other (white-space) decoration.
- *
- * @param nrOfEntries Number of direct members of the array that
- * have been output
- */
- void writeEndObject(JsonGenerator jg, int nrOfEntries)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after an object entry (field:value) has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate the two. Pretty-printer is
- * to output a comma as well, but can surround that with other
- * (white-space) decoration.
- */
- void writeObjectEntrySeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after an object field has been output, but
- * before the value is output.
- *
- * Default handling (without pretty-printing) will output a single
- * colon to separate the two. Pretty-printer is
- * to output a colon as well, but can surround that with other
- * (white-space) decoration.
- */
- void writeObjectFieldValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- // // // Array handling
-
- /**
- * Method called when an Array value is to be output, before
- * any member/child values are output.
- *
- * Default handling (without pretty-printing) will output
- * the opening bracket.
- * Pretty-printer is
- * to output a bracket as well, but can surround that
- * with other (white-space) decoration.
- */
- void writeStartArray(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after an Array value has been completely output
- * (minus closing bracket).
- *
- * Default handling (without pretty-printing) will output
- * the closing bracket.
- * Pretty-printer is
- * to output a bracket as well, but can surround that
- * with other (white-space) decoration.
- *
- * @param nrOfValues Number of direct members of the array that
- * have been output
- */
- void writeEndArray(JsonGenerator jg, int nrOfValues)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after an array value has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate the two. Pretty-printer is
- * to output a comma as well, but can surround that with other
- * (white-space) decoration.
- */
- void writeArrayValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- /*
- /**********************************************************
- /* Then events that by default do not produce any output
- /* but that are often overridden to add white space
- /* in pretty-printing mode
- /**********************************************************
- */
-
- /**
- * Method called after array start marker has been output,
- * and right before the first value is to be output.
- * It is not called for arrays with no values.
- *
- * Default handling does not output anything, but pretty-printer
- * is free to add any white space decoration.
- */
- void beforeArrayValues(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-
- /**
- * Method called after object start marker has been output,
- * and right before the field name of the first entry is
- * to be output.
- * It is not called for objects without entries.
- *
- * Default handling does not output anything, but pretty-printer
- * is free to add any white space decoration.
- */
- void beforeObjectEntries(JsonGenerator jg)
- throws IOException, JsonGenerationException;
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/SerializableString.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/SerializableString.java
deleted file mode 100644
index b99fc1c98..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/SerializableString.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-/**
- * Interface that defines how Jackson package can interact with efficient
- * pre-serialized or lazily-serialized and reused String representations.
- * Typically implementations store possible serialized version(s) so that
- * serialization of String can be done more efficiently, especially when
- * used multiple times.
- *
- * Note that "quoted" in methods means quoting of 'special' characters using
- * JSON backlash notation (and not use of actual double quotes).
- *
- * @see com.fr.third.fasterxml.jackson.core.io.SerializedString
- */
-public interface SerializableString
-{
- /**
- * Returns unquoted String that this object represents (and offers
- * serialized forms for)
- */
- String getValue();
-
- /**
- * Returns length of the (unquoted) String as characters.
- * Functionally equvalent to:
- *
- * getValue().length();
- *
- */
- int charLength();
-
- /*
- /**********************************************************
- /* Accessors for byte sequences
- /**********************************************************
- */
-
- /**
- * Returns JSON quoted form of the String, as character array.
- * Result can be embedded as-is in textual JSON as property name or JSON String.
- */
- char[] asQuotedChars();
-
- /**
- * Returns UTF-8 encoded version of unquoted String.
- * Functionally equivalent to (but more efficient than):
- *
- * getValue().getBytes("UTF-8");
- *
- */
- byte[] asUnquotedUTF8();
-
- /**
- * Returns UTF-8 encoded version of JSON-quoted String.
- * Functionally equivalent to (but more efficient than):
- *
- * new String(asQuotedChars()).getBytes("UTF-8");
- *
- */
- byte[] asQuotedUTF8();
-
- /*
- /**********************************************************
- /* Helper methods for appending byte/char sequences
- /**********************************************************
- */
-
- /**
- * Method that will append quoted UTF-8 bytes of this String into given
- * buffer, if there is enough room; if not, returns -1.
- * Functionally equivalent to:
- *
- * byte[] bytes = str.asQuotedUTF8();
- * System.arraycopy(bytes, 0, buffer, offset, bytes.length);
- * return bytes.length;
- *
- *
- * @return Number of bytes appended, if successful, otherwise -1
- */
- int appendQuotedUTF8(byte[] buffer, int offset);
-
- /**
- * Method that will append quoted characters of this String into given
- * buffer. Functionally equivalent to:
- *
- * char[] ch = str.asQuotedChars();
- * System.arraycopy(ch, 0, buffer, offset, ch.length);
- * return ch.length;
- *
- *
- * @return Number of characters appended, if successful, otherwise -1
- */
- int appendQuoted(char[] buffer, int offset);
-
- /**
- * Method that will append unquoted ('raw') UTF-8 bytes of this String into given
- * buffer. Functionally equivalent to:
- *
- * byte[] bytes = str.asUnquotedUTF8();
- * System.arraycopy(bytes, 0, buffer, offset, bytes.length);
- * return bytes.length;
- *
- *
- * @return Number of bytes appended, if successful, otherwise -1
- */
- int appendUnquotedUTF8(byte[] buffer, int offset);
-
-
- /**
- * Method that will append unquoted characters of this String into given
- * buffer. Functionally equivalent to:
- *
- * char[] ch = str.getValue().toCharArray();
- * System.arraycopy(bytes, 0, buffer, offset, ch.length);
- * return ch.length;
- *
- *
- * @return Number of characters appended, if successful, otherwise -1
- */
- int appendUnquoted(char[] buffer, int offset);
-
- /*
- /**********************************************************
- /* Helper methods for writing out byte sequences
- /**********************************************************
- */
-
- /**
- * @return Number of bytes written
- */
- int writeQuotedUTF8(OutputStream out) throws IOException;
-
- /**
- * @return Number of bytes written
- */
- int writeUnquotedUTF8(OutputStream out) throws IOException;
-
- /**
- * @return Number of bytes put, if successful, otherwise -1
- */
- int putQuotedUTF8(ByteBuffer buffer) throws IOException;
-
- /**
- * @return Number of bytes put, if successful, otherwise -1
- */
- int putUnquotedUTF8(ByteBuffer out) throws IOException;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeCodec.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeCodec.java
deleted file mode 100644
index 270e06bf4..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeCodec.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.fr.third.fasterxml.jackson.core;
-
-import java.io.IOException;
-
-/**
- * Interface that defines objects that can read and write
- * {@link TreeNode} instances using Streaming API.
- *
- * @since 2.3
- */
-public abstract class TreeCodec
-{
- public abstract T readTree(JsonParser jp)
- throws IOException, JsonProcessingException;
-
- public abstract void writeTree(JsonGenerator jg, TreeNode tree)
- throws IOException, JsonProcessingException;
-
- public abstract TreeNode createArrayNode();
- public abstract TreeNode createObjectNode();
-
- public abstract JsonParser treeAsTokens(TreeNode node);
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeNode.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeNode.java
deleted file mode 100644
index 01789f636..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/TreeNode.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-import java.util.Iterator;
-
-/**
- * Marker interface used to denote JSON Tree nodes, as far as
- * the core package knows them (which is very little): mostly
- * needed to allow {@link ObjectCodec} to have some level
- * of interoperability.
- * Most functionality is within JsonNode
- * base class in mapper
package.
- *
- * Note that in Jackson 1.x JsonNode
itself
- * was part of core package: Jackson 2.x refactored this
- * since conceptually Tree Model is part of mapper package,
- * and so part visible to core
package should
- * be minimized.
- *
- * NOTE: starting with Jackson 2.2, there is more functionality
- * available via this class, and the intent is that this should
- * form actual base for multiple alternative tree representations;
- * for example, immutable trees could use different implementation
- * than mutable trees. It should also be possible to move actual
- * Tree Model implementation out of databind package eventually
- * (Jackson 3?).
- *
- * @since 2.2
- */
-public interface TreeNode
-{
- /*
- /**********************************************************
- /* Minimal introspection methods
- /**********************************************************
- */
-
- /**
- * Method that can be used for efficient type detection
- * when using stream abstraction for traversing nodes.
- * Will return the first {@link JsonToken} that equivalent
- * stream event would produce (for most nodes there is just
- * one token but for structured/container types multiple)
- */
- JsonToken asToken();
-
- /**
- * If this node is a numeric type (as per {@link JsonToken#isNumeric}),
- * returns native type that node uses to store the numeric value;
- * otherwise returns null.
- *
- * @return Type of number contained, if any; or null if node does not
- * contain numeric value.
- */
- JsonParser.NumberType numberType();
-
- /**
- * Method that returns number of child nodes this node contains:
- * for Array nodes, number of child elements, for Object nodes,
- * number of fields, and for all other nodes 0.
- *
- * @return For non-container nodes returns 0; for arrays number of
- * contained elements, and for objects number of fields.
- *
- * @since 2.2
- */
- int size();
-
- /**
- * Method that returns true for all value nodes: ones that
- * are not containers, and that do not represent "missing" nodes
- * in the path. Such value nodes represent String, Number, Boolean
- * and null values from JSON.
- *
- * Note: one and only one of methods {@link #isValueNode},
- * {@link #isContainerNode} and {@link #isMissingNode} ever
- * returns true for any given node.
- *
- * @since 2.2
- */
- boolean isValueNode();
-
- /**
- * Method that returns true for container nodes: Arrays and Objects.
- *
- * Note: one and only one of methods {@link #isValueNode},
- * {@link #isContainerNode} and {@link #isMissingNode} ever
- * returns true for any given node.
- *
- * @since 2.2
- */
- boolean isContainerNode();
-
- /**
- * Method that returns true for "virtual" nodes which represent
- * missing entries constructed by path accessor methods when
- * there is no actual node matching given criteria.
- *
- * Note: one and only one of methods {@link #isValueNode},
- * {@link #isContainerNode} and {@link #isMissingNode} ever
- * returns true for any given node.
- *
- * @since 2.2
- */
- boolean isMissingNode();
-
- /**
- * Method that returns true if this node is an Array node, false
- * otherwise.
- * Note that if true is returned, {@link #isContainerNode}
- * must also return true.
- *
- * @since 2.2
- */
- boolean isArray();
-
- /**
- * Method that returns true if this node is an Object node, false
- * otherwise.
- * Note that if true is returned, {@link #isContainerNode}
- * must also return true.
- *
- * @since 2.2
- */
- boolean isObject();
-
- /*
- /**********************************************************
- /* Basic traversal through structured entries (Arrays, Objects)
- /**********************************************************
- */
-
- /**
- * Method for accessing value of the specified field of
- * an object node. If this node is not an object (or it
- * does not have a value for specified field name), or
- * if there is no field with such name, null is returned.
- *
- * NOTE: handling of explicit null values may vary between
- * implementations; some trees may retain explicit nulls, others
- * not.
- *
- * @return Node that represent value of the specified field,
- * if this node is an object and has value for the specified
- * field. Null otherwise.
- *
- * @since 2.2
- */
- TreeNode get(String fieldName);
-
- /**
- * Method for accessing value of the specified element of
- * an array node. For other nodes, null is returned.
- *
- * For array nodes, index specifies
- * exact location within array and allows for efficient iteration
- * over child elements (underlying storage is guaranteed to
- * be efficiently indexable, i.e. has random-access to elements).
- * If index is less than 0, or equal-or-greater than
- * node.size()
, null is returned; no exception is
- * thrown for any index.
- *
- * @return Node that represent value of the specified element,
- * if this node is an array and has specified element.
- * Null otherwise.
- *
- * @since 2.2
- */
- TreeNode get(int index);
-
- /**
- * Method for accessing value of the specified field of
- * an object node.
- * For other nodes, a "missing node" (virtual node
- * for which {@link #isMissingNode} returns true) is returned.
- *
- * @return Node that represent value of the specified field,
- * if this node is an object and has value for the specified field;
- * otherwise "missing node" is returned.
- *
- * @since 2.2
- */
- TreeNode path(String fieldName);
-
- /**
- * Method for accessing value of the specified element of
- * an array node.
- * For other nodes, a "missing node" (virtual node
- * for which {@link #isMissingNode} returns true) is returned.
- *
- * For array nodes, index specifies
- * exact location within array and allows for efficient iteration
- * over child elements (underlying storage is guaranteed to
- * be efficiently indexable, i.e. has random-access to elements).
- * If index is less than 0, or equal-or-greater than
- * node.size()
, "missing node" is returned; no exception is
- * thrown for any index.
- *
- * @return Node that represent value of the specified element,
- * if this node is an array and has specified element;
- * otherwise "missing node" is returned.
- *
- * @since 2.2
- */
- TreeNode path(int index);
-
- /**
- * Method for accessing names of all fields for this node, iff
- * this node is an Object node. Number of field names accessible
- * will be {@link #size}.
- *
- * @since 2.2
- */
- Iterator fieldNames();
-
- /**
- * Method for locating node specified by given JSON pointer instances.
- * Method will never return null; if no matching node exists,
- * will return a node for which {@link TreeNode#isMissingNode()} returns true.
- *
- * @return Node that matches given JSON Pointer: if no match exists,
- * will return a node for which {@link TreeNode#isMissingNode()} returns true.
- *
- * @since 2.3
- */
- TreeNode at(JsonPointer ptr);
-
- /**
- * Convenience method that is functionally equivalent to:
- *
- * return at(JsonPointer.valueOf(jsonPointerExpression));
- *
- *
- * Note that if the same expression is used often, it is preferable to construct
- * {@link JsonPointer} instance once and reuse it: this method will not perform
- * any caching of compiled expressions.
- *
- * @param jsonPointerExpression Expression to compile as a {@link JsonPointer}
- * instance
- *
- * @return Node that matches given JSON Pointer: if no match exists,
- * will return a node for which {@link TreeNode#isMissingNode()} returns true.
- *
- * @since 2.3
- */
- TreeNode at(String jsonPointerExpression)
- throws IllegalArgumentException;
-
- /*
- /**********************************************************
- /* Converting to/from Streaming API
- /**********************************************************
- */
-
- /**
- * Method for constructing a {@link JsonParser} instance for
- * iterating over contents of the tree that this node is root of.
- * Functionally equivalent to first serializing tree using
- * {@link ObjectCodec} and then re-parsing but
- * more efficient.
- */
- JsonParser traverse();
-
- /**
- * Same as {@link #traverse()}, but additionally passes {@link com.fr.third.fasterxml.jackson.core.ObjectCodec}
- * to use if {@link JsonParser#readValueAs(Class)} is used (otherwise caller must call
- * {@link JsonParser#setCodec} on response explicitly).
- *
- * @since 2.1
- */
- JsonParser traverse(ObjectCodec codec);
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Version.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Version.java
deleted file mode 100644
index 8dc0e0457..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Version.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Object that encapsulates versioning information of a component.
- * Version information includes not just version number but also
- * optionally group and artifact ids of the component being versioned.
- *
- * Note that optional group and artifact id properties are new with Jackson 2.0:
- * if provided, they should align with Maven artifact information.
- */
-public class Version
- implements Comparable,
- java.io.Serializable
-{
- private static final long serialVersionUID = 1L;
-
- private final static Version UNKNOWN_VERSION = new Version(0, 0, 0, null, null, null);
-
- protected final int _majorVersion;
-
- protected final int _minorVersion;
-
- protected final int _patchLevel;
-
- protected final String _groupId;
-
- protected final String _artifactId;
-
- /**
- * Additional information for snapshot versions; null for non-snapshot
- * (release) versions.
- */
- protected final String _snapshotInfo;
-
- /**
- * @deprecated Use variant that takes group and artifact ids
- *
- * @since 2.1
- */
- @Deprecated
- public Version(int major, int minor, int patchLevel, String snapshotInfo)
- {
- this(major, minor, patchLevel, snapshotInfo, null, null);
- }
-
- public Version(int major, int minor, int patchLevel, String snapshotInfo,
- String groupId, String artifactId)
- {
- _majorVersion = major;
- _minorVersion = minor;
- _patchLevel = patchLevel;
- _snapshotInfo = snapshotInfo;
- _groupId = (groupId == null) ? "" : groupId;
- _artifactId = (artifactId == null) ? "" : artifactId;
- }
-
- /**
- * Method returns canonical "not known" version, which is used as version
- * in cases where actual version information is not known (instead of null).
- */
- public static Version unknownVersion() { return UNKNOWN_VERSION; }
-
- public boolean isUknownVersion() { return (this == UNKNOWN_VERSION); }
- public boolean isSnapshot() { return (_snapshotInfo != null && _snapshotInfo.length() > 0); }
-
- public int getMajorVersion() { return _majorVersion; }
- public int getMinorVersion() { return _minorVersion; }
- public int getPatchLevel() { return _patchLevel; }
-
- public String getGroupId() { return _groupId; }
- public String getArtifactId() { return _artifactId; }
-
- public String toFullString() {
- return new StringBuilder()
- .append(_groupId)
- .append('/')
- .append(_artifactId)
- .append('/')
- .append(toString())
- .toString();
- }
-
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder();
- sb.append(_majorVersion).append('.');
- sb.append(_minorVersion).append('.');
- sb.append(_patchLevel);
- if (isSnapshot()) {
- sb.append('-').append(_snapshotInfo);
- }
- return sb.toString();
- }
-
- @Override
- public int hashCode() {
- return _artifactId.hashCode() ^ _groupId.hashCode() + _majorVersion - _minorVersion + _patchLevel;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (o == this) return true;
- if (o == null) return false;
- if (o.getClass() != getClass()) return false;
- Version other = (Version) o;
- return (other._majorVersion == _majorVersion)
- && (other._minorVersion == _minorVersion)
- && (other._patchLevel == _patchLevel)
- && other._artifactId.equals(_artifactId)
- && other._groupId.equals(_groupId)
- ;
- }
-
- @Override
- public int compareTo(Version other)
- {
- if (other == this) return 0;
-
- int diff = _groupId.compareTo(other._groupId);
- if (diff == 0) {
- diff = _artifactId.compareTo(other._artifactId);
- if (diff == 0) {
- diff = _majorVersion - other._majorVersion;
- if (diff == 0) {
- diff = _minorVersion - other._minorVersion;
- if (diff == 0) {
- diff = _patchLevel - other._patchLevel;
- }
- }
- }
- }
- return diff;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Versioned.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Versioned.java
deleted file mode 100644
index dc65d2b3c..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/Versioned.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core;
-
-/**
- * Interface that those Jackson components that are explicitly versioned will implement.
- * Intention is to allow both plug-in components (custom extensions) and applications and
- * frameworks that use Jackson to detect exact version of Jackson in use.
- * This may be useful for example for ensuring that proper Jackson version is deployed
- * (beyond mechanisms that deployment system may have), as well as for possible
- * workarounds.
- */
-public interface Versioned {
- /**
- * Method called to detect version of the component that implements this interface;
- * returned version should never be null, but may return specific "not available"
- * instance (see {@link Version} for details).
- */
- Version version();
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/GeneratorBase.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/GeneratorBase.java
deleted file mode 100644
index e78fe7f52..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/GeneratorBase.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.base;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.json.DupDetector;
-import com.fr.third.fasterxml.jackson.core.json.JsonWriteContext;
-import com.fr.third.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-/**
- * This base class implements part of API that a JSON generator exposes
- * to applications, adds shared internal methods that sub-classes
- * can use and adds some abstract methods sub-classes must implement.
- */
-public abstract class GeneratorBase
- extends JsonGenerator
-{
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- protected ObjectCodec _objectCodec;
-
- /**
- * Bit flag composed of bits that indicate which
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature}s
- * are enabled.
- */
- protected int _features;
-
- /**
- * Flag set to indicate that implicit conversion from number
- * to JSON String is needed (as per
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator.Feature#WRITE_NUMBERS_AS_STRINGS}).
- */
- protected boolean _cfgNumbersAsStrings;
-
- /*
- /**********************************************************
- /* State
- /**********************************************************
- */
-
- /**
- * Object that keeps track of the current contextual state
- * of the generator.
- */
- protected JsonWriteContext _writeContext;
-
- /**
- * Flag that indicates whether generator is closed or not. Gets
- * set when it is closed by an explicit call
- * ({@link #close}).
- */
- protected boolean _closed;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected GeneratorBase(int features, ObjectCodec codec)
- {
- super();
- _features = features;
- DupDetector dups = Feature.STRICT_DUPLICATE_DETECTION.enabledIn(features)
- ? DupDetector.rootDetector(this) : null;
- _writeContext = JsonWriteContext.createRootContext(dups);
- _objectCodec = codec;
- _cfgNumbersAsStrings = Feature.WRITE_NUMBERS_AS_STRINGS.enabledIn(features);
- }
-
- /**
- * Implemented with detection that tries to find "VERSION.txt" in same
- * package as the implementation class.
- */
- @Override
- public Version version() {
- return VersionUtil.versionFor(getClass());
- }
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- @Override
- public JsonGenerator enable(Feature f) {
- _features |= f.getMask();
- if (f == Feature.WRITE_NUMBERS_AS_STRINGS) {
- _cfgNumbersAsStrings = true;
- } else if (f == Feature.ESCAPE_NON_ASCII) {
- setHighestNonEscapedChar(127);
- }
- return this;
- }
-
- @Override
- public JsonGenerator disable(Feature f) {
- _features &= ~f.getMask();
- if (f == Feature.WRITE_NUMBERS_AS_STRINGS) {
- _cfgNumbersAsStrings = false;
- } else if (f == Feature.ESCAPE_NON_ASCII) {
- setHighestNonEscapedChar(0);
- }
- return this;
- }
-
- //public JsonGenerator configure(Feature f, boolean state) { }
-
- @Override
- public final boolean isEnabled(Feature f) {
- return (_features & f.getMask()) != 0;
- }
-
- @Override
- public int getFeatureMask() {
- return _features;
- }
-
- @Override
- public JsonGenerator setFeatureMask(int mask) {
- _features = mask;
- return this;
- }
-
- @Override
- public JsonGenerator useDefaultPrettyPrinter() {
- /* 28-Sep-2012, tatu: As per [Issue#84], should not override a
- * pretty printer if one already assigned.
- */
- if (getPrettyPrinter() != null) {
- return this;
- }
- return setPrettyPrinter(new DefaultPrettyPrinter());
- }
-
- @Override
- public JsonGenerator setCodec(ObjectCodec oc) {
- _objectCodec = oc;
- return this;
- }
-
- @Override
- public final ObjectCodec getCodec() { return _objectCodec; }
-
- /*
- /**********************************************************
- /* Public API, accessors
- /**********************************************************
- */
-
- /**
- * Note: co-variant return type.
- */
- @Override
- public final JsonWriteContext getOutputContext() { return _writeContext; }
-
- /*
- /**********************************************************
- /* Public API, write methods, structural
- /**********************************************************
- */
-
- //public void writeStartArray() throws IOException
- //public void writeEndArray() throws IOException
- //public void writeStartObject() throws IOException
- //public void writeEndObject() throws IOException
-
- /*
- /**********************************************************
- /* Public API, write methods, textual
- /**********************************************************
- */
-
- @Override
- public void writeFieldName(SerializableString name) throws IOException {
- writeFieldName(name.getValue());
- }
-
- //public abstract void writeString(String text) throws IOException;
-
- //public abstract void writeString(char[] text, int offset, int len) throws IOException;
-
- //public abstract void writeRaw(String text) throws IOException;
-
- //public abstract void writeRaw(char[] text, int offset, int len) throws IOException;
-
- @Override
- public void writeString(SerializableString text) throws IOException {
- writeString(text.getValue());
- }
-
- @Override
- public void writeRawValue(String text) throws IOException {
- _verifyValueWrite("write raw value");
- writeRaw(text);
- }
-
- @Override
- public void writeRawValue(String text, int offset, int len) throws IOException {
- _verifyValueWrite("write raw value");
- writeRaw(text, offset, len);
- }
-
- @Override
- public void writeRawValue(char[] text, int offset, int len) throws IOException {
- _verifyValueWrite("write raw value");
- writeRaw(text, offset, len);
- }
-
- @Override
- public int writeBinary(Base64Variant b64variant, InputStream data, int dataLength) throws IOException {
- // Let's implement this as "unsupported" to make it easier to add new parser impls
- _reportUnsupportedOperation();
- return 0;
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, primitive
- /**********************************************************
- */
-
- // Not implemented at this level, added as placeholders
-
- /*
- public abstract void writeNumber(int i)
- public abstract void writeNumber(long l)
- public abstract void writeNumber(double d)
- public abstract void writeNumber(float f)
- public abstract void writeNumber(BigDecimal dec)
- public abstract void writeBoolean(boolean state)
- public abstract void writeNull()
- */
-
- /*
- /**********************************************************
- /* Public API, write methods, POJOs, trees
- /**********************************************************
- */
-
- @Override
- public void writeObject(Object value) throws IOException
- {
- if (value == null) {
- // important: call method that does check value write:
- writeNull();
- } else {
- /* 02-Mar-2009, tatu: we are NOT to call _verifyValueWrite here,
- * because that will be done when codec actually serializes
- * contained POJO. If we did call it it would advance state
- * causing exception later on
- */
- if (_objectCodec != null) {
- _objectCodec.writeValue(this, value);
- return;
- }
- _writeSimpleObject(value);
- }
- }
-
- @Override
- public void writeTree(TreeNode rootNode) throws IOException
- {
- // As with 'writeObject()', we are not check if write would work
- if (rootNode == null) {
- writeNull();
- } else {
- if (_objectCodec == null) {
- throw new IllegalStateException("No ObjectCodec defined");
- }
- _objectCodec.writeValue(this, rootNode);
- }
- }
-
- /*
- /**********************************************************
- /* Public API, low-level output handling
- /**********************************************************
- */
-
- @Override public abstract void flush() throws IOException;
- @Override public void close() throws IOException { _closed = true; }
- @Override public boolean isClosed() { return _closed; }
-
- /*
- /**********************************************************
- /* Package methods for this, sub-classes
- /**********************************************************
- */
-
- /**
- * Method called to release any buffers generator may be holding,
- * once generator is being closed.
- */
- protected abstract void _releaseBuffers();
-
- /**
- * Method called before trying to write a value (scalar or structured),
- * to verify that this is legal in current output state, as well as to
- * output separators if and as necessary.
- *
- * @param typeMsg Additional message used for generating exception message
- * if value output is NOT legal in current generator output state.
- */
- protected abstract void _verifyValueWrite(String typeMsg) throws IOException;
-
- // @Deprecated in 2.3 -- now defined in super-class; remove in 2.4
- @Override
- protected void _writeSimpleObject(Object value) throws IOException { super._writeSimpleObject(value); }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserBase.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserBase.java
deleted file mode 100644
index 13447acad..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserBase.java
+++ /dev/null
@@ -1,1090 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.base;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.IOContext;
-import com.fr.third.fasterxml.jackson.core.io.NumberInput;
-import com.fr.third.fasterxml.jackson.core.json.DupDetector;
-import com.fr.third.fasterxml.jackson.core.json.JsonReadContext;
-import com.fr.third.fasterxml.jackson.core.json.PackageVersion;
-import com.fr.third.fasterxml.jackson.core.util.ByteArrayBuilder;
-import com.fr.third.fasterxml.jackson.core.util.TextBuffer;
-
-/**
- * Intermediate base class used by all Jackson {@link JsonParser}
- * implementations. Contains most common things that are independent
- * of actual underlying input source.
- */
-public abstract class ParserBase
- extends ParserMinimalBase
-{
- /*
- /**********************************************************
- /* Generic I/O state
- /**********************************************************
- */
-
- /**
- * I/O context for this reader. It handles buffer allocation
- * for the reader.
- */
- final protected IOContext _ioContext;
-
- /**
- * Flag that indicates whether parser is closed or not. Gets
- * set when parser is either closed by explicit call
- * ({@link #close}) or when end-of-input is reached.
- */
- protected boolean _closed;
-
- /*
- /**********************************************************
- /* Current input data
- /**********************************************************
- */
-
- // Note: type of actual buffer depends on sub-class, can't include
-
- /**
- * Pointer to next available character in buffer
- */
- protected int _inputPtr = 0;
-
- /**
- * Index of character after last available one in the buffer.
- */
- protected int _inputEnd = 0;
-
- /*
- /**********************************************************
- /* Current input location information
- /**********************************************************
- */
-
- /**
- * Number of characters/bytes that were contained in previous blocks
- * (blocks that were already processed prior to the current buffer).
- */
- protected long _currInputProcessed = 0L;
-
- /**
- * Current row location of current point in input buffer, starting
- * from 1, if available.
- */
- protected int _currInputRow = 1;
-
- /**
- * Current index of the first character of the current row in input
- * buffer. Needed to calculate column position, if necessary; benefit
- * of not having column itself is that this only has to be updated
- * once per line.
- */
- protected int _currInputRowStart = 0;
-
- /*
- /**********************************************************
- /* Information about starting location of event
- /* Reader is pointing to; updated on-demand
- /**********************************************************
- */
-
- // // // Location info at point when current token was started
-
- /**
- * Total number of bytes/characters read before start of current token.
- * For big (gigabyte-sized) sizes are possible, needs to be long,
- * unlike pointers and sizes related to in-memory buffers.
- */
- protected long _tokenInputTotal = 0;
-
- /**
- * Input row on which current token starts, 1-based
- */
- protected int _tokenInputRow = 1;
-
- /**
- * Column on input row that current token starts; 0-based (although
- * in the end it'll be converted to 1-based)
- */
- protected int _tokenInputCol = 0;
-
- /*
- /**********************************************************
- /* Parsing state
- /**********************************************************
- */
-
- /**
- * Information about parser context, context in which
- * the next token is to be parsed (root, array, object).
- */
- protected JsonReadContext _parsingContext;
-
- /**
- * Secondary token related to the next token after current one;
- * used if its type is known. This may be value token that
- * follows FIELD_NAME, for example.
- */
- protected JsonToken _nextToken;
-
- /*
- /**********************************************************
- /* Buffer(s) for local name(s) and text content
- /**********************************************************
- */
-
- /**
- * Buffer that contains contents of String values, including
- * field names if necessary (name split across boundary,
- * contains escape sequence, or access needed to char array)
- */
- protected final TextBuffer _textBuffer;
-
- /**
- * Temporary buffer that is needed if field name is accessed
- * using {@link #getTextCharacters} method (instead of String
- * returning alternatives)
- */
- protected char[] _nameCopyBuffer = null;
-
- /**
- * Flag set to indicate whether the field name is available
- * from the name copy buffer or not (in addition to its String
- * representation being available via read context)
- */
- protected boolean _nameCopied = false;
-
- /**
- * ByteArrayBuilder is needed if 'getBinaryValue' is called. If so,
- * we better reuse it for remainder of content.
- */
- protected ByteArrayBuilder _byteArrayBuilder = null;
-
- /**
- * We will hold on to decoded binary data, for duration of
- * current event, so that multiple calls to
- * {@link #getBinaryValue} will not need to decode data more
- * than once.
- */
- protected byte[] _binaryValue;
-
- /*
- /**********************************************************
- /* Constants and fields of former 'JsonNumericParserBase'
- /**********************************************************
- */
-
- final protected static int NR_UNKNOWN = 0;
-
- // First, integer types
-
- final protected static int NR_INT = 0x0001;
- final protected static int NR_LONG = 0x0002;
- final protected static int NR_BIGINT = 0x0004;
-
- // And then floating point types
-
- final protected static int NR_DOUBLE = 0x008;
- final protected static int NR_BIGDECIMAL = 0x0010;
-
- // Also, we need some numeric constants
-
- final static BigInteger BI_MIN_INT = BigInteger.valueOf(Integer.MIN_VALUE);
- final static BigInteger BI_MAX_INT = BigInteger.valueOf(Integer.MAX_VALUE);
-
- final static BigInteger BI_MIN_LONG = BigInteger.valueOf(Long.MIN_VALUE);
- final static BigInteger BI_MAX_LONG = BigInteger.valueOf(Long.MAX_VALUE);
-
- final static BigDecimal BD_MIN_LONG = new BigDecimal(BI_MIN_LONG);
- final static BigDecimal BD_MAX_LONG = new BigDecimal(BI_MAX_LONG);
-
- final static BigDecimal BD_MIN_INT = new BigDecimal(BI_MIN_INT);
- final static BigDecimal BD_MAX_INT = new BigDecimal(BI_MAX_INT);
-
- final static long MIN_INT_L = (long) Integer.MIN_VALUE;
- final static long MAX_INT_L = (long) Integer.MAX_VALUE;
-
- // These are not very accurate, but have to do... (for bounds checks)
-
- final static double MIN_LONG_D = (double) Long.MIN_VALUE;
- final static double MAX_LONG_D = (double) Long.MAX_VALUE;
-
- final static double MIN_INT_D = (double) Integer.MIN_VALUE;
- final static double MAX_INT_D = (double) Integer.MAX_VALUE;
-
- // Digits, numeric
- final protected static int INT_0 = '0';
- final protected static int INT_9 = '9';
-
- final protected static int INT_MINUS = '-';
- final protected static int INT_PLUS = '+';
-
- final protected static char CHAR_NULL = '\0';
-
- // Numeric value holders: multiple fields used for
- // for efficiency
-
- /**
- * Bitfield that indicates which numeric representations
- * have been calculated for the current type
- */
- protected int _numTypesValid = NR_UNKNOWN;
-
- // First primitives
-
- protected int _numberInt;
-
- protected long _numberLong;
-
- protected double _numberDouble;
-
- // And then object types
-
- protected BigInteger _numberBigInt;
-
- protected BigDecimal _numberBigDecimal;
-
- // And then other information about value itself
-
- /**
- * Flag that indicates whether numeric value has a negative
- * value. That is, whether its textual representation starts
- * with minus character.
- */
- protected boolean _numberNegative;
-
- /**
- * Length of integer part of the number, in characters
- */
- protected int _intLength;
-
- /**
- * Length of the fractional part (not including decimal
- * point or exponent), in characters.
- * Not used for pure integer values.
- */
- protected int _fractLength;
-
- /**
- * Length of the exponent part of the number, if any, not
- * including 'e' marker or sign, just digits.
- * Not used for pure integer values.
- */
- protected int _expLength;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected ParserBase(IOContext ctxt, int features)
- {
- super();
- _features = features;
- _ioContext = ctxt;
- _textBuffer = ctxt.constructTextBuffer();
- DupDetector dups = Feature.STRICT_DUPLICATE_DETECTION.enabledIn(features)
- ? DupDetector.rootDetector(this) : null;
- JsonReadContext readCtxt = JsonReadContext.createRootContext(dups);
- _parsingContext = readCtxt;
- }
-
- @Override
- public Version version() {
- return PackageVersion.VERSION;
- }
-
- /*
- /**********************************************************
- /* JsonParser impl
- /**********************************************************
- */
-
- /**
- * Method that can be called to get the name associated with
- * the current event.
- */
- @Override
- public String getCurrentName()
- throws IOException, JsonParseException
- {
- // [JACKSON-395]: start markers require information from parent
- if (_currToken == JsonToken.START_OBJECT || _currToken == JsonToken.START_ARRAY) {
- JsonReadContext parent = _parsingContext.getParent();
- return parent.getCurrentName();
- }
- return _parsingContext.getCurrentName();
- }
-
- @Override
- public void overrideCurrentName(String name)
- {
- // Simple, but need to look for START_OBJECT/ARRAY's "off-by-one" thing:
- JsonReadContext ctxt = _parsingContext;
- if (_currToken == JsonToken.START_OBJECT || _currToken == JsonToken.START_ARRAY) {
- ctxt = ctxt.getParent();
- }
- /* 24-Sep-2013, tatu: Unfortunate, but since we did not expose exceptions,
- * need to wrap this here
- */
- try {
- ctxt.setCurrentName(name);
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
- public void close() throws IOException
- {
- if (!_closed) {
- _closed = true;
- try {
- _closeInput();
- } finally {
- // as per [JACKSON-324], do in finally block
- // Also, internal buffer(s) can now be released as well
- _releaseBuffers();
- }
- }
- }
-
- @Override
- public boolean isClosed() { return _closed; }
-
- @Override
- public JsonReadContext getParsingContext()
- {
- return _parsingContext;
- }
-
- /**
- * Method that return the starting location of the current
- * token; that is, position of the first character from input
- * that starts the current token.
- */
- @Override
- public JsonLocation getTokenLocation()
- {
- return new JsonLocation(_ioContext.getSourceReference(),
- -1L, getTokenCharacterOffset(), // bytes, chars
- getTokenLineNr(),
- getTokenColumnNr());
- }
-
- /**
- * Method that returns location of the last processed character;
- * usually for error reporting purposes
- */
- @Override
- public JsonLocation getCurrentLocation()
- {
- int col = _inputPtr - _currInputRowStart + 1; // 1-based
- return new JsonLocation(_ioContext.getSourceReference(),
- -1L, _currInputProcessed + _inputPtr, // bytes, chars
- _currInputRow, col);
- }
-
- /*
- /**********************************************************
- /* Public API, access to token information, text and similar
- /**********************************************************
- */
-
- @Override
- public boolean hasTextCharacters()
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- return true; // usually true
- }
- if (_currToken == JsonToken.FIELD_NAME) {
- return _nameCopied;
- }
- return false;
- }
-
- // No embedded objects with base impl...
- @Override
- public Object getEmbeddedObject() throws IOException, JsonParseException {
- return null;
- }
-
- /*
- /**********************************************************
- /* Public low-level accessors
- /**********************************************************
- */
-
- public long getTokenCharacterOffset() { return _tokenInputTotal; }
- public int getTokenLineNr() { return _tokenInputRow; }
- public int getTokenColumnNr() {
- // note: value of -1 means "not available"; otherwise convert from 0-based to 1-based
- int col = _tokenInputCol;
- return (col < 0) ? col : (col + 1);
- }
-
- /*
- /**********************************************************
- /* Low-level reading, other
- /**********************************************************
- */
-
- protected final void loadMoreGuaranteed()
- throws IOException
- {
- if (!loadMore()) {
- _reportInvalidEOF();
- }
- }
-
- /*
- /**********************************************************
- /* Abstract methods needed from sub-classes
- /**********************************************************
- */
-
- protected abstract boolean loadMore() throws IOException;
-
- protected abstract void _finishString() throws IOException, JsonParseException;
-
- protected abstract void _closeInput() throws IOException;
-
- /*
- /**********************************************************
- /* Low-level reading, other
- /**********************************************************
- */
-
- /**
- * Method called to release internal buffers owned by the base
- * reader. This may be called along with {@link #_closeInput} (for
- * example, when explicitly closing this reader instance), or
- * separately (if need be).
- */
- protected void _releaseBuffers() throws IOException
- {
- _textBuffer.releaseBuffers();
- char[] buf = _nameCopyBuffer;
- if (buf != null) {
- _nameCopyBuffer = null;
- _ioContext.releaseNameCopyBuffer(buf);
- }
- }
-
- /**
- * Method called when an EOF is encountered between tokens.
- * If so, it may be a legitimate EOF, but only iff there
- * is no open non-root context.
- */
- @Override
- protected void _handleEOF() throws JsonParseException
- {
- if (!_parsingContext.inRoot()) {
- _reportInvalidEOF(": expected close marker for "+_parsingContext.getTypeDesc()+" (from "+_parsingContext.getStartLocation(_ioContext.getSourceReference())+")");
- }
- }
-
- /*
- /**********************************************************
- /* Internal/package methods: Error reporting
- /**********************************************************
- */
-
- protected void _reportMismatchedEndMarker(int actCh, char expCh)
- throws JsonParseException
- {
- String startDesc = ""+_parsingContext.getStartLocation(_ioContext.getSourceReference());
- _reportError("Unexpected close marker '"+((char) actCh)+"': expected '"+expCh+"' (for "+_parsingContext.getTypeDesc()+" starting at "+startDesc+")");
- }
-
- /*
- /**********************************************************
- /* Internal/package methods: shared/reusable builders
- /**********************************************************
- */
-
- public ByteArrayBuilder _getByteArrayBuilder()
- {
- if (_byteArrayBuilder == null) {
- _byteArrayBuilder = new ByteArrayBuilder();
- } else {
- _byteArrayBuilder.reset();
- }
- return _byteArrayBuilder;
- }
-
- /*
- /**********************************************************
- /* Methods from former JsonNumericParserBase
- /**********************************************************
- */
-
- // // // Life-cycle of number-parsing
-
- protected final JsonToken reset(boolean negative, int intLen, int fractLen, int expLen)
- {
- if (fractLen < 1 && expLen < 1) { // integer
- return resetInt(negative, intLen);
- }
- return resetFloat(negative, intLen, fractLen, expLen);
- }
-
- protected final JsonToken resetInt(boolean negative, int intLen)
- {
- _numberNegative = negative;
- _intLength = intLen;
- _fractLength = 0;
- _expLength = 0;
- _numTypesValid = NR_UNKNOWN; // to force parsing
- return JsonToken.VALUE_NUMBER_INT;
- }
-
- protected final JsonToken resetFloat(boolean negative, int intLen, int fractLen, int expLen)
- {
- _numberNegative = negative;
- _intLength = intLen;
- _fractLength = fractLen;
- _expLength = expLen;
- _numTypesValid = NR_UNKNOWN; // to force parsing
- return JsonToken.VALUE_NUMBER_FLOAT;
- }
-
- protected final JsonToken resetAsNaN(String valueStr, double value)
- {
- _textBuffer.resetWithString(valueStr);
- _numberDouble = value;
- _numTypesValid = NR_DOUBLE;
- return JsonToken.VALUE_NUMBER_FLOAT;
- }
-
- /*
- /**********************************************************
- /* Numeric accessors of public API
- /**********************************************************
- */
-
- @Override
- public Number getNumberValue() throws IOException, JsonParseException
- {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_UNKNOWN); // will also check event type
- }
- // Separate types for int types
- if (_currToken == JsonToken.VALUE_NUMBER_INT) {
- if ((_numTypesValid & NR_INT) != 0) {
- return _numberInt;
- }
- if ((_numTypesValid & NR_LONG) != 0) {
- return _numberLong;
- }
- if ((_numTypesValid & NR_BIGINT) != 0) {
- return _numberBigInt;
- }
- // Shouldn't get this far but if we do
- return _numberBigDecimal;
- }
-
- /* And then floating point types. But here optimal type
- * needs to be big decimal, to avoid losing any data?
- */
- if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- return _numberBigDecimal;
- }
- if ((_numTypesValid & NR_DOUBLE) == 0) { // sanity check
- _throwInternal();
- }
- return _numberDouble;
- }
-
- @Override
- public NumberType getNumberType() throws IOException, JsonParseException
- {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_UNKNOWN); // will also check event type
- }
- if (_currToken == JsonToken.VALUE_NUMBER_INT) {
- if ((_numTypesValid & NR_INT) != 0) {
- return NumberType.INT;
- }
- if ((_numTypesValid & NR_LONG) != 0) {
- return NumberType.LONG;
- }
- return NumberType.BIG_INTEGER;
- }
-
- /* And then floating point types. Here optimal type
- * needs to be big decimal, to avoid losing any data?
- * However... using BD is slow, so let's allow returning
- * double as type if no explicit call has been made to access
- * data as BD?
- */
- if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- return NumberType.BIG_DECIMAL;
- }
- return NumberType.DOUBLE;
- }
-
- @Override
- public int getIntValue() throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_INT) == 0) {
- if (_numTypesValid == NR_UNKNOWN) { // not parsed at all
- _parseNumericValue(NR_INT); // will also check event type
- }
- if ((_numTypesValid & NR_INT) == 0) { // wasn't an int natively?
- convertNumberToInt(); // let's make it so, if possible
- }
- }
- return _numberInt;
- }
-
- @Override
- public long getLongValue() throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_LONG) == 0) {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_LONG);
- }
- if ((_numTypesValid & NR_LONG) == 0) {
- convertNumberToLong();
- }
- }
- return _numberLong;
- }
-
- @Override
- public BigInteger getBigIntegerValue() throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_BIGINT) == 0) {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_BIGINT);
- }
- if ((_numTypesValid & NR_BIGINT) == 0) {
- convertNumberToBigInteger();
- }
- }
- return _numberBigInt;
- }
-
- @Override
- public float getFloatValue() throws IOException, JsonParseException
- {
- double value = getDoubleValue();
- /* 22-Jan-2009, tatu: Bounds/range checks would be tricky
- * here, so let's not bother even trying...
- */
- /*
- if (value < -Float.MAX_VALUE || value > MAX_FLOAT_D) {
- _reportError("Numeric value ("+getText()+") out of range of Java float");
- }
- */
- return (float) value;
- }
-
- @Override
- public double getDoubleValue() throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_DOUBLE) == 0) {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_DOUBLE);
- }
- if ((_numTypesValid & NR_DOUBLE) == 0) {
- convertNumberToDouble();
- }
- }
- return _numberDouble;
- }
-
- @Override
- public BigDecimal getDecimalValue() throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_BIGDECIMAL) == 0) {
- if (_numTypesValid == NR_UNKNOWN) {
- _parseNumericValue(NR_BIGDECIMAL);
- }
- if ((_numTypesValid & NR_BIGDECIMAL) == 0) {
- convertNumberToBigDecimal();
- }
- }
- return _numberBigDecimal;
- }
-
- /*
- /**********************************************************
- /* Conversion from textual to numeric representation
- /**********************************************************
- */
-
- /**
- * Method that will parse actual numeric value out of a syntactically
- * valid number value. Type it will parse into depends on whether
- * it is a floating point number, as well as its magnitude: smallest
- * legal type (of ones available) is used for efficiency.
- *
- * @param expType Numeric type that we will immediately need, if any;
- * mostly necessary to optimize handling of floating point numbers
- */
- protected void _parseNumericValue(int expType)
- throws IOException, JsonParseException
- {
- // Int or float?
- if (_currToken == JsonToken.VALUE_NUMBER_INT) {
- char[] buf = _textBuffer.getTextBuffer();
- int offset = _textBuffer.getTextOffset();
- int len = _intLength;
- if (_numberNegative) {
- ++offset;
- }
- if (len <= 9) { // definitely fits in int
- int i = NumberInput.parseInt(buf, offset, len);
- _numberInt = _numberNegative ? -i : i;
- _numTypesValid = NR_INT;
- return;
- }
- if (len <= 18) { // definitely fits AND is easy to parse using 2 int parse calls
- long l = NumberInput.parseLong(buf, offset, len);
- if (_numberNegative) {
- l = -l;
- }
- // [JACKSON-230] Could still fit in int, need to check
- if (len == 10) {
- if (_numberNegative) {
- if (l >= MIN_INT_L) {
- _numberInt = (int) l;
- _numTypesValid = NR_INT;
- return;
- }
- } else {
- if (l <= MAX_INT_L) {
- _numberInt = (int) l;
- _numTypesValid = NR_INT;
- return;
- }
- }
- }
- _numberLong = l;
- _numTypesValid = NR_LONG;
- return;
- }
- _parseSlowInt(expType, buf, offset, len);
- return;
- }
- if (_currToken == JsonToken.VALUE_NUMBER_FLOAT) {
- _parseSlowFloat(expType);
- return;
- }
- _reportError("Current token ("+_currToken+") not numeric, can not use numeric value accessors");
- }
-
- private void _parseSlowFloat(int expType)
- throws IOException, JsonParseException
- {
- /* Nope: floating point. Here we need to be careful to get
- * optimal parsing strategy: choice is between accurate but
- * slow (BigDecimal) and lossy but fast (Double). For now
- * let's only use BD when explicitly requested -- it can
- * still be constructed correctly at any point since we do
- * retain textual representation
- */
- try {
- if (expType == NR_BIGDECIMAL) {
- _numberBigDecimal = _textBuffer.contentsAsDecimal();
- _numTypesValid = NR_BIGDECIMAL;
- } else {
- // Otherwise double has to do
- _numberDouble = _textBuffer.contentsAsDouble();
- _numTypesValid = NR_DOUBLE;
- }
- } catch (NumberFormatException nex) {
- // Can this ever occur? Due to overflow, maybe?
- _wrapError("Malformed numeric value '"+_textBuffer.contentsAsString()+"'", nex);
- }
- }
-
- private void _parseSlowInt(int expType, char[] buf, int offset, int len)
- throws IOException, JsonParseException
- {
- String numStr = _textBuffer.contentsAsString();
- try {
- // [JACKSON-230] Some long cases still...
- if (NumberInput.inLongRange(buf, offset, len, _numberNegative)) {
- // Probably faster to construct a String, call parse, than to use BigInteger
- _numberLong = Long.parseLong(numStr);
- _numTypesValid = NR_LONG;
- } else {
- // nope, need the heavy guns... (rare case)
- _numberBigInt = new BigInteger(numStr);
- _numTypesValid = NR_BIGINT;
- }
- } catch (NumberFormatException nex) {
- // Can this ever occur? Due to overflow, maybe?
- _wrapError("Malformed numeric value '"+numStr+"'", nex);
- }
- }
-
- /*
- /**********************************************************
- /* Numeric conversions
- /**********************************************************
- */
-
- protected void convertNumberToInt()
- throws IOException, JsonParseException
- {
- // First, converting from long ought to be easy
- if ((_numTypesValid & NR_LONG) != 0) {
- // Let's verify it's lossless conversion by simple roundtrip
- int result = (int) _numberLong;
- if (((long) result) != _numberLong) {
- _reportError("Numeric value ("+getText()+") out of range of int");
- }
- _numberInt = result;
- } else if ((_numTypesValid & NR_BIGINT) != 0) {
- if (BI_MIN_INT.compareTo(_numberBigInt) > 0
- || BI_MAX_INT.compareTo(_numberBigInt) < 0) {
- reportOverflowInt();
- }
- _numberInt = _numberBigInt.intValue();
- } else if ((_numTypesValid & NR_DOUBLE) != 0) {
- // Need to check boundaries
- if (_numberDouble < MIN_INT_D || _numberDouble > MAX_INT_D) {
- reportOverflowInt();
- }
- _numberInt = (int) _numberDouble;
- } else if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- if (BD_MIN_INT.compareTo(_numberBigDecimal) > 0
- || BD_MAX_INT.compareTo(_numberBigDecimal) < 0) {
- reportOverflowInt();
- }
- _numberInt = _numberBigDecimal.intValue();
- } else {
- _throwInternal();
- }
- _numTypesValid |= NR_INT;
- }
-
- protected void convertNumberToLong()
- throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_INT) != 0) {
- _numberLong = (long) _numberInt;
- } else if ((_numTypesValid & NR_BIGINT) != 0) {
- if (BI_MIN_LONG.compareTo(_numberBigInt) > 0
- || BI_MAX_LONG.compareTo(_numberBigInt) < 0) {
- reportOverflowLong();
- }
- _numberLong = _numberBigInt.longValue();
- } else if ((_numTypesValid & NR_DOUBLE) != 0) {
- // Need to check boundaries
- if (_numberDouble < MIN_LONG_D || _numberDouble > MAX_LONG_D) {
- reportOverflowLong();
- }
- _numberLong = (long) _numberDouble;
- } else if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- if (BD_MIN_LONG.compareTo(_numberBigDecimal) > 0
- || BD_MAX_LONG.compareTo(_numberBigDecimal) < 0) {
- reportOverflowLong();
- }
- _numberLong = _numberBigDecimal.longValue();
- } else {
- _throwInternal();
- }
- _numTypesValid |= NR_LONG;
- }
-
- protected void convertNumberToBigInteger()
- throws IOException, JsonParseException
- {
- if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- // here it'll just get truncated, no exceptions thrown
- _numberBigInt = _numberBigDecimal.toBigInteger();
- } else if ((_numTypesValid & NR_LONG) != 0) {
- _numberBigInt = BigInteger.valueOf(_numberLong);
- } else if ((_numTypesValid & NR_INT) != 0) {
- _numberBigInt = BigInteger.valueOf(_numberInt);
- } else if ((_numTypesValid & NR_DOUBLE) != 0) {
- _numberBigInt = BigDecimal.valueOf(_numberDouble).toBigInteger();
- } else {
- _throwInternal();
- }
- _numTypesValid |= NR_BIGINT;
- }
-
- protected void convertNumberToDouble()
- throws IOException, JsonParseException
- {
- /* 05-Aug-2008, tatus: Important note: this MUST start with
- * more accurate representations, since we don't know which
- * value is the original one (others get generated when
- * requested)
- */
-
- if ((_numTypesValid & NR_BIGDECIMAL) != 0) {
- _numberDouble = _numberBigDecimal.doubleValue();
- } else if ((_numTypesValid & NR_BIGINT) != 0) {
- _numberDouble = _numberBigInt.doubleValue();
- } else if ((_numTypesValid & NR_LONG) != 0) {
- _numberDouble = (double) _numberLong;
- } else if ((_numTypesValid & NR_INT) != 0) {
- _numberDouble = (double) _numberInt;
- } else {
- _throwInternal();
- }
- _numTypesValid |= NR_DOUBLE;
- }
-
- protected void convertNumberToBigDecimal()
- throws IOException, JsonParseException
- {
- /* 05-Aug-2008, tatus: Important note: this MUST start with
- * more accurate representations, since we don't know which
- * value is the original one (others get generated when
- * requested)
- */
-
- if ((_numTypesValid & NR_DOUBLE) != 0) {
- /* Let's actually parse from String representation,
- * to avoid rounding errors that non-decimal floating operations
- * would incur
- */
- _numberBigDecimal = NumberInput.parseBigDecimal(getText());
- } else if ((_numTypesValid & NR_BIGINT) != 0) {
- _numberBigDecimal = new BigDecimal(_numberBigInt);
- } else if ((_numTypesValid & NR_LONG) != 0) {
- _numberBigDecimal = BigDecimal.valueOf(_numberLong);
- } else if ((_numTypesValid & NR_INT) != 0) {
- _numberBigDecimal = BigDecimal.valueOf(_numberInt);
- } else {
- _throwInternal();
- }
- _numTypesValid |= NR_BIGDECIMAL;
- }
-
- /*
- /**********************************************************
- /* Number handling exceptions
- /**********************************************************
- */
-
- protected void reportUnexpectedNumberChar(int ch, String comment)
- throws JsonParseException
- {
- String msg = "Unexpected character ("+_getCharDesc(ch)+") in numeric value";
- if (comment != null) {
- msg += ": "+comment;
- }
- _reportError(msg);
- }
-
- protected void reportInvalidNumber(String msg)
- throws JsonParseException
- {
- _reportError("Invalid numeric value: "+msg);
- }
-
- protected void reportOverflowInt()
- throws IOException, JsonParseException
- {
- _reportError("Numeric value ("+getText()+") out of range of int ("+Integer.MIN_VALUE+" - "+Integer.MAX_VALUE+")");
- }
-
- protected void reportOverflowLong()
- throws IOException, JsonParseException
- {
- _reportError("Numeric value ("+getText()+") out of range of long ("+Long.MIN_VALUE+" - "+Long.MAX_VALUE+")");
- }
-
- /*
- /**********************************************************
- /* Base64 handling support
- /**********************************************************
- */
-
- /**
- * Method that sub-classes must implement to support escaped sequences
- * in base64-encoded sections.
- * Sub-classes that do not need base64 support can leave this as is
- */
- protected char _decodeEscaped()
- throws IOException, JsonParseException {
- throw new UnsupportedOperationException();
- }
-
- protected final int _decodeBase64Escape(Base64Variant b64variant, int ch, int index)
- throws IOException, JsonParseException
- {
- // 17-May-2011, tatu: As per [JACKSON-xxx], need to handle escaped chars
- if (ch != '\\') {
- throw reportInvalidBase64Char(b64variant, ch, index);
- }
- int unescaped = _decodeEscaped();
- // if white space, skip if first triplet; otherwise errors
- if (unescaped <= INT_SPACE) {
- if (index == 0) { // whitespace only allowed to be skipped between triplets
- return -1;
- }
- }
- // otherwise try to find actual triplet value
- int bits = b64variant.decodeBase64Char(unescaped);
- if (bits < 0) {
- throw reportInvalidBase64Char(b64variant, unescaped, index);
- }
- return bits;
- }
-
- protected final int _decodeBase64Escape(Base64Variant b64variant, char ch, int index)
- throws IOException, JsonParseException
- {
- // 17-May-2011, tatu: As per [JACKSON-xxx], need to handle escaped chars
- if (ch != '\\') {
- throw reportInvalidBase64Char(b64variant, ch, index);
- }
- char unescaped = _decodeEscaped();
- // if white space, skip if first triplet; otherwise errors
- if (unescaped <= INT_SPACE) {
- if (index == 0) { // whitespace only allowed to be skipped between triplets
- return -1;
- }
- }
- // otherwise try to find actual triplet value
- int bits = b64variant.decodeBase64Char(unescaped);
- if (bits < 0) {
- throw reportInvalidBase64Char(b64variant, unescaped, index);
- }
- return bits;
- }
-
- protected IllegalArgumentException reportInvalidBase64Char(Base64Variant b64variant, int ch, int bindex)
- throws IllegalArgumentException
- {
- return reportInvalidBase64Char(b64variant, ch, bindex, null);
- }
-
- /**
- * @param bindex Relative index within base64 character unit; between 0
- * and 3 (as unit has exactly 4 characters)
- */
- protected IllegalArgumentException reportInvalidBase64Char(Base64Variant b64variant, int ch, int bindex, String msg)
- throws IllegalArgumentException
- {
- String base;
- if (ch <= INT_SPACE) {
- base = "Illegal white space character (code 0x"+Integer.toHexString(ch)+") as character #"+(bindex+1)+" of 4-char base64 unit: can only used between units";
- } else if (b64variant.usesPaddingChar(ch)) {
- base = "Unexpected padding character ('"+b64variant.getPaddingChar()+"') as character #"+(bindex+1)+" of 4-char base64 unit: padding only legal as 3rd or 4th character";
- } else if (!Character.isDefined(ch) || Character.isISOControl(ch)) {
- // Not sure if we can really get here... ? (most illegal xml chars are caught at lower level)
- base = "Illegal character (code 0x"+Integer.toHexString(ch)+") in base64 content";
- } else {
- base = "Illegal character '"+((char)ch)+"' (code 0x"+Integer.toHexString(ch)+") in base64 content";
- }
- if (msg != null) {
- base = base + ": " + msg;
- }
- return new IllegalArgumentException(base);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserMinimalBase.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserMinimalBase.java
deleted file mode 100644
index 3fdb84658..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/ParserMinimalBase.java
+++ /dev/null
@@ -1,574 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.base;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.JsonParser.Feature;
-import com.fr.third.fasterxml.jackson.core.io.NumberInput;
-import com.fr.third.fasterxml.jackson.core.util.ByteArrayBuilder;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.*;
-
-/**
- * Intermediate base class used by all Jackson {@link JsonParser}
- * implementations, but does not add any additional fields that depend
- * on particular method of obtaining input.
- *
- * Note that 'minimal' here mostly refers to minimal number of fields
- * (size) and functionality that is specific to certain types
- * of parser implementations; but not necessarily to number of methods.
- */
-public abstract class ParserMinimalBase
- extends JsonParser
-{
- // Control chars:
- protected final static int INT_TAB = '\t';
- protected final static int INT_LF = '\n';
- protected final static int INT_CR = '\r';
- protected final static int INT_SPACE = 0x0020;
-
- // Markup
- protected final static int INT_LBRACKET = '[';
- protected final static int INT_RBRACKET = ']';
- protected final static int INT_LCURLY = '{';
- protected final static int INT_RCURLY = '}';
- protected final static int INT_QUOTE = '"';
- protected final static int INT_BACKSLASH = '\\';
- protected final static int INT_SLASH = '/';
- protected final static int INT_COLON = ':';
- protected final static int INT_COMMA = ',';
-
- /*
- /**********************************************************
- /* Minimal generally useful state
- /**********************************************************
- */
-
- /**
- * Last token retrieved via {@link #nextToken}, if any.
- * Null before the first call to nextToken()
,
- * as well as if token has been explicitly cleared
- */
- protected JsonToken _currToken;
-
- /**
- * Last cleared token, if any: that is, value that was in
- * effect when {@link #clearCurrentToken} was called.
- */
- protected JsonToken _lastClearedToken;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected ParserMinimalBase() { }
- protected ParserMinimalBase(int features) {
- super(features);
- }
-
- @Override
- public Version version() {
- return VersionUtil.versionFor(getClass());
- }
-
- /*
- /**********************************************************
- /* Configuration overrides if any
- /**********************************************************
- */
-
- // from base class:
-
- //public void enableFeature(Feature f)
- //public void disableFeature(Feature f)
- //public void setFeature(Feature f, boolean state)
- //public boolean isFeatureEnabled(Feature f)
-
- /*
- /**********************************************************
- /* JsonParser impl
- /**********************************************************
- */
-
- @Override
- public abstract JsonToken nextToken() throws IOException, JsonParseException;
-
- @Override
- public JsonToken getCurrentToken() {
- return _currToken;
- }
-
- @Override
- public final int getCurrentTokenId() {
- final JsonToken t = _currToken;
- return (t == null) ? JsonTokenId.ID_NO_TOKEN : t.id();
- }
-
- @Override
- public boolean hasCurrentToken() {
- return _currToken != null;
- }
-
- @Override
- public JsonToken nextValue()
- throws IOException, JsonParseException
- {
- /* Implementation should be as trivial as follows; only
- * needs to change if we are to skip other tokens (for
- * example, if comments were exposed as tokens)
- */
- JsonToken t = nextToken();
- if (t == JsonToken.FIELD_NAME) {
- t = nextToken();
- }
- return t;
- }
-
- @Override
- public JsonParser skipChildren() throws IOException, JsonParseException
- {
- if (_currToken != JsonToken.START_OBJECT
- && _currToken != JsonToken.START_ARRAY) {
- return this;
- }
- int open = 1;
-
- /* Since proper matching of start/end markers is handled
- * by nextToken(), we'll just count nesting levels here
- */
- while (true) {
- JsonToken t = nextToken();
- if (t == null) {
- _handleEOF();
- /* given constraints, above should never return;
- * however, FindBugs doesn't know about it and
- * complains... so let's add dummy break here
- */
- return this;
- }
- if (t.isStructStart()) {
- ++open;
- } else if (t.isStructEnd()) {
- if (--open == 0) {
- return this;
- }
- }
- }
- }
-
- /**
- * Method sub-classes need to implement
- */
- protected abstract void _handleEOF() throws JsonParseException;
-
- //public JsonToken getCurrentToken()
-
- //public boolean hasCurrentToken()
-
- @Override
- public abstract String getCurrentName() throws IOException, JsonParseException;
-
- @Override
- public abstract void close() throws IOException;
-
- @Override
- public abstract boolean isClosed();
-
- @Override
- public abstract JsonStreamContext getParsingContext();
-
-// public abstract JsonLocation getTokenLocation();
-
-// public abstract JsonLocation getCurrentLocation();
-
- /*
- /**********************************************************
- /* Public API, token state overrides
- /**********************************************************
- */
-
- @Override
- public void clearCurrentToken() {
- if (_currToken != null) {
- _lastClearedToken = _currToken;
- _currToken = null;
- }
- }
-
- @Override
- public JsonToken getLastClearedToken() {
- return _lastClearedToken;
- }
-
- @Override
- public abstract void overrideCurrentName(String name);
-
- /*
- /**********************************************************
- /* Public API, access to token information, text
- /**********************************************************
- */
-
- @Override
- public abstract String getText() throws IOException, JsonParseException;
-
- @Override
- public abstract char[] getTextCharacters() throws IOException, JsonParseException;
-
- @Override
- public abstract boolean hasTextCharacters();
-
- @Override
- public abstract int getTextLength() throws IOException, JsonParseException;
-
- @Override
- public abstract int getTextOffset() throws IOException, JsonParseException;
-
- /*
- /**********************************************************
- /* Public API, access to token information, binary
- /**********************************************************
- */
-
- @Override
- public abstract byte[] getBinaryValue(Base64Variant b64variant)
- throws IOException, JsonParseException;
-
- /*
- /**********************************************************
- /* Public API, access with conversion/coercion
- /**********************************************************
- */
-
- @Override
- public boolean getValueAsBoolean(boolean defaultValue) throws IOException, JsonParseException
- {
- JsonToken t = _currToken;
- if (t != null) {
- switch (t.id()) {
- case ID_STRING:
- String str = getText().trim();
- if ("true".equals(str)) {
- return true;
- }
- if ("false".equals(str)) {
- return false;
- }
- if (_hasTextualNull(str)) {
- return false;
- }
- break;
- case ID_NUMBER_INT:
- return getIntValue() != 0;
- case ID_TRUE:
- return true;
- case ID_FALSE:
- case ID_NULL:
- return false;
- case ID_EMBEDDED_OBJECT:
- Object value = this.getEmbeddedObject();
- if (value instanceof Boolean) {
- return (Boolean) value;
- }
- break;
- default:
- }
- }
- return defaultValue;
- }
-
- @Override
- public int getValueAsInt(int defaultValue) throws IOException, JsonParseException
- {
- JsonToken t = _currToken;
- if (t != null) {
- switch (t.id()) {
- case ID_STRING:
- String str = getText();
- if (_hasTextualNull(str)) {
- return 0;
- }
- return NumberInput.parseAsInt(str, defaultValue);
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return getIntValue();
- case ID_TRUE:
- return 1;
- case ID_FALSE:
- return 0;
- case ID_NULL:
- return 0;
- case ID_EMBEDDED_OBJECT:
- Object value = this.getEmbeddedObject();
- if (value instanceof Number) {
- return ((Number) value).intValue();
- }
- }
- }
- return defaultValue;
- }
-
- @Override
- public long getValueAsLong(long defaultValue) throws IOException, JsonParseException
- {
- JsonToken t = _currToken;
- if (t != null) {
- switch (t.id()) {
- case ID_STRING:
- String str = getText();
- if (_hasTextualNull(str)) {
- return 0L;
- }
- return NumberInput.parseAsLong(str, defaultValue);
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return getLongValue();
- case ID_TRUE:
- return 1L;
- case ID_FALSE:
- case ID_NULL:
- return 0L;
- case ID_EMBEDDED_OBJECT:
- Object value = this.getEmbeddedObject();
- if (value instanceof Number) {
- return ((Number) value).longValue();
- }
- }
- }
- return defaultValue;
- }
-
- @Override
- public double getValueAsDouble(double defaultValue) throws IOException, JsonParseException
- {
- JsonToken t = _currToken;
- if (t != null) {
- switch (t.id()) {
- case ID_STRING:
- String str = getText();
- if (_hasTextualNull(str)) {
- return 0L;
- }
- return NumberInput.parseAsDouble(str, defaultValue);
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return getDoubleValue();
- case ID_TRUE:
- return 1.0;
- case ID_FALSE:
- case ID_NULL:
- return 0.0;
- case ID_EMBEDDED_OBJECT:
- Object value = this.getEmbeddedObject();
- if (value instanceof Number) {
- return ((Number) value).doubleValue();
- }
- }
- }
- return defaultValue;
- }
-
- @Override
- public String getValueAsString(String defaultValue) throws IOException, JsonParseException
- {
- if (_currToken != JsonToken.VALUE_STRING) {
- if (_currToken == null || _currToken == JsonToken.VALUE_NULL || !_currToken.isScalarValue()) {
- return defaultValue;
- }
- }
- return getText();
- }
-
- /*
- /**********************************************************
- /* Base64 decoding
- /**********************************************************
- */
-
- /**
- * Helper method that can be used for base64 decoding in cases where
- * encoded content has already been read as a String.
- */
- protected void _decodeBase64(String str, ByteArrayBuilder builder, Base64Variant b64variant)
- throws IOException, JsonParseException
- {
- // just call helper method introduced in 2.2.3
- try {
- b64variant.decode(str, builder);
- } catch (IllegalArgumentException e) {
- _reportError(e.getMessage());
- }
- }
-
- /**
- * @param bindex Relative index within base64 character unit; between 0
- * and 3 (as unit has exactly 4 characters)
- *
- * @deprecated in 2.2.3; should migrate away
- */
- @Deprecated
- protected void _reportInvalidBase64(Base64Variant b64variant, char ch, int bindex, String msg)
- throws JsonParseException
- {
- String base;
- if (ch <= INT_SPACE) {
- base = "Illegal white space character (code 0x"+Integer.toHexString(ch)+") as character #"+(bindex+1)+" of 4-char base64 unit: can only used between units";
- } else if (b64variant.usesPaddingChar(ch)) {
- base = "Unexpected padding character ('"+b64variant.getPaddingChar()+"') as character #"+(bindex+1)+" of 4-char base64 unit: padding only legal as 3rd or 4th character";
- } else if (!Character.isDefined(ch) || Character.isISOControl(ch)) {
- // Not sure if we can really get here... ? (most illegal xml chars are caught at lower level)
- base = "Illegal character (code 0x"+Integer.toHexString(ch)+") in base64 content";
- } else {
- base = "Illegal character '"+ch+"' (code 0x"+Integer.toHexString(ch)+") in base64 content";
- }
- if (msg != null) {
- base = base + ": " + msg;
- }
- throw _constructError(base);
- }
-
- /**
- *
- * @deprecated in 2.2.3; should migrate away
- */
- @Deprecated
- protected void _reportBase64EOF() throws JsonParseException {
- throw _constructError("Unexpected end-of-String in base64 content");
- }
-
- /*
- /**********************************************************
- /* Coercion helper methods (overridable)
- /**********************************************************
- */
-
- /**
- * Helper method used to determine whether we are currently pointing to
- * a String value of "null" (NOT a null token); and, if so, that parser
- * is to recognize and return it similar to if it was real null token.
- *
- * @since 2.3
- */
- protected boolean _hasTextualNull(String value) {
- return "null".equals(value);
- }
-
- /*
- /**********************************************************
- /* Error reporting
- /**********************************************************
- */
-
- protected void _reportUnexpectedChar(int ch, String comment)
- throws JsonParseException
- {
- if (ch < 0) { // sanity check
- _reportInvalidEOF();
- }
- String msg = "Unexpected character ("+_getCharDesc(ch)+")";
- if (comment != null) {
- msg += ": "+comment;
- }
- _reportError(msg);
- }
-
- protected void _reportInvalidEOF()
- throws JsonParseException
- {
- _reportInvalidEOF(" in "+_currToken);
- }
-
- protected void _reportInvalidEOF(String msg)
- throws JsonParseException
- {
- _reportError("Unexpected end-of-input"+msg);
- }
-
- protected void _reportInvalidEOFInValue() throws JsonParseException {
- _reportInvalidEOF(" in a value");
- }
-
- protected void _reportMissingRootWS(int ch) throws JsonParseException {
- _reportUnexpectedChar(ch, "Expected space separating root-level values");
- }
-
- protected void _throwInvalidSpace(int i)
- throws JsonParseException
- {
- char c = (char) i;
- String msg = "Illegal character ("+_getCharDesc(c)+"): only regular white space (\\r, \\n, \\t) is allowed between tokens";
- _reportError(msg);
- }
-
- /**
- * Method called to report a problem with unquoted control character.
- * Note: starting with version 1.4, it is possible to suppress
- * exception by enabling {@link Feature#ALLOW_UNQUOTED_CONTROL_CHARS}.
- */
- protected void _throwUnquotedSpace(int i, String ctxtDesc)
- throws JsonParseException
- {
- // JACKSON-208; possible to allow unquoted control chars:
- if (!isEnabled(Feature.ALLOW_UNQUOTED_CONTROL_CHARS) || i >= INT_SPACE) {
- char c = (char) i;
- String msg = "Illegal unquoted character ("+_getCharDesc(c)+"): has to be escaped using backslash to be included in "+ctxtDesc;
- _reportError(msg);
- }
- }
-
- protected char _handleUnrecognizedCharacterEscape(char ch) throws JsonProcessingException
- {
- // as per [JACKSON-300]
- if (isEnabled(Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)) {
- return ch;
- }
- // and [JACKSON-548]
- if (ch == '\'' && isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
- return ch;
- }
- _reportError("Unrecognized character escape "+_getCharDesc(ch));
- return ch;
- }
-
- /*
- /**********************************************************
- /* Error reporting, generic
- /**********************************************************
- */
-
- protected final static String _getCharDesc(int ch)
- {
- char c = (char) ch;
- if (Character.isISOControl(c)) {
- return "(CTRL-CHAR, code "+ch+")";
- }
- if (ch > 255) {
- return "'"+c+"' (code "+ch+" / 0x"+Integer.toHexString(ch)+")";
- }
- return "'"+c+"' (code "+ch+")";
- }
-
- protected final void _reportError(String msg)
- throws JsonParseException
- {
- throw _constructError(msg);
- }
-
- protected final void _wrapError(String msg, Throwable t)
- throws JsonParseException
- {
- throw _constructError(msg, t);
- }
-
- protected final void _throwInternal() {
- VersionUtil.throwInternal();
- }
-
- protected final JsonParseException _constructError(String msg, Throwable t)
- {
- return new JsonParseException(msg, getCurrentLocation(), t);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/package-info.java
deleted file mode 100644
index 8b3a0bb92..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/base/package-info.java
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * Base classes used by concrete Parser and Generator implementations;
- * contain functionality that is not specific to JSON or input
- * abstraction (byte vs char).
- * Most formats extend these types, although it is also possible to
- * directly extend {@link com.fr.third.fasterxml.jackson.core.JsonParser} or
- * {@link com.fr.third.fasterxml.jackson.core.JsonGenerator}.
- */
-package com.fr.third.fasterxml.jackson.core.base;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatDetector.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatDetector.java
deleted file mode 100644
index 17dac4ac3..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatDetector.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.format;
-
-import java.io.*;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Simple helper class that allows data format (content type) auto-detection,
- * given an ordered set of {@link JsonFactory} instances to use for actual low-level
- * detection.
- */
-public class DataFormatDetector
-{
- /**
- * By default we will look ahead at most 64 bytes; in most cases,
- * much less (4 bytes or so) is needed, but we will allow bit more
- * leniency to support data formats that need more complex heuristics.
- */
- public final static int DEFAULT_MAX_INPUT_LOOKAHEAD = 64;
-
- /**
- * Ordered list of factories which both represent data formats to
- * detect (in precedence order, starting with highest) and are used
- * for actual detection.
- */
- protected final JsonFactory[] _detectors;
-
- /**
- * Strength of match we consider to be good enough to be used
- * without checking any other formats.
- * Default value is {@link MatchStrength#SOLID_MATCH},
- */
- protected final MatchStrength _optimalMatch;
-
- /**
- * Strength of minimal match we accept as the answer, unless
- * better matches are found.
- * Default value is {@link MatchStrength#WEAK_MATCH},
- */
- protected final MatchStrength _minimalMatch;
-
- /**
- * Maximum number of leading bytes of the input that we can read
- * to determine data format.
- *
- * Default value is {@link #DEFAULT_MAX_INPUT_LOOKAHEAD}.
- */
- protected final int _maxInputLookahead;
-
- /*
- /**********************************************************
- /* Construction
- /**********************************************************
- */
-
- public DataFormatDetector(JsonFactory... detectors) {
- this(detectors, MatchStrength.SOLID_MATCH, MatchStrength.WEAK_MATCH,
- DEFAULT_MAX_INPUT_LOOKAHEAD);
- }
-
- public DataFormatDetector(Collection detectors) {
- this(detectors.toArray(new JsonFactory[detectors.size()]));
- }
-
- /**
- * Method that will return a detector instance that uses given
- * optimal match level (match that is considered sufficient to return, without
- * trying to find stronger matches with other formats).
- */
- public DataFormatDetector withOptimalMatch(MatchStrength optMatch) {
- if (optMatch == _optimalMatch) {
- return this;
- }
- return new DataFormatDetector(_detectors, optMatch, _minimalMatch, _maxInputLookahead);
- }
- /**
- * Method that will return a detector instance that uses given
- * minimal match level; match that may be returned unless a stronger match
- * is found with other format detectors.
- */
- public DataFormatDetector withMinimalMatch(MatchStrength minMatch) {
- if (minMatch == _minimalMatch) {
- return this;
- }
- return new DataFormatDetector(_detectors, _optimalMatch, minMatch, _maxInputLookahead);
- }
-
- /**
- * Method that will return a detector instance that allows detectors to
- * read up to specified number of bytes when determining format match strength.
- */
- public DataFormatDetector withMaxInputLookahead(int lookaheadBytes)
- {
- if (lookaheadBytes == _maxInputLookahead) {
- return this;
- }
- return new DataFormatDetector(_detectors, _optimalMatch, _minimalMatch, lookaheadBytes);
- }
-
- private DataFormatDetector(JsonFactory[] detectors,
- MatchStrength optMatch, MatchStrength minMatch,
- int maxInputLookahead)
- {
- _detectors = detectors;
- _optimalMatch = optMatch;
- _minimalMatch = minMatch;
- _maxInputLookahead = maxInputLookahead;
- }
-
- /*
- /**********************************************************
- /* Public API
- /**********************************************************
- */
-
- /**
- * Method to call to find format that content (accessible via given
- * {@link InputStream}) given has, as per configuration of this detector
- * instance.
- *
- * @return Matcher object which contains result; never null, even in cases
- * where no match (with specified minimal match strength) is found.
- */
- public DataFormatMatcher findFormat(InputStream in) throws IOException
- {
- return _findFormat(new InputAccessor.Std(in, new byte[_maxInputLookahead]));
- }
-
- /**
- * Method to call to find format that given content (full document)
- * has, as per configuration of this detector instance.
- *
- * @return Matcher object which contains result; never null, even in cases
- * where no match (with specified minimal match strength) is found.
- */
- public DataFormatMatcher findFormat(byte[] fullInputData) throws IOException
- {
- return _findFormat(new InputAccessor.Std(fullInputData));
- }
-
- /**
- * Method to call to find format that given content (full document)
- * has, as per configuration of this detector instance.
- *
- * @return Matcher object which contains result; never null, even in cases
- * where no match (with specified minimal match strength) is found.
- *
- * @since 2.1
- */
- public DataFormatMatcher findFormat(byte[] fullInputData, int offset, int len) throws IOException
- {
- return _findFormat(new InputAccessor.Std(fullInputData, offset, len));
- }
-
- /*
- /**********************************************************
- /* Overrides
- /**********************************************************
- */
-
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder();
- sb.append('[');
- final int len = _detectors.length;
- if (len > 0) {
- sb.append(_detectors[0].getFormatName());
- for (int i = 1; i < len; ++i) {
- sb.append(", ");
- sb.append(_detectors[i].getFormatName());
- }
- }
- sb.append(']');
- return sb.toString();
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private DataFormatMatcher _findFormat(InputAccessor.Std acc) throws IOException
- {
- JsonFactory bestMatch = null;
- MatchStrength bestMatchStrength = null;
- for (JsonFactory f : _detectors) {
- acc.reset();
- MatchStrength strength = f.hasFormat(acc);
- // if not better than what we have so far (including minimal level limit), skip
- if (strength == null || strength.ordinal() < _minimalMatch.ordinal()) {
- continue;
- }
- // also, needs to better match than before
- if (bestMatch != null) {
- if (bestMatchStrength.ordinal() >= strength.ordinal()) {
- continue;
- }
- }
- // finally: if it's good enough match, we are done
- bestMatch = f;
- bestMatchStrength = strength;
- if (strength.ordinal() >= _optimalMatch.ordinal()) {
- break;
- }
- }
- return acc.createMatcher(bestMatch, bestMatchStrength);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatMatcher.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatMatcher.java
deleted file mode 100644
index e87c11893..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/DataFormatMatcher.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.format;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.JsonFactory;
-import com.fr.third.fasterxml.jackson.core.JsonParser;
-import com.fr.third.fasterxml.jackson.core.io.MergedStream;
-
-/**
- * Result object constructed by {@link DataFormatDetector} when requested
- * to detect format of given input data.
- */
-public class DataFormatMatcher
-{
- protected final InputStream _originalStream;
-
- /**
- * Content read during format matching process
- */
- protected final byte[] _bufferedData;
-
- /**
- * Pointer to the first byte in buffer available for reading
- */
- protected final int _bufferedStart;
-
- /**
- * Number of bytes available in buffer.
- */
- protected final int _bufferedLength;
-
- /**
- * Factory that produced sufficient match (if any)
- */
- protected final JsonFactory _match;
-
- /**
- * Strength of match with {@link #_match}
- */
- protected final MatchStrength _matchStrength;
-
- protected DataFormatMatcher(InputStream in, byte[] buffered,
- int bufferedStart, int bufferedLength,
- JsonFactory match, MatchStrength strength)
- {
- _originalStream = in;
- _bufferedData = buffered;
- _bufferedStart = bufferedStart;
- _bufferedLength = bufferedLength;
- _match = match;
- _matchStrength = strength;
- }
-
- /*
- /**********************************************************
- /* Public API, simple accessors
- /**********************************************************
- */
-
- /**
- * Accessor to use to see if any formats matched well enough with
- * the input data.
- */
- public boolean hasMatch() { return _match != null; }
-
- /**
- * Method for accessing strength of the match, if any; if no match,
- * will return {@link MatchStrength#INCONCLUSIVE}.
- */
- public MatchStrength getMatchStrength() {
- return (_matchStrength == null) ? MatchStrength.INCONCLUSIVE : _matchStrength;
- }
-
- /**
- * Accessor for {@link JsonFactory} that represents format that data matched.
- */
- public JsonFactory getMatch() { return _match; }
-
- /**
- * Accessor for getting brief textual name of matched format if any (null
- * if none). Equivalent to:
- *
- * return hasMatch() ? getMatch().getFormatName() : null;
- *
- */
- public String getMatchedFormatName() {
- return _match.getFormatName();
- }
-
- /*
- /**********************************************************
- /* Public API, factory methods
- /**********************************************************
- */
-
- /**
- * Convenience method for trying to construct a {@link JsonParser} for
- * parsing content which is assumed to be in detected data format.
- * If no match was found, returns null.
- */
- public JsonParser createParserWithMatch() throws IOException {
- if (_match == null) {
- return null;
- }
- if (_originalStream == null) {
- return _match.createParser(_bufferedData, _bufferedStart, _bufferedLength);
- }
- return _match.createParser(getDataStream());
- }
-
- /**
- * Method to use for accessing input for which format detection has been done.
- * This must be used instead of using stream passed to detector
- * unless given stream itself can do buffering.
- * Stream will return all content that was read during matching process, as well
- * as remaining contents of the underlying stream.
- */
- public InputStream getDataStream() {
- if (_originalStream == null) {
- return new ByteArrayInputStream(_bufferedData, _bufferedStart, _bufferedLength);
- }
- return new MergedStream(null, _originalStream, _bufferedData, _bufferedStart, _bufferedLength);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/InputAccessor.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/InputAccessor.java
deleted file mode 100644
index 5bdf10e2a..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/InputAccessor.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.format;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.JsonFactory;
-
-/**
- * Interface used to expose beginning of a data file to data format
- * detection code.
- */
-public interface InputAccessor
-{
- /**
- * Method to call to check if more input is available.
- * Since this may result in more content to be read (at least
- * one more byte), a {@link IOException} may get thrown.
- */
- boolean hasMoreBytes() throws IOException;
-
- /**
- * Returns next byte available, if any; if no more bytes are
- * available, will throw {@link java.io.EOFException}.
- */
- byte nextByte() throws IOException;
-
- /**
- * Method that can be called to reset accessor to read from beginning
- * of input.
- */
- void reset();
-
- /*
- /**********************************************************
- /* Standard implementation
- /**********************************************************
- */
-
- /**
- * Basic implementation that reads data from given
- * {@link InputStream} and buffers it as necessary.
- */
- class Std implements InputAccessor
- {
- protected final InputStream _in;
-
- protected final byte[] _buffer;
-
- protected final int _bufferedStart;
-
- /**
- * End of valid bytes in the buffer (points to one past last valid)
- */
- protected int _bufferedEnd;
-
- /**
- * Pointer to next available buffered byte in {@link #_buffer}.
- */
- protected int _ptr;
-
- /**
- * Constructor used when content to check is available via
- * input stream and must be read.
- */
- public Std(InputStream in, byte[] buffer)
- {
- _in = in;
- _buffer = buffer;
- _bufferedStart = 0;
- _ptr = 0;
- _bufferedEnd = 0;
- }
-
- /**
- * Constructor used when the full input (or at least enough leading bytes
- * of full input) is available.
- */
- public Std(byte[] inputDocument)
- {
- _in = null;
- _buffer = inputDocument;
- // we have it all:
- _bufferedStart = 0;
- _bufferedEnd = inputDocument.length;
- }
-
- /**
- * Constructor used when the full input (or at least enough leading bytes
- * of full input) is available.
- *
- * @since 2.1
- */
- public Std(byte[] inputDocument, int start, int len)
- {
- _in = null;
- _buffer = inputDocument;
- _ptr = start;
- _bufferedStart = start;
- _bufferedEnd = start+len;
- }
-
- @Override
- public boolean hasMoreBytes() throws IOException
- {
- if (_ptr < _bufferedEnd) { // already got more
- return true;
- }
- if (_in == null) { // nowhere to read from
- return false;
- }
- int amount = _buffer.length - _ptr;
- if (amount < 1) { // can not load any more
- return false;
- }
- int count = _in.read(_buffer, _ptr, amount);
- if (count <= 0) { // EOF
- return false;
- }
- _bufferedEnd += count;
- return true;
- }
-
- @Override
- public byte nextByte() throws IOException
- {
- // should we just try loading more automatically?
- if (_ptr >= _bufferedEnd) {
- if (!hasMoreBytes()) {
- throw new EOFException("Failed auto-detect: could not read more than "+_ptr+" bytes (max buffer size: "+_buffer.length+")");
- }
- }
- return _buffer[_ptr++];
- }
-
- @Override
- public void reset() {
- _ptr = _bufferedStart;
- }
-
- /*
- /**********************************************************
- /* Extended API for DataFormatDetector/Matcher
- /**********************************************************
- */
-
- public DataFormatMatcher createMatcher(JsonFactory match, MatchStrength matchStrength)
- {
- return new DataFormatMatcher(_in, _buffer, _bufferedStart, (_bufferedEnd - _bufferedStart),
- match, matchStrength);
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/MatchStrength.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/MatchStrength.java
deleted file mode 100644
index d34f59e5b..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/MatchStrength.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.format;
-
-/**
- * Enumeration used to indicate strength of match between data format
- * and piece of data (typically beginning of a data file).
- * Values are in increasing match strength; and detectors should return
- * "strongest" value: that is, it should start with strongest match
- * criteria, and downgrading if criteria is not fulfilled.
- */
-public enum MatchStrength
-{
- /**
- * Value that indicates that given data can not be in given format.
- */
- NO_MATCH,
-
- /**
- * Value that indicates that detector can not find out whether could
- * be a match or not.
- * This can occur for example for textual data formats t
- * when there are so many leading spaces that detector can not
- * find the first data byte (because detectors typically limit lookahead
- * to some smallish value).
- */
- INCONCLUSIVE,
-
- /**
- * Value that indicates that given data could be of specified format (i.e.
- * it can not be ruled out). This can occur for example when seen data
- * is both not in canonical formats (for example: JSON data should be a JSON Array or Object
- * not a scalar value, as per JSON specification) and there are known use case
- * where a format detected is actually used (plain JSON Strings are actually used, even
- * though specification does not indicate that as valid usage: as such, seeing a leading
- * double-quote could indicate a JSON String, which plausibly could indicate
- * non-standard JSON usage).
- */
- WEAK_MATCH,
-
- /**
- * Value that indicates that given data conforms to (one of) canonical form(s) of
- * the data format.
- *
- * For example, when testing for XML data format,
- * seeing a less-than character ("<") alone (with possible leading spaces)
- * would be a strong indication that data could
- * be in xml format (but see below for {@link #FULL_MATCH} description for more)
- */
- SOLID_MATCH,
-
- /**
- * Value that indicates that given data contains a signature that is deemed
- * specific enough to uniquely indicate data format used.
- *
- * For example, when testing for XML data format,
- * seing "<xml" as the first data bytes ("XML declaration", as per XML specification)
- * could give full confidence that data is indeed in XML format.
- * Not all data formats have unique leading identifiers to allow full matches; for example,
- * JSON only has heuristic matches and can have at most {@link #SOLID_MATCH}) match.
- */
- FULL_MATCH
- ;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/package-info.java
deleted file mode 100644
index a43b67ab4..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/format/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Package that contains interfaces needed for dynamic, pluggable
- * format (auto)detection; as well as basic utility classes for
- * simple format detection functionality.
- */
-package com.fr.third.fasterxml.jackson.core.format;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/BaseReader.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/BaseReader.java
deleted file mode 100644
index 8ab9ba6a9..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/BaseReader.java
+++ /dev/null
@@ -1,116 +0,0 @@
-
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-/**
- * 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 _context;
-
- protected InputStream _in;
-
- protected byte[] _buffer;
-
- protected int _ptr;
- protected int _length;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected BaseReader(IOContext context,
- InputStream in, byte[] buf, int ptr, int len)
- {
- _context = context;
- _in = in;
- _buffer = buf;
- _ptr = ptr;
- _length = len;
- }
-
- /*
- /**********************************************************
- /* Reader API
- /**********************************************************
- */
-
- @Override
- public void close() throws IOException
- {
- InputStream in = _in;
-
- if (in != null) {
- _in = null;
- freeBuffers();
- in.close();
- }
- }
-
- protected char[] _tmpBuf = 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
- */
- @Override
- public int read() throws IOException
- {
- if (_tmpBuf == null) {
- _tmpBuf = new char[1];
- }
- if (read(_tmpBuf, 0, 1) < 1) {
- return -1;
- }
- return _tmpBuf[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 = _buffer;
- if (buf != null) {
- _buffer = null;
- _context.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");
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharTypes.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharTypes.java
deleted file mode 100644
index 241e0901b..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharTypes.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.util.Arrays;
-
-public final class CharTypes
-{
- private final static char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
- private final static byte[] HEX_BYTES;
- static {
- int len = HEX_CHARS.length;
- HEX_BYTES = new byte[len];
- for (int i = 0; i < len; ++i) {
- HEX_BYTES[i] = (byte) HEX_CHARS[i];
- }
- }
-
-
- /**
- * Lookup table used for determining which input characters
- * need special handling when contained in text segment.
- */
- final static int[] sInputCodes;
- static {
- /* 96 would do for most cases (backslash is ascii 94)
- * but if we want to do lookups by raw bytes it's better
- * to have full table
- */
- final int[] table = new int[256];
- // Control chars and non-space white space are not allowed unquoted
- for (int i = 0; i < 32; ++i) {
- table[i] = -1;
- }
- // And then string end and quote markers are special too
- table['"'] = 1;
- table['\\'] = 1;
- sInputCodes = table;
- }
-
- /**
- * Additionally we can combine UTF-8 decoding info into similar
- * data table.
- */
- final static int[] sInputCodesUTF8;
- static {
- final int[] table = new int[sInputCodes.length];
- System.arraycopy(sInputCodes, 0, table, 0, table.length);
- for (int c = 128; c < 256; ++c) {
- int code;
-
- // We'll add number of bytes needed for decoding
- if ((c & 0xE0) == 0xC0) { // 2 bytes (0x0080 - 0x07FF)
- code = 2;
- } else if ((c & 0xF0) == 0xE0) { // 3 bytes (0x0800 - 0xFFFF)
- code = 3;
- } else if ((c & 0xF8) == 0xF0) {
- // 4 bytes; double-char with surrogates and all...
- code = 4;
- } else {
- // And -1 seems like a good "universal" error marker...
- code = -1;
- }
- table[c] = code;
- }
- sInputCodesUTF8 = table;
- }
-
- /**
- * To support non-default (and -standard) unquoted field names mode,
- * need to have alternate checking.
- * Basically this is list of 8-bit ASCII characters that are legal
- * as part of Javascript identifier
- */
- final static int[] sInputCodesJsNames;
- static {
- final int[] table = new int[256];
- // Default is "not a name char", mark ones that are
- Arrays.fill(table, -1);
- // Assume rules with JS same as Java (change if/as needed)
- for (int i = 33; i < 256; ++i) {
- if (Character.isJavaIdentifierPart((char) i)) {
- table[i] = 0;
- }
- }
- /* As per [JACKSON-267], '@', '#' and '*' are also to be accepted as well.
- * And '-' (for hyphenated names); and '+' for sake of symmetricity...
- */
- table['@'] = 0;
- table['#'] = 0;
- table['*'] = 0;
- table['-'] = 0;
- table['+'] = 0;
- sInputCodesJsNames = table;
- }
-
- /**
- * This table is similar to Latin-1, except that it marks all "high-bit"
- * code as ok. They will be validated at a later point, when decoding
- * name
- */
- final static int[] sInputCodesUtf8JsNames;
- static {
- final int[] table = new int[256];
- // start with 8-bit JS names
- System.arraycopy(sInputCodesJsNames, 0, table, 0, table.length);
- Arrays.fill(table, 128, 128, 0);
- sInputCodesUtf8JsNames = table;
- }
-
- /**
- * Decoding table used to quickly determine characters that are
- * relevant within comment content.
- */
- final static int[] sInputCodesComment;
- static {
- final int[] buf = new int[256];
- // but first: let's start with UTF-8 multi-byte markers:
- System.arraycopy(sInputCodesUTF8, 128, buf, 128, 128);
-
- // default (0) means "ok" (skip); -1 invalid, others marked by char itself
- Arrays.fill(buf, 0, 32, -1); // invalid white space
- buf['\t'] = 0; // tab is still fine
- buf['\n'] = '\n'; // lf/cr need to be observed, ends cpp comment
- buf['\r'] = '\r';
- buf['*'] = '*'; // end marker for c-style comments
- sInputCodesComment = buf;
- }
-
- /**
- * Decoding table used for skipping white space and comments.
- *
- * @since 2.3
- */
- final static int[] sInputCodesWS;
- static {
- // but first: let's start with UTF-8 multi-byte markers:
- final int[] buf = new int[256];
- System.arraycopy(sInputCodesUTF8, 128, buf, 128, 128);
-
- // default (0) means "not whitespace" (end); 1 "whitespace", -1 invalid,
- // 2-4 UTF-8 multi-bytes, others marked by char itself
- //
- Arrays.fill(buf, 0, 32, -1); // invalid white space
- buf[' '] = 1;
- buf['\t'] = 1;
- buf['\n'] = '\n'; // lf/cr need to be observed, ends cpp comment
- buf['\r'] = '\r';
- buf['/'] = '/'; // start marker for c/cpp comments
- buf['#'] = '#'; // start marker for YAML comments
- sInputCodesWS = buf;
- }
-
- /**
- * Lookup table used for determining which output characters in
- * 7-bit ASCII range need to be quoted.
- */
- final static int[] sOutputEscapes128;
- static {
- int[] table = new int[128];
- // Control chars need generic escape sequence
- for (int i = 0; i < 32; ++i) {
- // 04-Mar-2011, tatu: Used to use "-(i + 1)", replaced with constant
- table[i] = CharacterEscapes.ESCAPE_STANDARD;
- }
- /* Others (and some within that range too) have explicit shorter
- * sequences
- */
- table['"'] = '"';
- table['\\'] = '\\';
- // Escaping of slash is optional, so let's not add it
- table[0x08] = 'b';
- table[0x09] = 't';
- table[0x0C] = 'f';
- table[0x0A] = 'n';
- table[0x0D] = 'r';
- sOutputEscapes128 = table;
- }
-
- /**
- * Lookup table for the first 128 Unicode characters (7-bit ASCII)
- * range. For actual hex digits, contains corresponding value;
- * for others -1.
- */
- final static int[] sHexValues = new int[128];
- static {
- Arrays.fill(sHexValues, -1);
- for (int i = 0; i < 10; ++i) {
- sHexValues['0' + i] = i;
- }
- for (int i = 0; i < 6; ++i) {
- sHexValues['a' + i] = 10 + i;
- sHexValues['A' + i] = 10 + i;
- }
- }
-
- public static int[] getInputCodeLatin1() { return sInputCodes; }
- public static int[] getInputCodeUtf8() { return sInputCodesUTF8; }
-
- public static int[] getInputCodeLatin1JsNames() { return sInputCodesJsNames; }
- public static int[] getInputCodeUtf8JsNames() { return sInputCodesUtf8JsNames; }
-
- public static int[] getInputCodeComment() { return sInputCodesComment; }
- public static int[] getInputCodeWS() { return sInputCodesWS; }
-
- /**
- * Accessor for getting a read-only encoding table for first 128 Unicode
- * code points (single-byte UTF-8 characters).
- * Value of 0 means "no escaping"; other positive values that value is character
- * to use after backslash; and negative values that generic (backslash - u)
- * escaping is to be used.
- */
- public static int[] get7BitOutputEscapes() { return sOutputEscapes128; }
-
- public static int charToHex(int ch)
- {
- return (ch > 127) ? -1 : sHexValues[ch];
- }
-
- public static void appendQuoted(StringBuilder sb, String content)
- {
- final int[] escCodes = sOutputEscapes128;
- int escLen = escCodes.length;
- for (int i = 0, len = content.length(); i < len; ++i) {
- char c = content.charAt(i);
- if (c >= escLen || escCodes[c] == 0) {
- sb.append(c);
- continue;
- }
- sb.append('\\');
- int escCode = escCodes[c];
- if (escCode < 0) { // generic quoting (hex value)
- // The only negative value sOutputEscapes128 returns
- // is CharacterEscapes.ESCAPE_STANDARD, which mean
- // appendQuotes should encode using the Unicode encoding;
- // not sure if this is the right way to encode for
- // CharacterEscapes.ESCAPE_CUSTOM or other (future)
- // CharacterEscapes.ESCAPE_XXX values.
-
- // We know that it has to fit in just 2 hex chars
- sb.append('u');
- sb.append('0');
- sb.append('0');
- int value = c; // widening
- sb.append(HEX_CHARS[value >> 4]);
- sb.append(HEX_CHARS[value & 0xF]);
- } else { // "named", i.e. prepend with slash
- sb.append((char) escCode);
- }
- }
- }
-
- public static char[] copyHexChars()
- {
- return (char[]) HEX_CHARS.clone();
- }
-
- public static byte[] copyHexBytes()
- {
- return (byte[]) HEX_BYTES.clone();
- }
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharacterEscapes.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharacterEscapes.java
deleted file mode 100644
index ff6d8b9f4..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/CharacterEscapes.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import com.fr.third.fasterxml.jackson.core.SerializableString;
-import com.fr.third.fasterxml.jackson.core.util.ArraysCompat;
-
-/**
- * Abstract base class that defines interface for customizing character
- * escaping aspects for String values, for formats that use escaping.
- * For JSON this applies to both property names and String values.
- */
-public abstract class CharacterEscapes
- implements java.io.Serializable // since 2.1
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * Value used for lookup tables to indicate that matching characters
- * do not need to be escaped.
- */
- public final static int ESCAPE_NONE = 0;
-
- /**
- * Value used for lookup tables to indicate that matching characters
- * are to be escaped using standard escaping; for JSON this means
- * (for example) using "backslash - u" escape method.
- */
- public final static int ESCAPE_STANDARD = -1;
-
- /**
- * Value used for lookup tables to indicate that matching characters
- * will need custom escapes; and that another call
- * to {@link #getEscapeSequence} is needed to figure out exact escape
- * sequence to output.
- */
- public final static int ESCAPE_CUSTOM = -2;
-
- /**
- * Method generators can call to get lookup table for determining
- * escape handling for first 128 characters of Unicode (ASCII
- * characters. Caller is not to modify contents of this array, since
- * this is expected to be a shared copy.
- *
- * @return Array with size of at least 128, where first 128 entries
- * have either one of ESCAPE_xxx
constants, or non-zero positive
- * integer (meaning of which is data format specific; for JSON it means
- * that combination of backslash and character with that value is to be used)
- * to indicate that specific escape sequence is to be used.
- */
- public abstract int[] getEscapeCodesForAscii();
-
- /**
- * Method generators can call to get lookup table for determining
- * exact escape sequence to use for given character.
- * It can be called for any character, but typically is called for
- * either for ASCII characters for which custom escape
- * sequence is needed; or for any non-ASCII character.
- */
- public abstract SerializableString getEscapeSequence(int ch);
-
- /**
- * Helper method that can be used to get a copy of standard JSON
- * escape definitions; this is useful when just wanting to slightly
- * customize definitions. Caller can modify this array as it sees
- * fit and usually returns modified instance via {@link #getEscapeCodesForAscii}
- */
- public static int[] standardAsciiEscapesForJSON() {
- int[] esc = CharTypes.get7BitOutputEscapes();
- return ArraysCompat.copyOf(esc, esc.length);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/IOContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/IOContext.java
deleted file mode 100644
index 0b387c2b9..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/IOContext.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import com.fr.third.fasterxml.jackson.core.JsonEncoding;
-import com.fr.third.fasterxml.jackson.core.util.BufferRecycler;
-import com.fr.third.fasterxml.jackson.core.util.TextBuffer;
-
-/**
- * To limit number of configuration and state objects to pass, all
- * contextual objects that need to be passed by the factory to
- * readers and writers are combined under this object. One instance
- * is created for each reader and writer.
- *
- * NOTE: non-final since 2.4, to allow sub-classing.
- */
-public class IOContext
-{
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Reference to the source object, which can be used for displaying
- * location information
- */
- protected final Object _sourceRef;
-
- /**
- * Encoding used by the underlying stream, if known.
- */
- protected JsonEncoding _encoding;
-
- /**
- * Flag that indicates whether underlying input/output source/target
- * object is fully managed by the owner of this context (parser or
- * generator). If true, it is, and is to be closed by parser/generator;
- * if false, calling application has to do closing (unless auto-closing
- * feature is enabled for the parser/generator in question; in which
- * case it acts like the owner).
- */
- protected final boolean _managedResource;
-
- /*
- /**********************************************************
- /* Buffer handling, recycling
- /**********************************************************
- */
-
- /**
- * Recycler used for actual allocation/deallocation/reuse
- */
- protected final BufferRecycler _bufferRecycler;
-
- /**
- * Reference to the allocated I/O buffer for low-level input reading,
- * if any allocated.
- */
- protected byte[] _readIOBuffer = null;
-
- /**
- * Reference to the allocated I/O buffer used for low-level
- * encoding-related buffering.
- */
- protected byte[] _writeEncodingBuffer = null;
-
- /**
- * Reference to the buffer allocated for temporary use with
- * base64 encoding or decoding.
- */
- protected byte[] _base64Buffer = null;
-
- /**
- * Reference to the buffer allocated for tokenization purposes,
- * in which character input is read, and from which it can be
- * further returned.
- */
- protected char[] _tokenCBuffer = null;
-
- /**
- * Reference to the buffer allocated for buffering it for
- * output, before being encoded: generally this means concatenating
- * output, then encoding when buffer fills up.
- */
- protected char[] _concatCBuffer = null;
-
- /**
- * Reference temporary buffer Parser instances need if calling
- * app decides it wants to access name via 'getTextCharacters' method.
- * Regular text buffer can not be used as it may contain textual
- * representation of the value token.
- */
- protected char[] _nameCopyBuffer = null;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public IOContext(BufferRecycler br, Object sourceRef, boolean managedResource)
- {
- _bufferRecycler = br;
- _sourceRef = sourceRef;
- _managedResource = managedResource;
- }
-
- public void setEncoding(JsonEncoding enc) {
- _encoding = enc;
- }
-
- /*
- /**********************************************************
- /* Public API, accessors
- /**********************************************************
- */
-
- public Object getSourceReference() { return _sourceRef; }
- public JsonEncoding getEncoding() { return _encoding; }
- public boolean isResourceManaged() { return _managedResource; }
-
- /*
- /**********************************************************
- /* Public API, buffer management
- /**********************************************************
- */
-
- public TextBuffer constructTextBuffer() {
- return new TextBuffer(_bufferRecycler);
- }
-
- /**
- *
- * Note: the method can only be called once during its life cycle.
- * This is to protect against accidental sharing.
- */
- public byte[] allocReadIOBuffer() {
- _verifyAlloc(_readIOBuffer);
- return (_readIOBuffer = _bufferRecycler.allocByteBuffer(BufferRecycler.ByteBufferType.READ_IO_BUFFER));
- }
-
- /**
- * @since 2.3.2
- */
- public byte[] allocReadIOBuffer(int minSize) {
- _verifyAlloc(_readIOBuffer);
- return (_readIOBuffer = _bufferRecycler.allocByteBuffer(BufferRecycler.ByteBufferType.READ_IO_BUFFER, minSize));
- }
-
- public byte[] allocWriteEncodingBuffer() {
- _verifyAlloc(_writeEncodingBuffer);
- return (_writeEncodingBuffer = _bufferRecycler.allocByteBuffer(BufferRecycler.ByteBufferType.WRITE_ENCODING_BUFFER));
- }
-
- /**
- * @since 2.3.2
- */
- public byte[] allocWriteEncodingBuffer(int minSize) {
- _verifyAlloc(_writeEncodingBuffer);
- return (_writeEncodingBuffer = _bufferRecycler.allocByteBuffer(BufferRecycler.ByteBufferType.WRITE_ENCODING_BUFFER, minSize));
- }
-
- /**
- * @since 2.1
- */
- public byte[] allocBase64Buffer() {
- _verifyAlloc(_base64Buffer);
- return (_base64Buffer = _bufferRecycler.allocByteBuffer(BufferRecycler.ByteBufferType.BASE64_CODEC_BUFFER));
- }
-
- public char[] allocTokenBuffer() {
- _verifyAlloc(_tokenCBuffer);
- return (_tokenCBuffer = _bufferRecycler.allocCharBuffer(BufferRecycler.CharBufferType.TOKEN_BUFFER));
- }
-
- public char[] allocConcatBuffer() {
- _verifyAlloc(_concatCBuffer);
- return (_concatCBuffer = _bufferRecycler.allocCharBuffer(BufferRecycler.CharBufferType.CONCAT_BUFFER));
- }
-
- public char[] allocNameCopyBuffer(int minSize) {
- _verifyAlloc(_nameCopyBuffer);
- return (_nameCopyBuffer = _bufferRecycler.allocCharBuffer(BufferRecycler.CharBufferType.NAME_COPY_BUFFER, minSize));
- }
-
- /**
- * Method to call when all the processing buffers can be safely
- * recycled.
- */
- public void releaseReadIOBuffer(byte[] buf) {
- if (buf != null) {
- /* Let's do sanity checks to ensure once-and-only-once release,
- * as well as avoiding trying to release buffers not owned
- */
- _verifyRelease(buf, _readIOBuffer);
- _readIOBuffer = null;
- _bufferRecycler.releaseByteBuffer(BufferRecycler.ByteBufferType.READ_IO_BUFFER, buf);
- }
- }
-
- public void releaseWriteEncodingBuffer(byte[] buf) {
- if (buf != null) {
- /* Let's do sanity checks to ensure once-and-only-once release,
- * as well as avoiding trying to release buffers not owned
- */
- _verifyRelease(buf, _writeEncodingBuffer);
- _writeEncodingBuffer = null;
- _bufferRecycler.releaseByteBuffer(BufferRecycler.ByteBufferType.WRITE_ENCODING_BUFFER, buf);
- }
- }
-
- public void releaseBase64Buffer(byte[] buf) {
- if (buf != null) { // sanity checks, release once-and-only-once, must be one owned
- _verifyRelease(buf, _base64Buffer);
- _base64Buffer = null;
- _bufferRecycler.releaseByteBuffer(BufferRecycler.ByteBufferType.BASE64_CODEC_BUFFER, buf);
- }
- }
-
- public void releaseTokenBuffer(char[] buf) {
- if (buf != null) {
- _verifyRelease(buf, _tokenCBuffer);
- _tokenCBuffer = null;
- _bufferRecycler.releaseCharBuffer(BufferRecycler.CharBufferType.TOKEN_BUFFER, buf);
- }
- }
-
- public void releaseConcatBuffer(char[] buf) {
- if (buf != null) {
- // 14-Jan-2014, tatu: Let's actually allow upgrade of the original buffer.
- _verifyRelease(buf, _concatCBuffer);
- _concatCBuffer = null;
- _bufferRecycler.releaseCharBuffer(BufferRecycler.CharBufferType.CONCAT_BUFFER, buf);
- }
- }
-
- public void releaseNameCopyBuffer(char[] buf) {
- if (buf != null) {
- // 14-Jan-2014, tatu: Let's actually allow upgrade of the original buffer.
- _verifyRelease(buf, _nameCopyBuffer);
- _nameCopyBuffer = null;
- _bufferRecycler.releaseCharBuffer(BufferRecycler.CharBufferType.NAME_COPY_BUFFER, buf);
- }
- }
-
- /*
- /**********************************************************
- /* Internal helpers
- /**********************************************************
- */
-
- protected void _verifyAlloc(Object buffer) {
- if (buffer != null) { throw new IllegalStateException("Trying to call same allocXxx() method second time"); }
- }
-
- protected void _verifyRelease(byte[] toRelease, byte[] src) {
- if ((toRelease != src) && (toRelease.length <= src.length)) { throw wrongBuf(); }
- }
-
- protected void _verifyRelease(char[] toRelease, char[] src) {
- if ((toRelease != src) && (toRelease.length <= src.length)) { throw wrongBuf(); }
- }
-
- private IllegalArgumentException wrongBuf() { return new IllegalArgumentException("Trying to release buffer not owned by the context"); }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/InputDecorator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/InputDecorator.java
deleted file mode 100644
index 654822465..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/InputDecorator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-/**
- * Handler class that can be used to decorate input sources.
- * Typical use is to use a filter abstraction (filtered stream,
- * reader) around original input source, and apply additional
- * processing during read operations.
- */
-public abstract class InputDecorator
- implements java.io.Serializable // since 2.1
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * Method called by {@link com.fr.third.fasterxml.jackson.core.JsonFactory} instance when
- * creating parser given an {@link InputStream}, when this decorator
- * has been registered.
- *
- * @param ctxt IO context in use (provides access to declared encoding).
- * NOTE: at this point context may not have all information initialized;
- * specifically auto-detected encoding is only available once parsing starts,
- * which may occur only after this method is called.
- * @param in Original input source
- *
- * @return InputStream to use; either passed in argument, or something that
- * calls it
- */
- public abstract InputStream decorate(IOContext ctxt, InputStream in)
- throws IOException;
-
- /**
- * Method called by {@link com.fr.third.fasterxml.jackson.core.JsonFactory} instance when
- * creating parser on given "raw" byte source.
- * Method can either construct a {@link InputStream} for reading; or return
- * null to indicate that no wrapping should occur.
- *
- * @param ctxt IO context in use (provides access to declared encoding)
- * NOTE: at this point context may not have all information initialized;
- * specifically auto-detected encoding is only available once parsing starts,
- * which may occur only after this method is called.
- * @param src Input buffer that contains contents to parse
- * @param offset Offset of the first available byte in the input buffer
- * @param length Number of bytes available in the input buffer
- *
- * @return Either {@link InputStream} to use as input source; or null to indicate
- * that contents are to be processed as-is by caller
- */
- public abstract InputStream decorate(IOContext ctxt, byte[] src, int offset, int length)
- throws IOException;
-
- /**
- * Method called by {@link com.fr.third.fasterxml.jackson.core.JsonFactory} instance when
- * creating parser given an {@link Reader}, when this decorator
- * has been registered.
- *
- * @param ctxt IO context in use (provides access to declared encoding)
- * NOTE: at this point context may not have all information initialized;
- * specifically auto-detected encoding is only available once parsing starts,
- * which may occur only after this method is called.
- * @param src Original input source
- *
- * @return Reader to use; either passed in argument, or something that
- * calls it (for example, a {@link FilterReader})
- */
- public abstract Reader decorate(IOContext ctxt, Reader src) throws IOException;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/JsonStringEncoder.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/JsonStringEncoder.java
deleted file mode 100644
index 137baeca5..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/JsonStringEncoder.java
+++ /dev/null
@@ -1,396 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.lang.ref.SoftReference;
-
-import com.fr.third.fasterxml.jackson.core.util.BufferRecycler;
-import com.fr.third.fasterxml.jackson.core.util.ByteArrayBuilder;
-import com.fr.third.fasterxml.jackson.core.util.TextBuffer;
-
-/**
- * Helper class used for efficient encoding of JSON String values (including
- * JSON field names) into Strings or UTF-8 byte arrays.
- *
- * Note that methods in here are somewhat optimized, but not ridiculously so.
- * Reason is that conversion method results are expected to be cached so that
- * these methods will not be hot spots during normal operation.
- */
-public final class JsonStringEncoder
-{
- private final static char[] HEX_CHARS = CharTypes.copyHexChars();
-
- private final static byte[] HEX_BYTES = CharTypes.copyHexBytes();
-
- private final static int SURR1_FIRST = 0xD800;
- private final static int SURR1_LAST = 0xDBFF;
- private final static int SURR2_FIRST = 0xDC00;
- private final static int SURR2_LAST = 0xDFFF;
-
- private final static int INT_BACKSLASH = '\\';
- private final static int INT_U = 'u';
- private final static int INT_0 = '0';
-
- /**
- * This ThreadLocal
contains a {@link java.lang.ref.SoftReference}
- * to a {@link BufferRecycler} used to provide a low-cost
- * buffer recycling between reader and writer instances.
- */
- final protected static ThreadLocal> _threadEncoder
- = new ThreadLocal>();
-
- /**
- * Lazily constructed text buffer used to produce JSON encoded Strings
- * as characters (without UTF-8 encoding)
- */
- protected TextBuffer _textBuffer;
-
- /**
- * Lazily-constructed builder used for UTF-8 encoding of text values
- * (quoted and unquoted)
- */
- protected ByteArrayBuilder _byteBuilder;
-
- /**
- * Temporary buffer used for composing quote/escape sequences
- */
- protected final char[] _quoteBuffer;
-
- /*
- /**********************************************************
- /* Construction, instance access
- /**********************************************************
- */
-
- public JsonStringEncoder()
- {
- _quoteBuffer = new char[6];
- _quoteBuffer[0] = '\\';
- _quoteBuffer[2] = '0';
- _quoteBuffer[3] = '0';
- }
-
- /**
- * Factory method for getting an instance; this is either recycled per-thread instance,
- * or a newly constructed one.
- */
- public static JsonStringEncoder getInstance()
- {
- SoftReference ref = _threadEncoder.get();
- JsonStringEncoder enc = (ref == null) ? null : ref.get();
-
- if (enc == null) {
- enc = new JsonStringEncoder();
- _threadEncoder.set(new SoftReference(enc));
- }
- return enc;
- }
-
- /*
- /**********************************************************
- /* Public API
- /**********************************************************
- */
-
- /**
- * Method that will quote text contents using JSON standard quoting,
- * and return results as a character array
- */
- public char[] quoteAsString(String input)
- {
- TextBuffer textBuffer = _textBuffer;
- if (textBuffer == null) {
- // no allocator; can add if we must, shouldn't need to
- _textBuffer = textBuffer = new TextBuffer(null);
- }
- char[] outputBuffer = textBuffer.emptyAndGetCurrentSegment();
- final int[] escCodes = CharTypes.get7BitOutputEscapes();
- final int escCodeCount = escCodes.length;
- int inPtr = 0;
- final int inputLen = input.length();
- int outPtr = 0;
-
- outer_loop:
- while (inPtr < inputLen) {
- tight_loop:
- while (true) {
- char c = input.charAt(inPtr);
- if (c < escCodeCount && escCodes[c] != 0) {
- break tight_loop;
- }
- if (outPtr >= outputBuffer.length) {
- outputBuffer = textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outputBuffer[outPtr++] = c;
- if (++inPtr >= inputLen) {
- break outer_loop;
- }
- }
- // something to escape; 2 or 6-char variant?
- 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) {
- System.arraycopy(_quoteBuffer, 0, outputBuffer, outPtr, first);
- }
- outputBuffer = textBuffer.finishCurrentSegment();
- int second = length - first;
- System.arraycopy(_quoteBuffer, first, outputBuffer, 0, second);
- outPtr = second;
- } else {
- System.arraycopy(_quoteBuffer, 0, outputBuffer, outPtr, length);
- outPtr += length;
- }
- }
- textBuffer.setCurrentLength(outPtr);
- return textBuffer.contentsAsArray();
- }
-
- /**
- * Will quote given JSON String value using standard quoting, encode
- * results as UTF-8, and return result as a byte array.
- */
- @SuppressWarnings("resource")
- public byte[] quoteAsUTF8(String text)
- {
- ByteArrayBuilder byteBuilder = _byteBuilder;
- if (byteBuilder == null) {
- // no allocator; can add if we must, shouldn't need to
- _byteBuilder = byteBuilder = new ByteArrayBuilder(null);
- }
- int inputPtr = 0;
- int inputEnd = text.length();
- int outputPtr = 0;
- byte[] outputBuffer = byteBuilder.resetAndGetFirstSegment();
-
- main_loop:
- while (inputPtr < inputEnd) {
- final int[] escCodes = CharTypes.get7BitOutputEscapes();
-
- inner_loop: // ASCII and escapes
- while (true) {
- int ch = text.charAt(inputPtr);
- if (ch > 0x7F || escCodes[ch] != 0) {
- break inner_loop;
- }
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) ch;
- if (++inputPtr >= inputEnd) {
- break main_loop;
- }
- }
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- // Ok, so what did we hit?
- int ch = (int) text.charAt(inputPtr++);
- if (ch <= 0x7F) { // needs quoting
- int escape = escCodes[ch];
- // ctrl-char, 6-byte escape...
- outputPtr = _appendByteEscape(ch, escape, byteBuilder, outputPtr);
- outputBuffer = byteBuilder.getCurrentSegment();
- continue main_loop;
- } else if (ch <= 0x7FF) { // fine, just needs 2 byte output
- outputBuffer[outputPtr++] = (byte) (0xc0 | (ch >> 6));
- ch = (0x80 | (ch & 0x3f));
- } else { // 3 or 4 bytes
- // Surrogates?
- if (ch < SURR1_FIRST || ch > SURR2_LAST) { // nope
- outputBuffer[outputPtr++] = (byte) (0xe0 | (ch >> 12));
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((ch >> 6) & 0x3f));
- ch = (0x80 | (ch & 0x3f));
- } else { // yes, surrogate pair
- if (ch > SURR1_LAST) { // must be from first range
- _illegalSurrogate(ch);
- }
- // and if so, followed by another from next range
- if (inputPtr >= inputEnd) {
- _illegalSurrogate(ch);
- }
- ch = _convertSurrogate(ch, text.charAt(inputPtr++));
- if (ch > 0x10FFFF) { // illegal, as per RFC 4627
- _illegalSurrogate(ch);
- }
- outputBuffer[outputPtr++] = (byte) (0xf0 | (ch >> 18));
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((ch >> 12) & 0x3f));
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((ch >> 6) & 0x3f));
- ch = (0x80 | (ch & 0x3f));
- }
- }
- if (outputPtr >= outputBuffer.length) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) ch;
- }
- return _byteBuilder.completeAndCoalesce(outputPtr);
- }
-
- /**
- * Will encode given String as UTF-8 (without any quoting), return
- * resulting byte array.
- */
- @SuppressWarnings("resource")
- public byte[] encodeAsUTF8(String text)
- {
- ByteArrayBuilder byteBuilder = _byteBuilder;
- if (byteBuilder == null) {
- // no allocator; can add if we must, shouldn't need to
- _byteBuilder = byteBuilder = new ByteArrayBuilder(null);
- }
- int inputPtr = 0;
- int inputEnd = text.length();
- int outputPtr = 0;
- byte[] outputBuffer = byteBuilder.resetAndGetFirstSegment();
- int outputEnd = outputBuffer.length;
-
- main_loop:
- while (inputPtr < inputEnd) {
- int c = text.charAt(inputPtr++);
-
- // first tight loop for ascii
- while (c <= 0x7F) {
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) c;
- if (inputPtr >= inputEnd) {
- break main_loop;
- }
- c = text.charAt(inputPtr++);
- }
-
- // then multi-byte...
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- if (c < 0x800) { // 2-byte
- outputBuffer[outputPtr++] = (byte) (0xc0 | (c >> 6));
- } else { // 3 or 4 bytes
- // Surrogates?
- if (c < SURR1_FIRST || c > SURR2_LAST) { // nope
- outputBuffer[outputPtr++] = (byte) (0xe0 | (c >> 12));
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- } else { // yes, surrogate pair
- if (c > SURR1_LAST) { // must be from first range
- _illegalSurrogate(c);
- }
- // and if so, followed by another from next range
- if (inputPtr >= inputEnd) {
- _illegalSurrogate(c);
- }
- c = _convertSurrogate(c, text.charAt(inputPtr++));
- if (c > 0x10FFFF) { // illegal, as per RFC 4627
- _illegalSurrogate(c);
- }
- outputBuffer[outputPtr++] = (byte) (0xf0 | (c >> 18));
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((c >> 12) & 0x3f));
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- }
- }
- if (outputPtr >= outputEnd) {
- outputBuffer = byteBuilder.finishCurrentSegment();
- outputEnd = outputBuffer.length;
- outputPtr = 0;
- }
- outputBuffer[outputPtr++] = (byte) (0x80 | (c & 0x3f));
- }
- return _byteBuilder.completeAndCoalesce(outputPtr);
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- 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)
- {
- quoteBuffer[1] = (char) escCode;
- return 2;
- }
-
- private int _appendByteEscape(int ch, int escCode, ByteArrayBuilder byteBuilder, int ptr)
- {
- byteBuilder.setCurrentSegmentLength(ptr);
- byteBuilder.append(INT_BACKSLASH);
- if (escCode < 0) { // standard escape
- byteBuilder.append(INT_U);
- if (ch > 0xFF) {
- int hi = (ch >> 8);
- byteBuilder.append(HEX_BYTES[hi >> 4]);
- byteBuilder.append(HEX_BYTES[hi & 0xF]);
- ch &= 0xFF;
- } else {
- byteBuilder.append(INT_0);
- byteBuilder.append(INT_0);
- }
- byteBuilder.append(HEX_BYTES[ch >> 4]);
- byteBuilder.append(HEX_BYTES[ch & 0xF]);
- } else { // 2-char simple escape
- byteBuilder.append((byte) escCode);
- }
- return byteBuilder.getCurrentSegmentLength();
- }
-
- protected static int _convertSurrogate(int firstPart, int secondPart)
- {
- // Ok, then, is the second part valid?
- if (secondPart < SURR2_FIRST || secondPart > SURR2_LAST) {
- throw new IllegalArgumentException("Broken surrogate pair: first char 0x"+Integer.toHexString(firstPart)+", second 0x"+Integer.toHexString(secondPart)+"; illegal combination");
- }
- return 0x10000 + ((firstPart - SURR1_FIRST) << 10) + (secondPart - SURR2_FIRST);
- }
-
- protected static void _illegalSurrogate(int code) {
- throw new IllegalArgumentException(UTF8Writer.illegalSurrogateDesc(code));
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/MergedStream.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/MergedStream.java
deleted file mode 100644
index 0aeab681d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/MergedStream.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-/**
- * Simple {@link InputStream} implementation that is used to "unwind" some
- * data previously read from an input stream; so that as long as some of
- * that data remains, it's returned; but as long as it's read, we'll
- * just use data from the underlying original stream.
- * This is similar to {@link java.io.PushbackInputStream}, but here there's
- * only one implicit pushback, when instance is constructed.
- */
-public final class MergedStream
- extends InputStream
-{
- final protected IOContext _context;
-
- final InputStream _in;
-
- byte[] _buffer;
-
- int _ptr;
-
- final int _end;
-
- public MergedStream(IOContext context,
- InputStream in, byte[] buf, int start, int end)
- {
- _context = context;
- _in = in;
- _buffer = buf;
- _ptr = start;
- _end = end;
- }
-
- @Override
- public int available() throws IOException
- {
- if (_buffer != null) {
- return _end - _ptr;
- }
- return _in.available();
- }
-
- @Override
- public void close() throws IOException
- {
- freeMergedBuffer();
- _in.close();
- }
-
- @Override
- public void mark(int readlimit)
- {
- if (_buffer == null) {
- _in.mark(readlimit);
- }
- }
-
- @Override
- public boolean markSupported()
- {
- // Only supports marks past the initial rewindable section...
- return (_buffer == null) && _in.markSupported();
- }
-
- @Override
- public int read() throws IOException
- {
- if (_buffer != null) {
- int c = _buffer[_ptr++] & 0xFF;
- if (_ptr >= _end) {
- freeMergedBuffer();
- }
- return c;
- }
- return _in.read();
- }
-
- @Override
- public int read(byte[] b) throws IOException
- {
- return read(b, 0, b.length);
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException
- {
- if (_buffer != null) {
- int avail = _end - _ptr;
- if (len > avail) {
- len = avail;
- }
- System.arraycopy(_buffer, _ptr, b, off, len);
- _ptr += len;
- if (_ptr >= _end) {
- freeMergedBuffer();
- }
- return len;
- }
- return _in.read(b, off, len);
- }
-
- @Override
- public void reset() throws IOException
- {
- if (_buffer == null) {
- _in.reset();
- }
- }
-
- @Override
- public long skip(long n) throws IOException
- {
- long count = 0L;
-
- if (_buffer != null) {
- int amount = _end - _ptr;
-
- if (amount > n) { // all in pushed back segment?
- _ptr += (int) n;
- return n;
- }
- freeMergedBuffer();
- count += amount;
- n -= amount;
- }
-
- if (n > 0) {
- count += _in.skip(n);
- }
- return count;
- }
-
- private void freeMergedBuffer()
- {
- byte[] buf = _buffer;
- if (buf != null) {
- _buffer = null;
- if (_context != null) {
- _context.releaseReadIOBuffer(buf);
- }
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberInput.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberInput.java
deleted file mode 100644
index f82bfcff4..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberInput.java
+++ /dev/null
@@ -1,319 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.math.BigDecimal;
-
-public final class NumberInput
-{
- /**
- * Textual representation of a double constant that can cause nasty problems
- * with JDK (see http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308).
- */
- public final static String NASTY_SMALL_DOUBLE = "2.2250738585072012e-308";
-
- /**
- * Constants needed for parsing longs from basic int parsing methods
- */
- final static long L_BILLION = 1000000000;
-
- final static String MIN_LONG_STR_NO_SIGN = String.valueOf(Long.MIN_VALUE).substring(1);
- final static String MAX_LONG_STR = String.valueOf(Long.MAX_VALUE);
-
- /**
- * Fast method for parsing integers that are known to fit into
- * regular 32-bit signed int type. This means that length is
- * between 1 and 9 digits (inclusive)
- *
- * Note: public to let unit tests call it
- */
- public static int parseInt(char[] digitChars, int offset, int len)
- {
- int num = digitChars[offset] - '0';
- len += offset;
- // This looks ugly, but appears the fastest way (as per measurements)
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- if (++offset < len) {
- num = (num * 10) + (digitChars[offset] - '0');
- }
- }
- }
- }
- }
- }
- }
- }
- return num;
- }
-
- /**
- * Helper method to (more) efficiently parse integer numbers from
- * String values.
- */
- public static int parseInt(String str)
- {
- /* Ok: let's keep strategy simple: ignoring optional minus sign,
- * we'll accept 1 - 9 digits and parse things efficiently;
- * otherwise just defer to JDK parse functionality.
- */
- char c = str.charAt(0);
- int length = str.length();
- boolean negative = (c == '-');
- int offset = 1;
- // must have 1 - 9 digits after optional sign:
- // negative?
- if (negative) {
- if (length == 1 || length > 10) {
- return Integer.parseInt(str);
- }
- c = str.charAt(offset++);
- } else {
- if (length > 9) {
- return Integer.parseInt(str);
- }
- }
- if (c > '9' || c < '0') {
- return Integer.parseInt(str);
- }
- int num = c - '0';
- if (offset < length) {
- c = str.charAt(offset++);
- if (c > '9' || c < '0') {
- return Integer.parseInt(str);
- }
- num = (num * 10) + (c - '0');
- if (offset < length) {
- c = str.charAt(offset++);
- if (c > '9' || c < '0') {
- return Integer.parseInt(str);
- }
- num = (num * 10) + (c - '0');
- // Let's just loop if we have more than 3 digits:
- if (offset < length) {
- do {
- c = str.charAt(offset++);
- if (c > '9' || c < '0') {
- return Integer.parseInt(str);
- }
- num = (num * 10) + (c - '0');
- } while (offset < length);
- }
- }
- }
- return negative ? -num : num;
- }
-
- public static long parseLong(char[] digitChars, int offset, int len)
- {
- // Note: caller must ensure length is [10, 18]
- int len1 = len-9;
- long val = parseInt(digitChars, offset, len1) * L_BILLION;
- return val + (long) parseInt(digitChars, offset+len1, 9);
- }
-
- public static long parseLong(String str)
- {
- /* Ok, now; as the very first thing, let's just optimize case of "fake longs";
- * that is, if we know they must be ints, call int parsing
- */
- int length = str.length();
- if (length <= 9) {
- return (long) parseInt(str);
- }
- // !!! TODO: implement efficient 2-int parsing...
- return Long.parseLong(str);
- }
-
- /**
- * Helper method for determining if given String representation of
- * an integral number would fit in 64-bit Java long or not.
- * Note that input String must NOT contain leading minus sign (even
- * if 'negative' is set to true).
- *
- * @param negative Whether original number had a minus sign (which is
- * NOT passed to this method) or not
- */
- public static boolean inLongRange(char[] digitChars, int offset, int len,
- boolean negative)
- {
- String cmpStr = negative ? MIN_LONG_STR_NO_SIGN : MAX_LONG_STR;
- int cmpLen = cmpStr.length();
- if (len < cmpLen) return true;
- if (len > cmpLen) return false;
-
- for (int i = 0; i < cmpLen; ++i) {
- int diff = digitChars[offset+i] - cmpStr.charAt(i);
- if (diff != 0) {
- return (diff < 0);
- }
- }
- return true;
- }
-
- /**
- * Similar to {@link #inLongRange(char[],int,int,boolean)}, but
- * with String argument
- *
- * @param negative Whether original number had a minus sign (which is
- * NOT passed to this method) or not
- */
- public static boolean inLongRange(String numberStr, boolean negative)
- {
- String cmpStr = negative ? MIN_LONG_STR_NO_SIGN : MAX_LONG_STR;
- int cmpLen = cmpStr.length();
- int actualLen = numberStr.length();
- if (actualLen < cmpLen) return true;
- if (actualLen > cmpLen) return false;
-
- // could perhaps just use String.compareTo()?
- for (int i = 0; i < cmpLen; ++i) {
- int diff = numberStr.charAt(i) - cmpStr.charAt(i);
- if (diff != 0) {
- return (diff < 0);
- }
- }
- return true;
- }
-
- public static int parseAsInt(String input, int defaultValue)
- {
- if (input == null) {
- return defaultValue;
- }
- input = input.trim();
- int len = input.length();
- if (len == 0) {
- return defaultValue;
- }
- // One more thing: use integer parsing for 'simple'
- int i = 0;
- if (i < len) { // skip leading sign:
- char c = input.charAt(0);
- if (c == '+') { // for plus, actually physically remove
- input = input.substring(1);
- len = input.length();
- } else if (c == '-') { // minus, just skip for checks, must retain
- ++i;
- }
- }
- for (; i < len; ++i) {
- char c = input.charAt(i);
- // if other symbols, parse as Double, coerce
- if (c > '9' || c < '0') {
- try {
- return (int) parseDouble(input);
- } catch (NumberFormatException e) {
- return defaultValue;
- }
- }
- }
- try {
- return Integer.parseInt(input);
- } catch (NumberFormatException e) { }
- return defaultValue;
- }
-
- public static long parseAsLong(String input, long defaultValue)
- {
- if (input == null) {
- return defaultValue;
- }
- input = input.trim();
- int len = input.length();
- if (len == 0) {
- return defaultValue;
- }
- // One more thing: use long parsing for 'simple'
- int i = 0;
- if (i < len) { // skip leading sign:
- char c = input.charAt(0);
- if (c == '+') { // for plus, actually physically remove
- input = input.substring(1);
- len = input.length();
- } else if (c == '-') { // minus, just skip for checks, must retain
- ++i;
- }
- }
- for (; i < len; ++i) {
- char c = input.charAt(i);
- // if other symbols, parse as Double, coerce
- if (c > '9' || c < '0') {
- try {
- return (long) parseDouble(input);
- } catch (NumberFormatException e) {
- return defaultValue;
- }
- }
- }
- try {
- return Long.parseLong(input);
- } catch (NumberFormatException e) { }
- return defaultValue;
- }
-
- public static double parseAsDouble(String input, double defaultValue)
- {
- if (input == null) {
- return defaultValue;
- }
- input = input.trim();
- int len = input.length();
- if (len == 0) {
- return defaultValue;
- }
- try {
- return parseDouble(input);
- } catch (NumberFormatException e) { }
- return defaultValue;
- }
-
- public static double parseDouble(String numStr) throws NumberFormatException
- {
- // [JACKSON-486]: avoid some nasty float representations... but should it be MIN_NORMAL or MIN_VALUE?
- /* as per [JACKSON-827], let's use MIN_VALUE as it is available on all JDKs; normalized
- * only in JDK 1.6. In practice, should not really matter.
- */
- if (NASTY_SMALL_DOUBLE.equals(numStr)) {
- return Double.MIN_VALUE;
- }
- return Double.parseDouble(numStr);
- }
-
- public static BigDecimal parseBigDecimal(String numStr) throws NumberFormatException
- {
- try {
- return new BigDecimal(numStr);
- } catch (NumberFormatException e) {
- throw _badBigDecimal(numStr);
- }
- }
-
- public static BigDecimal parseBigDecimal(char[] buffer) throws NumberFormatException {
- return parseBigDecimal(buffer, 0, buffer.length);
- }
-
- public static BigDecimal parseBigDecimal(char[] buffer, int offset, int len)
- throws NumberFormatException
- {
- try {
- return new BigDecimal(buffer, offset, len);
- } catch (NumberFormatException e) {
- throw _badBigDecimal(new String(buffer, offset, len));
- }
- }
-
- private static NumberFormatException _badBigDecimal(String str) {
- return new NumberFormatException("Value \""+str+"\" can not be represented as BigDecimal");
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberOutput.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberOutput.java
deleted file mode 100644
index eb5877fda..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/NumberOutput.java
+++ /dev/null
@@ -1,398 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-public final class NumberOutput
-{
- private final static char NULL_CHAR = (char) 0;
-
- private static int MILLION = 1000000;
- private static int BILLION = 1000000000;
- private static long TEN_BILLION_L = 10000000000L;
- private static long THOUSAND_L = 1000L;
-
- private static long MIN_INT_AS_LONG = (long) Integer.MIN_VALUE;
- private static long MAX_INT_AS_LONG = (long) Integer.MAX_VALUE;
-
- final static String SMALLEST_LONG = String.valueOf(Long.MIN_VALUE);
-
- final static char[] LEADING_TRIPLETS = new char[4000];
- final static char[] FULL_TRIPLETS = new char[4000];
- static {
- /* Let's fill it with NULLs for ignorable leading digits,
- * and digit chars for others
- */
- int ix = 0;
- for (int i1 = 0; i1 < 10; ++i1) {
- char f1 = (char) ('0' + i1);
- char l1 = (i1 == 0) ? NULL_CHAR : f1;
- for (int i2 = 0; i2 < 10; ++i2) {
- char f2 = (char) ('0' + i2);
- char l2 = (i1 == 0 && i2 == 0) ? NULL_CHAR : f2;
- for (int i3 = 0; i3 < 10; ++i3) {
- // Last is never to be empty
- char f3 = (char) ('0' + i3);
- LEADING_TRIPLETS[ix] = l1;
- LEADING_TRIPLETS[ix+1] = l2;
- LEADING_TRIPLETS[ix+2] = f3;
- FULL_TRIPLETS[ix] = f1;
- FULL_TRIPLETS[ix+1] = f2;
- FULL_TRIPLETS[ix+2] = f3;
- ix += 4;
- }
- }
- }
- }
-
- final static byte[] FULL_TRIPLETS_B = new byte[4000];
- static {
- for (int i = 0; i < 4000; ++i) {
- FULL_TRIPLETS_B[i] = (byte) FULL_TRIPLETS[i];
- }
- }
-
- final static String[] sSmallIntStrs = new String[] {
- "0","1","2","3","4","5","6","7","8","9","10"
- };
- final static String[] sSmallIntStrs2 = new String[] {
- "-1","-2","-3","-4","-5","-6","-7","-8","-9","-10"
- };
-
- /*
- /**********************************************************
- /* Efficient serialization methods using raw buffers
- /**********************************************************
- */
-
- /**
- * @return Offset within buffer after outputting int
- */
- public static int outputInt(int value, char[] buffer, int offset)
- {
- if (value < 0) {
- if (value == Integer.MIN_VALUE) {
- /* Special case: no matching positive value within range;
- * let's then "upgrade" to long and output as such.
- */
- return outputLong((long) value, buffer, offset);
- }
- buffer[offset++] = '-';
- value = -value;
- }
-
- if (value < MILLION) { // at most 2 triplets...
- if (value < 1000) {
- if (value < 10) {
- buffer[offset++] = (char) ('0' + value);
- } else {
- offset = outputLeadingTriplet(value, buffer, offset);
- }
- } else {
- int thousands = value / 1000;
- value -= (thousands * 1000); // == value % 1000
- offset = outputLeadingTriplet(thousands, buffer, offset);
- offset = outputFullTriplet(value, buffer, offset);
- }
- return offset;
- }
-
- // ok, all 3 triplets included
- /* Let's first hand possible billions separately before
- * handling 3 triplets. This is possible since we know we
- * can have at most '2' as billion count.
- */
- boolean hasBillions = (value >= BILLION);
- if (hasBillions) {
- value -= BILLION;
- if (value >= BILLION) {
- value -= BILLION;
- buffer[offset++] = '2';
- } else {
- buffer[offset++] = '1';
- }
- }
- int newValue = value / 1000;
- int ones = (value - (newValue * 1000)); // == value % 1000
- value = newValue;
- newValue /= 1000;
- int thousands = (value - (newValue * 1000));
-
- // value now has millions, which have 1, 2 or 3 digits
- if (hasBillions) {
- offset = outputFullTriplet(newValue, buffer, offset);
- } else {
- offset = outputLeadingTriplet(newValue, buffer, offset);
- }
- offset = outputFullTriplet(thousands, buffer, offset);
- offset = outputFullTriplet(ones, buffer, offset);
- return offset;
- }
-
- public static int outputInt(int value, byte[] buffer, int offset)
- {
- if (value < 0) {
- if (value == Integer.MIN_VALUE) {
- return outputLong((long) value, buffer, offset);
- }
- buffer[offset++] = '-';
- value = -value;
- }
-
- if (value < MILLION) { // at most 2 triplets...
- if (value < 1000) {
- if (value < 10) {
- buffer[offset++] = (byte) ('0' + value);
- } else {
- offset = outputLeadingTriplet(value, buffer, offset);
- }
- } else {
- int thousands = value / 1000;
- value -= (thousands * 1000); // == value % 1000
- offset = outputLeadingTriplet(thousands, buffer, offset);
- offset = outputFullTriplet(value, buffer, offset);
- }
- return offset;
- }
- boolean hasBillions = (value >= BILLION);
- if (hasBillions) {
- value -= BILLION;
- if (value >= BILLION) {
- value -= BILLION;
- buffer[offset++] = '2';
- } else {
- buffer[offset++] = '1';
- }
- }
- int newValue = value / 1000;
- int ones = (value - (newValue * 1000)); // == value % 1000
- value = newValue;
- newValue /= 1000;
- int thousands = (value - (newValue * 1000));
-
- if (hasBillions) {
- offset = outputFullTriplet(newValue, buffer, offset);
- } else {
- offset = outputLeadingTriplet(newValue, buffer, offset);
- }
- offset = outputFullTriplet(thousands, buffer, offset);
- offset = outputFullTriplet(ones, buffer, offset);
- return offset;
- }
-
- /**
- * @return Offset within buffer after outputting int
- */
- public static int outputLong(long value, char[] buffer, int offset)
- {
- // First: does it actually fit in an int?
- if (value < 0L) {
- /* MIN_INT is actually printed as long, just because its
- * negation is not an int but long
- */
- if (value > MIN_INT_AS_LONG) {
- return outputInt((int) value, buffer, offset);
- }
- if (value == Long.MIN_VALUE) {
- // Special case: no matching positive value within range
- int len = SMALLEST_LONG.length();
- SMALLEST_LONG.getChars(0, len, buffer, offset);
- return (offset + len);
- }
- buffer[offset++] = '-';
- value = -value;
- } else {
- if (value <= MAX_INT_AS_LONG) {
- return outputInt((int) value, buffer, offset);
- }
- }
-
- /* Ok: real long print. Need to first figure out length
- * in characters, and then print in from end to beginning
- */
- int origOffset = offset;
- offset += calcLongStrLength(value);
- int ptr = offset;
-
- // First, with long arithmetics:
- while (value > MAX_INT_AS_LONG) { // full triplet
- ptr -= 3;
- long newValue = value / THOUSAND_L;
- int triplet = (int) (value - newValue * THOUSAND_L);
- outputFullTriplet(triplet, buffer, ptr);
- value = newValue;
- }
- // Then with int arithmetics:
- int ivalue = (int) value;
- while (ivalue >= 1000) { // still full triplet
- ptr -= 3;
- int newValue = ivalue / 1000;
- int triplet = ivalue - (newValue * 1000);
- outputFullTriplet(triplet, buffer, ptr);
- ivalue = newValue;
- }
- // And finally, if anything remains, partial triplet
- outputLeadingTriplet(ivalue, buffer, origOffset);
-
- return offset;
- }
-
- public static int outputLong(long value, byte[] buffer, int offset)
- {
- if (value < 0L) {
- if (value > MIN_INT_AS_LONG) {
- return outputInt((int) value, buffer, offset);
- }
- if (value == Long.MIN_VALUE) {
- // Special case: no matching positive value within range
- int len = SMALLEST_LONG.length();
- for (int i = 0; i < len; ++i) {
- buffer[offset++] = (byte) SMALLEST_LONG.charAt(i);
- }
- return offset;
- }
- buffer[offset++] = '-';
- value = -value;
- } else {
- if (value <= MAX_INT_AS_LONG) {
- return outputInt((int) value, buffer, offset);
- }
- }
- int origOffset = offset;
- offset += calcLongStrLength(value);
- int ptr = offset;
-
- // First, with long arithmetics:
- while (value > MAX_INT_AS_LONG) { // full triplet
- ptr -= 3;
- long newValue = value / THOUSAND_L;
- int triplet = (int) (value - newValue * THOUSAND_L);
- outputFullTriplet(triplet, buffer, ptr);
- value = newValue;
- }
- // Then with int arithmetics:
- int ivalue = (int) value;
- while (ivalue >= 1000) { // still full triplet
- ptr -= 3;
- int newValue = ivalue / 1000;
- int triplet = ivalue - (newValue * 1000);
- outputFullTriplet(triplet, buffer, ptr);
- ivalue = newValue;
- }
- outputLeadingTriplet(ivalue, buffer, origOffset);
- return offset;
- }
-
- /*
- /**********************************************************
- /* Secondary convenience serialization methods
- /**********************************************************
- */
-
- /* !!! 05-Aug-2008, tatus: Any ways to further optimize
- * these? (or need: only called by diagnostics methods?)
- */
-
- public static String toString(int value)
- {
- // Lookup table for small values
- if (value < sSmallIntStrs.length) {
- if (value >= 0) {
- return sSmallIntStrs[value];
- }
- int v2 = -value - 1;
- if (v2 < sSmallIntStrs2.length) {
- return sSmallIntStrs2[v2];
- }
- }
- return Integer.toString(value);
- }
-
- public static String toString(long value)
- {
- if (value <= Integer.MAX_VALUE &&
- value >= Integer.MIN_VALUE) {
- return toString((int) value);
- }
- return Long.toString(value);
- }
-
- public static String toString(double value)
- {
- return Double.toString(value);
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private static int outputLeadingTriplet(int triplet, char[] buffer, int offset)
- {
- int digitOffset = (triplet << 2);
- char c = LEADING_TRIPLETS[digitOffset++];
- if (c != NULL_CHAR) {
- buffer[offset++] = c;
- }
- c = LEADING_TRIPLETS[digitOffset++];
- if (c != NULL_CHAR) {
- buffer[offset++] = c;
- }
- // Last is required to be non-empty
- buffer[offset++] = LEADING_TRIPLETS[digitOffset];
- return offset;
- }
-
- private static int outputLeadingTriplet(int triplet, byte[] buffer, int offset)
- {
- int digitOffset = (triplet << 2);
- char c = LEADING_TRIPLETS[digitOffset++];
- if (c != NULL_CHAR) {
- buffer[offset++] = (byte) c;
- }
- c = LEADING_TRIPLETS[digitOffset++];
- if (c != NULL_CHAR) {
- buffer[offset++] = (byte) c;
- }
- // Last is required to be non-empty
- buffer[offset++] = (byte) LEADING_TRIPLETS[digitOffset];
- return offset;
- }
-
- private static int outputFullTriplet(int triplet, char[] buffer, int offset)
- {
- int digitOffset = (triplet << 2);
- buffer[offset++] = FULL_TRIPLETS[digitOffset++];
- buffer[offset++] = FULL_TRIPLETS[digitOffset++];
- buffer[offset++] = FULL_TRIPLETS[digitOffset];
- return offset;
- }
-
- private static int outputFullTriplet(int triplet, byte[] buffer, int offset)
- {
- int digitOffset = (triplet << 2);
- buffer[offset++] = FULL_TRIPLETS_B[digitOffset++];
- buffer[offset++] = FULL_TRIPLETS_B[digitOffset++];
- buffer[offset++] = FULL_TRIPLETS_B[digitOffset];
- return offset;
- }
-
- /**
- *
- * Pre-conditions: posValue is positive, and larger than
- * Integer.MAX_VALUE (about 2 billions).
- */
- private static int calcLongStrLength(long posValue)
- {
- int len = 10;
- long comp = TEN_BILLION_L;
-
- // 19 is longest, need to worry about overflow
- while (posValue >= comp) {
- if (len == 19) {
- break;
- }
- ++len;
- comp = (comp << 3) + (comp << 1); // 10x
- }
- return len;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/OutputDecorator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/OutputDecorator.java
deleted file mode 100644
index 265c492be..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/OutputDecorator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-/**
- * Handler class that can be used to decorate output destinations.
- * Typical use is to use a filter abstraction (filtered output stream,
- * writer) around original output destination, and apply additional
- * processing during write operations.
- */
-public abstract class OutputDecorator
- implements java.io.Serializable // since 2.1
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * Method called by {@link com.fr.third.fasterxml.jackson.core.JsonFactory} instance when
- * creating generator for given {@link OutputStream}, when this decorator
- * has been registered.
- *
- * @param ctxt IO context in use (provides access to declared encoding)
- * @param out Original output destination
- *
- * @return OutputStream to use; either passed in argument, or something that
- * calls it
- */
- public abstract OutputStream decorate(IOContext ctxt, OutputStream out)
- throws IOException;
-
- /**
- * Method called by {@link com.fr.third.fasterxml.jackson.core.JsonFactory} instance when
- * creating generator for given {@link Writer}, when this decorator
- * has been registered.
- *
- * @param ctxt IO context in use (provides access to declared encoding)
- * @param w Original output writer
- *
- * @return Writer to use; either passed in argument, or something that calls it
- */
- public abstract Writer decorate(IOContext ctxt, Writer w) throws IOException;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SegmentedStringWriter.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SegmentedStringWriter.java
deleted file mode 100644
index c2a5059c7..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SegmentedStringWriter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.util.BufferRecycler;
-import com.fr.third.fasterxml.jackson.core.util.TextBuffer;
-
-/**
- * Efficient alternative to {@link StringWriter}, based on using segmented
- * internal buffer. Initial input buffer is also recyclable.
- *
- * This class is most useful when serializing JSON content as a String:
- * if so, instance of this class can be given as the writer to
- * JsonGenerator
.
- */
-public final class SegmentedStringWriter
- extends Writer
-{
- final protected TextBuffer _buffer;
-
- public SegmentedStringWriter(BufferRecycler br)
- {
- super();
- _buffer = new TextBuffer(br);
- }
-
- /*
- /**********************************************************
- /* java.io.Writer implementation
- /**********************************************************
- */
-
- @Override
- public Writer append(char c)
- {
- write(c);
- return this;
- }
-
- @Override
- public Writer append(CharSequence csq)
- {
- String str = csq.toString();
- _buffer.append(str, 0, str.length());
- return this;
- }
-
- @Override
- public Writer append(CharSequence csq, int start, int end)
- {
- String str = csq.subSequence(start, end).toString();
- _buffer.append(str, 0, str.length());
- return this;
- }
-
- @Override public void close() { } // NOP
-
- @Override public void flush() { } // NOP
-
- @Override
- public void write(char[] cbuf) {
- _buffer.append(cbuf, 0, cbuf.length);
- }
-
- @Override
- public void write(char[] cbuf, int off, int len) {
- _buffer.append(cbuf, off, len);
- }
-
- @Override
- public void write(int c) {
- _buffer.append((char) c);
- }
-
- @Override
- public void write(String str) { _buffer.append(str, 0, str.length()); }
-
- @Override
- public void write(String str, int off, int len) {
- _buffer.append(str, off, len);
- }
-
- /*
- /**********************************************************
- /* Extended API
- /**********************************************************
- */
-
- /**
- * Main access method that will construct a String that contains
- * all the contents, release all internal buffers we may have,
- * and return result String.
- * Note that the method is not idempotent -- if called second time,
- * will just return an empty String.
- */
- public String getAndClear()
- {
- String result = _buffer.contentsAsString();
- _buffer.releaseBuffers();
- return result;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SerializedString.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SerializedString.java
deleted file mode 100644
index 37415d99d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/SerializedString.java
+++ /dev/null
@@ -1,280 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-
-import com.fr.third.fasterxml.jackson.core.SerializableString;
-
-/**
- * String token that can lazily serialize String contained and then reuse that
- * serialization later on. This is similar to JDBC prepared statements, for example,
- * in that instances should only be created when they are used more than use;
- * prime candidates are various serializers.
- *
- * Class is final for performance reasons and since this is not designed to
- * be extensible or customizable (customizations would occur in calling code)
- */
-public class SerializedString
- implements SerializableString, java.io.Serializable
-{
- protected final String _value;
-
- /* 13-Dec-2010, tatu: Whether use volatile or not is actually an important
- * decision for multi-core use cases. Cost of volatility can be non-trivial
- * for heavy use cases, and serialized-string instances are accessed often.
- * Given that all code paths with common Jackson usage patterns go through
- * a few memory barriers (mostly with cache/reuse pool access) it seems safe
- * enough to omit volatiles here, given how simple lazy initialization is.
- * This can be compared to how {@link String#intern} works; lazily and
- * without synchronization or use of volatile keyword.
- *
- * Change to remove volatile was a request by implementors of a high-throughput
- * search framework; and they believed this is an important optimization for
- * heaviest, multi-core deployed use cases.
- */
- /*
- * 22-Sep-2013, tatu: FWIW, there have been no reports of problems in this
- * area, or anything pointing to it. So I think we are safe up to JDK7
- */
-
- protected /*volatile*/ byte[] _quotedUTF8Ref;
-
- protected /*volatile*/ byte[] _unquotedUTF8Ref;
-
- protected /*volatile*/ char[] _quotedChars;
-
- public SerializedString(String v) {
- if (v == null) {
- throw new IllegalStateException("Null String illegal for SerializedString");
- }
- _value = v;
- }
-
- /*
- /**********************************************************
- /* Serializable overrides
- /**********************************************************
- */
-
- /**
- * Ugly hack, to work through the requirement that _value is indeed final,
- * and that JDK serialization won't call ctor(s).
- *
- * @since 2.1
- */
- protected transient String _jdkSerializeValue;
-
- private void readObject(ObjectInputStream in) throws IOException {
- _jdkSerializeValue = in.readUTF();
- }
-
- private void writeObject(ObjectOutputStream out) throws IOException {
- out.writeUTF(_value);
- }
-
- protected Object readResolve() {
- return new SerializedString(_jdkSerializeValue);
- }
-
- /*
- /**********************************************************
- /* API
- /**********************************************************
- */
-
- @Override
- public final String getValue() { return _value; }
-
- /**
- * Returns length of the String as characters
- */
- @Override
- public final int charLength() { return _value.length(); }
-
- @Override
- public final char[] asQuotedChars()
- {
- char[] result = _quotedChars;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsString(_value);
- _quotedChars = result;
- }
- return result;
- }
-
- /**
- * Accessor for accessing value that has been quoted using JSON
- * quoting rules, and encoded using UTF-8 encoding.
- */
- @Override
- public final byte[] asUnquotedUTF8()
- {
- byte[] result = _unquotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().encodeAsUTF8(_value);
- _unquotedUTF8Ref = result;
- }
- return result;
- }
-
- /**
- * Accessor for accessing value as is (without JSON quoting)
- * encoded using UTF-8 encoding.
- */
- @Override
- public final byte[] asQuotedUTF8()
- {
- byte[] result = _quotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsUTF8(_value);
- _quotedUTF8Ref = result;
- }
- return result;
- }
-
- /*
- /**********************************************************
- /* Additional 2.0 methods for appending/writing contents
- /**********************************************************
- */
-
- @Override
- public int appendQuotedUTF8(byte[] buffer, int offset)
- {
- byte[] result = _quotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsUTF8(_value);
- _quotedUTF8Ref = result;
- }
- final int length = result.length;
- if ((offset + length) > buffer.length) {
- return -1;
- }
- System.arraycopy(result, 0, buffer, offset, length);
- return length;
- }
-
- @Override
- public int appendQuoted(char[] buffer, int offset)
- {
- char[] result = _quotedChars;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsString(_value);
- _quotedChars = result;
- }
- final int length = result.length;
- if ((offset + length) > buffer.length) {
- return -1;
- }
- System.arraycopy(result, 0, buffer, offset, length);
- return length;
- }
-
- @Override
- public int appendUnquotedUTF8(byte[] buffer, int offset)
- {
- byte[] result = _unquotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().encodeAsUTF8(_value);
- _unquotedUTF8Ref = result;
- }
- final int length = result.length;
- if ((offset + length) > buffer.length) {
- return -1;
- }
- System.arraycopy(result, 0, buffer, offset, length);
- return length;
- }
-
- @Override
- public int appendUnquoted(char[] buffer, int offset)
- {
- String str = _value;
- final int length = str.length();
- if ((offset + length) > buffer.length) {
- return -1;
- }
- str.getChars(0, length, buffer, offset);
- return length;
- }
-
- @Override
- public int writeQuotedUTF8(OutputStream out) throws IOException
- {
- byte[] result = _quotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsUTF8(_value);
- _quotedUTF8Ref = result;
- }
- final int length = result.length;
- out.write(result, 0, length);
- return length;
- }
-
- @Override
- public int writeUnquotedUTF8(OutputStream out) throws IOException
- {
- byte[] result = _unquotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().encodeAsUTF8(_value);
- _unquotedUTF8Ref = result;
- }
- final int length = result.length;
- out.write(result, 0, length);
- return length;
- }
-
- @Override
- public int putQuotedUTF8(ByteBuffer buffer)
- {
- byte[] result = _quotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().quoteAsUTF8(_value);
- _quotedUTF8Ref = result;
- }
- final int length = result.length;
- if (length > buffer.remaining()) {
- return -1;
- }
- buffer.put(result, 0, length);
- return length;
- }
-
- @Override
- public int putUnquotedUTF8(ByteBuffer buffer)
- {
- byte[] result = _unquotedUTF8Ref;
- if (result == null) {
- result = JsonStringEncoder.getInstance().encodeAsUTF8(_value);
- _unquotedUTF8Ref = result;
- }
- final int length = result.length;
- if (length > buffer.remaining()) {
- return -1;
- }
- buffer.put(result, 0, length);
- return length;
- }
-
-
- /*
- /**********************************************************
- /* Standard method overrides
- /**********************************************************
- */
-
- @Override
- public final String toString() { return _value; }
-
- @Override
- public final int hashCode() { return _value.hashCode(); }
-
- @Override
- public final boolean equals(Object o)
- {
- if (o == this) return true;
- if (o == null || o.getClass() != getClass()) return false;
- SerializedString other = (SerializedString) o;
- return _value.equals(other._value);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF32Reader.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF32Reader.java
deleted file mode 100644
index da4b9720e..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF32Reader.java
+++ /dev/null
@@ -1,218 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-
-/**
- * Since JDK does not come with UTF-32/UCS-4, let's implement a simple
- * decoder to use.
- */
-public class UTF32Reader
- extends BaseReader
-{
- 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.
- */
- protected char _surrogate = NULL_CHAR;
-
- /**
- * Total read character count; used for error reporting purposes
- */
- protected int _charCount = 0;
-
- /**
- * Total read byte count; used for error reporting purposes
- */
- protected int _byteCount = 0;
-
- protected final boolean _managedBuffers;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public UTF32Reader(IOContext ctxt,
- InputStream in, byte[] buf, int ptr, int len,
- boolean isBigEndian)
- {
- super(ctxt, in, buf, ptr, len);
- _bigEndian = isBigEndian;
- _managedBuffers = (in != null);
- }
-
- /*
- /**********************************************************
- /* Public API
- /**********************************************************
- */
-
- @Override
- public int read(char[] cbuf, int start, int len)
- throws IOException
- {
- // Already EOF?
- if (_buffer == null) {
- return -1;
- }
- if (len < 1) {
- return len;
- }
- // Let's then ensure there's enough room...
- if (start < 0 || (start+len) > cbuf.length) {
- reportBounds(cbuf, start, len);
- }
-
- len += start;
- int outPtr = start;
-
- // Ok, first; do we have a surrogate from last round?
- 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
- * result, we only need to get 4 bytes for a full char.
- */
- int left = (_length - _ptr);
- if (left < 4) {
- if (!loadMore(left)) { // (legal) EOF?
- return -1;
- }
- }
- }
-
- main_loop:
- while (outPtr < len) {
- int ptr = _ptr;
- int ch;
-
- if (_bigEndian) {
- ch = (_buffer[ptr] << 24) | ((_buffer[ptr+1] & 0xFF) << 16)
- | ((_buffer[ptr+2] & 0xFF) << 8) | (_buffer[ptr+3] & 0xFF);
- } else {
- ch = (_buffer[ptr] & 0xFF) | ((_buffer[ptr+1] & 0xFF) << 8)
- | ((_buffer[ptr+2] & 0xFF) << 16) | (_buffer[ptr+3] << 24);
- }
- _ptr += 4;
-
- // Does it need to be split to surrogates?
- // (also, we can and need to verify illegal chars)
- if (ch > 0xFFFF) { // need to split into surrogates?
- if (ch > LAST_VALID_UNICODE_CHAR) {
- reportInvalid(ch, outPtr-start,
- "(above "+Integer.toHexString(LAST_VALID_UNICODE_CHAR)+") ");
- }
- ch -= 0x10000; // to normalize it starting with 0x0
- cbuf[outPtr++] = (char) (0xD800 + (ch >> 10));
- // hmmh. can this ever be 0? (not legal, at least?)
- ch = (0xDC00 | (ch & 0x03FF));
- // Room for second part?
- if (outPtr >= len) { // nope
- _surrogate = (char) ch;
- break main_loop;
- }
- }
- cbuf[outPtr++] = (char) ch;
- if (_ptr >= _length) {
- break main_loop;
- }
- }
-
- len = outPtr - start;
- _charCount += len;
- return len;
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private void reportUnexpectedEOF(int gotBytes, int needed)
- throws IOException
- {
- 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+")");
- }
-
- private void reportInvalid(int value, int offset, String msg)
- throws IOException
- {
- 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+")");
- }
-
- /**
- * @param available Number of "unused" bytes in the input buffer
- *
- * @return True, if enough bytes were read to allow decoding of at least
- * one full character; false if EOF was encountered instead.
- */
- private boolean loadMore(int available)
- throws IOException
- {
- _byteCount += (_length - available);
-
- // Bytes that need to be moved to the beginning of buffer?
- if (available > 0) {
- if (_ptr > 0) {
- for (int i = 0; i < available; ++i) {
- _buffer[i] = _buffer[_ptr+i];
- }
- _ptr = 0;
- }
- _length = available;
- } else {
- /* Ok; here we can actually reasonably expect an EOF,
- * so let's do a separate read right away:
- */
- _ptr = 0;
- int count = (_in == null) ? -1 : _in.read(_buffer);
- if (count < 1) {
- _length = 0;
- if (count < 0) { // -1
- if (_managedBuffers) {
- freeBuffers(); // to help GC?
- }
- return false;
- }
- // 0 count is no good; let's err out
- reportStrangeStream();
- }
- _length = count;
- }
-
- /* Need at least 4 bytes; if we don't get that many, it's an
- * error.
- */
- while (_length < 4) {
- int count = (_in == null) ? -1 : _in.read(_buffer, _length, _buffer.length - _length);
- if (count < 1) {
- if (count < 0) { // -1, EOF... no good!
- if (_managedBuffers) {
- freeBuffers(); // to help GC?
- }
- reportUnexpectedEOF(_length, 4);
- }
- // 0 count is no good; let's err out
- reportStrangeStream();
- }
- _length += count;
- }
- return true;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF8Writer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF8Writer.java
deleted file mode 100644
index 6cca63c66..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/io/UTF8Writer.java
+++ /dev/null
@@ -1,387 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.io;
-
-import java.io.*;
-
-public final class UTF8Writer extends Writer
-{
- final static int SURR1_FIRST = 0xD800;
- final static int SURR1_LAST = 0xDBFF;
- final static int SURR2_FIRST = 0xDC00;
- final static int SURR2_LAST = 0xDFFF;
-
- final private IOContext _context;
-
- private OutputStream _out;
-
- private byte[] _outBuffer;
-
- final private int _outBufferEnd;
-
- private int _outPtr;
-
- /**
- * When outputting chars from BMP, surrogate pairs need to be coalesced.
- * To do this, both pairs must be known first; and since it is possible
- * pairs may be split, we need temporary storage for the first half
- */
- private int _surrogate = 0;
-
- public UTF8Writer(IOContext ctxt, OutputStream out)
- {
- _context = ctxt;
- _out = out;
-
- _outBuffer = ctxt.allocWriteEncodingBuffer();
- /* Max. expansion for a single char (in unmodified UTF-8) is
- * 4 bytes (or 3 depending on how you view it -- 4 when recombining
- * surrogate pairs)
- */
- _outBufferEnd = _outBuffer.length - 4;
- _outPtr = 0;
- }
-
- @Override
- public Writer append(char c)
- throws IOException
- {
- write(c);
- return this;
- }
-
- @Override
- public void close()
- throws IOException
- {
- if (_out != null) {
- if (_outPtr > 0) {
- _out.write(_outBuffer, 0, _outPtr);
- _outPtr = 0;
- }
- OutputStream out = _out;
- _out = null;
-
- byte[] buf = _outBuffer;
- if (buf != null) {
- _outBuffer = null;
- _context.releaseWriteEncodingBuffer(buf);
- }
-
- out.close();
-
- /* Let's 'flush' orphan surrogate, no matter what; but only
- * after cleanly closing everything else.
- */
- int code = _surrogate;
- _surrogate = 0;
- if (code > 0) {
- illegalSurrogate(code);
- }
- }
- }
-
- @Override
- public void flush()
- throws IOException
- {
- if (_out != null) {
- if (_outPtr > 0) {
- _out.write(_outBuffer, 0, _outPtr);
- _outPtr = 0;
- }
- _out.flush();
- }
- }
-
- @Override
- public void write(char[] cbuf)
- throws IOException
- {
- write(cbuf, 0, cbuf.length);
- }
-
- @Override
- public void write(char[] cbuf, int off, int len)
- throws IOException
- {
- if (len < 2) {
- if (len == 1) {
- write(cbuf[off]);
- }
- return;
- }
-
- // First: do we have a leftover surrogate to deal with?
- if (_surrogate > 0) {
- char second = cbuf[off++];
- --len;
- write(convertSurrogate(second));
- // will have at least one more char
- }
-
- int outPtr = _outPtr;
- byte[] outBuf = _outBuffer;
- int outBufLast = _outBufferEnd; // has 4 'spare' bytes
-
- // All right; can just loop it nice and easy now:
- len += off; // len will now be the end of input buffer
-
- output_loop:
- for (; off < len; ) {
- /* First, let's ensure we can output at least 4 bytes
- * (longest UTF-8 encoded codepoint):
- */
- if (outPtr >= outBufLast) {
- _out.write(outBuf, 0, outPtr);
- outPtr = 0;
- }
-
- int c = cbuf[off++];
- // And then see if we have an Ascii char:
- if (c < 0x80) { // If so, can do a tight inner loop:
- outBuf[outPtr++] = (byte)c;
- // Let's calc how many ascii chars we can copy at most:
- int maxInCount = (len - off);
- int maxOutCount = (outBufLast - outPtr);
-
- if (maxInCount > maxOutCount) {
- maxInCount = maxOutCount;
- }
- maxInCount += off;
- ascii_loop:
- while (true) {
- if (off >= maxInCount) { // done with max. ascii seq
- continue output_loop;
- }
- c = cbuf[off++];
- if (c >= 0x80) {
- break ascii_loop;
- }
- outBuf[outPtr++] = (byte) c;
- }
- }
-
- // Nope, multi-byte:
- if (c < 0x800) { // 2-byte
- outBuf[outPtr++] = (byte) (0xc0 | (c >> 6));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- } else { // 3 or 4 bytes
- // Surrogates?
- if (c < SURR1_FIRST || c > SURR2_LAST) {
- outBuf[outPtr++] = (byte) (0xe0 | (c >> 12));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- continue;
- }
- // Yup, a surrogate:
- if (c > SURR1_LAST) { // must be from first range
- _outPtr = outPtr;
- illegalSurrogate(c);
- }
- _surrogate = c;
- // and if so, followed by another from next range
- if (off >= len) { // unless we hit the end?
- break;
- }
- c = convertSurrogate(cbuf[off++]);
- if (c > 0x10FFFF) { // illegal in JSON as well as in XML
- _outPtr = outPtr;
- illegalSurrogate(c);
- }
- outBuf[outPtr++] = (byte) (0xf0 | (c >> 18));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 12) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- }
- }
- _outPtr = outPtr;
- }
-
- @Override
- public void write(int c) throws IOException
- {
- // First; do we have a left over surrogate?
- if (_surrogate > 0) {
- c = convertSurrogate(c);
- // If not, do we start with a surrogate?
- } else if (c >= SURR1_FIRST && c <= SURR2_LAST) {
- // Illegal to get second part without first:
- if (c > SURR1_LAST) {
- illegalSurrogate(c);
- }
- // First part just needs to be held for now
- _surrogate = c;
- return;
- }
-
- if (_outPtr >= _outBufferEnd) { // let's require enough room, first
- _out.write(_outBuffer, 0, _outPtr);
- _outPtr = 0;
- }
-
- if (c < 0x80) { // ascii
- _outBuffer[_outPtr++] = (byte) c;
- } else {
- int ptr = _outPtr;
- if (c < 0x800) { // 2-byte
- _outBuffer[ptr++] = (byte) (0xc0 | (c >> 6));
- _outBuffer[ptr++] = (byte) (0x80 | (c & 0x3f));
- } else if (c <= 0xFFFF) { // 3 bytes
- _outBuffer[ptr++] = (byte) (0xe0 | (c >> 12));
- _outBuffer[ptr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- _outBuffer[ptr++] = (byte) (0x80 | (c & 0x3f));
- } else { // 4 bytes
- if (c > 0x10FFFF) { // illegal
- illegalSurrogate(c);
- }
- _outBuffer[ptr++] = (byte) (0xf0 | (c >> 18));
- _outBuffer[ptr++] = (byte) (0x80 | ((c >> 12) & 0x3f));
- _outBuffer[ptr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- _outBuffer[ptr++] = (byte) (0x80 | (c & 0x3f));
- }
- _outPtr = ptr;
- }
- }
-
- @Override
- public void write(String str) throws IOException
- {
- write(str, 0, str.length());
- }
-
- @Override
- public void write(String str, int off, int len) throws IOException
- {
- if (len < 2) {
- if (len == 1) {
- write(str.charAt(off));
- }
- return;
- }
-
- // First: do we have a leftover surrogate to deal with?
- if (_surrogate > 0) {
- char second = str.charAt(off++);
- --len;
- write(convertSurrogate(second));
- // will have at least one more char (case of 1 char was checked earlier on)
- }
-
- int outPtr = _outPtr;
- byte[] outBuf = _outBuffer;
- int outBufLast = _outBufferEnd; // has 4 'spare' bytes
-
- // All right; can just loop it nice and easy now:
- len += off; // len will now be the end of input buffer
-
- output_loop:
- for (; off < len; ) {
- /* First, let's ensure we can output at least 4 bytes
- * (longest UTF-8 encoded codepoint):
- */
- if (outPtr >= outBufLast) {
- _out.write(outBuf, 0, outPtr);
- outPtr = 0;
- }
-
- int c = str.charAt(off++);
- // And then see if we have an Ascii char:
- if (c < 0x80) { // If so, can do a tight inner loop:
- outBuf[outPtr++] = (byte)c;
- // Let's calc how many ascii chars we can copy at most:
- int maxInCount = (len - off);
- int maxOutCount = (outBufLast - outPtr);
-
- if (maxInCount > maxOutCount) {
- maxInCount = maxOutCount;
- }
- maxInCount += off;
- ascii_loop:
- while (true) {
- if (off >= maxInCount) { // done with max. ascii seq
- continue output_loop;
- }
- c = str.charAt(off++);
- if (c >= 0x80) {
- break ascii_loop;
- }
- outBuf[outPtr++] = (byte) c;
- }
- }
-
- // Nope, multi-byte:
- if (c < 0x800) { // 2-byte
- outBuf[outPtr++] = (byte) (0xc0 | (c >> 6));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- } else { // 3 or 4 bytes
- // Surrogates?
- if (c < SURR1_FIRST || c > SURR2_LAST) {
- outBuf[outPtr++] = (byte) (0xe0 | (c >> 12));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- continue;
- }
- // Yup, a surrogate:
- if (c > SURR1_LAST) { // must be from first range
- _outPtr = outPtr;
- illegalSurrogate(c);
- }
- _surrogate = c;
- // and if so, followed by another from next range
- if (off >= len) { // unless we hit the end?
- break;
- }
- c = convertSurrogate(str.charAt(off++));
- if (c > 0x10FFFF) { // illegal, as per RFC 4627
- _outPtr = outPtr;
- illegalSurrogate(c);
- }
- outBuf[outPtr++] = (byte) (0xf0 | (c >> 18));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 12) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- outBuf[outPtr++] = (byte) (0x80 | (c & 0x3f));
- }
- }
- _outPtr = outPtr;
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- /**
- * Method called to calculate UTF codepoint, from a surrogate pair.
- */
- protected int convertSurrogate(int secondPart)
- throws IOException
- {
- int firstPart = _surrogate;
- _surrogate = 0;
-
- // Ok, then, is the second part valid?
- if (secondPart < SURR2_FIRST || secondPart > SURR2_LAST) {
- throw new IOException("Broken surrogate pair: first char 0x"+Integer.toHexString(firstPart)+", second 0x"+Integer.toHexString(secondPart)+"; illegal combination");
- }
- return 0x10000 + ((firstPart - SURR1_FIRST) << 10) + (secondPart - SURR2_FIRST);
- }
-
- protected static void illegalSurrogate(int code) throws IOException {
- throw new IOException(illegalSurrogateDesc(code));
- }
-
- protected static String illegalSurrogateDesc(int code)
- {
- if (code > 0x10FFFF) { // over max?
- return "Illegal character point (0x"+Integer.toHexString(code)+") to output; max is 0x10FFFF as per RFC 4627";
- }
- if (code >= SURR1_FIRST) {
- if (code <= SURR1_LAST) { // Unmatched first part (closing without second part?)
- return "Unmatched first part of surrogate pair (0x"+Integer.toHexString(code)+")";
- }
- return "Unmatched second part of surrogate pair (0x"+Integer.toHexString(code)+")";
- }
- // should we ever get this?
- return "Illegal character point (0x"+Integer.toHexString(code)+") to output";
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java
deleted file mode 100644
index b0fe29197..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java
+++ /dev/null
@@ -1,513 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.format.InputAccessor;
-import com.fr.third.fasterxml.jackson.core.format.MatchStrength;
-import com.fr.third.fasterxml.jackson.core.io.*;
-import com.fr.third.fasterxml.jackson.core.sym.BytesToNameCanonicalizer;
-import com.fr.third.fasterxml.jackson.core.sym.CharsToNameCanonicalizer;
-
-/**
- * This class is used to determine the encoding of byte stream
- * that is to contain JSON content. Rules are fairly simple, and
- * defined in JSON specification (RFC-4627 or newer), except
- * for BOM handling, which is a property of underlying
- * streams.
- */
-public final class ByteSourceJsonBootstrapper
-{
- final static byte UTF8_BOM_1 = (byte) 0xEF;
- final static byte UTF8_BOM_2 = (byte) 0xBB;
- final static byte UTF8_BOM_3 = (byte) 0xBF;
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- protected final IOContext _context;
-
- protected final InputStream _in;
-
- /*
- /**********************************************************
- /* Input buffering
- /**********************************************************
- */
-
- protected final byte[] _inputBuffer;
-
- private int _inputPtr;
-
- private int _inputEnd;
-
- /**
- * Flag that indicates whether buffer above is to be recycled
- * after being used or not.
- */
- private final boolean _bufferRecyclable;
-
- /*
- /**********************************************************
- /* Input location
- /**********************************************************
- */
-
- /**
- * Current number of input units (bytes or chars) that were processed in
- * previous blocks,
- * before contents of current input buffer.
- *
- * Note: includes possible BOMs, if those were part of the input.
- */
- protected int _inputProcessed;
-
- /*
- /**********************************************************
- /* Data gathered
- /**********************************************************
- */
-
- protected boolean _bigEndian = true;
-
- protected int _bytesPerChar = 0; // 0 means "dunno yet"
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public ByteSourceJsonBootstrapper(IOContext ctxt, InputStream in)
- {
- _context = ctxt;
- _in = in;
- _inputBuffer = ctxt.allocReadIOBuffer();
- _inputEnd = _inputPtr = 0;
- _inputProcessed = 0;
- _bufferRecyclable = true;
- }
-
- public ByteSourceJsonBootstrapper(IOContext ctxt, byte[] inputBuffer, int inputStart, int inputLen)
- {
- _context = ctxt;
- _in = null;
- _inputBuffer = inputBuffer;
- _inputPtr = inputStart;
- _inputEnd = (inputStart + inputLen);
- // Need to offset this for correct location info
- _inputProcessed = -inputStart;
- _bufferRecyclable = false;
- }
-
- /*
- /**********************************************************
- /* Encoding detection during bootstrapping
- /**********************************************************
- */
-
- /**
- * Method that should be called after constructing an instace.
- * It will figure out encoding that content uses, to allow
- * for instantiating a proper scanner object.
- */
- public JsonEncoding detectEncoding()
- throws IOException, JsonParseException
- {
- boolean foundEncoding = false;
-
- // First things first: BOM handling
- /* Note: we can require 4 bytes to be read, since no
- * combination of BOM + valid JSON content can have
- * shorter length (shortest valid JSON content is single
- * digit char, but BOMs are chosen such that combination
- * is always at least 4 chars long)
- */
- if (ensureLoaded(4)) {
- int quad = (_inputBuffer[_inputPtr] << 24)
- | ((_inputBuffer[_inputPtr+1] & 0xFF) << 16)
- | ((_inputBuffer[_inputPtr+2] & 0xFF) << 8)
- | (_inputBuffer[_inputPtr+3] & 0xFF);
-
- if (handleBOM(quad)) {
- foundEncoding = true;
- } else {
- /* If no BOM, need to auto-detect based on first char;
- * this works since it must be 7-bit ascii (wrt. unicode
- * compatible encodings, only ones JSON can be transferred
- * over)
- */
- // UTF-32?
- if (checkUTF32(quad)) {
- foundEncoding = true;
- } else if (checkUTF16(quad >>> 16)) {
- foundEncoding = true;
- }
- }
- } else if (ensureLoaded(2)) {
- int i16 = ((_inputBuffer[_inputPtr] & 0xFF) << 8)
- | (_inputBuffer[_inputPtr+1] & 0xFF);
- if (checkUTF16(i16)) {
- foundEncoding = true;
- }
- }
-
- JsonEncoding enc;
-
- /* Not found yet? As per specs, this means it must be UTF-8. */
- if (!foundEncoding) {
- enc = JsonEncoding.UTF8;
- } else {
- switch (_bytesPerChar) {
- case 1:
- enc = JsonEncoding.UTF8;
- break;
- case 2:
- enc = _bigEndian ? JsonEncoding.UTF16_BE : JsonEncoding.UTF16_LE;
- break;
- case 4:
- enc = _bigEndian ? JsonEncoding.UTF32_BE : JsonEncoding.UTF32_LE;
- break;
- default:
- throw new RuntimeException("Internal error"); // should never get here
- }
- }
- _context.setEncoding(enc);
- return enc;
- }
-
- /*
- /**********************************************************
- /* Constructing a Reader
- /**********************************************************
- */
-
- @SuppressWarnings("resource")
- public Reader constructReader()
- throws IOException
- {
- JsonEncoding enc = _context.getEncoding();
- switch (enc.bits()) {
- case 8: // only in non-common case where we don't want to do direct mapping
- case 16:
- {
- // First: do we have a Stream? If not, need to create one:
- InputStream in = _in;
-
- if (in == null) {
- in = new ByteArrayInputStream(_inputBuffer, _inputPtr, _inputEnd);
- } else {
- /* Also, if we have any read but unused input (usually true),
- * need to merge that input in:
- */
- if (_inputPtr < _inputEnd) {
- in = new MergedStream(_context, in, _inputBuffer, _inputPtr, _inputEnd);
- }
- }
- return new InputStreamReader(in, enc.getJavaName());
- }
- case 32:
- return new UTF32Reader(_context, _in, _inputBuffer, _inputPtr, _inputEnd,
- _context.getEncoding().isBigEndian());
- }
- throw new RuntimeException("Internal error"); // should never get here
- }
-
- public JsonParser constructParser(int parserFeatures, ObjectCodec codec,
- BytesToNameCanonicalizer rootByteSymbols, CharsToNameCanonicalizer rootCharSymbols,
- boolean canonicalize, boolean intern)
- throws IOException
- {
- JsonEncoding enc = detectEncoding();
-
- if (enc == JsonEncoding.UTF8) {
- /* and without canonicalization, byte-based approach is not performance; just use std UTF-8 reader
- * (which is ok for larger input; not so hot for smaller; but this is not a common case)
- */
- if (canonicalize) {
- BytesToNameCanonicalizer can = rootByteSymbols.makeChild(canonicalize, intern);
- return new UTF8StreamJsonParser(_context, parserFeatures, _in, codec, can, _inputBuffer, _inputPtr, _inputEnd, _bufferRecyclable);
- }
- }
- return new ReaderBasedJsonParser(_context, parserFeatures, constructReader(), codec,
- rootCharSymbols.makeChild(canonicalize, intern));
- }
-
- /*
- /**********************************************************
- /* Encoding detection for data format auto-detection
- /**********************************************************
- */
-
- /**
- * Current implementation is not as thorough as other functionality
- * ({@link com.fr.third.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper});
- * supports UTF-8, for example. But it should work, for now, and can
- * be improved as necessary.
- */
- public static MatchStrength hasJSONFormat(InputAccessor acc) throws IOException
- {
- // Ideally we should see "[" or "{"; but if not, we'll accept double-quote (String)
- // in future could also consider accepting non-standard matches?
-
- if (!acc.hasMoreBytes()) {
- return MatchStrength.INCONCLUSIVE;
- }
- byte b = acc.nextByte();
- // Very first thing, a UTF-8 BOM?
- if (b == UTF8_BOM_1) { // yes, looks like UTF-8 BOM
- if (!acc.hasMoreBytes()) {
- return MatchStrength.INCONCLUSIVE;
- }
- if (acc.nextByte() != UTF8_BOM_2) {
- return MatchStrength.NO_MATCH;
- }
- if (!acc.hasMoreBytes()) {
- return MatchStrength.INCONCLUSIVE;
- }
- if (acc.nextByte() != UTF8_BOM_3) {
- return MatchStrength.NO_MATCH;
- }
- if (!acc.hasMoreBytes()) {
- return MatchStrength.INCONCLUSIVE;
- }
- b = acc.nextByte();
- }
- // Then possible leading space
- int ch = skipSpace(acc, b);
- if (ch < 0) {
- return MatchStrength.INCONCLUSIVE;
- }
- // First, let's see if it looks like a structured type:
- if (ch == '{') { // JSON object?
- // Ideally we need to find either double-quote or closing bracket
- ch = skipSpace(acc);
- if (ch < 0) {
- return MatchStrength.INCONCLUSIVE;
- }
- if (ch == '"' || ch == '}') {
- return MatchStrength.SOLID_MATCH;
- }
- // ... should we allow non-standard? Let's not yet... can add if need be
- return MatchStrength.NO_MATCH;
- }
- MatchStrength strength;
-
- if (ch == '[') {
- ch = skipSpace(acc);
- if (ch < 0) {
- return MatchStrength.INCONCLUSIVE;
- }
- // closing brackets is easy; but for now, let's also accept opening...
- if (ch == ']' || ch == '[') {
- return MatchStrength.SOLID_MATCH;
- }
- return MatchStrength.SOLID_MATCH;
- } else {
- // plain old value is not very convincing...
- strength = MatchStrength.WEAK_MATCH;
- }
-
- if (ch == '"') { // string value
- return strength;
- }
- if (ch <= '9' && ch >= '0') { // number
- return strength;
- }
- if (ch == '-') { // negative number
- ch = skipSpace(acc);
- if (ch < 0) {
- return MatchStrength.INCONCLUSIVE;
- }
- return (ch <= '9' && ch >= '0') ? strength : MatchStrength.NO_MATCH;
- }
- // or one of literals
- if (ch == 'n') { // null
- return tryMatch(acc, "ull", strength);
- }
- if (ch == 't') { // true
- return tryMatch(acc, "rue", strength);
- }
- if (ch == 'f') { // false
- return tryMatch(acc, "alse", strength);
- }
- return MatchStrength.NO_MATCH;
- }
-
- private static MatchStrength tryMatch(InputAccessor acc, String matchStr, MatchStrength fullMatchStrength)
- throws IOException
- {
- for (int i = 0, len = matchStr.length(); i < len; ++i) {
- if (!acc.hasMoreBytes()) {
- return MatchStrength.INCONCLUSIVE;
- }
- if (acc.nextByte() != matchStr.charAt(i)) {
- return MatchStrength.NO_MATCH;
- }
- }
- return fullMatchStrength;
- }
-
- private static int skipSpace(InputAccessor acc) throws IOException
- {
- if (!acc.hasMoreBytes()) {
- return -1;
- }
- return skipSpace(acc, acc.nextByte());
- }
-
- private static int skipSpace(InputAccessor acc, byte b) throws IOException
- {
- while (true) {
- int ch = (int) b & 0xFF;
- if (!(ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t')) {
- return ch;
- }
- if (!acc.hasMoreBytes()) {
- return -1;
- }
- b = acc.nextByte();
- ch = (int) b & 0xFF;
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, parsing
- /**********************************************************
- */
-
- /**
- * @return True if a BOM was succesfully found, and encoding
- * thereby recognized.
- */
- private boolean handleBOM(int quad)
- throws IOException
- {
- /* Handling of (usually) optional BOM (required for
- * multi-byte formats); first 32-bit charsets:
- */
- switch (quad) {
- case 0x0000FEFF:
- _bigEndian = true;
- _inputPtr += 4;
- _bytesPerChar = 4;
- return true;
- case 0xFFFE0000: // UCS-4, LE?
- _inputPtr += 4;
- _bytesPerChar = 4;
- _bigEndian = false;
- return true;
- case 0x0000FFFE: // UCS-4, in-order...
- reportWeirdUCS4("2143"); // throws exception
- case 0xFEFF0000: // UCS-4, in-order...
- reportWeirdUCS4("3412"); // throws exception
- }
- // Ok, if not, how about 16-bit encoding BOMs?
- int msw = quad >>> 16;
- if (msw == 0xFEFF) { // UTF-16, BE
- _inputPtr += 2;
- _bytesPerChar = 2;
- _bigEndian = true;
- return true;
- }
- if (msw == 0xFFFE) { // UTF-16, LE
- _inputPtr += 2;
- _bytesPerChar = 2;
- _bigEndian = false;
- return true;
- }
- // And if not, then UTF-8 BOM?
- if ((quad >>> 8) == 0xEFBBBF) { // UTF-8
- _inputPtr += 3;
- _bytesPerChar = 1;
- _bigEndian = true; // doesn't really matter
- return true;
- }
- return false;
- }
-
- private boolean checkUTF32(int quad)
- throws IOException
- {
- /* Handling of (usually) optional BOM (required for
- * multi-byte formats); first 32-bit charsets:
- */
- if ((quad >> 8) == 0) { // 0x000000?? -> UTF32-BE
- _bigEndian = true;
- } else if ((quad & 0x00FFFFFF) == 0) { // 0x??000000 -> UTF32-LE
- _bigEndian = false;
- } else if ((quad & ~0x00FF0000) == 0) { // 0x00??0000 -> UTF32-in-order
- reportWeirdUCS4("3412");
- } else if ((quad & ~0x0000FF00) == 0) { // 0x0000??00 -> UTF32-in-order
- reportWeirdUCS4("2143");
- } else {
- // Can not be valid UTF-32 encoded JSON...
- return false;
- }
- // Not BOM (just regular content), nothing to skip past:
- //_inputPtr += 4;
- _bytesPerChar = 4;
- return true;
- }
-
- private boolean checkUTF16(int i16)
- {
- if ((i16 & 0xFF00) == 0) { // UTF-16BE
- _bigEndian = true;
- } else if ((i16 & 0x00FF) == 0) { // UTF-16LE
- _bigEndian = false;
- } else { // nope, not UTF-16
- return false;
- }
- // Not BOM (just regular content), nothing to skip past:
- //_inputPtr += 2;
- _bytesPerChar = 2;
- return true;
- }
-
- /*
- /**********************************************************
- /* Internal methods, problem reporting
- /**********************************************************
- */
-
- private void reportWeirdUCS4(String type)
- throws IOException
- {
- throw new CharConversionException("Unsupported UCS-4 endianness ("+type+") detected");
- }
-
- /*
- /**********************************************************
- /* Internal methods, raw input access
- /**********************************************************
- */
-
- protected boolean ensureLoaded(int minimum)
- throws IOException
- {
- /* Let's assume here buffer has enough room -- this will always
- * be true for the limited used this method gets
- */
- int gotten = (_inputEnd - _inputPtr);
- while (gotten < minimum) {
- int count;
-
- if (_in == null) { // block source
- count = -1;
- } else {
- count = _in.read(_inputBuffer, _inputEnd, _inputBuffer.length - _inputEnd);
- }
- if (count < 1) {
- return false;
- }
- _inputEnd += count;
- gotten += count;
- }
- return true;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/DupDetector.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/DupDetector.java
deleted file mode 100644
index 770203c7d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/DupDetector.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Helper class used if
- * {@link com.fr.third.fasterxml.jackson.core.JsonParser.Feature#STRICT_DUPLICATE_DETECTION}
- * is enabled.
- * Optimized to try to limit memory usage and processing overhead for smallest
- * entries, but without adding trashing (immutable objects would achieve optimal
- * memory usage but lead to significant number of discarded temp objects for
- * scopes with large number of entries). Another consideration is trying to limit
- * actual number of compiled classes as it contributes significantly to overall
- * jar size (due to linkage etc).
- *
- * @since 2.3
- */
-public class DupDetector
-{
- /**
- * We need to store a back-reference here to parser/generator, unfortunately.
- */
- protected final Object _source;
-
- protected String _firstName;
-
- protected String _secondName;
-
- /**
- * Lazily constructed set of names already seen within this context.
- */
- protected HashSet _seen;
-
- private DupDetector(Object src) {
- _source = src;
- }
-
- public static DupDetector rootDetector(JsonParser p) {
- return new DupDetector(p);
- }
-
- public static DupDetector rootDetector(JsonGenerator g) {
- return new DupDetector(g);
- }
-
- public DupDetector child() {
- return new DupDetector(_source);
- }
-
- public void reset() {
- _firstName = null;
- _secondName = null;
- _seen = null;
- }
-
- public JsonLocation findLocation() {
- // ugly but:
- if (_source instanceof JsonParser) {
- return ((JsonParser)_source).getCurrentLocation();
- }
- // do generators have a way to provide Location? Apparently not...
- return null;
- }
-
- public boolean isDup(String name) throws JsonParseException
- {
- if (_firstName == null) {
- _firstName = name;
- return false;
- }
- if (name.equals(_firstName)) {
- return true;
- }
- if (_secondName == null) {
- _secondName = name;
- return false;
- }
- if (name.equals(_secondName)) {
- return true;
- }
- if (_seen == null) {
- _seen = new HashSet(16); // 16 is default, seems reasonable
- _seen.add(_firstName);
- _seen.add(_secondName);
- }
- return !_seen.add(name);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonGeneratorImpl.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonGeneratorImpl.java
deleted file mode 100644
index e30a074b8..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonGeneratorImpl.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.base.GeneratorBase;
-import com.fr.third.fasterxml.jackson.core.io.CharTypes;
-import com.fr.third.fasterxml.jackson.core.io.CharacterEscapes;
-import com.fr.third.fasterxml.jackson.core.io.IOContext;
-import com.fr.third.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-/**
- * Intermediate base class shared by JSON-backed generators
- * like {@link UTF8JsonGenerator} and {@link WriterBasedJsonGenerator}.
- *
- * @since 2.1
- */
-public abstract class JsonGeneratorImpl extends GeneratorBase
-{
- /*
- /**********************************************************
- /* Constants
- /**********************************************************
- */
-
- /**
- * This is the default set of escape codes, over 7-bit ASCII range
- * (first 128 character codes), used for single-byte UTF-8 characters.
- */
- protected final static int[] sOutputEscapes = CharTypes.get7BitOutputEscapes();
-
- /*
- /**********************************************************
- /* Configuration, basic I/O
- /**********************************************************
- */
-
- final protected IOContext _ioContext;
-
- /*
- /**********************************************************
- /* Configuration, output escaping
- /**********************************************************
- */
-
- /**
- * Currently active set of output escape code definitions (whether
- * and how to escape or not) for 7-bit ASCII range (first 128
- * character codes). Defined separately to make potentially
- * customizable
- */
- protected int[] _outputEscapes = sOutputEscapes;
-
- /**
- * Value between 128 (0x80) and 65535 (0xFFFF) that indicates highest
- * Unicode code point that will not need escaping; or 0 to indicate
- * that all characters can be represented without escaping.
- * Typically used to force escaping of some portion of character set;
- * for example to always escape non-ASCII characters (if value was 127).
- *
- * NOTE: not all sub-classes make use of this setting.
- */
- protected int _maximumNonEscapedChar;
-
- /**
- * Definition of custom character escapes to use for generators created
- * by this factory, if any. If null, standard data format specific
- * escapes are used.
- */
- protected CharacterEscapes _characterEscapes;
-
- /*
- /**********************************************************
- /* Configuration, other
- /**********************************************************
- */
-
- /**
- * Separator to use, if any, between root-level values.
- *
- * @since 2.1
- */
- protected SerializableString _rootValueSeparator
- = DefaultPrettyPrinter.DEFAULT_ROOT_VALUE_SEPARATOR;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public JsonGeneratorImpl(IOContext ctxt, int features, ObjectCodec codec)
- {
- super(features, codec);
- _ioContext = ctxt;
- if (isEnabled(Feature.ESCAPE_NON_ASCII)) {
- setHighestNonEscapedChar(127);
- }
- }
-
- /*
- /**********************************************************
- /* Overridden configuration methods
- /**********************************************************
- */
-
- @Override
- public JsonGenerator setHighestNonEscapedChar(int charCode) {
- _maximumNonEscapedChar = (charCode < 0) ? 0 : charCode;
- return this;
- }
-
- @Override
- public int getHighestEscapedChar() {
- return _maximumNonEscapedChar;
- }
-
- @Override
- public JsonGenerator setCharacterEscapes(CharacterEscapes esc)
- {
- _characterEscapes = esc;
- if (esc == null) { // revert to standard escapes
- _outputEscapes = sOutputEscapes;
- } else {
- _outputEscapes = esc.getEscapeCodesForAscii();
- }
- return this;
- }
-
- /**
- * Method for accessing custom escapes factory uses for {@link JsonGenerator}s
- * it creates.
- */
- @Override
- public CharacterEscapes getCharacterEscapes() {
- return _characterEscapes;
- }
-
- @Override
- public JsonGenerator setRootValueSeparator(SerializableString sep) {
- _rootValueSeparator = sep;
- return this;
- }
-
- /*
- /**********************************************************
- /* Versioned
- /**********************************************************
- */
-
- @Override
- public Version version() {
- return VersionUtil.versionFor(getClass());
- }
-
- /*
- /**********************************************************
- /* Partial API
- /**********************************************************
- */
-
- // // Overrides just to make things final, to possibly help with inlining
-
- @Override
- public final void writeStringField(String fieldName, String value)
- throws IOException, JsonGenerationException
- {
- writeFieldName(fieldName);
- writeString(value);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonReadContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonReadContext.java
deleted file mode 100644
index 43b5c1e55..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonReadContext.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.CharTypes;
-
-/**
- * Extension of {@link JsonStreamContext}, which implements
- * core methods needed, and also exposes
- * more complete API to parser implementation classes.
- */
-public final class JsonReadContext
- extends JsonStreamContext
-{
- // // // Configuration
-
- /**
- * Parent context for this context; null for root context.
- */
- protected final JsonReadContext _parent;
-
- // // // Optional duplicate detection
-
- protected final DupDetector _dups;
-
- // // // Location information (minus source reference)
-
- protected int _lineNr;
- protected int _columnNr;
-
- protected String _currentName;
-
- /*
- /**********************************************************
- /* Simple instance reuse slots; speeds up things
- /* a bit (10-15%) for docs with lots of small
- /* arrays/objects (for which allocation was
- /* visible in profile stack frames)
- /**********************************************************
- */
-
- protected JsonReadContext _child = null;
-
- /*
- /**********************************************************
- /* Instance construction, reuse
- /**********************************************************
- */
-
- public JsonReadContext(JsonReadContext parent, DupDetector dups,
- int type, int lineNr, int colNr)
- {
- super();
- _parent = parent;
- _dups = dups;
- _type = type;
- _lineNr = lineNr;
- _columnNr = colNr;
- _index = -1;
- }
-
- protected void reset(int type, int lineNr, int colNr)
- {
- _type = type;
- _index = -1;
- _lineNr = lineNr;
- _columnNr = colNr;
- _currentName = null;
- if (_dups != null) {
- _dups.reset();
- }
- }
-
- /*
- public void trackDups(JsonParser jp) {
- _dups = DupDetector.rootDetector(jp);
- }
- */
-
- // // // Factory methods
-
- @Deprecated // since 2.3, use variant that takes dup detector
- public static JsonReadContext createRootContext(int lineNr, int colNr) {
- return createRootContext(lineNr, colNr, null);
- }
-
- public static JsonReadContext createRootContext(int lineNr, int colNr,
- DupDetector dups)
- {
- return new JsonReadContext(null, dups, TYPE_ROOT, lineNr, colNr);
- }
-
- @Deprecated // since 2.3, use variant that takes dup detector
- public static JsonReadContext createRootContext() {
- return createRootContext(null);
- }
-
- public static JsonReadContext createRootContext(DupDetector dups) {
- return new JsonReadContext(null, dups, TYPE_ROOT, 1, 0);
- }
-
- public JsonReadContext createChildArrayContext(int lineNr, int colNr)
- {
- JsonReadContext ctxt = _child;
- if (ctxt == null) {
- _child = ctxt = new JsonReadContext(this,
- (_dups == null) ? null : _dups.child(),
- TYPE_ARRAY, lineNr, colNr);
- } else {
- ctxt.reset(TYPE_ARRAY, lineNr, colNr);
- }
- return ctxt;
- }
-
- public JsonReadContext createChildObjectContext(int lineNr, int colNr)
- {
- JsonReadContext ctxt = _child;
- if (ctxt == null) {
- _child = ctxt = new JsonReadContext(this,
- (_dups == null) ? null : _dups.child(),
- TYPE_OBJECT, lineNr, colNr);
- return ctxt;
- }
- ctxt.reset(TYPE_OBJECT, lineNr, colNr);
- return ctxt;
- }
-
- /*
- /**********************************************************
- /* Abstract method implementation
- /**********************************************************
- */
-
- @Override
- public String getCurrentName() { return _currentName; }
-
- @Override
- public JsonReadContext getParent() { return _parent; }
-
- /*
- /**********************************************************
- /* Extended API
- /**********************************************************
- */
-
- /**
- * @return Location pointing to the point where the context
- * start marker was found
- */
- public JsonLocation getStartLocation(Object srcRef)
- {
- /* We don't keep track of offsets at this level (only
- * reader does)
- */
- long totalChars = -1L;
-
- return new JsonLocation(srcRef, totalChars, _lineNr, _columnNr);
- }
-
- /*
- /**********************************************************
- /* State changes
- /**********************************************************
- */
-
- public boolean expectComma()
- {
- /* Assumption here is that we will be getting a value (at least
- * before calling this method again), and
- * so will auto-increment index to avoid having to do another call
- */
- int ix = ++_index; // starts from -1
- return (_type != TYPE_ROOT && ix > 0);
- }
-
- public void setCurrentName(String name) throws JsonProcessingException
- {
- _currentName = name;
- if (_dups != null) {
- _checkDup(_dups, name);
- }
- }
-
- private void _checkDup(DupDetector dd, String name) throws JsonProcessingException
- {
- if (dd.isDup(name)) {
- throw new JsonParseException("Duplicate field '"+name+"'", dd.findLocation());
- }
- }
-
- /*
- /**********************************************************
- /* Overridden standard methods
- /**********************************************************
- */
-
- /**
- * Overridden to provide developer readable "JsonPath" representation
- * of the context.
- */
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder(64);
- switch (_type) {
- case TYPE_ROOT:
- sb.append("/");
- break;
- case TYPE_ARRAY:
- sb.append('[');
- sb.append(getCurrentIndex());
- sb.append(']');
- break;
- case TYPE_OBJECT:
- sb.append('{');
- if (_currentName != null) {
- sb.append('"');
- CharTypes.appendQuoted(sb, _currentName);
- sb.append('"');
- } else {
- sb.append('?');
- }
- sb.append('}');
- break;
- }
- return sb.toString();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonWriteContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonWriteContext.java
deleted file mode 100644
index 2ae9430a6..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/JsonWriteContext.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Extension of {@link JsonStreamContext}, which implements
- * core methods needed, and also exposes
- * more complete API to generator implementation classes.
- */
-public class JsonWriteContext
- extends JsonStreamContext
-{
- // // // Return values for writeValue()
-
- public final static int STATUS_OK_AS_IS = 0;
- public final static int STATUS_OK_AFTER_COMMA = 1;
- public final static int STATUS_OK_AFTER_COLON = 2;
- public final static int STATUS_OK_AFTER_SPACE = 3; // in root context
- public final static int STATUS_EXPECT_VALUE = 4;
- public final static int STATUS_EXPECT_NAME = 5;
-
- /**
- * Parent context for this context; null for root context.
- */
- protected final JsonWriteContext _parent;
-
- // // // Optional duplicate detection
-
- protected final DupDetector _dups;
-
- /*
- /**********************************************************
- /* Simple instance reuse slots; speed up things
- /* a bit (10-15%) for docs with lots of small
- /* arrays/objects
- /**********************************************************
- */
-
- protected JsonWriteContext _child = null;
-
- /**
- * Name of the field of which value is to be parsed; only
- * used for OBJECT contexts
- */
- protected String _currentName;
-
- /**
- * Marker used to indicate that we just received a name, and
- * now expect a value
- */
- protected boolean _gotName;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected JsonWriteContext(int type, JsonWriteContext parent,
- DupDetector dups)
- {
- super();
- _type = type;
- _parent = parent;
- _dups = dups;
- _index = -1;
- }
-
- protected JsonWriteContext reset(int type) {
- _type = type;
- _index = -1;
- _currentName = null;
- _gotName = false;
- if (_dups != null) {
- _dups.reset();
- }
- return this;
- }
-
- // // // Factory methods
-
- /**
- * @deprecated Since 2.3; use method that takes argument
- */
- @Deprecated
- public static JsonWriteContext createRootContext() {
- return createRootContext(null);
- }
-
- public static JsonWriteContext createRootContext(DupDetector dd) {
- return new JsonWriteContext(TYPE_ROOT, null, dd);
- }
-
- public JsonWriteContext createChildArrayContext()
- {
- JsonWriteContext ctxt = _child;
- if (ctxt == null) {
- _child = ctxt = new JsonWriteContext(TYPE_ARRAY, this,
- (_dups == null) ? null : _dups.child());
- return ctxt;
- }
- return ctxt.reset(TYPE_ARRAY);
- }
-
- public JsonWriteContext createChildObjectContext()
- {
- JsonWriteContext ctxt = _child;
- if (ctxt == null) {
- _child = ctxt = new JsonWriteContext(TYPE_OBJECT, this,
- (_dups == null) ? null : _dups.child());
- return ctxt;
- }
- return ctxt.reset(TYPE_OBJECT);
- }
-
- // // // Shared API
-
- @Override
- public final JsonWriteContext getParent() { return _parent; }
-
- @Override
- public final String getCurrentName() { return _currentName; }
-
- // // // API sub-classes are to implement
-
- /**
- * Method that writer is to call before it writes a field name.
- *
- * @return Index of the field entry (0-based)
- */
- public final int writeFieldName(String name) throws JsonProcessingException
- {
- _gotName = true;
- _currentName = name;
- if (_dups != null) {
- _checkDup(_dups, name);
- }
- return (_index < 0) ? STATUS_OK_AS_IS : STATUS_OK_AFTER_COMMA;
- }
-
- private void _checkDup(DupDetector dd, String name) throws JsonProcessingException
- {
- if (dd.isDup(name)) {
- throw new JsonGenerationException("Duplicate field '"+name+"'");
- }
- }
-
- public final int writeValue()
- {
- // Most likely, object:
- if (_type == TYPE_OBJECT) {
- _gotName = false;
- ++_index;
- return STATUS_OK_AFTER_COLON;
- }
-
- // Ok, array?
- if (_type == TYPE_ARRAY) {
- int ix = _index;
- ++_index;
- return (ix < 0) ? STATUS_OK_AS_IS : STATUS_OK_AFTER_COMMA;
- }
-
- // Nope, root context
- // No commas within root context, but need space
- ++_index;
- return (_index == 0) ? STATUS_OK_AS_IS : STATUS_OK_AFTER_SPACE;
- }
-
- // // // Internally used abstract methods
-
- protected final void appendDesc(StringBuilder sb)
- {
- if (_type == TYPE_OBJECT) {
- sb.append('{');
- if (_currentName != null) {
- sb.append('"');
- // !!! TODO: Name chars should be escaped?
- sb.append(_currentName);
- sb.append('"');
- } else {
- sb.append('?');
- }
- sb.append('}');
- } else if (_type == TYPE_ARRAY) {
- sb.append('[');
- sb.append(getCurrentIndex());
- sb.append(']');
- } else {
- // nah, ROOT:
- sb.append("/");
- }
- }
-
- // // // Overridden standard methods
-
- /**
- * Overridden to provide developer writeable "JsonPath" representation
- * of the context.
- */
- @Override
- public final String toString()
- {
- StringBuilder sb = new StringBuilder(64);
- appendDesc(sb);
- return sb.toString();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java
deleted file mode 100644
index da93f040f..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import com.fr.third.fasterxml.jackson.core.Version;
-import com.fr.third.fasterxml.jackson.core.Versioned;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-/**
- * Automatically generated from PackageVersion.java.in during
- * packageVersion-generate execution of maven-replacer-plugin in
- * pom.xml.
- */
-public final class PackageVersion implements Versioned {
- public final static Version VERSION = VersionUtil.parseVersion(
- "2.3.3", "com.fr.third.fasterxml.jackson.core", "jackson-core");
-
- @Override
- public Version version() {
- return VERSION;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java.in b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java.in
deleted file mode 100644
index 301ce4767..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/PackageVersion.java.in
+++ /dev/null
@@ -1,20 +0,0 @@
-package @package@;
-
-import com.fr.third.fasterxml.jackson.core.Version;
-import com.fr.third.fasterxml.jackson.core.Versioned;
-import com.fr.third.fasterxml.jackson.core.util.VersionUtil;
-
-/**
- * Automatically generated from PackageVersion.java.in during
- * packageVersion-generate execution of maven-replacer-plugin in
- * pom.xml.
- */
-public final class PackageVersion implements Versioned {
- public final static Version VERSION = VersionUtil.parseVersion(
- "@projectversion@", "@projectgroupid@", "@projectartifactid@");
-
- @Override
- public Version version() {
- return VERSION;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ReaderBasedJsonParser.java
deleted file mode 100644
index 856682f51..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/ReaderBasedJsonParser.java
+++ /dev/null
@@ -1,2044 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.base.ParserBase;
-import com.fr.third.fasterxml.jackson.core.io.CharTypes;
-import com.fr.third.fasterxml.jackson.core.io.IOContext;
-import com.fr.third.fasterxml.jackson.core.sym.CharsToNameCanonicalizer;
-import com.fr.third.fasterxml.jackson.core.util.*;
-
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.*;
-
-/**
- * This is a concrete implementation of {@link JsonParser}, which is
- * based on a {@link java.io.Reader} to handle low-level character
- * conversion tasks.
- */
-public final class ReaderBasedJsonParser
- extends ParserBase
-{
- // Latin1 encoding is not supported, but we do use 8-bit subset for
- // pre-processing task, to simplify first pass, keep it fast.
- protected final static int[] _icLatin1 = CharTypes.getInputCodeLatin1();
-
- // White-space processing is done all the time, pre-fetch as well
- private final static int[] _icWS = CharTypes.getInputCodeWS();
-
- /*
- /**********************************************************
- /* Input configuration
- /**********************************************************
- */
-
- /**
- * Reader that can be used for reading more content, if one
- * buffer from input source, but in some cases pre-loaded buffer
- * is handed to the parser.
- */
- protected Reader _reader;
-
- /**
- * Current buffer from which data is read; generally data is read into
- * buffer from input source.
- */
- protected char[] _inputBuffer;
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- protected ObjectCodec _objectCodec;
-
- final protected CharsToNameCanonicalizer _symbols;
-
- final protected int _hashSeed;
-
- /*
- /**********************************************************
- /* Parsing state
- /**********************************************************
- */
-
- /**
- * Flag that indicates that the current token has not yet
- * been fully processed, and needs to be finished for
- * some access (or skipped to obtain the next token)
- */
- protected boolean _tokenIncomplete = false;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public ReaderBasedJsonParser(IOContext ctxt, int features, Reader r,
- ObjectCodec codec, CharsToNameCanonicalizer st)
- {
- super(ctxt, features);
- _reader = r;
- _inputBuffer = ctxt.allocTokenBuffer();
- _objectCodec = codec;
- _symbols = st;
- _hashSeed = st.hashSeed();
- }
-
- /*
- /**********************************************************
- /* Base method defs, overrides
- /**********************************************************
- */
-
- @Override
- public ObjectCodec getCodec() {
- return _objectCodec;
- }
-
- @Override
- public void setCodec(ObjectCodec c) {
- _objectCodec = c;
- }
-
- @Override
- public int releaseBuffered(Writer w) throws IOException
- {
- int count = _inputEnd - _inputPtr;
- if (count < 1) {
- return 0;
- }
- // let's just advance ptr to end
- int origPtr = _inputPtr;
- w.write(_inputBuffer, origPtr, count);
- return count;
- }
-
- @Override
- public Object getInputSource() {
- return _reader;
- }
-
- @Override
- protected boolean loadMore() throws IOException
- {
- _currInputProcessed += _inputEnd;
- _currInputRowStart -= _inputEnd;
-
- if (_reader != null) {
- int count = _reader.read(_inputBuffer, 0, _inputBuffer.length);
- if (count > 0) {
- _inputPtr = 0;
- _inputEnd = count;
- return true;
- }
- // End of input
- _closeInput();
- // Should never return 0, so let's fail
- if (count == 0) {
- throw new IOException("Reader returned 0 characters when trying to read "+_inputEnd);
- }
- }
- return false;
- }
-
- protected char getNextChar(String eofMsg)
- throws IOException, JsonParseException
- {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(eofMsg);
- }
- }
- return _inputBuffer[_inputPtr++];
- }
-
- @Override
- protected void _closeInput() throws IOException
- {
- /* 25-Nov-2008, tatus: As per [JACKSON-16] we are not to call close()
- * on the underlying Reader, unless we "own" it, or auto-closing
- * feature is enabled.
- * One downside is that when using our optimized
- * Reader (granted, we only do that for UTF-32...) this
- * means that buffer recycling won't work correctly.
- */
- if (_reader != null) {
- if (_ioContext.isResourceManaged() || isEnabled(Feature.AUTO_CLOSE_SOURCE)) {
- _reader.close();
- }
- _reader = null;
- }
- }
-
- /**
- * Method called to release internal buffers owned by the base
- * reader. This may be called along with {@link #_closeInput} (for
- * example, when explicitly closing this reader instance), or
- * separately (if need be).
- */
- @Override
- protected void _releaseBuffers()
- throws IOException
- {
- super._releaseBuffers();
- // merge new symbols, if any
- _symbols.release();
- char[] buf = _inputBuffer;
- if (buf != null) {
- _inputBuffer = null;
- _ioContext.releaseTokenBuffer(buf);
- }
- }
-
- /*
- /**********************************************************
- /* Public API, data access
- /**********************************************************
- */
-
- /**
- * Method for accessing textual representation of the current event;
- * if no current event (before first call to {@link #nextToken}, or
- * after encountering end-of-input), returns null.
- * Method can be called for any event.
- */
- @Override
- public String getText()
- throws IOException, JsonParseException
- {
- JsonToken t = _currToken;
- if (t == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return _getText2(t);
- }
-
- // // // Let's override default impls for improved performance
-
- // @since 2.1
- @Override
- public String getValueAsString() throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return super.getValueAsString(null);
- }
-
- // @since 2.1
- @Override
- public String getValueAsString(String defValue) throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return super.getValueAsString(defValue);
- }
-
- protected String _getText2(JsonToken t)
- {
- if (t == null) {
- return null;
- }
- switch (t.id()) {
- case ID_FIELD_NAME:
- return _parsingContext.getCurrentName();
-
- case ID_STRING:
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.contentsAsString();
- default:
- return t.asString();
- }
- }
-
- @Override
- public char[] getTextCharacters()
- throws IOException, JsonParseException
- {
- if (_currToken != null) { // null only before/after document
- switch (_currToken.id()) {
- case ID_FIELD_NAME:
- if (!_nameCopied) {
- String name = _parsingContext.getCurrentName();
- int nameLen = name.length();
- if (_nameCopyBuffer == null) {
- _nameCopyBuffer = _ioContext.allocNameCopyBuffer(nameLen);
- } else if (_nameCopyBuffer.length < nameLen) {
- _nameCopyBuffer = new char[nameLen];
- }
- name.getChars(0, nameLen, _nameCopyBuffer, 0);
- _nameCopied = true;
- }
- return _nameCopyBuffer;
-
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.getTextBuffer();
-
- default:
- return _currToken.asCharArray();
- }
- }
- return null;
- }
-
- @Override
- public int getTextLength()
- throws IOException, JsonParseException
- {
- if (_currToken != null) { // null only before/after document
- switch (_currToken.id()) {
-
- case ID_FIELD_NAME:
- return _parsingContext.getCurrentName().length();
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.size();
-
- default:
- return _currToken.asCharArray().length;
- }
- }
- return 0;
- }
-
- @Override
- public int getTextOffset() throws IOException, JsonParseException
- {
- // Most have offset of 0, only some may have other values:
- if (_currToken != null) {
- switch (_currToken.id()) {
- case ID_FIELD_NAME:
- return 0;
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.getTextOffset();
- default:
- }
- }
- return 0;
- }
-
- @Override
- public byte[] getBinaryValue(Base64Variant b64variant)
- throws IOException, JsonParseException
- {
- if (_currToken != JsonToken.VALUE_STRING &&
- (_currToken != JsonToken.VALUE_EMBEDDED_OBJECT || _binaryValue == null)) {
- _reportError("Current token ("+_currToken+") not VALUE_STRING or VALUE_EMBEDDED_OBJECT, can not access as binary");
- }
- /* To ensure that we won't see inconsistent data, better clear up
- * state...
- */
- if (_tokenIncomplete) {
- try {
- _binaryValue = _decodeBase64(b64variant);
- } catch (IllegalArgumentException iae) {
- throw _constructError("Failed to decode VALUE_STRING as base64 ("+b64variant+"): "+iae.getMessage());
- }
- /* let's clear incomplete only now; allows for accessing other
- * textual content in error cases
- */
- _tokenIncomplete = false;
- } else { // may actually require conversion...
- if (_binaryValue == null) {
- @SuppressWarnings("resource")
- ByteArrayBuilder builder = _getByteArrayBuilder();
- _decodeBase64(getText(), builder, b64variant);
- _binaryValue = builder.toByteArray();
- }
- }
- return _binaryValue;
- }
-
- @Override
- public int readBinaryValue(Base64Variant b64variant, OutputStream out)
- throws IOException, JsonParseException
- {
- // if we have already read the token, just use whatever we may have
- if (!_tokenIncomplete || _currToken != JsonToken.VALUE_STRING) {
- byte[] b = getBinaryValue(b64variant);
- out.write(b);
- return b.length;
- }
- // otherwise do "real" incremental parsing...
- byte[] buf = _ioContext.allocBase64Buffer();
- try {
- return _readBinary(b64variant, out, buf);
- } finally {
- _ioContext.releaseBase64Buffer(buf);
- }
- }
-
- protected int _readBinary(Base64Variant b64variant, OutputStream out, byte[] buffer)
- throws IOException, JsonParseException
- {
- int outputPtr = 0;
- final int outputEnd = buffer.length - 3;
- int outputCount = 0;
-
- while (true) {
- // first, we'll skip preceding white space, if any
- char ch;
- do {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- } while (ch <= INT_SPACE);
- int bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) { // reached the end, fair and square?
- if (ch == '"') {
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 0);
- if (bits < 0) { // white space to skip
- continue;
- }
- }
-
- // enough room? If not, flush
- if (outputPtr > outputEnd) {
- outputCount += outputPtr;
- out.write(buffer, 0, outputPtr);
- outputPtr = 0;
- }
-
- int decodedData = bits;
-
- // then second base64 char; can't get padding yet, nor ws
-
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- bits = _decodeBase64Escape(b64variant, ch, 1);
- }
- decodedData = (decodedData << 6) | bits;
-
- // third base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
-
- // First branch: can get padding (-> 1 byte)
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 4;
- buffer[outputPtr++] = (byte) decodedData;
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 2);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- // Ok, must get padding
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- if (!b64variant.usesPaddingChar(ch)) {
- throw reportInvalidBase64Char(b64variant, ch, 3, "expected padding character '"+b64variant.getPaddingChar()+"'");
- }
- // Got 12 bits, only need 8, need to shift
- decodedData >>= 4;
- buffer[outputPtr++] = (byte) decodedData;
- continue;
- }
- }
- // Nope, 2 or 3 bytes
- decodedData = (decodedData << 6) | bits;
- // fourth and last base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 2;
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 3);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- /* With padding we only get 2 bytes; but we have
- * to shift it a bit so it is identical to triplet
- * case with partial output.
- * 3 chars gives 3x6 == 18 bits, of which 2 are
- * dummies, need to discard:
- */
- decodedData >>= 2;
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- continue;
- }
- }
- // otherwise, our triplet is now complete
- decodedData = (decodedData << 6) | bits;
- buffer[outputPtr++] = (byte) (decodedData >> 16);
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- }
- _tokenIncomplete = false;
- if (outputPtr > 0) {
- outputCount += outputPtr;
- out.write(buffer, 0, outputPtr);
- }
- return outputCount;
- }
-
- /*
- /**********************************************************
- /* Public API, traversal
- /**********************************************************
- */
-
- /**
- * @return Next token from the stream, if any found, or null
- * to indicate end-of-input
- */
- @Override
- public JsonToken nextToken()
- throws IOException, JsonParseException
- {
- _numTypesValid = NR_UNKNOWN;
-
- /* First: field names are special -- we will always tokenize
- * (part of) value along with field name to simplify
- * state handling. If so, can and need to use secondary token:
- */
- if (_currToken == JsonToken.FIELD_NAME) {
- return _nextAfterName();
- }
- if (_tokenIncomplete) {
- _skipString(); // only strings can be partial
- }
- int i = _skipWSOrEnd();
- if (i < 0) { // end-of-input
- /* 19-Feb-2009, tatu: Should actually close/release things
- * like input source, symbol table and recyclable buffers now.
- */
- close();
- return (_currToken = null);
- }
-
- /* First, need to ensure we know the starting location of token
- * after skipping leading white space
- */
- _tokenInputTotal = _currInputProcessed + _inputPtr - 1;
- _tokenInputRow = _currInputRow;
- _tokenInputCol = _inputPtr - _currInputRowStart - 1;
-
- // finally: clear any data retained so far
- _binaryValue = null;
-
- // Closing scope?
- if (i == INT_RBRACKET) {
- if (!_parsingContext.inArray()) {
- _reportMismatchedEndMarker(i, '}');
- }
- _parsingContext = _parsingContext.getParent();
- return (_currToken = JsonToken.END_ARRAY);
- }
- if (i == INT_RCURLY) {
- if (!_parsingContext.inObject()) {
- _reportMismatchedEndMarker(i, ']');
- }
- _parsingContext = _parsingContext.getParent();
- return (_currToken = JsonToken.END_OBJECT);
- }
-
- // Nope: do we then expect a comma?
- if (_parsingContext.expectComma()) {
- if (i != INT_COMMA) {
- _reportUnexpectedChar(i, "was expecting comma to separate "+_parsingContext.getTypeDesc()+" entries");
- }
- i = _skipWS();
- }
-
- /* And should we now have a name? Always true for
- * Object contexts, since the intermediate 'expect-value'
- * state is never retained.
- */
- boolean inObject = _parsingContext.inObject();
- if (inObject) {
- // First, field name itself:
- String name = _parseName(i);
- _parsingContext.setCurrentName(name);
- _currToken = JsonToken.FIELD_NAME;
- i = _skipWS();
- if (i != INT_COLON) {
- _reportUnexpectedChar(i, "was expecting a colon to separate field name and value");
- }
- i = _skipWS();
- }
-
- // Ok: we must have a value... what is it?
-
- JsonToken t;
-
- switch (i) {
- case '"':
- _tokenIncomplete = true;
- t = JsonToken.VALUE_STRING;
- break;
- case '[':
- if (!inObject) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- }
- t = JsonToken.START_ARRAY;
- break;
- case '{':
- if (!inObject) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- t = JsonToken.START_OBJECT;
- break;
- case ']':
- case '}':
- // Error: neither is valid at this point; valid closers have
- // been handled earlier
- _reportUnexpectedChar(i, "expected a value");
- case 't':
- _matchToken("true", 1);
- t = JsonToken.VALUE_TRUE;
- break;
- case 'f':
- _matchToken("false", 1);
- t = JsonToken.VALUE_FALSE;
- break;
- case 'n':
- _matchToken("null", 1);
- t = JsonToken.VALUE_NULL;
- break;
-
- case '-':
- /* Should we have separate handling for plus? Although
- * it is not allowed per se, it may be erroneously used,
- * and could be indicate by a more specific error message.
- */
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- t = _parseNumber(i);
- break;
- default:
- t = _handleOddValue(i);
- break;
- }
-
- if (inObject) {
- _nextToken = t;
- return _currToken;
- }
- _currToken = t;
- return t;
- }
-
- private JsonToken _nextAfterName()
- {
- _nameCopied = false; // need to invalidate if it was copied
- JsonToken t = _nextToken;
- _nextToken = null;
- // Also: may need to start new context?
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return (_currToken = t);
- }
-
- /*
- @Override
- public boolean nextFieldName(SerializableString str)
- throws IOException, JsonParseException
- */
-
- // note: identical to one in UTF8StreamJsonParser
- @Override
- public String nextTextValue()
- throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString();
- }
- return _textBuffer.contentsAsString();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return null;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_STRING) ? getText() : null;
- }
-
- // note: identical to one in Utf8StreamParser
- @Override
- public int nextIntValue(int defaultValue)
- throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.FIELD_NAME) {
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_NUMBER_INT) {
- return getIntValue();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return defaultValue;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getIntValue() : defaultValue;
- }
-
- // note: identical to one in Utf8StreamParser
- @Override
- public long nextLongValue(long defaultValue)
- throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_NUMBER_INT) {
- return getLongValue();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return defaultValue;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getLongValue() : defaultValue;
- }
-
- // note: identical to one in UTF8StreamJsonParser
- @Override
- public Boolean nextBooleanValue()
- throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_TRUE) {
- return Boolean.TRUE;
- }
- if (t == JsonToken.VALUE_FALSE) {
- return Boolean.FALSE;
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return null;
- }
- JsonToken t = nextToken();
- if (t != null) {
- int id = t.id();
- if (id == ID_TRUE) return Boolean.TRUE;
- if (id == ID_FALSE) return Boolean.FALSE;
- }
- return null;
- }
-
- /*
- /**********************************************************
- /* Internal methods, number parsing
- /**********************************************************
- */
-
- /**
- * Initial parsing method for number values. It needs to be able
- * to parse enough input to be able to determine whether the
- * value is to be considered a simple integer value, or a more
- * generic decimal value: latter of which needs to be expressed
- * as a floating point number. The basic rule is that if the number
- * has no fractional or exponential part, it is an integer; otherwise
- * a floating point number.
- *
- * Because much of input has to be processed in any case, no partial
- * parsing is done: all input text will be stored for further
- * processing. However, actual numeric value conversion will be
- * deferred, since it is usually the most complicated and costliest
- * part of processing.
- */
- protected JsonToken _parseNumber(int ch) throws IOException
- {
- /* Although we will always be complete with respect to textual
- * representation (that is, all characters will be parsed),
- * actual conversion to a number is deferred. Thus, need to
- * note that no representations are valid yet
- */
- boolean negative = (ch == INT_MINUS);
- int ptr = _inputPtr;
- int startPtr = ptr-1; // to include sign/digit already read
- final int inputLen = _inputEnd;
-
- dummy_loop:
- do { // dummy loop, to be able to break out
- if (negative) { // need to read the next digit
- if (ptr >= _inputEnd) {
- break dummy_loop;
- }
- ch = _inputBuffer[ptr++];
- // First check: must have a digit to follow minus sign
- if (ch > INT_9 || ch < INT_0) {
- _inputPtr = ptr;
- return _handleInvalidNumberStart(ch, true);
- }
- /* (note: has been checked for non-negative already, in
- * the dispatching code that determined it should be
- * a numeric value)
- */
- }
- // One special case, leading zero(es):
- if (ch == INT_0) {
- break dummy_loop;
- }
-
- /* First, let's see if the whole number is contained within
- * the input buffer unsplit. This should be the common case;
- * and to simplify processing, we will just reparse contents
- * in the alternative case (number split on buffer boundary)
- */
-
- int intLen = 1; // already got one
-
- // First let's get the obligatory integer part:
-
- int_loop:
- while (true) {
- if (ptr >= _inputEnd) {
- break dummy_loop;
- }
- ch = (int) _inputBuffer[ptr++];
- if (ch < INT_0 || ch > INT_9) {
- break int_loop;
- }
- ++intLen;
- }
-
- int fractLen = 0;
-
- // And then see if we get other parts
- if (ch == '.') { // yes, fraction
- fract_loop:
- while (true) {
- if (ptr >= inputLen) {
- break dummy_loop;
- }
- ch = (int) _inputBuffer[ptr++];
- if (ch < INT_0 || ch > INT_9) {
- break fract_loop;
- }
- ++fractLen;
- }
- // must be followed by sequence of ints, one minimum
- if (fractLen == 0) {
- reportUnexpectedNumberChar(ch, "Decimal point not followed by a digit");
- }
- }
-
- int expLen = 0;
- if (ch == 'e' || ch == 'E') { // and/or exponent
- if (ptr >= inputLen) {
- break dummy_loop;
- }
- // Sign indicator?
- ch = (int) _inputBuffer[ptr++];
- if (ch == INT_MINUS || ch == INT_PLUS) { // yup, skip for now
- if (ptr >= inputLen) {
- break dummy_loop;
- }
- ch = (int) _inputBuffer[ptr++];
- }
- while (ch <= INT_9 && ch >= INT_0) {
- ++expLen;
- if (ptr >= inputLen) {
- break dummy_loop;
- }
- ch = (int) _inputBuffer[ptr++];
- }
- // must be followed by sequence of ints, one minimum
- if (expLen == 0) {
- reportUnexpectedNumberChar(ch, "Exponent indicator not followed by a digit");
- }
- }
- // Got it all: let's add to text buffer for parsing, access
- --ptr; // need to push back following separator
- _inputPtr = ptr;
- // As per #105, need separating space between root values; check here
- if (_parsingContext.inRoot()) {
- _verifyRootSpace(ch);
- }
- int len = ptr-startPtr;
- _textBuffer.resetWithShared(_inputBuffer, startPtr, len);
- return reset(negative, intLen, fractLen, expLen);
- } while (false);
-
- _inputPtr = negative ? (startPtr+1) : startPtr;
- return _parseNumber2(negative);
- }
-
- /**
- * Method called to parse a number, when the primary parse
- * method has failed to parse it, due to it being split on
- * buffer boundary. As a result code is very similar, except
- * that it has to explicitly copy contents to the text buffer
- * instead of just sharing the main input buffer.
- */
- private JsonToken _parseNumber2(boolean negative) throws IOException
- {
- char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
- int outPtr = 0;
-
- // Need to prepend sign?
- if (negative) {
- outBuf[outPtr++] = '-';
- }
-
- // This is the place to do leading-zero check(s) too:
- int intLen = 0;
- char c = (_inputPtr < _inputEnd) ? _inputBuffer[_inputPtr++] : getNextChar("No digit following minus sign");
- if (c == '0') {
- c = _verifyNoLeadingZeroes();
- }
- boolean eof = false;
-
- // Ok, first the obligatory integer part:
- int_loop:
- while (c >= '0' && c <= '9') {
- ++intLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = c;
- if (_inputPtr >= _inputEnd && !loadMore()) {
- // EOF is legal for main level int values
- c = CHAR_NULL;
- eof = true;
- break int_loop;
- }
- c = _inputBuffer[_inputPtr++];
- }
- // Also, integer part is not optional
- if (intLen == 0) {
- reportInvalidNumber("Missing integer part (next char "+_getCharDesc(c)+")");
- }
-
- int fractLen = 0;
- // And then see if we get other parts
- if (c == '.') { // yes, fraction
- outBuf[outPtr++] = c;
-
- fract_loop:
- while (true) {
- if (_inputPtr >= _inputEnd && !loadMore()) {
- eof = true;
- break fract_loop;
- }
- c = _inputBuffer[_inputPtr++];
- if (c < INT_0 || c > INT_9) {
- break fract_loop;
- }
- ++fractLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = c;
- }
- // must be followed by sequence of ints, one minimum
- if (fractLen == 0) {
- reportUnexpectedNumberChar(c, "Decimal point not followed by a digit");
- }
- }
-
- int expLen = 0;
- if (c == 'e' || c == 'E') { // exponent?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = c;
- // Not optional, can require that we get one more char
- c = (_inputPtr < _inputEnd) ? _inputBuffer[_inputPtr++]
- : getNextChar("expected a digit for number exponent");
- // Sign indicator?
- if (c == '-' || c == '+') {
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = c;
- // Likewise, non optional:
- c = (_inputPtr < _inputEnd) ? _inputBuffer[_inputPtr++]
- : getNextChar("expected a digit for number exponent");
- }
-
- exp_loop:
- while (c <= INT_9 && c >= INT_0) {
- ++expLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = c;
- if (_inputPtr >= _inputEnd && !loadMore()) {
- eof = true;
- break exp_loop;
- }
- c = _inputBuffer[_inputPtr++];
- }
- // must be followed by sequence of ints, one minimum
- if (expLen == 0) {
- reportUnexpectedNumberChar(c, "Exponent indicator not followed by a digit");
- }
- }
-
- // Ok; unless we hit end-of-input, need to push last char read back
- if (!eof) {
- --_inputPtr;
- if (_parsingContext.inRoot()) {
- _verifyRootSpace(c);
- }
- }
- _textBuffer.setCurrentLength(outPtr);
- // And there we have it!
- return reset(negative, intLen, fractLen, expLen);
- }
-
- /**
- * Method called when we have seen one zero, and want to ensure
- * it is not followed by another
- */
- private char _verifyNoLeadingZeroes() throws IOException
- {
- // Ok to have plain "0"
- if (_inputPtr >= _inputEnd && !loadMore()) {
- return '0';
- }
- char ch = _inputBuffer[_inputPtr];
- // if not followed by a number (probably '.'); return zero as is, to be included
- if (ch < '0' || ch > '9') {
- return '0';
- }
- if (!isEnabled(Feature.ALLOW_NUMERIC_LEADING_ZEROS)) {
- reportInvalidNumber("Leading zeroes not allowed");
- }
- // if so, just need to skip either all zeroes (if followed by number); or all but one (if non-number)
- ++_inputPtr; // Leading zero to be skipped
- if (ch == INT_0) {
- while (_inputPtr < _inputEnd || loadMore()) {
- ch = _inputBuffer[_inputPtr];
- if (ch < '0' || ch > '9') { // followed by non-number; retain one zero
- return '0';
- }
- ++_inputPtr; // skip previous zero
- if (ch != '0') { // followed by other number; return
- break;
- }
- }
- }
- return ch;
- }
-
- /**
- * Method called if expected numeric value (due to leading sign) does not
- * look like a number
- */
- protected JsonToken _handleInvalidNumberStart(int ch, boolean negative) throws IOException
- {
- if (ch == 'I') {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOFInValue();
- }
- }
- ch = _inputBuffer[_inputPtr++];
- if (ch == 'N') {
- String match = negative ? "-INF" :"+INF";
- _matchToken(match, 3);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN(match, negative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY);
- }
- _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- } else if (ch == 'n') {
- String match = negative ? "-Infinity" :"+Infinity";
- _matchToken(match, 3);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN(match, negative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY);
- }
- _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- }
- }
- reportUnexpectedNumberChar(ch, "expected digit (0-9) to follow minus sign, for valid numeric value");
- return null;
- }
-
- /**
- * Method called to ensure that a root-value is followed by a space
- * token.
- *
- * NOTE: caller MUST ensure there is at least one character available;
- * and that input pointer is AT given char (not past)
- */
- private final void _verifyRootSpace(int ch) throws IOException
- {
- // caller had pushed it back, before calling; reset
- ++_inputPtr;
- switch (ch) {
- case ' ':
- case '\t':
- return;
- case '\r':
- _skipCR();
- return;
- case '\n':
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- return;
- }
- _reportMissingRootWS(ch);
- }
-
- /*
- /**********************************************************
- /* Internal methods, secondary parsing
- /**********************************************************
- */
-
- protected String _parseName(int i) throws IOException
- {
- if (i != INT_QUOTE) {
- return _handleOddName(i);
- }
- /* First: let's try to see if we have a simple name: one that does
- * not cross input buffer boundary, and does not contain escape
- * sequences.
- */
- int ptr = _inputPtr;
- int hash = _hashSeed;
- final int inputLen = _inputEnd;
-
- if (ptr < inputLen) {
- final int[] codes = _icLatin1;
- final int maxCode = codes.length;
-
- do {
- int ch = _inputBuffer[ptr];
- if (ch < maxCode && codes[ch] != 0) {
- if (ch == '"') {
- int start = _inputPtr;
- _inputPtr = ptr+1; // to skip the quote
- return _symbols.findSymbol(_inputBuffer, start, ptr - start, hash);
- }
- break;
- }
- hash = (hash * CharsToNameCanonicalizer.HASH_MULT) + ch;
- ++ptr;
- } while (ptr < inputLen);
- }
-
- int start = _inputPtr;
- _inputPtr = ptr;
- return _parseName2(start, hash, INT_QUOTE);
- }
-
- private String _parseName2(int startPtr, int hash, int endChar) throws IOException
- {
- _textBuffer.resetWithShared(_inputBuffer, startPtr, (_inputPtr - startPtr));
-
- /* Output pointers; calls will also ensure that the buffer is
- * not shared and has room for at least one more char.
- */
- char[] outBuf = _textBuffer.getCurrentSegment();
- int outPtr = _textBuffer.getCurrentSegmentSize();
-
- while (true) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing '"+((char) endChar)+"' for name");
- }
- }
- char c = _inputBuffer[_inputPtr++];
- int i = (int) c;
- if (i <= INT_BACKSLASH) {
- if (i == INT_BACKSLASH) {
- /* Although chars outside of BMP are to be escaped as
- * an UTF-16 surrogate pair, does that affect decoding?
- * For now let's assume it does not.
- */
- c = _decodeEscaped();
- } else if (i <= endChar) {
- if (i == endChar) {
- break;
- }
- if (i < INT_SPACE) {
- _throwUnquotedSpace(i, "name");
- }
- }
- }
- hash = (hash * CharsToNameCanonicalizer.HASH_MULT) + i;
- // Ok, let's add char to output:
- outBuf[outPtr++] = c;
-
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- }
- _textBuffer.setCurrentLength(outPtr);
- {
- TextBuffer tb = _textBuffer;
- char[] buf = tb.getTextBuffer();
- int start = tb.getTextOffset();
- int len = tb.size();
-
- return _symbols.findSymbol(buf, start, len, hash);
- }
- }
-
- /**
- * Method called when we see non-white space character other
- * than double quote, when expecting a field name.
- * In standard mode will just throw an expection; but
- * in non-standard modes may be able to parse name.
- */
- protected String _handleOddName(int i) throws IOException
- {
- // [JACKSON-173]: allow single quotes
- if (i == '\'' && isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
- return _parseAposName();
- }
- // [JACKSON-69]: allow unquoted names if feature enabled:
- if (!isEnabled(Feature.ALLOW_UNQUOTED_FIELD_NAMES)) {
- _reportUnexpectedChar(i, "was expecting double-quote to start field name");
- }
- final int[] codes = CharTypes.getInputCodeLatin1JsNames();
- final int maxCode = codes.length;
-
- // Also: first char must be a valid name char, but NOT be number
- boolean firstOk;
-
- if (i < maxCode) { // identifier, or a number ([Issue#102])
- firstOk = (codes[i] == 0);
- } else {
- firstOk = Character.isJavaIdentifierPart((char) i);
- }
- if (!firstOk) {
- _reportUnexpectedChar(i, "was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name");
- }
- int ptr = _inputPtr;
- int hash = _hashSeed;
- final int inputLen = _inputEnd;
-
- if (ptr < inputLen) {
- do {
- int ch = _inputBuffer[ptr];
- if (ch < maxCode) {
- if (codes[ch] != 0) {
- int start = _inputPtr-1; // -1 to bring back first char
- _inputPtr = ptr;
- return _symbols.findSymbol(_inputBuffer, start, ptr - start, hash);
- }
- } else if (!Character.isJavaIdentifierPart((char) ch)) {
- int start = _inputPtr-1; // -1 to bring back first char
- _inputPtr = ptr;
- return _symbols.findSymbol(_inputBuffer, start, ptr - start, hash);
- }
- hash = (hash * CharsToNameCanonicalizer.HASH_MULT) + ch;
- ++ptr;
- } while (ptr < inputLen);
- }
- int start = _inputPtr-1;
- _inputPtr = ptr;
- return _handleOddName2(start, hash, codes);
- }
-
- protected String _parseAposName() throws IOException
- {
- // Note: mostly copy of_parseFieldName
- int ptr = _inputPtr;
- int hash = _hashSeed;
- final int inputLen = _inputEnd;
-
- if (ptr < inputLen) {
- final int[] codes = _icLatin1;
- final int maxCode = codes.length;
-
- do {
- int ch = _inputBuffer[ptr];
- if (ch == '\'') {
- int start = _inputPtr;
- _inputPtr = ptr+1; // to skip the quote
- return _symbols.findSymbol(_inputBuffer, start, ptr - start, hash);
- }
- if (ch < maxCode && codes[ch] != 0) {
- break;
- }
- hash = (hash * CharsToNameCanonicalizer.HASH_MULT) + ch;
- ++ptr;
- } while (ptr < inputLen);
- }
-
- int start = _inputPtr;
- _inputPtr = ptr;
-
- return _parseName2(start, hash, '\'');
- }
-
- /**
- * Method for handling cases where first non-space character
- * of an expected value token is not legal for standard JSON content.
- */
- protected JsonToken _handleOddValue(int i) throws IOException
- {
- // Most likely an error, unless we are to allow single-quote-strings
- switch (i) {
- case '\'':
- /* [JACKSON-173]: allow single quotes. Unlike with regular
- * Strings, we'll eagerly parse contents; this so that there's
- * no need to store information on quote char used.
- *
- * Also, no separation to fast/slow parsing; we'll just do
- * one regular (~= slowish) parsing, to keep code simple
- */
- if (isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
- return _handleApos();
- }
- break;
- case 'N':
- _matchToken("NaN", 1);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN("NaN", Double.NaN);
- }
- _reportError("Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- break;
- case 'I':
- _matchToken("Infinity", 1);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN("Infinity", Double.POSITIVE_INFINITY);
- }
- _reportError("Non-standard token 'Infinity': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- break;
- case '+': // note: '-' is taken as number
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOFInValue();
- }
- }
- return _handleInvalidNumberStart(_inputBuffer[_inputPtr++], false);
- }
- // [Issue#77] Try to decode most likely token
- if (Character.isJavaIdentifierStart(i)) {
- _reportInvalidToken(""+((char) i), "('true', 'false' or 'null')");
- }
- // but if it doesn't look like a token:
- _reportUnexpectedChar(i, "expected a valid value (number, String, array, object, 'true', 'false' or 'null')");
- return null;
- }
-
- protected JsonToken _handleApos() throws IOException
- {
- char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
- int outPtr = _textBuffer.getCurrentSegmentSize();
-
- while (true) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing quote for a string value");
- }
- }
- char c = _inputBuffer[_inputPtr++];
- int i = (int) c;
- if (i <= '\\') {
- if (i == '\\') {
- /* Although chars outside of BMP are to be escaped as
- * an UTF-16 surrogate pair, does that affect decoding?
- * For now let's assume it does not.
- */
- c = _decodeEscaped();
- } else if (i <= '\'') {
- if (i == '\'') {
- break;
- }
- if (i < INT_SPACE) {
- _throwUnquotedSpace(i, "string value");
- }
- }
- }
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- // Ok, let's add char to output:
- outBuf[outPtr++] = c;
- }
- _textBuffer.setCurrentLength(outPtr);
- return JsonToken.VALUE_STRING;
- }
-
- private String _handleOddName2(int startPtr, int hash, int[] codes) throws IOException
- {
- _textBuffer.resetWithShared(_inputBuffer, startPtr, (_inputPtr - startPtr));
- char[] outBuf = _textBuffer.getCurrentSegment();
- int outPtr = _textBuffer.getCurrentSegmentSize();
- final int maxCode = codes.length;
-
- while (true) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) { // acceptable for now (will error out later)
- break;
- }
- }
- char c = _inputBuffer[_inputPtr];
- int i = (int) c;
- if (i <= maxCode) {
- if (codes[i] != 0) {
- break;
- }
- } else if (!Character.isJavaIdentifierPart(c)) {
- break;
- }
- ++_inputPtr;
- hash = (hash * CharsToNameCanonicalizer.HASH_MULT) + i;
- // Ok, let's add char to output:
- outBuf[outPtr++] = c;
-
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- }
- _textBuffer.setCurrentLength(outPtr);
- {
- TextBuffer tb = _textBuffer;
- char[] buf = tb.getTextBuffer();
- int start = tb.getTextOffset();
- int len = tb.size();
-
- return _symbols.findSymbol(buf, start, len, hash);
- }
- }
-
- @Override
- protected void _finishString() throws IOException
- {
- /* First: let's try to see if we have simple String value: one
- * that does not cross input buffer boundary, and does not
- * contain escape sequences.
- */
- int ptr = _inputPtr;
- final int inputLen = _inputEnd;
-
- if (ptr < inputLen) {
- final int[] codes = _icLatin1;
- final int maxCode = codes.length;
-
- do {
- int ch = _inputBuffer[ptr];
- if (ch < maxCode && codes[ch] != 0) {
- if (ch == '"') {
- _textBuffer.resetWithShared(_inputBuffer, _inputPtr, (ptr-_inputPtr));
- _inputPtr = ptr+1;
- // Yes, we got it all
- return;
- }
- break;
- }
- ++ptr;
- } while (ptr < inputLen);
- }
-
- /* Either ran out of input, or bumped into an escape
- * sequence...
- */
- _textBuffer.resetWithCopy(_inputBuffer, _inputPtr, (ptr-_inputPtr));
- _inputPtr = ptr;
- _finishString2();
- }
-
- protected void _finishString2() throws IOException
- {
- char[] outBuf = _textBuffer.getCurrentSegment();
- int outPtr = _textBuffer.getCurrentSegmentSize();
-
- while (true) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing quote for a string value");
- }
- }
- char c = _inputBuffer[_inputPtr++];
- int i = (int) c;
- if (i <= INT_BACKSLASH) {
- if (i == INT_BACKSLASH) {
- /* Although chars outside of BMP are to be escaped as
- * an UTF-16 surrogate pair, does that affect decoding?
- * For now let's assume it does not.
- */
- c = _decodeEscaped();
- } else if (i <= INT_QUOTE) {
- if (i == INT_QUOTE) {
- break;
- }
- if (i < INT_SPACE) {
- _throwUnquotedSpace(i, "string value");
- }
- }
- }
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- // Ok, let's add char to output:
- outBuf[outPtr++] = c;
- }
- _textBuffer.setCurrentLength(outPtr);
- }
-
- /**
- * Method called to skim through rest of unparsed String value,
- * if it is not needed. This can be done bit faster if contents
- * need not be stored for future access.
- */
- protected void _skipString() throws IOException
- {
- _tokenIncomplete = false;
-
- int inputPtr = _inputPtr;
- int inputLen = _inputEnd;
- char[] inputBuffer = _inputBuffer;
-
- while (true) {
- if (inputPtr >= inputLen) {
- _inputPtr = inputPtr;
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing quote for a string value");
- }
- inputPtr = _inputPtr;
- inputLen = _inputEnd;
- }
- char c = inputBuffer[inputPtr++];
- int i = (int) c;
- if (i <= INT_BACKSLASH) {
- if (i == INT_BACKSLASH) {
- /* Although chars outside of BMP are to be escaped as
- * an UTF-16 surrogate pair, does that affect decoding?
- * For now let's assume it does not.
- */
- _inputPtr = inputPtr;
- c = _decodeEscaped();
- inputPtr = _inputPtr;
- inputLen = _inputEnd;
- } else if (i <= INT_QUOTE) {
- if (i == INT_QUOTE) {
- _inputPtr = inputPtr;
- break;
- }
- if (i < INT_SPACE) {
- _inputPtr = inputPtr;
- _throwUnquotedSpace(i, "string value");
- }
- }
- }
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, other parsing
- /**********************************************************
- */
-
- /**
- * We actually need to check the character value here
- * (to see if we have \n following \r).
- */
- protected void _skipCR() throws IOException
- {
- if (_inputPtr < _inputEnd || loadMore()) {
- if (_inputBuffer[_inputPtr] == '\n') {
- ++_inputPtr;
- }
- }
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- }
-
- private int _skipWS() throws IOException
- {
- final int[] codes = _icWS;
- while (_inputPtr < _inputEnd || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++];
- if (i >= 64) {
- return i;
- }
- switch (codes[i]) {
- case -1:
- _throwInvalidSpace(i);
- case 0:
- return i;
- case 1:
- continue;
- case '\n':
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case '\r':
- _skipCR();
- break;
- case '/':
- _skipComment();
- break;
- case '#':
- if (!_skipYAMLComment()) {
- return i;
- }
- break;
- }
- }
- throw _constructError("Unexpected end-of-input within/between "+_parsingContext.getTypeDesc()+" entries");
- }
-
- private int _skipWSOrEnd() throws IOException
- {
- final int[] codes = _icWS;
- while (_inputPtr < _inputEnd || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++];
- if (i >= 64) {
- return i;
- }
- switch (codes[i]) {
- case -1:
- _throwInvalidSpace(i);
- case 0:
- return i;
- case 1:
- continue;
- case '\n':
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case '\r':
- _skipCR();
- break;
- case '/':
- _skipComment();
- break;
- case '#':
- if (!_skipYAMLComment()) {
- return i;
- }
- break;
- }
- }
- // We ran out of input...
- _handleEOF();
- return -1;
- }
-
- private void _skipComment() throws IOException
- {
- if (!isEnabled(Feature.ALLOW_COMMENTS)) {
- _reportUnexpectedChar('/', "maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)");
- }
- // First: check which comment (if either) it is:
- if (_inputPtr >= _inputEnd && !loadMore()) {
- _reportInvalidEOF(" in a comment");
- }
- char c = _inputBuffer[_inputPtr++];
- if (c == '/') {
- _skipLine();
- } else if (c == '*') {
- _skipCComment();
- } else {
- _reportUnexpectedChar(c, "was expecting either '*' or '/' for a comment");
- }
- }
-
- private void _skipCComment() throws IOException
- {
- // Ok: need the matching '*/'
- main_loop:
- while ((_inputPtr < _inputEnd) || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++];
- if (i <= '*') {
- if (i == '*') { // end?
- if ((_inputPtr >= _inputEnd) && !loadMore()) {
- break main_loop;
- }
- if (_inputBuffer[_inputPtr] == INT_SLASH) {
- ++_inputPtr;
- return;
- }
- continue;
- }
- if (i < INT_SPACE) {
- if (i == INT_LF) {
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- } else if (i == INT_CR) {
- _skipCR();
- } else if (i != INT_TAB) {
- _throwInvalidSpace(i);
- }
- }
- }
- }
- _reportInvalidEOF(" in a comment");
- }
-
- private boolean _skipYAMLComment() throws IOException
- {
- if (!isEnabled(Feature.ALLOW_YAML_COMMENTS)) {
- return false;
- }
- _skipLine();
- return true;
- }
-
- private void _skipLine() throws IOException
- {
- // Ok: need to find EOF or linefeed
- while ((_inputPtr < _inputEnd) || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++];
- if (i < INT_SPACE) {
- if (i == INT_LF) {
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- } else if (i == INT_CR) {
- _skipCR();
- break;
- } else if (i != INT_TAB) {
- _throwInvalidSpace(i);
- }
- }
- }
- }
-
- @Override
- protected char _decodeEscaped() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in character escape sequence");
- }
- }
- char c = _inputBuffer[_inputPtr++];
-
- switch ((int) c) {
- // First, ones that are mapped
- case 'b':
- return '\b';
- case 't':
- return '\t';
- case 'n':
- return '\n';
- case 'f':
- return '\f';
- case 'r':
- return '\r';
-
- // And these are to be returned as they are
- case '"':
- case '/':
- case '\\':
- return c;
-
- case 'u': // and finally hex-escaped
- break;
-
- default:
- return _handleUnrecognizedCharacterEscape(c);
- }
-
- // Ok, a hex escape. Need 4 characters
- int value = 0;
- for (int i = 0; i < 4; ++i) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in character escape sequence");
- }
- }
- int ch = (int) _inputBuffer[_inputPtr++];
- int digit = CharTypes.charToHex(ch);
- if (digit < 0) {
- _reportUnexpectedChar(ch, "expected a hex-digit for character escape sequence");
- }
- value = (value << 4) | digit;
- }
- return (char) value;
- }
-
- /**
- * Helper method for checking whether input matches expected token
- */
- protected void _matchToken(String matchStr, int i) throws IOException
- {
- final int len = matchStr.length();
-
- do {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidToken(matchStr.substring(0, i));
- }
- }
- if (_inputBuffer[_inputPtr] != matchStr.charAt(i)) {
- _reportInvalidToken(matchStr.substring(0, i));
- }
- ++_inputPtr;
- } while (++i < len);
-
- // but let's also ensure we either get EOF, or non-alphanum char...
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- return;
- }
- }
- char c = _inputBuffer[_inputPtr];
- if (c < '0' || c == ']' || c == '}') { // expected/allowed chars
- return;
- }
- // if Java letter, it's a problem tho
- if (Character.isJavaIdentifierPart(c)) {
- _reportInvalidToken(matchStr.substring(0, i));
- }
- return;
- }
-
- /*
- /**********************************************************
- /* Binary access
- /**********************************************************
- */
-
- /**
- * Efficient handling for incremental parsing of base64-encoded
- * textual content.
- */
- @SuppressWarnings("resource")
- protected byte[] _decodeBase64(Base64Variant b64variant) throws IOException
- {
- ByteArrayBuilder builder = _getByteArrayBuilder();
-
- //main_loop:
- while (true) {
- // first, we'll skip preceding white space, if any
- char ch;
- do {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- } while (ch <= INT_SPACE);
- int bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- if (ch == '"') { // reached the end, fair and square?
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 0);
- if (bits < 0) { // white space to skip
- continue;
- }
- }
- int decodedData = bits;
-
- // then second base64 char; can't get padding yet, nor ws
-
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- bits = _decodeBase64Escape(b64variant, ch, 1);
- }
- decodedData = (decodedData << 6) | bits;
-
- // third base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
-
- // First branch: can get padding (-> 1 byte)
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 4;
- builder.append(decodedData);
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 2);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- // Ok, must get more padding chars, then
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- if (!b64variant.usesPaddingChar(ch)) {
- throw reportInvalidBase64Char(b64variant, ch, 3, "expected padding character '"+b64variant.getPaddingChar()+"'");
- }
- // Got 12 bits, only need 8, need to shift
- decodedData >>= 4;
- builder.append(decodedData);
- continue;
- }
- // otherwise we got escaped other char, to be processed below
- }
- // Nope, 2 or 3 bytes
- decodedData = (decodedData << 6) | bits;
- // fourth and last base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++];
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 3);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- // With padding we only get 2 bytes; but we have
- // to shift it a bit so it is identical to triplet
- // case with partial output.
- // 3 chars gives 3x6 == 18 bits, of which 2 are
- // dummies, need to discard:
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- continue;
- }
- // otherwise we got escaped other char, to be processed below
- }
- // otherwise, our triplet is now complete
- decodedData = (decodedData << 6) | bits;
- builder.appendThreeBytes(decodedData);
- }
- }
-
- /*
- /**********************************************************
- /* Error reporting
- /**********************************************************
- */
-
- protected void _reportInvalidToken(String matchedPart) throws IOException {
- _reportInvalidToken(matchedPart, "'null', 'true', 'false' or NaN");
- }
-
- protected void _reportInvalidToken(String matchedPart, String msg)
- throws IOException
- {
- StringBuilder sb = new StringBuilder(matchedPart);
- /* Let's just try to find what appears to be the token, using
- * regular Java identifier character rules. It's just a heuristic,
- * nothing fancy here.
- */
- while (true) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- break;
- }
- }
- char c = _inputBuffer[_inputPtr];
- if (!Character.isJavaIdentifierPart(c)) {
- break;
- }
- ++_inputPtr;
- sb.append(c);
- }
- _reportError("Unrecognized token '"+sb.toString()+"': was expecting "+msg);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8JsonGenerator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8JsonGenerator.java
deleted file mode 100644
index e951f3f38..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8JsonGenerator.java
+++ /dev/null
@@ -1,1865 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.*;
-
-public class UTF8JsonGenerator
- extends JsonGeneratorImpl
-{
- private final static byte BYTE_u = (byte) 'u';
-
- private final static byte BYTE_0 = (byte) '0';
-
- private final static byte BYTE_LBRACKET = (byte) '[';
- private final static byte BYTE_RBRACKET = (byte) ']';
- private final static byte BYTE_LCURLY = (byte) '{';
- private final static byte BYTE_RCURLY = (byte) '}';
-
- private final static byte BYTE_BACKSLASH = (byte) '\\';
- private final static byte BYTE_COMMA = (byte) ',';
- private final static byte BYTE_COLON = (byte) ':';
- private final static byte BYTE_QUOTE = (byte) '"';
-
- protected final static int SURR1_FIRST = 0xD800;
- protected final static int SURR1_LAST = 0xDBFF;
- protected final static int SURR2_FIRST = 0xDC00;
- protected final static int SURR2_LAST = 0xDFFF;
-
- // intermediate copies only made up to certain length...
- private final static int MAX_BYTES_TO_BUFFER = 512;
-
- final static byte[] HEX_CHARS = CharTypes.copyHexBytes();
-
- private final static byte[] NULL_BYTES = { 'n', 'u', 'l', 'l' };
- private final static byte[] TRUE_BYTES = { 't', 'r', 'u', 'e' };
- private final static byte[] FALSE_BYTES = { 'f', 'a', 'l', 's', 'e' };
-
- /*
- /**********************************************************
- /* Output buffering
- /**********************************************************
- */
-
- /**
- * Underlying output stream used for writing JSON content.
- */
- final protected OutputStream _outputStream;
-
- /**
- * Intermediate buffer in which contents are buffered before
- * being written using {@link #_outputStream}.
- */
- protected byte[] _outputBuffer;
-
- /**
- * Pointer to the position right beyond the last character to output
- * (end marker; may be past the buffer)
- */
- protected int _outputTail = 0;
-
- /**
- * End marker of the output buffer; one past the last valid position
- * within the buffer.
- */
- protected final int _outputEnd;
-
- /**
- * Maximum number of char
s that we know will always fit
- * in the output buffer after escaping
- */
- protected final int _outputMaxContiguous;
-
- /**
- * Intermediate buffer in which characters of a String are copied
- * before being encoded.
- */
- protected char[] _charBuffer;
-
- /**
- * Length of _charBuffer
- */
- protected final int _charBufferLength;
-
- /**
- * 6 character temporary buffer allocated if needed, for constructing
- * escape sequences
- */
- protected byte[] _entityBuffer;
-
- /**
- * Flag that indicates whether the output buffer is recycable (and
- * needs to be returned to recycler once we are done) or not.
- */
- protected boolean _bufferRecyclable;
-
- /*
- /**********************************************************
- /* Quick flags
- /**********************************************************
- */
-
- protected final boolean _cfgQuoteNames;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public UTF8JsonGenerator(IOContext ctxt, int features, ObjectCodec codec,
- OutputStream out)
- {
- super(ctxt, features, codec);
- _outputStream = out;
- _bufferRecyclable = true;
- _outputBuffer = ctxt.allocWriteEncodingBuffer();
- _outputEnd = _outputBuffer.length;
-
- /* To be exact, each char can take up to 6 bytes when escaped (Unicode
- * escape with backslash, 'u' and 4 hex digits); but to avoid fluctuation,
- * we will actually round down to only do up to 1/8 number of chars
- */
- _outputMaxContiguous = _outputEnd >> 3;
- _charBuffer = ctxt.allocConcatBuffer();
- _charBufferLength = _charBuffer.length;
-
- // By default we use this feature to determine additional quoting
- if (isEnabled(Feature.ESCAPE_NON_ASCII)) {
- setHighestNonEscapedChar(127);
- }
- _cfgQuoteNames = Feature.QUOTE_FIELD_NAMES.enabledIn(features);
- }
-
- public UTF8JsonGenerator(IOContext ctxt, int features, ObjectCodec codec,
- OutputStream out,
- byte[] outputBuffer, int outputOffset, boolean bufferRecyclable)
- {
-
- super(ctxt, features, codec);
- _outputStream = out;
- _bufferRecyclable = bufferRecyclable;
- _outputTail = outputOffset;
- _outputBuffer = outputBuffer;
- _outputEnd = _outputBuffer.length;
- // up to 6 bytes per char (see above), rounded up to 1/8
- _outputMaxContiguous = _outputEnd >> 3;
- _charBuffer = ctxt.allocConcatBuffer();
- _charBufferLength = _charBuffer.length;
- _cfgQuoteNames = Feature.QUOTE_FIELD_NAMES.enabledIn(features);
- }
-
- /*
- /**********************************************************
- /* Overridden configuration methods
- /**********************************************************
- */
-
- @Override
- public Object getOutputTarget() {
- return _outputStream;
- }
-
- /*
- /**********************************************************
- /* Overridden methods
- /**********************************************************
- */
-
- @Override
- public void writeFieldName(String name) throws IOException, JsonGenerationException
- {
- int status = _writeContext.writeFieldName(name);
- if (status == JsonWriteContext.STATUS_EXPECT_VALUE) {
- _reportError("Can not write a field name, expecting a value");
- }
- if (_cfgPrettyPrinter != null) {
- _writePPFieldName(name, (status == JsonWriteContext.STATUS_OK_AFTER_COMMA));
- return;
- }
- if (status == JsonWriteContext.STATUS_OK_AFTER_COMMA) { // need comma
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_COMMA;
- }
- _writeFieldName(name);
- }
-
- protected final void _writeFieldName(String name)
- throws IOException, JsonGenerationException
- {
- /* To support [JACKSON-46], we'll do this:
- * (Question: should quoting of spaces (etc) still be enabled?)
- */
- if (!_cfgQuoteNames) {
- _writeStringSegments(name);
- return;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- // The beef:
- final int len = name.length();
- if (len <= _charBufferLength) { // yes, fits right in
- name.getChars(0, len, _charBuffer, 0);
- // But as one segment, or multiple?
- if (len <= _outputMaxContiguous) {
- if ((_outputTail + len) > _outputEnd) { // caller must ensure enough space
- _flushBuffer();
- }
- _writeStringSegment(_charBuffer, 0, len);
- } else {
- _writeStringSegments(_charBuffer, 0, len);
- }
- } else {
- _writeStringSegments(name);
- }
-
- // and closing quotes; need room for one more char:
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeFieldName(SerializableString name)
- throws IOException, JsonGenerationException
- {
- // Object is a value, need to verify it's allowed
- int status = _writeContext.writeFieldName(name.getValue());
- if (status == JsonWriteContext.STATUS_EXPECT_VALUE) {
- _reportError("Can not write a field name, expecting a value");
- }
- if (_cfgPrettyPrinter != null) {
- _writePPFieldName(name, (status == JsonWriteContext.STATUS_OK_AFTER_COMMA));
- return;
- }
- if (status == JsonWriteContext.STATUS_OK_AFTER_COMMA) {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_COMMA;
- }
- _writeFieldName(name);
- }
-
- protected final void _writeFieldName(SerializableString name)
- throws IOException, JsonGenerationException
- {
- if (!_cfgQuoteNames) {
- int len = name.appendQuotedUTF8(_outputBuffer, _outputTail); // different quoting (escaping)
- if (len < 0) {
- _writeBytes(name.asQuotedUTF8());
- } else {
- _outputTail += len;
- }
- return;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- int len = name.appendQuotedUTF8(_outputBuffer, _outputTail);
- if (len < 0) { // couldn't append, bit longer processing
- _writeBytes(name.asQuotedUTF8());
- } else {
- _outputTail += len;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- /*
- /**********************************************************
- /* Output method implementations, structural
- /**********************************************************
- */
-
- @Override
- public final void writeStartArray() throws IOException, JsonGenerationException
- {
- _verifyValueWrite("start an array");
- _writeContext = _writeContext.createChildArrayContext();
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeStartArray(this);
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_LBRACKET;
- }
- }
-
- @Override
- public final void writeEndArray() throws IOException, JsonGenerationException
- {
- if (!_writeContext.inArray()) {
- _reportError("Current context not an ARRAY but "+_writeContext.getTypeDesc());
- }
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeEndArray(this, _writeContext.getEntryCount());
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_RBRACKET;
- }
- _writeContext = _writeContext.getParent();
- }
-
- @Override
- public final void writeStartObject() throws IOException, JsonGenerationException
- {
- _verifyValueWrite("start an object");
- _writeContext = _writeContext.createChildObjectContext();
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeStartObject(this);
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_LCURLY;
- }
- }
-
- @Override
- public final void writeEndObject() throws IOException, JsonGenerationException
- {
- if (!_writeContext.inObject()) {
- _reportError("Current context not an object but "+_writeContext.getTypeDesc());
- }
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeEndObject(this, _writeContext.getEntryCount());
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_RCURLY;
- }
- _writeContext = _writeContext.getParent();
- }
-
- /**
- * Specialized version of _writeFieldName
, off-lined
- * to keep the "fast path" as simple (and hopefully fast) as possible.
- */
- protected final void _writePPFieldName(String name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (commaBefore) {
- _cfgPrettyPrinter.writeObjectEntrySeparator(this);
- } else {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
-
- if (_cfgQuoteNames) { // standard
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- final int len = name.length();
- if (len <= _charBufferLength) { // yes, fits right in
- name.getChars(0, len, _charBuffer, 0);
- // But as one segment, or multiple?
- if (len <= _outputMaxContiguous) {
- if ((_outputTail + len) > _outputEnd) { // caller must ensure enough space
- _flushBuffer();
- }
- _writeStringSegment(_charBuffer, 0, len);
- } else {
- _writeStringSegments(_charBuffer, 0, len);
- }
- } else {
- _writeStringSegments(name);
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- } else { // non-standard, omit quotes
- _writeStringSegments(name);
- }
- }
-
- protected final void _writePPFieldName(SerializableString name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (commaBefore) {
- _cfgPrettyPrinter.writeObjectEntrySeparator(this);
- } else {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
-
- final boolean addQuotes = _cfgQuoteNames; // standard
- if (addQuotes) {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
- _writeBytes(name.asQuotedUTF8());
- if (addQuotes) {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
- }
-
- /*
- /**********************************************************
- /* Output method implementations, textual
- /**********************************************************
- */
-
- @Override
- public void writeString(String text)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (text == null) {
- _writeNull();
- return;
- }
- // First: can we make a local copy of chars that make up text?
- final int len = text.length();
- if (len > _charBufferLength) { // nope: off-line handling
- _writeLongString(text);
- return;
- }
- // yes: good.
- text.getChars(0, len, _charBuffer, 0);
- // Output: if we can't guarantee it fits in output buffer, off-line as well:
- if (len > _outputMaxContiguous) {
- _writeLongString(_charBuffer, 0, len);
- return;
- }
- if ((_outputTail + len) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _writeStringSegment(_charBuffer, 0, len); // we checked space already above
- /* [JACKSON-462] But that method may have had to expand multi-byte Unicode
- * chars, so we must check again
- */
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- private void _writeLongString(String text)
- throws IOException, JsonGenerationException
- {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _writeStringSegments(text);
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- private void _writeLongString(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _writeStringSegments(_charBuffer, 0, len);
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeString(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- // One or multiple segments?
- if (len <= _outputMaxContiguous) {
- if ((_outputTail + len) > _outputEnd) { // caller must ensure enough space
- _flushBuffer();
- }
- _writeStringSegment(text, offset, len);
- } else {
- _writeStringSegments(text, offset, len);
- }
- // And finally, closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public final void writeString(SerializableString text)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- int len = text.appendQuotedUTF8(_outputBuffer, _outputTail);
- if (len < 0) {
- _writeBytes(text.asQuotedUTF8());
- } else {
- _outputTail += len;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeRawUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _writeBytes(text, offset, length);
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeUTF8String(byte[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- // One or multiple segments?
- if (len <= _outputMaxContiguous) {
- _writeUTF8Segment(text, offset, len);
- } else {
- _writeUTF8Segments(text, offset, len);
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- /*
- /**********************************************************
- /* Output method implementations, unprocessed ("raw")
- /**********************************************************
- */
-
- @Override
- public void writeRaw(String text)
- throws IOException, JsonGenerationException
- {
- int start = 0;
- int len = text.length();
- while (len > 0) {
- char[] buf = _charBuffer;
- final int blen = buf.length;
- final int len2 = (len < blen) ? len : blen;
- text.getChars(start, start+len2, buf, 0);
- writeRaw(buf, 0, len2);
- start += len2;
- len -= len2;
- }
- }
-
- @Override
- public void writeRaw(String text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- while (len > 0) {
- char[] buf = _charBuffer;
- final int blen = buf.length;
- final int len2 = (len < blen) ? len : blen;
- text.getChars(offset, offset+len2, buf, 0);
- writeRaw(buf, 0, len2);
- offset += len2;
- len -= len2;
- }
- }
-
- @Override
- public void writeRaw(SerializableString text) throws IOException, JsonGenerationException
- {
- byte[] raw = text.asUnquotedUTF8();
- if (raw.length > 0) {
- _writeBytes(raw);
- }
- }
-
- // @TODO: rewrite for speed...
- @Override
- public final void writeRaw(char[] cbuf, int offset, int len)
- throws IOException, JsonGenerationException
- {
- // First: if we have 3 x charCount spaces, we know it'll fit just fine
- {
- int len3 = len+len+len;
- if ((_outputTail + len3) > _outputEnd) {
- // maybe we could flush?
- if (_outputEnd < len3) { // wouldn't be enough...
- _writeSegmentedRaw(cbuf, offset, len);
- return;
- }
- // yes, flushing brings enough space
- _flushBuffer();
- }
- }
- len += offset; // now marks the end
-
- // Note: here we know there is enough room, hence no output boundary checks
- main_loop:
- while (offset < len) {
- inner_loop:
- while (true) {
- int ch = (int) cbuf[offset];
- if (ch > 0x7F) {
- break inner_loop;
- }
- _outputBuffer[_outputTail++] = (byte) ch;
- if (++offset >= len) {
- break main_loop;
- }
- }
- char ch = cbuf[offset++];
- if (ch < 0x800) { // 2-byte?
- _outputBuffer[_outputTail++] = (byte) (0xc0 | (ch >> 6));
- _outputBuffer[_outputTail++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- offset = _outputRawMultiByteChar(ch, cbuf, offset, len);
- }
- }
- }
-
- @Override
- public void writeRaw(char ch)
- throws IOException, JsonGenerationException
- {
- if ((_outputTail + 3) >= _outputEnd) {
- _flushBuffer();
- }
- final byte[] bbuf = _outputBuffer;
- if (ch <= 0x7F) {
- bbuf[_outputTail++] = (byte) ch;
- } else if (ch < 0x800) { // 2-byte?
- bbuf[_outputTail++] = (byte) (0xc0 | (ch >> 6));
- bbuf[_outputTail++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- /*offset =*/ _outputRawMultiByteChar(ch, null, 0, 0);
- }
- }
-
- /**
- * Helper method called when it is possible that output of raw section
- * to output may cross buffer boundary
- */
- private final void _writeSegmentedRaw(char[] cbuf, int offset, int len)
- throws IOException, JsonGenerationException
- {
- final int end = _outputEnd;
- final byte[] bbuf = _outputBuffer;
-
- main_loop:
- while (offset < len) {
- inner_loop:
- while (true) {
- int ch = (int) cbuf[offset];
- if (ch >= 0x80) {
- break inner_loop;
- }
- // !!! TODO: fast(er) writes (roll input, output checks in one)
- if (_outputTail >= end) {
- _flushBuffer();
- }
- bbuf[_outputTail++] = (byte) ch;
- if (++offset >= len) {
- break main_loop;
- }
- }
- if ((_outputTail + 3) >= _outputEnd) {
- _flushBuffer();
- }
- char ch = cbuf[offset++];
- if (ch < 0x800) { // 2-byte?
- bbuf[_outputTail++] = (byte) (0xc0 | (ch >> 6));
- bbuf[_outputTail++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- offset = _outputRawMultiByteChar(ch, cbuf, offset, len);
- }
- }
- }
-
- /*
- /**********************************************************
- /* Output method implementations, base64-encoded binary
- /**********************************************************
- */
-
- @Override
- public void writeBinary(Base64Variant b64variant,
- byte[] data, int offset, int len)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write binary value");
- // Starting quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _writeBinary(b64variant, data, offset, offset+len);
- // and closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public int writeBinary(Base64Variant b64variant,
- InputStream data, int dataLength)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write binary value");
- // Starting quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- byte[] encodingBuffer = _ioContext.allocBase64Buffer();
- int bytes;
- try {
- if (dataLength < 0) { // length unknown
- bytes = _writeBinary(b64variant, data, encodingBuffer);
- } else {
- int missing = _writeBinary(b64variant, data, encodingBuffer, dataLength);
- if (missing > 0) {
- _reportError("Too few bytes available: missing "+missing+" bytes (out of "+dataLength+")");
- }
- bytes = dataLength;
- }
- } finally {
- _ioContext.releaseBase64Buffer(encodingBuffer);
- }
- // and closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- return bytes;
- }
-
- /*
- /**********************************************************
- /* Output method implementations, primitive
- /**********************************************************
- */
-
- @Override
- public void writeNumber(short s)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- // up to 5 digits and possible minus sign
- if ((_outputTail + 6) >= _outputEnd) {
- _flushBuffer();
- }
- if (_cfgNumbersAsStrings) {
- _writeQuotedShort(s);
- return;
- }
- _outputTail = NumberOutput.outputInt(s, _outputBuffer, _outputTail);
- }
-
- private final void _writeQuotedShort(short s) throws IOException {
- if ((_outputTail + 8) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _outputTail = NumberOutput.outputInt(s, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeNumber(int i)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- // up to 10 digits and possible minus sign
- if ((_outputTail + 11) >= _outputEnd) {
- _flushBuffer();
- }
- if (_cfgNumbersAsStrings) {
- _writeQuotedInt(i);
- return;
- }
- _outputTail = NumberOutput.outputInt(i, _outputBuffer, _outputTail);
- }
-
- private final void _writeQuotedInt(int i) throws IOException
- {
- if ((_outputTail + 13) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _outputTail = NumberOutput.outputInt(i, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeNumber(long l)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedLong(l);
- return;
- }
- if ((_outputTail + 21) >= _outputEnd) {
- // up to 20 digits, minus sign
- _flushBuffer();
- }
- _outputTail = NumberOutput.outputLong(l, _outputBuffer, _outputTail);
- }
-
- private final void _writeQuotedLong(long l) throws IOException
- {
- if ((_outputTail + 23) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- _outputTail = NumberOutput.outputLong(l, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeNumber(BigInteger value)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (value == null) {
- _writeNull();
- } else if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(value);
- } else {
- writeRaw(value.toString());
- }
- }
-
-
- @Override
- public void writeNumber(double d)
- throws IOException, JsonGenerationException
- {
- if (_cfgNumbersAsStrings ||
- // [JACKSON-139]
- (((Double.isNaN(d) || Double.isInfinite(d))
- && isEnabled(Feature.QUOTE_NON_NUMERIC_NUMBERS)))) {
- writeString(String.valueOf(d));
- return;
- }
- // What is the max length for doubles? 40 chars?
- _verifyValueWrite("write number");
- writeRaw(String.valueOf(d));
- }
-
- @Override
- public void writeNumber(float f)
- throws IOException, JsonGenerationException
- {
- if (_cfgNumbersAsStrings ||
- // [JACKSON-139]
- (((Float.isNaN(f) || Float.isInfinite(f))
- && isEnabled(Feature.QUOTE_NON_NUMERIC_NUMBERS)))) {
- writeString(String.valueOf(f));
- return;
- }
- // What is the max length for floats?
- _verifyValueWrite("write number");
- writeRaw(String.valueOf(f));
- }
-
- @Override
- public void writeNumber(BigDecimal value)
- throws IOException, JsonGenerationException
- {
- // Don't really know max length for big decimal, no point checking
- _verifyValueWrite("write number");
- if (value == null) {
- _writeNull();
- } else if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(value);
- } else if (isEnabled(Feature.WRITE_BIGDECIMAL_AS_PLAIN)) {
- writeRaw(value.toPlainString());
- } else {
- writeRaw(value.toString());
- }
- }
-
- @Override
- public void writeNumber(String encodedValue)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(encodedValue);
- } else {
- writeRaw(encodedValue);
- }
- }
-
- private final void _writeQuotedRaw(Object value) throws IOException
- {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- writeRaw(value.toString());
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = BYTE_QUOTE;
- }
-
- @Override
- public void writeBoolean(boolean state)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write boolean value");
- if ((_outputTail + 5) >= _outputEnd) {
- _flushBuffer();
- }
- byte[] keyword = state ? TRUE_BYTES : FALSE_BYTES;
- int len = keyword.length;
- System.arraycopy(keyword, 0, _outputBuffer, _outputTail, len);
- _outputTail += len;
- }
-
- @Override
- public void writeNull()
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write null value");
- _writeNull();
- }
-
- /*
- /**********************************************************
- /* Implementations for other methods
- /**********************************************************
- */
-
- @Override
- protected final void _verifyValueWrite(String typeMsg)
- throws IOException, JsonGenerationException
- {
- int status = _writeContext.writeValue();
- if (status == JsonWriteContext.STATUS_EXPECT_NAME) {
- _reportError("Can not "+typeMsg+", expecting field name");
- }
- if (_cfgPrettyPrinter == null) {
- byte b;
- switch (status) {
- case JsonWriteContext.STATUS_OK_AFTER_COMMA:
- b = BYTE_COMMA;
- break;
- case JsonWriteContext.STATUS_OK_AFTER_COLON:
- b = BYTE_COLON;
- break;
- case JsonWriteContext.STATUS_OK_AFTER_SPACE: // root-value separator
- if (_rootValueSeparator != null) {
- byte[] raw = _rootValueSeparator.asUnquotedUTF8();
- if (raw.length > 0) {
- _writeBytes(raw);
- }
- }
- return;
- case JsonWriteContext.STATUS_OK_AS_IS:
- default:
- return;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail] = b;
- ++_outputTail;
- return;
- }
- // Otherwise, pretty printer knows what to do...
- _verifyPrettyValueWrite(typeMsg, status);
- }
-
- protected final void _verifyPrettyValueWrite(String typeMsg, int status)
- throws IOException, JsonGenerationException
- {
- // If we have a pretty printer, it knows what to do:
- switch (status) {
- case JsonWriteContext.STATUS_OK_AFTER_COMMA: // array
- _cfgPrettyPrinter.writeArrayValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AFTER_COLON:
- _cfgPrettyPrinter.writeObjectFieldValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AFTER_SPACE:
- _cfgPrettyPrinter.writeRootValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AS_IS:
- // First entry, but of which context?
- if (_writeContext.inArray()) {
- _cfgPrettyPrinter.beforeArrayValues(this);
- } else if (_writeContext.inObject()) {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
- break;
- default:
- _throwInternal();
- break;
- }
- }
-
- /*
- /**********************************************************
- /* Low-level output handling
- /**********************************************************
- */
-
- @Override
- public void flush()
- throws IOException
- {
- _flushBuffer();
- if (_outputStream != null) {
- if (isEnabled(Feature.FLUSH_PASSED_TO_STREAM)) {
- _outputStream.flush();
- }
- }
- }
-
- @Override
- public void close()
- throws IOException
- {
- super.close();
-
- /* 05-Dec-2008, tatu: To add [JACKSON-27], need to close open
- * scopes.
- */
- // First: let's see that we still have buffers...
- if (_outputBuffer != null
- && isEnabled(Feature.AUTO_CLOSE_JSON_CONTENT)) {
- while (true) {
- JsonStreamContext ctxt = getOutputContext();
- if (ctxt.inArray()) {
- writeEndArray();
- } else if (ctxt.inObject()) {
- writeEndObject();
- } else {
- break;
- }
- }
- }
- _flushBuffer();
-
- /* 25-Nov-2008, tatus: As per [JACKSON-16] we are not to call close()
- * on the underlying Reader, unless we "own" it, or auto-closing
- * feature is enabled.
- * One downside: when using UTF8Writer, underlying buffer(s)
- * may not be properly recycled if we don't close the writer.
- */
- if (_outputStream != null) {
- if (_ioContext.isResourceManaged() || isEnabled(Feature.AUTO_CLOSE_TARGET)) {
- _outputStream.close();
- } else if (isEnabled(Feature.FLUSH_PASSED_TO_STREAM)) {
- // If we can't close it, we should at least flush
- _outputStream.flush();
- }
- }
- // Internal buffer(s) generator has can now be released as well
- _releaseBuffers();
- }
-
- @Override
- protected void _releaseBuffers()
- {
- byte[] buf = _outputBuffer;
- if (buf != null && _bufferRecyclable) {
- _outputBuffer = null;
- _ioContext.releaseWriteEncodingBuffer(buf);
- }
- char[] cbuf = _charBuffer;
- if (cbuf != null) {
- _charBuffer = null;
- _ioContext.releaseConcatBuffer(cbuf);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, raw bytes
- /**********************************************************
- */
-
- private final void _writeBytes(byte[] bytes) throws IOException
- {
- final int len = bytes.length;
- if ((_outputTail + len) > _outputEnd) {
- _flushBuffer();
- // still not enough?
- if (len > MAX_BYTES_TO_BUFFER) {
- _outputStream.write(bytes, 0, len);
- return;
- }
- }
- System.arraycopy(bytes, 0, _outputBuffer, _outputTail, len);
- _outputTail += len;
- }
-
- private final void _writeBytes(byte[] bytes, int offset, int len) throws IOException
- {
- if ((_outputTail + len) > _outputEnd) {
- _flushBuffer();
- // still not enough?
- if (len > MAX_BYTES_TO_BUFFER) {
- _outputStream.write(bytes, offset, len);
- return;
- }
- }
- System.arraycopy(bytes, offset, _outputBuffer, _outputTail, len);
- _outputTail += len;
- }
-
- /*
- /**********************************************************
- /* Internal methods, mid-level writing, String segments
- /**********************************************************
- */
-
- /**
- * Method called when String to write is long enough not to fit
- * completely in temporary copy buffer. If so, we will actually
- * copy it in small enough chunks so it can be directly fed
- * to single-segment writes (instead of maximum slices that
- * would fit in copy buffer)
- */
- private final void _writeStringSegments(String text)
- throws IOException, JsonGenerationException
- {
- int left = text.length();
- int offset = 0;
- final char[] cbuf = _charBuffer;
-
- while (left > 0) {
- int len = Math.min(_outputMaxContiguous, left);
- text.getChars(offset, offset+len, cbuf, 0);
- if ((_outputTail + len) > _outputEnd) { // caller must ensure enough space
- _flushBuffer();
- }
- _writeStringSegment(cbuf, 0, len);
- offset += len;
- left -= len;
- }
- }
-
- /**
- * Method called when character sequence to write is long enough that
- * its maximum encoded and escaped form is not guaranteed to fit in
- * the output buffer. If so, we will need to choose smaller output
- * chunks to write at a time.
- */
- private final void _writeStringSegments(char[] cbuf, int offset, int totalLen)
- throws IOException, JsonGenerationException
- {
- do {
- int len = Math.min(_outputMaxContiguous, totalLen);
- if ((_outputTail + len) > _outputEnd) { // caller must ensure enough space
- _flushBuffer();
- }
- _writeStringSegment(cbuf, offset, len);
- offset += len;
- totalLen -= len;
- } while (totalLen > 0);
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, text segments
- /**********************************************************
- */
-
- /**
- * This method called when the string content is already in
- * a char buffer, and its maximum total encoded and escaped length
- * can not exceed size of the output buffer.
- * Caller must ensure that there is enough space in output buffer,
- * assuming case of all non-escaped ASCII characters, as well as
- * potentially enough space for other cases (but not necessarily flushed)
- */
- private final void _writeStringSegment(char[] cbuf, int offset, int len)
- throws IOException, JsonGenerationException
- {
- // note: caller MUST ensure (via flushing) there's room for ASCII only
-
- // Fast+tight loop for ASCII-only, no-escaping-needed output
- len += offset; // becomes end marker, then
-
- int outputPtr = _outputTail;
- final byte[] outputBuffer = _outputBuffer;
- final int[] escCodes = _outputEscapes;
-
- while (offset < len) {
- int ch = cbuf[offset];
- // note: here we know that (ch > 0x7F) will cover case of escaping non-ASCII too:
- if (ch > 0x7F || escCodes[ch] != 0) {
- break;
- }
- outputBuffer[outputPtr++] = (byte) ch;
- ++offset;
- }
- _outputTail = outputPtr;
- if (offset < len) {
- // [JACKSON-106]
- if (_characterEscapes != null) {
- _writeCustomStringSegment2(cbuf, offset, len);
- // [JACKSON-102]
- } else if (_maximumNonEscapedChar == 0) {
- _writeStringSegment2(cbuf, offset, len);
- } else {
- _writeStringSegmentASCII2(cbuf, offset, len);
- }
-
- }
- }
-
- /**
- * Secondary method called when content contains characters to escape,
- * and/or multi-byte UTF-8 characters.
- */
- private final void _writeStringSegment2(final char[] cbuf, int offset, final int end)
- throws IOException, JsonGenerationException
- {
- // Ok: caller guarantees buffer can have room; but that may require flushing:
- if ((_outputTail + 6 * (end - offset)) > _outputEnd) {
- _flushBuffer();
- }
-
- int outputPtr = _outputTail;
-
- final byte[] outputBuffer = _outputBuffer;
- final int[] escCodes = _outputEscapes;
-
- while (offset < end) {
- int ch = cbuf[offset++];
- if (ch <= 0x7F) {
- if (escCodes[ch] == 0) {
- outputBuffer[outputPtr++] = (byte) ch;
- continue;
- }
- int escape = escCodes[ch];
- if (escape > 0) { // 2-char escape, fine
- outputBuffer[outputPtr++] = BYTE_BACKSLASH;
- outputBuffer[outputPtr++] = (byte) escape;
- } else {
- // ctrl-char, 6-byte escape...
- outputPtr = _writeGenericEscape(ch, outputPtr);
- }
- continue;
- }
- if (ch <= 0x7FF) { // fine, just needs 2 byte output
- outputBuffer[outputPtr++] = (byte) (0xc0 | (ch >> 6));
- outputBuffer[outputPtr++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- outputPtr = _outputMultiByteChar(ch, outputPtr);
- }
- }
- _outputTail = outputPtr;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, text segment
- /* with additional escaping (ASCII or such)
- /**********************************************************
- */
-
- /**
- * Same as _writeStringSegment2(char[], ...) _outputEnd) {
- _flushBuffer();
- }
-
- int outputPtr = _outputTail;
-
- final byte[] outputBuffer = _outputBuffer;
- final int[] escCodes = _outputEscapes;
- final int maxUnescaped = _maximumNonEscapedChar;
-
- while (offset < end) {
- int ch = cbuf[offset++];
- if (ch <= 0x7F) {
- if (escCodes[ch] == 0) {
- outputBuffer[outputPtr++] = (byte) ch;
- continue;
- }
- int escape = escCodes[ch];
- if (escape > 0) { // 2-char escape, fine
- outputBuffer[outputPtr++] = BYTE_BACKSLASH;
- outputBuffer[outputPtr++] = (byte) escape;
- } else {
- // ctrl-char, 6-byte escape...
- outputPtr = _writeGenericEscape(ch, outputPtr);
- }
- continue;
- }
- if (ch > maxUnescaped) { // [JACKSON-102] Allow forced escaping if non-ASCII (etc) chars:
- outputPtr = _writeGenericEscape(ch, outputPtr);
- continue;
- }
- if (ch <= 0x7FF) { // fine, just needs 2 byte output
- outputBuffer[outputPtr++] = (byte) (0xc0 | (ch >> 6));
- outputBuffer[outputPtr++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- outputPtr = _outputMultiByteChar(ch, outputPtr);
- }
- }
- _outputTail = outputPtr;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, text segment
- /* with fully custom escaping (and possibly escaping of non-ASCII
- /**********************************************************
- */
-
- /**
- * Same as _writeStringSegmentASCII2(char[], ...) _outputEnd) {
- _flushBuffer();
- }
- int outputPtr = _outputTail;
-
- final byte[] outputBuffer = _outputBuffer;
- final int[] escCodes = _outputEscapes;
- // may or may not have this limit
- final int maxUnescaped = (_maximumNonEscapedChar <= 0) ? 0xFFFF : _maximumNonEscapedChar;
- final CharacterEscapes customEscapes = _characterEscapes; // non-null
-
- while (offset < end) {
- int ch = cbuf[offset++];
- if (ch <= 0x7F) {
- if (escCodes[ch] == 0) {
- outputBuffer[outputPtr++] = (byte) ch;
- continue;
- }
- int escape = escCodes[ch];
- if (escape > 0) { // 2-char escape, fine
- outputBuffer[outputPtr++] = BYTE_BACKSLASH;
- outputBuffer[outputPtr++] = (byte) escape;
- } else if (escape == CharacterEscapes.ESCAPE_CUSTOM) {
- SerializableString esc = customEscapes.getEscapeSequence(ch);
- if (esc == null) {
- _reportError("Invalid custom escape definitions; custom escape not found for character code 0x"
- +Integer.toHexString(ch)+", although was supposed to have one");
- }
- outputPtr = _writeCustomEscape(outputBuffer, outputPtr, esc, end-offset);
- } else {
- // ctrl-char, 6-byte escape...
- outputPtr = _writeGenericEscape(ch, outputPtr);
- }
- continue;
- }
- if (ch > maxUnescaped) { // [JACKSON-102] Allow forced escaping if non-ASCII (etc) chars:
- outputPtr = _writeGenericEscape(ch, outputPtr);
- continue;
- }
- SerializableString esc = customEscapes.getEscapeSequence(ch);
- if (esc != null) {
- outputPtr = _writeCustomEscape(outputBuffer, outputPtr, esc, end-offset);
- continue;
- }
- if (ch <= 0x7FF) { // fine, just needs 2 byte output
- outputBuffer[outputPtr++] = (byte) (0xc0 | (ch >> 6));
- outputBuffer[outputPtr++] = (byte) (0x80 | (ch & 0x3f));
- } else {
- outputPtr = _outputMultiByteChar(ch, outputPtr);
- }
- }
- _outputTail = outputPtr;
- }
-
- private final int _writeCustomEscape(byte[] outputBuffer, int outputPtr, SerializableString esc, int remainingChars)
- throws IOException, JsonGenerationException
- {
- byte[] raw = esc.asUnquotedUTF8(); // must be escaped at this point, shouldn't double-quote
- int len = raw.length;
- if (len > 6) { // may violate constraints we have, do offline
- return _handleLongCustomEscape(outputBuffer, outputPtr, _outputEnd, raw, remainingChars);
- }
- // otherwise will fit without issues, so:
- System.arraycopy(raw, 0, outputBuffer, outputPtr, len);
- return (outputPtr + len);
- }
-
- private final int _handleLongCustomEscape(byte[] outputBuffer, int outputPtr, int outputEnd, byte[] raw,
- int remainingChars)
- throws IOException, JsonGenerationException
- {
- int len = raw.length;
- if ((outputPtr + len) > outputEnd) {
- _outputTail = outputPtr;
- _flushBuffer();
- outputPtr = _outputTail;
- if (len > outputBuffer.length) { // very unlikely, but possible...
- _outputStream.write(raw, 0, len);
- return outputPtr;
- }
- System.arraycopy(raw, 0, outputBuffer, outputPtr, len);
- outputPtr += len;
- }
- // but is the invariant still obeyed? If not, flush once more
- if ((outputPtr + 6 * remainingChars) > outputEnd) {
- _flushBuffer();
- return _outputTail;
- }
- return outputPtr;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, "raw UTF-8" segments
- /**********************************************************
- */
-
- /**
- * Method called when UTF-8 encoded (but NOT yet escaped!) content is not guaranteed
- * to fit in the output buffer after escaping; as such, we just need to
- * chunk writes.
- */
- private final void _writeUTF8Segments(byte[] utf8, int offset, int totalLen)
- throws IOException, JsonGenerationException
- {
- do {
- int len = Math.min(_outputMaxContiguous, totalLen);
- _writeUTF8Segment(utf8, offset, len);
- offset += len;
- totalLen -= len;
- } while (totalLen > 0);
- }
-
- private final void _writeUTF8Segment(byte[] utf8, final int offset, final int len)
- throws IOException, JsonGenerationException
- {
- // fast loop to see if escaping is needed; don't copy, just look
- final int[] escCodes = _outputEscapes;
-
- for (int ptr = offset, end = offset + len; ptr < end; ) {
- // 28-Feb-2011, tatu: escape codes just cover 7-bit range, so:
- int ch = utf8[ptr++];
- if ((ch >= 0) && escCodes[ch] != 0) {
- _writeUTF8Segment2(utf8, offset, len);
- return;
- }
- }
-
- // yes, fine, just copy the sucker
- if ((_outputTail + len) > _outputEnd) { // enough room or need to flush?
- _flushBuffer(); // but yes once we flush (caller guarantees length restriction)
- }
- System.arraycopy(utf8, offset, _outputBuffer, _outputTail, len);
- _outputTail += len;
- }
-
- private final void _writeUTF8Segment2(final byte[] utf8, int offset, int len)
- throws IOException, JsonGenerationException
- {
- int outputPtr = _outputTail;
-
- // Ok: caller guarantees buffer can have room; but that may require flushing:
- if ((outputPtr + (len * 6)) > _outputEnd) {
- _flushBuffer();
- outputPtr = _outputTail;
- }
-
- final byte[] outputBuffer = _outputBuffer;
- final int[] escCodes = _outputEscapes;
- len += offset; // so 'len' becomes 'end'
-
- while (offset < len) {
- byte b = utf8[offset++];
- int ch = b;
- if (ch < 0 || escCodes[ch] == 0) {
- outputBuffer[outputPtr++] = b;
- continue;
- }
- int escape = escCodes[ch];
- if (escape > 0) { // 2-char escape, fine
- outputBuffer[outputPtr++] = BYTE_BACKSLASH;
- outputBuffer[outputPtr++] = (byte) escape;
- } else {
- // ctrl-char, 6-byte escape...
- outputPtr = _writeGenericEscape(ch, outputPtr);
- }
- }
- _outputTail = outputPtr;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, base64 encoded
- /**********************************************************
- */
-
- protected final void _writeBinary(Base64Variant b64variant,
- byte[] input, int inputPtr, final int inputEnd)
- throws IOException, JsonGenerationException
- {
- // Encoding is by chunks of 3 input, 4 output chars, so:
- int safeInputEnd = inputEnd - 3;
- // Let's also reserve room for possible (and quoted) lf char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- // Ok, first we loop through all full triplets of data:
- while (inputPtr <= safeInputEnd) {
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- // First, mash 3 bytes into lsb of 32-bit int
- int b24 = ((int) input[inputPtr++]) << 8;
- b24 |= ((int) input[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) input[inputPtr++]) & 0xFF);
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- // note: must quote in JSON value
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- int inputLeft = inputEnd - inputPtr; // 0, 1 or 2
- if (inputLeft > 0) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) input[inputPtr++]) << 16;
- if (inputLeft == 2) {
- b24 |= (((int) input[inputPtr++]) & 0xFF) << 8;
- }
- _outputTail = b64variant.encodeBase64Partial(b24, inputLeft, _outputBuffer, _outputTail);
- }
- }
-
- // write-method called when length is definitely known
- protected final int _writeBinary(Base64Variant b64variant,
- InputStream data, byte[] readBuffer, int bytesLeft)
- throws IOException, JsonGenerationException
- {
- int inputPtr = 0;
- int inputEnd = 0;
- int lastFullOffset = -3;
-
- // Let's also reserve room for possible (and quoted) LF char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- while (bytesLeft > 2) { // main loop for full triplets
- if (inputPtr > lastFullOffset) {
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, bytesLeft);
- inputPtr = 0;
- if (inputEnd < 3) { // required to try to read to have at least 3 bytes
- break;
- }
- lastFullOffset = inputEnd-3;
- }
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 8;
- b24 |= ((int) readBuffer[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) readBuffer[inputPtr++]) & 0xFF);
- bytesLeft -= 3;
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- if (bytesLeft > 0) {
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, bytesLeft);
- inputPtr = 0;
- if (inputEnd > 0) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 16;
- int amount;
- if (inputPtr < inputEnd) {
- b24 |= (((int) readBuffer[inputPtr]) & 0xFF) << 8;
- amount = 2;
- } else {
- amount = 1;
- }
- _outputTail = b64variant.encodeBase64Partial(b24, amount, _outputBuffer, _outputTail);
- bytesLeft -= amount;
- }
- }
- return bytesLeft;
- }
-
- // write method when length is unknown
- protected final int _writeBinary(Base64Variant b64variant,
- InputStream data, byte[] readBuffer)
- throws IOException, JsonGenerationException
- {
- int inputPtr = 0;
- int inputEnd = 0;
- int lastFullOffset = -3;
- int bytesDone = 0;
-
- // Let's also reserve room for possible (and quoted) LF char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- // Ok, first we loop through all full triplets of data:
- while (true) {
- if (inputPtr > lastFullOffset) { // need to load more
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, readBuffer.length);
- inputPtr = 0;
- if (inputEnd < 3) { // required to try to read to have at least 3 bytes
- break;
- }
- lastFullOffset = inputEnd-3;
- }
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- // First, mash 3 bytes into lsb of 32-bit int
- int b24 = ((int) readBuffer[inputPtr++]) << 8;
- b24 |= ((int) readBuffer[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) readBuffer[inputPtr++]) & 0xFF);
- bytesDone += 3;
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- if (inputPtr < inputEnd) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 16;
- int amount = 1;
- if (inputPtr < inputEnd) {
- b24 |= (((int) readBuffer[inputPtr]) & 0xFF) << 8;
- amount = 2;
- }
- bytesDone += amount;
- _outputTail = b64variant.encodeBase64Partial(b24, amount, _outputBuffer, _outputTail);
- }
- return bytesDone;
- }
-
- private final int _readMore(InputStream in,
- byte[] readBuffer, int inputPtr, int inputEnd,
- int maxRead) throws IOException
- {
- // anything to shift to front?
- int i = 0;
- while (inputPtr < inputEnd) {
- readBuffer[i++] = readBuffer[inputPtr++];
- }
- inputPtr = 0;
- inputEnd = i;
- maxRead = Math.min(maxRead, readBuffer.length);
-
- do {
- int length = maxRead - inputEnd;
- if (length == 0) {
- break;
- }
- int count = in.read(readBuffer, inputEnd, length);
- if (count < 0) {
- return inputEnd;
- }
- inputEnd += count;
- } while (inputEnd < 3);
- return inputEnd;
- }
-
- /*
- /**********************************************************
- /* Internal methods, character escapes/encoding
- /**********************************************************
- */
-
- /**
- * Method called to output a character that is beyond range of
- * 1- and 2-byte UTF-8 encodings, when outputting "raw"
- * text (meaning it is not to be escaped or quoted)
- */
- private final int _outputRawMultiByteChar(int ch, char[] cbuf, int inputOffset, int inputLen)
- throws IOException
- {
- // Let's handle surrogates gracefully (as 4 byte output):
- if (ch >= SURR1_FIRST) {
- if (ch <= SURR2_LAST) { // yes, outside of BMP
- // Do we have second part?
- if (inputOffset >= inputLen || cbuf == null) { // nope... have to note down
- _reportError("Split surrogate on writeRaw() input (last character)");
- }
- _outputSurrogates(ch, cbuf[inputOffset]);
- return (inputOffset+1);
- }
- }
- final byte[] bbuf = _outputBuffer;
- bbuf[_outputTail++] = (byte) (0xe0 | (ch >> 12));
- bbuf[_outputTail++] = (byte) (0x80 | ((ch >> 6) & 0x3f));
- bbuf[_outputTail++] = (byte) (0x80 | (ch & 0x3f));
- return inputOffset;
- }
-
- protected final void _outputSurrogates(int surr1, int surr2)
- throws IOException
- {
- int c = _decodeSurrogate(surr1, surr2);
- if ((_outputTail + 4) > _outputEnd) {
- _flushBuffer();
- }
- final byte[] bbuf = _outputBuffer;
- bbuf[_outputTail++] = (byte) (0xf0 | (c >> 18));
- bbuf[_outputTail++] = (byte) (0x80 | ((c >> 12) & 0x3f));
- bbuf[_outputTail++] = (byte) (0x80 | ((c >> 6) & 0x3f));
- bbuf[_outputTail++] = (byte) (0x80 | (c & 0x3f));
- }
-
- /**
- *
- * @param ch
- * @param outputPtr Position within output buffer to append multi-byte in
- *
- * @return New output position after appending
- *
- * @throws IOException
- */
- private final int _outputMultiByteChar(int ch, int outputPtr)
- throws IOException
- {
- byte[] bbuf = _outputBuffer;
- if (ch >= SURR1_FIRST && ch <= SURR2_LAST) { // yes, outside of BMP; add an escape
- bbuf[outputPtr++] = BYTE_BACKSLASH;
- bbuf[outputPtr++] = BYTE_u;
-
- bbuf[outputPtr++] = HEX_CHARS[(ch >> 12) & 0xF];
- bbuf[outputPtr++] = HEX_CHARS[(ch >> 8) & 0xF];
- bbuf[outputPtr++] = HEX_CHARS[(ch >> 4) & 0xF];
- bbuf[outputPtr++] = HEX_CHARS[ch & 0xF];
- } else {
- bbuf[outputPtr++] = (byte) (0xe0 | (ch >> 12));
- bbuf[outputPtr++] = (byte) (0x80 | ((ch >> 6) & 0x3f));
- bbuf[outputPtr++] = (byte) (0x80 | (ch & 0x3f));
- }
- return outputPtr;
- }
-
- protected final int _decodeSurrogate(int surr1, int surr2) throws IOException
- {
- // First is known to be valid, but how about the other?
- if (surr2 < SURR2_FIRST || surr2 > SURR2_LAST) {
- String msg = "Incomplete surrogate pair: first char 0x"+Integer.toHexString(surr1)+", second 0x"+Integer.toHexString(surr2);
- _reportError(msg);
- }
- int c = 0x10000 + ((surr1 - SURR1_FIRST) << 10) + (surr2 - SURR2_FIRST);
- return c;
- }
-
- private final void _writeNull() throws IOException
- {
- if ((_outputTail + 4) >= _outputEnd) {
- _flushBuffer();
- }
- System.arraycopy(NULL_BYTES, 0, _outputBuffer, _outputTail, 4);
- _outputTail += 4;
- }
-
- /**
- * Method called to write a generic Unicode escape for given character.
- *
- * @param charToEscape Character to escape using escape sequence (\\uXXXX)
- */
- private int _writeGenericEscape(int charToEscape, int outputPtr)
- throws IOException
- {
- final byte[] bbuf = _outputBuffer;
- bbuf[outputPtr++] = BYTE_BACKSLASH;
- bbuf[outputPtr++] = BYTE_u;
- if (charToEscape > 0xFF) {
- int hi = (charToEscape >> 8) & 0xFF;
- bbuf[outputPtr++] = HEX_CHARS[hi >> 4];
- bbuf[outputPtr++] = HEX_CHARS[hi & 0xF];
- charToEscape &= 0xFF;
- } else {
- bbuf[outputPtr++] = BYTE_0;
- bbuf[outputPtr++] = BYTE_0;
- }
- // We know it's a control char, so only the last 2 chars are non-0
- bbuf[outputPtr++] = HEX_CHARS[charToEscape >> 4];
- bbuf[outputPtr++] = HEX_CHARS[charToEscape & 0xF];
- return outputPtr;
- }
-
- protected final void _flushBuffer() throws IOException
- {
- int len = _outputTail;
- if (len > 0) {
- _outputTail = 0;
- _outputStream.write(_outputBuffer, 0, len);
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
deleted file mode 100644
index 141e1b86a..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
+++ /dev/null
@@ -1,3251 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.base.ParserBase;
-import com.fr.third.fasterxml.jackson.core.io.CharTypes;
-import com.fr.third.fasterxml.jackson.core.io.IOContext;
-import com.fr.third.fasterxml.jackson.core.sym.*;
-import com.fr.third.fasterxml.jackson.core.util.*;
-
-import static com.fr.third.fasterxml.jackson.core.JsonTokenId.*;
-
-/**
- * This is a concrete implementation of {@link JsonParser}, which is
- * based on a {@link java.io.InputStream} as the input source.
- *
- * Note: non-final since version 2.3.
- */
-public class UTF8StreamJsonParser
- extends ParserBase
-{
- final static byte BYTE_LF = (byte) '\n';
-
- // This is the main input-code lookup table, fetched eagerly
- private final static int[] _icUTF8 = CharTypes.getInputCodeUtf8();
-
- // Latin1 encoding is not supported, but we do use 8-bit subset for
- // pre-processing task, to simplify first pass, keep it fast.
- protected final static int[] _icLatin1 = CharTypes.getInputCodeLatin1();
-
- // White-space processing is done all the time, pre-fetch as well
- private final static int[] _icWS = CharTypes.getInputCodeWS();
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Codec used for data binding when (if) requested; typically full
- * ObjectMapper
, but that abstract is not part of core
- * package.
- */
- protected ObjectCodec _objectCodec;
-
- /**
- * Symbol table that contains field names encountered so far
- */
- final protected BytesToNameCanonicalizer _symbols;
-
- /*
- /**********************************************************
- /* Parsing state
- /**********************************************************
- */
-
- /**
- * Temporary buffer used for name parsing.
- */
- protected int[] _quadBuffer = new int[16];
-
- /**
- * Flag that indicates that the current token has not yet
- * been fully processed, and needs to be finished for
- * some access (or skipped to obtain the next token)
- */
- protected boolean _tokenIncomplete = false;
-
- /**
- * Temporary storage for partially parsed name bytes.
- */
- private int _quad1;
-
- /*
- /**********************************************************
- /* Input buffering (from former 'StreamBasedParserBase')
- /**********************************************************
- */
-
- protected InputStream _inputStream;
-
- /*
- /**********************************************************
- /* Current input data
- /**********************************************************
- */
-
- /**
- * Current buffer from which data is read; generally data is read into
- * buffer from input source, but in some cases pre-loaded buffer
- * is handed to the parser.
- */
- protected byte[] _inputBuffer;
-
- /**
- * Flag that indicates whether the input buffer is recycable (and
- * needs to be returned to recycler once we are done) or not.
- *
- * If it is not, it also means that parser can NOT modify underlying
- * buffer.
- */
- protected boolean _bufferRecyclable;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public UTF8StreamJsonParser(IOContext ctxt, int features, InputStream in,
- ObjectCodec codec, BytesToNameCanonicalizer sym,
- byte[] inputBuffer, int start, int end,
- boolean bufferRecyclable)
- {
- super(ctxt, features);
- _inputStream = in;
- _objectCodec = codec;
- _symbols = sym;
- _inputBuffer = inputBuffer;
- _inputPtr = start;
- _inputEnd = end;
- _currInputRowStart = start;
- // If we have offset, need to omit that from byte offset, so:
- _currInputProcessed = -start;
- _bufferRecyclable = bufferRecyclable;
- }
-
- @Override
- public ObjectCodec getCodec() {
- return _objectCodec;
- }
-
- @Override
- public void setCodec(ObjectCodec c) {
- _objectCodec = c;
- }
-
- /*
- /**********************************************************
- /* Overrides for life-cycle
- /**********************************************************
- */
-
- @Override
- public int releaseBuffered(OutputStream out) throws IOException
- {
- int count = _inputEnd - _inputPtr;
- if (count < 1) {
- return 0;
- }
- // let's just advance ptr to end
- int origPtr = _inputPtr;
- out.write(_inputBuffer, origPtr, count);
- return count;
- }
-
- @Override
- public Object getInputSource() {
- return _inputStream;
- }
-
- /*
- /**********************************************************
- /* Overrides, low-level reading
- /**********************************************************
- */
-
- @Override
- protected final boolean loadMore()
- throws IOException
- {
- _currInputProcessed += _inputEnd;
- _currInputRowStart -= _inputEnd;
-
- if (_inputStream != null) {
- int count = _inputStream.read(_inputBuffer, 0, _inputBuffer.length);
- if (count > 0) {
- _inputPtr = 0;
- _inputEnd = count;
- return true;
- }
- // End of input
- _closeInput();
- // Should never return 0, so let's fail
- if (count == 0) {
- throw new IOException("InputStream.read() returned 0 characters when trying to read "+_inputBuffer.length+" bytes");
- }
- }
- return false;
- }
-
- /**
- * 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
- {
- // No input stream, no leading (either we are closed, or have non-stream input source)
- if (_inputStream == null) {
- return false;
- }
- // Need to move remaining data in front?
- int amount = _inputEnd - _inputPtr;
- if (amount > 0 && _inputPtr > 0) {
- _currInputProcessed += _inputPtr;
- _currInputRowStart -= _inputPtr;
- System.arraycopy(_inputBuffer, _inputPtr, _inputBuffer, 0, amount);
- _inputEnd = amount;
- } else {
- _inputEnd = 0;
- }
- _inputPtr = 0;
- while (_inputEnd < minAvailable) {
- int count = _inputStream.read(_inputBuffer, _inputEnd, _inputBuffer.length - _inputEnd);
- if (count < 1) {
- // End of input
- _closeInput();
- // Should never return 0, so let's fail
- if (count == 0) {
- throw new IOException("InputStream.read() returned 0 characters when trying to read "+amount+" bytes");
- }
- return false;
- }
- _inputEnd += count;
- }
- return true;
- }
-
- @Override
- protected void _closeInput() throws IOException
- {
- /* 25-Nov-2008, tatus: As per [JACKSON-16] we are not to call close()
- * on the underlying InputStream, unless we "own" it, or auto-closing
- * feature is enabled.
- */
- if (_inputStream != null) {
- if (_ioContext.isResourceManaged() || isEnabled(Feature.AUTO_CLOSE_SOURCE)) {
- _inputStream.close();
- }
- _inputStream = null;
- }
- }
-
- /**
- * Method called to release internal buffers owned by the base
- * reader. This may be called along with {@link #_closeInput} (for
- * example, when explicitly closing this reader instance), or
- * separately (if need be).
- */
- @Override
- protected void _releaseBuffers() throws IOException
- {
- super._releaseBuffers();
- // Merge found symbols, if any:
- _symbols.release();
- if (_bufferRecyclable) {
- byte[] buf = _inputBuffer;
- if (buf != null) {
- _inputBuffer = null;
- _ioContext.releaseReadIOBuffer(buf);
- }
- }
- }
-
- /*
- /**********************************************************
- /* Public API, data access
- /**********************************************************
- */
-
- @Override
- public String getText()
- throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return _getText2(_currToken);
- }
-
- // // // Let's override default impls for improved performance
-
- // @since 2.1
- @Override
- public String getValueAsString() throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return super.getValueAsString(null);
- }
-
- // @since 2.1
- @Override
- public String getValueAsString(String defValue) throws IOException, JsonParseException
- {
- if (_currToken == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- return _textBuffer.contentsAsString();
- }
- return super.getValueAsString(defValue);
- }
-
- protected final String _getText2(JsonToken t)
- {
- if (t == null) {
- return null;
- }
- switch (t.id()) {
- case ID_FIELD_NAME:
- return _parsingContext.getCurrentName();
-
- case ID_STRING:
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.contentsAsString();
- default:
- return t.asString();
- }
- }
-
- @Override
- public char[] getTextCharacters()
- throws IOException, JsonParseException
- {
- if (_currToken != null) { // null only before/after document
- switch (_currToken.id()) {
-
- case ID_FIELD_NAME:
- if (!_nameCopied) {
- String name = _parsingContext.getCurrentName();
- int nameLen = name.length();
- if (_nameCopyBuffer == null) {
- _nameCopyBuffer = _ioContext.allocNameCopyBuffer(nameLen);
- } else if (_nameCopyBuffer.length < nameLen) {
- _nameCopyBuffer = new char[nameLen];
- }
- name.getChars(0, nameLen, _nameCopyBuffer, 0);
- _nameCopied = true;
- }
- return _nameCopyBuffer;
-
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.getTextBuffer();
-
- default:
- return _currToken.asCharArray();
- }
- }
- return null;
- }
-
- @Override
- public int getTextLength()
- throws IOException, JsonParseException
- {
- if (_currToken != null) { // null only before/after document
- switch (_currToken.id()) {
-
- case ID_FIELD_NAME:
- return _parsingContext.getCurrentName().length();
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.size();
-
- default:
- return _currToken.asCharArray().length;
- }
- }
- return 0;
- }
-
- @Override
- public int getTextOffset() throws IOException, JsonParseException
- {
- // Most have offset of 0, only some may have other values:
- if (_currToken != null) {
- switch (_currToken.id()) {
- case ID_FIELD_NAME:
- return 0;
- case ID_STRING:
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString(); // only strings can be incomplete
- }
- // fall through
- case ID_NUMBER_INT:
- case ID_NUMBER_FLOAT:
- return _textBuffer.getTextOffset();
- default:
- }
- }
- return 0;
- }
-
- @Override
- public byte[] getBinaryValue(Base64Variant b64variant)
- throws IOException, JsonParseException
- {
- if (_currToken != JsonToken.VALUE_STRING &&
- (_currToken != JsonToken.VALUE_EMBEDDED_OBJECT || _binaryValue == null)) {
- _reportError("Current token ("+_currToken+") not VALUE_STRING or VALUE_EMBEDDED_OBJECT, can not access as binary");
- }
- /* To ensure that we won't see inconsistent data, better clear up
- * state...
- */
- if (_tokenIncomplete) {
- try {
- _binaryValue = _decodeBase64(b64variant);
- } catch (IllegalArgumentException iae) {
- throw _constructError("Failed to decode VALUE_STRING as base64 ("+b64variant+"): "+iae.getMessage());
- }
- /* let's clear incomplete only now; allows for accessing other
- * textual content in error cases
- */
- _tokenIncomplete = false;
- } else { // may actually require conversion...
- if (_binaryValue == null) {
- @SuppressWarnings("resource")
- ByteArrayBuilder builder = _getByteArrayBuilder();
- _decodeBase64(getText(), builder, b64variant);
- _binaryValue = builder.toByteArray();
- }
- }
- return _binaryValue;
- }
-
- @Override
- public int readBinaryValue(Base64Variant b64variant, OutputStream out)
- throws IOException, JsonParseException
- {
- // if we have already read the token, just use whatever we may have
- if (!_tokenIncomplete || _currToken != JsonToken.VALUE_STRING) {
- byte[] b = getBinaryValue(b64variant);
- out.write(b);
- return b.length;
- }
- // otherwise do "real" incremental parsing...
- byte[] buf = _ioContext.allocBase64Buffer();
- try {
- return _readBinary(b64variant, out, buf);
- } finally {
- _ioContext.releaseBase64Buffer(buf);
- }
- }
-
- protected int _readBinary(Base64Variant b64variant, OutputStream out,
- byte[] buffer)
- throws IOException, JsonParseException
- {
- int outputPtr = 0;
- final int outputEnd = buffer.length - 3;
- int outputCount = 0;
-
- while (true) {
- // first, we'll skip preceding white space, if any
- int ch;
- do {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = (int) _inputBuffer[_inputPtr++] & 0xFF;
- } while (ch <= INT_SPACE);
- int bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) { // reached the end, fair and square?
- if (ch == INT_QUOTE) {
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 0);
- if (bits < 0) { // white space to skip
- continue;
- }
- }
-
- // enough room? If not, flush
- if (outputPtr > outputEnd) {
- outputCount += outputPtr;
- out.write(buffer, 0, outputPtr);
- outputPtr = 0;
- }
-
- int decodedData = bits;
-
- // then second base64 char; can't get padding yet, nor ws
-
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- bits = _decodeBase64Escape(b64variant, ch, 1);
- }
- decodedData = (decodedData << 6) | bits;
-
- // third base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
-
- // First branch: can get padding (-> 1 byte)
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 4;
- buffer[outputPtr++] = (byte) decodedData;
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 2);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- // Ok, must get padding
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- if (!b64variant.usesPaddingChar(ch)) {
- throw reportInvalidBase64Char(b64variant, ch, 3, "expected padding character '"+b64variant.getPaddingChar()+"'");
- }
- // Got 12 bits, only need 8, need to shift
- decodedData >>= 4;
- buffer[outputPtr++] = (byte) decodedData;
- continue;
- }
- }
- // Nope, 2 or 3 bytes
- decodedData = (decodedData << 6) | bits;
- // fourth and last base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 2;
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- break;
- }
- bits = _decodeBase64Escape(b64variant, ch, 3);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- /* With padding we only get 2 bytes; but we have
- * to shift it a bit so it is identical to triplet
- * case with partial output.
- * 3 chars gives 3x6 == 18 bits, of which 2 are
- * dummies, need to discard:
- */
- decodedData >>= 2;
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- continue;
- }
- }
- // otherwise, our triplet is now complete
- decodedData = (decodedData << 6) | bits;
- buffer[outputPtr++] = (byte) (decodedData >> 16);
- buffer[outputPtr++] = (byte) (decodedData >> 8);
- buffer[outputPtr++] = (byte) decodedData;
- }
- _tokenIncomplete = false;
- if (outputPtr > 0) {
- outputCount += outputPtr;
- out.write(buffer, 0, outputPtr);
- }
- return outputCount;
- }
-
- // As per [Issue#108], must ensure we call the right method
- @Override
- public JsonLocation getTokenLocation()
- {
- return new JsonLocation(_ioContext.getSourceReference(),
- getTokenCharacterOffset(), -1L, // bytes, chars
- getTokenLineNr(),
- getTokenColumnNr());
- }
-
- // As per [Issue#108], must ensure we call the right method
- @Override
- public JsonLocation getCurrentLocation()
- {
- int col = _inputPtr - _currInputRowStart + 1; // 1-based
- return new JsonLocation(_ioContext.getSourceReference(),
- _currInputProcessed + _inputPtr, -1L, // bytes, chars
- _currInputRow, col);
- }
-
- /*
- /**********************************************************
- /* Public API, traversal, basic
- /**********************************************************
- */
-
- /**
- * @return Next token from the stream, if any found, or null
- * to indicate end-of-input
- */
- @Override
- public JsonToken nextToken()
- throws IOException, JsonParseException
- {
- _numTypesValid = NR_UNKNOWN;
- /* First: field names are special -- we will always tokenize
- * (part of) value along with field name to simplify
- * state handling. If so, can and need to use secondary token:
- */
- if (_currToken == JsonToken.FIELD_NAME) {
- return _nextAfterName();
- }
- if (_tokenIncomplete) {
- _skipString(); // only strings can be partial
- }
-
- int i = _skipWSOrEnd();
- if (i < 0) { // end-of-input
- /* 19-Feb-2009, tatu: Should actually close/release things
- * like input source, symbol table and recyclable buffers now.
- */
- close();
- return (_currToken = null);
- }
-
- /* First, need to ensure we know the starting location of token
- * after skipping leading white space
- */
- _tokenInputTotal = _currInputProcessed + _inputPtr - 1;
- _tokenInputRow = _currInputRow;
- _tokenInputCol = _inputPtr - _currInputRowStart - 1;
-
- // finally: clear any data retained so far
- _binaryValue = null;
-
- // Closing scope?
- if (i == INT_RBRACKET) {
- if (!_parsingContext.inArray()) {
- _reportMismatchedEndMarker(i, '}');
- }
- _parsingContext = _parsingContext.getParent();
- return (_currToken = JsonToken.END_ARRAY);
- }
- if (i == INT_RCURLY) {
- if (!_parsingContext.inObject()) {
- _reportMismatchedEndMarker(i, ']');
- }
- _parsingContext = _parsingContext.getParent();
- return (_currToken = JsonToken.END_OBJECT);
- }
-
- // Nope: do we then expect a comma?
- if (_parsingContext.expectComma()) {
- if (i != INT_COMMA) {
- _reportUnexpectedChar(i, "was expecting comma to separate "+_parsingContext.getTypeDesc()+" entries");
- }
- i = _skipWS();
- }
-
- /* And should we now have a name? Always true for
- * Object contexts, since the intermediate 'expect-value'
- * state is never retained.
- */
- if (!_parsingContext.inObject()) {
- return _nextTokenNotInObject(i);
- }
- // So first parse the field name itself:
- Name n = _parseName(i);
- _parsingContext.setCurrentName(n.getName());
- _currToken = JsonToken.FIELD_NAME;
-
- // Let's do a quickie check:
- if (_inputPtr < _inputEnd && _inputBuffer[_inputPtr] == ':') {
- ++_inputPtr;
- } else {
- i = _skipWS();
- if (i != INT_COLON) {
- _reportUnexpectedChar(i, "was expecting a colon to separate field name and value");
- }
- }
- i = _skipWS();
-
- // Ok: we must have a value... what is it? Strings are very common, check first:
- if (i == INT_QUOTE) {
- _tokenIncomplete = true;
- _nextToken = JsonToken.VALUE_STRING;
- return _currToken;
- }
- JsonToken t;
-
- switch (i) {
- case '[':
- t = JsonToken.START_ARRAY;
- break;
- case '{':
- t = JsonToken.START_OBJECT;
- break;
- case ']':
- case '}':
- // Error: neither is valid at this point; valid closers have
- // been handled earlier
- _reportUnexpectedChar(i, "expected a value");
- case 't':
- _matchToken("true", 1);
- t = JsonToken.VALUE_TRUE;
- break;
- case 'f':
- _matchToken("false", 1);
- t = JsonToken.VALUE_FALSE;
- break;
- case 'n':
- _matchToken("null", 1);
- t = JsonToken.VALUE_NULL;
- break;
-
- case '-':
- /* Should we have separate handling for plus? Although
- * it is not allowed per se, it may be erroneously used,
- * and could be indicate by a more specific error message.
- */
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- t = _parseNumber(i);
- break;
- default:
- t = _handleUnexpectedValue(i);
- }
- _nextToken = t;
- return _currToken;
- }
-
- private final JsonToken _nextTokenNotInObject(int i)
- throws IOException, JsonParseException
- {
- if (i == INT_QUOTE) {
- _tokenIncomplete = true;
- return (_currToken = JsonToken.VALUE_STRING);
- }
- switch (i) {
- case '[':
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- return (_currToken = JsonToken.START_ARRAY);
- case '{':
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- return (_currToken = JsonToken.START_OBJECT);
- case ']':
- case '}':
- // Error: neither is valid at this point; valid closers have
- // been handled earlier
- _reportUnexpectedChar(i, "expected a value");
- case 't':
- _matchToken("true", 1);
- return (_currToken = JsonToken.VALUE_TRUE);
- case 'f':
- _matchToken("false", 1);
- return (_currToken = JsonToken.VALUE_FALSE);
- case 'n':
- _matchToken("null", 1);
- return (_currToken = JsonToken.VALUE_NULL);
- case '-':
- /* Should we have separate handling for plus? Although
- * it is not allowed per se, it may be erroneously used,
- * and could be indicate by a more specific error message.
- */
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- return (_currToken = _parseNumber(i));
- }
- return (_currToken = _handleUnexpectedValue(i));
- }
-
- private final JsonToken _nextAfterName()
- {
- _nameCopied = false; // need to invalidate if it was copied
- JsonToken t = _nextToken;
- _nextToken = null;
- // Also: may need to start new context?
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return (_currToken = t);
- }
-
- /*
- /**********************************************************
- /* Public API, traversal, nextXxxValue/nextFieldName
- /**********************************************************
- */
-
- @Override
- public boolean nextFieldName(SerializableString str)
- throws IOException, JsonParseException
- {
- // // // Note: most of code below is copied from nextToken()
-
- _numTypesValid = NR_UNKNOWN;
- if (_currToken == JsonToken.FIELD_NAME) { // can't have name right after name
- _nextAfterName();
- return false;
- }
- if (_tokenIncomplete) {
- _skipString();
- }
- int i = _skipWSOrEnd();
- if (i < 0) { // end-of-input
- close();
- _currToken = null;
- return false;
- }
- _tokenInputTotal = _currInputProcessed + _inputPtr - 1;
- _tokenInputRow = _currInputRow;
- _tokenInputCol = _inputPtr - _currInputRowStart - 1;
-
- // finally: clear any data retained so far
- _binaryValue = null;
-
- // Closing scope?
- if (i == INT_RBRACKET) {
- if (!_parsingContext.inArray()) {
- _reportMismatchedEndMarker(i, '}');
- }
- _parsingContext = _parsingContext.getParent();
- _currToken = JsonToken.END_ARRAY;
- return false;
- }
- if (i == INT_RCURLY) {
- if (!_parsingContext.inObject()) {
- _reportMismatchedEndMarker(i, ']');
- }
- _parsingContext = _parsingContext.getParent();
- _currToken = JsonToken.END_OBJECT;
- return false;
- }
-
- // Nope: do we then expect a comma?
- if (_parsingContext.expectComma()) {
- if (i != INT_COMMA) {
- _reportUnexpectedChar(i, "was expecting comma to separate "+_parsingContext.getTypeDesc()+" entries");
- }
- i = _skipWS();
- }
-
- if (!_parsingContext.inObject()) {
- _nextTokenNotInObject(i);
- return false;
- }
-
- // // // This part differs, name parsing
- if (i == INT_QUOTE) {
- // when doing literal match, must consider escaping:
- byte[] nameBytes = str.asQuotedUTF8();
- final int len = nameBytes.length;
- if ((_inputPtr + len) < _inputEnd) { // maybe...
- // first check length match by
- final int end = _inputPtr+len;
- if (_inputBuffer[end] == INT_QUOTE) {
- int offset = 0;
- final int ptr = _inputPtr;
- while (true) {
- if (offset == len) { // yes, match!
- _inputPtr = end+1; // skip current value first
- // First part is simple; setting of name
- _parsingContext.setCurrentName(str.getValue());
- _currToken = JsonToken.FIELD_NAME;
- // But then we also must handle following value etc
- _isNextTokenNameYes();
- return true;
- }
- if (nameBytes[offset] != _inputBuffer[ptr+offset]) {
- break;
- }
- ++offset;
- }
- }
- }
- }
- return _isNextTokenNameMaybe(i, str);
- }
-
- private final void _isNextTokenNameYes()
- throws IOException, JsonParseException
- {
- // very first thing: common case, colon, value, no white space
- int i;
- if (_inputPtr < (_inputEnd-1) && _inputBuffer[_inputPtr] == INT_COLON) { // fast case first
- i = _inputBuffer[++_inputPtr];
- ++_inputPtr;
- if (i == INT_QUOTE) {
- _tokenIncomplete = true;
- _nextToken = JsonToken.VALUE_STRING;
- return;
- }
- if (i == INT_LCURLY) {
- _nextToken = JsonToken.START_OBJECT;
- return;
- }
- if (i == INT_LBRACKET) {
- _nextToken = JsonToken.START_ARRAY;
- return;
- }
- i &= 0xFF;
- if (i <= INT_SPACE || i == INT_SLASH) {
- --_inputPtr;
- i = _skipWS();
- }
- } else {
- i = _skipColon();
- }
- switch (i) {
- case '"':
- _tokenIncomplete = true;
- _nextToken = JsonToken.VALUE_STRING;
- return;
- case '[':
- _nextToken = JsonToken.START_ARRAY;
- return;
- case '{':
- _nextToken = JsonToken.START_OBJECT;
- return;
- case ']':
- case '}':
- _reportUnexpectedChar(i, "expected a value");
- case 't':
- _matchToken("true", 1);
- _nextToken = JsonToken.VALUE_TRUE;
- return;
- case 'f':
- _matchToken("false", 1);
- _nextToken = JsonToken.VALUE_FALSE;
- return;
- case 'n':
- _matchToken("null", 1);
- _nextToken = JsonToken.VALUE_NULL;
- return;
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- _nextToken = _parseNumber(i);
- return;
- }
- _nextToken = _handleUnexpectedValue(i);
- }
-
- private final boolean _isNextTokenNameMaybe(int i, SerializableString str)
- throws IOException, JsonParseException
- {
- // // // and this is back to standard nextToken()
-
- Name n = _parseName(i);
- final boolean match;
- {
- String nameStr = n.getName();
- _parsingContext.setCurrentName(nameStr);
- match = nameStr.equals(str.getValue());
- }
- _currToken = JsonToken.FIELD_NAME;
- i = _skipWS();
- if (i != INT_COLON) {
- _reportUnexpectedChar(i, "was expecting a colon to separate field name and value");
- }
- i = _skipWS();
-
- // Ok: we must have a value... what is it? Strings are very common, check first:
- if (i == INT_QUOTE) {
- _tokenIncomplete = true;
- _nextToken = JsonToken.VALUE_STRING;
- return match;
- }
- JsonToken t;
-
- switch (i) {
- case '[':
- t = JsonToken.START_ARRAY;
- break;
- case '{':
- t = JsonToken.START_OBJECT;
- break;
- case ']':
- case '}':
- _reportUnexpectedChar(i, "expected a value");
- case 't':
- _matchToken("true", 1);
- t = JsonToken.VALUE_TRUE;
- break;
- case 'f':
- _matchToken("false", 1);
- t = JsonToken.VALUE_FALSE;
- break;
- case 'n':
- _matchToken("null", 1);
- t = JsonToken.VALUE_NULL;
- break;
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
-
- t = _parseNumber(i);
- break;
- default:
- t = _handleUnexpectedValue(i);
- }
- _nextToken = t;
- return match;
- }
-
- @Override
- public String nextTextValue()
- throws IOException, JsonParseException
- {
- // two distinct cases; either got name and we know next type, or 'other'
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_STRING) {
- if (_tokenIncomplete) {
- _tokenIncomplete = false;
- _finishString();
- }
- return _textBuffer.contentsAsString();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return null;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_STRING) ? getText() : null;
- }
-
- @Override
- public int nextIntValue(int defaultValue)
- throws IOException, JsonParseException
- {
- // two distinct cases; either got name and we know next type, or 'other'
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_NUMBER_INT) {
- return getIntValue();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return defaultValue;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getIntValue() : defaultValue;
- }
-
- @Override
- public long nextLongValue(long defaultValue)
- throws IOException, JsonParseException
- {
- // two distinct cases; either got name and we know next type, or 'other'
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_NUMBER_INT) {
- return getLongValue();
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return defaultValue;
- }
- // !!! TODO: optimize this case as well
- return (nextToken() == JsonToken.VALUE_NUMBER_INT) ? getLongValue() : defaultValue;
- }
-
- @Override
- public Boolean nextBooleanValue()
- throws IOException, JsonParseException
- {
- // two distinct cases; either got name and we know next type, or 'other'
- if (_currToken == JsonToken.FIELD_NAME) { // mostly copied from '_nextAfterName'
- _nameCopied = false;
- JsonToken t = _nextToken;
- _nextToken = null;
- _currToken = t;
- if (t == JsonToken.VALUE_TRUE) {
- return Boolean.TRUE;
- }
- if (t == JsonToken.VALUE_FALSE) {
- return Boolean.FALSE;
- }
- if (t == JsonToken.START_ARRAY) {
- _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
- } else if (t == JsonToken.START_OBJECT) {
- _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
- }
- return null;
- }
-
- switch (nextToken().id()) {
- case ID_TRUE:
- return Boolean.TRUE;
- case ID_FALSE:
- return Boolean.FALSE;
- default:
- return null;
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, number parsing
- /* (note: in 1.6 and prior, part of "Utf8NumericParser"
- /**********************************************************
- */
-
- /**
- * Initial parsing method for number values. It needs to be able
- * to parse enough input to be able to determine whether the
- * value is to be considered a simple integer value, or a more
- * generic decimal value: latter of which needs to be expressed
- * as a floating point number. The basic rule is that if the number
- * has no fractional or exponential part, it is an integer; otherwise
- * a floating point number.
- *
- * Because much of input has to be processed in any case, no partial
- * parsing is done: all input text will be stored for further
- * processing. However, actual numeric value conversion will be
- * deferred, since it is usually the most complicated and costliest
- * part of processing.
- */
- protected JsonToken _parseNumber(int c)
- throws IOException, JsonParseException
- {
- char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
- int outPtr = 0;
- boolean negative = (c == INT_MINUS);
-
- // Need to prepend sign?
- if (negative) {
- outBuf[outPtr++] = '-';
- // Must have something after sign too
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- // Note: must be followed by a digit
- if (c < INT_0 || c > INT_9) {
- return _handleInvalidNumberStart(c, true);
- }
- }
-
- // One special case: if first char is 0, must not be followed by a digit
- if (c == INT_0) {
- c = _verifyNoLeadingZeroes();
- }
-
- // Ok: we can first just add digit we saw first:
- outBuf[outPtr++] = (char) c;
- int intLen = 1;
-
- // And then figure out how far we can read without further checks:
- int end = _inputPtr + outBuf.length;
- if (end > _inputEnd) {
- end = _inputEnd;
- }
-
- // With this, we have a nice and tight loop:
- while (true) {
- if (_inputPtr >= end) {
- // Long enough to be split across boundary, so:
- return _parserNumber2(outBuf, outPtr, negative, intLen);
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- if (c < INT_0 || c > INT_9) {
- break;
- }
- ++intLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- }
- if (c == '.' || c == 'e' || c == 'E') {
- return _parseFloat(outBuf, outPtr, c, negative, intLen);
- }
-
- --_inputPtr; // to push back trailing char (comma etc)
- _textBuffer.setCurrentLength(outPtr);
- // As per #105, need separating space between root values; check here
- if (_parsingContext.inRoot()) {
- _verifyRootSpace(c);
- }
-
- // And there we have it!
- return resetInt(negative, intLen);
- }
-
- /**
- * Method called to handle parsing when input is split across buffer boundary
- * (or output is longer than segment used to store it)
- */
- private final JsonToken _parserNumber2(char[] outBuf, int outPtr, boolean negative,
- int intPartLength)
- throws IOException, JsonParseException
- {
- // Ok, parse the rest
- while (true) {
- if (_inputPtr >= _inputEnd && !loadMore()) {
- _textBuffer.setCurrentLength(outPtr);
- return resetInt(negative, intPartLength);
- }
- int c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- if (c > INT_9 || c < INT_0) {
- if (c == '.' || c == 'e' || c == 'E') {
- return _parseFloat(outBuf, outPtr, c, negative, intPartLength);
- }
- break;
- }
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- ++intPartLength;
- }
- --_inputPtr; // to push back trailing char (comma etc)
- _textBuffer.setCurrentLength(outPtr);
- // As per #105, need separating space between root values; check here
- if (_parsingContext.inRoot()) {
- _verifyRootSpace(_inputBuffer[_inputPtr++] & 0xFF);
- }
-
- // And there we have it!
- return resetInt(negative, intPartLength);
-
- }
-
- /**
- * Method called when we have seen one zero, and want to ensure
- * it is not followed by another
- */
- private final int _verifyNoLeadingZeroes()
- throws IOException, JsonParseException
- {
- // Ok to have plain "0"
- if (_inputPtr >= _inputEnd && !loadMore()) {
- return INT_0;
- }
- int ch = _inputBuffer[_inputPtr] & 0xFF;
- // if not followed by a number (probably '.'); return zero as is, to be included
- if (ch < INT_0 || ch > INT_9) {
- return INT_0;
- }
- // [JACKSON-358]: we may want to allow them, after all...
- if (!isEnabled(Feature.ALLOW_NUMERIC_LEADING_ZEROS)) {
- reportInvalidNumber("Leading zeroes not allowed");
- }
- // if so, just need to skip either all zeroes (if followed by number); or all but one (if non-number)
- ++_inputPtr; // Leading zero to be skipped
- if (ch == INT_0) {
- while (_inputPtr < _inputEnd || loadMore()) {
- ch = _inputBuffer[_inputPtr] & 0xFF;
- if (ch < INT_0 || ch > INT_9) { // followed by non-number; retain one zero
- return INT_0;
- }
- ++_inputPtr; // skip previous zeroes
- if (ch != INT_0) { // followed by other number; return
- break;
- }
- }
- }
- return ch;
- }
-
- private final JsonToken _parseFloat(char[] outBuf, int outPtr, int c,
- boolean negative, int integerPartLength)
- throws IOException, JsonParseException
- {
- int fractLen = 0;
- boolean eof = false;
-
- // And then see if we get other parts
- if (c == '.') { // yes, fraction
- outBuf[outPtr++] = (char) c;
-
- fract_loop:
- while (true) {
- if (_inputPtr >= _inputEnd && !loadMore()) {
- eof = true;
- break fract_loop;
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- if (c < INT_0 || c > INT_9) {
- break fract_loop;
- }
- ++fractLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- }
- // must be followed by sequence of ints, one minimum
- if (fractLen == 0) {
- reportUnexpectedNumberChar(c, "Decimal point not followed by a digit");
- }
- }
-
- int expLen = 0;
- if (c == 'e' || c == 'E') { // exponent?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- // Not optional, can require that we get one more char
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- // Sign indicator?
- if (c == '-' || c == '+') {
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- // Likewise, non optional:
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- }
-
- exp_loop:
- while (c <= INT_9 && c >= INT_0) {
- ++expLen;
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- outBuf[outPtr++] = (char) c;
- if (_inputPtr >= _inputEnd && !loadMore()) {
- eof = true;
- break exp_loop;
- }
- c = (int) _inputBuffer[_inputPtr++] & 0xFF;
- }
- // must be followed by sequence of ints, one minimum
- if (expLen == 0) {
- reportUnexpectedNumberChar(c, "Exponent indicator not followed by a digit");
- }
- }
-
- // Ok; unless we hit end-of-input, need to push last char read back
- if (!eof) {
- --_inputPtr;
- // As per #105, need separating space between root values; check here
- if (_parsingContext.inRoot()) {
- _verifyRootSpace(c);
- }
- }
- _textBuffer.setCurrentLength(outPtr);
-
- // And there we have it!
- return resetFloat(negative, integerPartLength, fractLen, expLen);
- }
-
- /**
- * Method called to ensure that a root-value is followed by a space
- * token.
- *
- * NOTE: caller MUST ensure there is at least one character available;
- * and that input pointer is AT given char (not past)
- */
- private final void _verifyRootSpace(int ch) throws IOException
- {
- // caller had pushed it back, before calling; reset
- ++_inputPtr;
- // TODO? Handle UTF-8 char decoding for error reporting
- switch (ch) {
- case ' ':
- case '\t':
- return;
- case '\r':
- _skipCR();
- return;
- case '\n':
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- return;
- }
- _reportMissingRootWS(ch);
- }
-
- /*
- /**********************************************************
- /* Internal methods, secondary parsing
- /**********************************************************
- */
-
- protected Name _parseName(int i) throws IOException
- {
- if (i != INT_QUOTE) {
- return _handleOddName(i);
- }
- // First: can we optimize out bounds checks?
- if ((_inputPtr + 9) > _inputEnd) { // Need 8 chars, plus one trailing (quote)
- return slowParseName();
- }
-
- // If so, can also unroll loops nicely
- /* 25-Nov-2008, tatu: This may seem weird, but here we do
- * NOT want to worry about UTF-8 decoding. Rather, we'll
- * assume that part is ok (if not it will get caught
- * later on), and just handle quotes and backslashes here.
- */
- final byte[] input = _inputBuffer;
- final int[] codes = _icLatin1;
-
- int q = input[_inputPtr++] & 0xFF;
-
- if (codes[q] == 0) {
- i = input[_inputPtr++] & 0xFF;
- if (codes[i] == 0) {
- q = (q << 8) | i;
- i = input[_inputPtr++] & 0xFF;
- if (codes[i] == 0) {
- q = (q << 8) | i;
- i = input[_inputPtr++] & 0xFF;
- if (codes[i] == 0) {
- q = (q << 8) | i;
- i = input[_inputPtr++] & 0xFF;
- if (codes[i] == 0) {
- _quad1 = q;
- return parseMediumName(i, codes);
- }
- if (i == INT_QUOTE) { // one byte/char case or broken
- return findName(q, 4);
- }
- return parseName(q, i, 4);
- }
- if (i == INT_QUOTE) { // one byte/char case or broken
- return findName(q, 3);
- }
- return parseName(q, i, 3);
- }
- if (i == INT_QUOTE) { // one byte/char case or broken
- return findName(q, 2);
- }
- return parseName(q, i, 2);
- }
- if (i == INT_QUOTE) { // one byte/char case or broken
- return findName(q, 1);
- }
- return parseName(q, i, 1);
- }
- if (q == INT_QUOTE) { // special case, ""
- return BytesToNameCanonicalizer.getEmptyName();
- }
- return parseName(0, q, 0); // quoting or invalid char
- }
-
- protected Name parseMediumName(int q2, final int[] codes) throws IOException
- {
- // Ok, got 5 name bytes so far
- int i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) { // 5 bytes
- return findName(_quad1, q2, 1);
- }
- return parseName(_quad1, q2, i, 1); // quoting or invalid char
- }
- q2 = (q2 << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) { // 6 bytes
- return findName(_quad1, q2, 2);
- }
- return parseName(_quad1, q2, i, 2);
- }
- q2 = (q2 << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) { // 7 bytes
- return findName(_quad1, q2, 3);
- }
- return parseName(_quad1, q2, i, 3);
- }
- q2 = (q2 << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) { // 8 bytes
- return findName(_quad1, q2, 4);
- }
- return parseName(_quad1, q2, i, 4);
- }
- _quadBuffer[0] = _quad1;
- _quadBuffer[1] = q2;
- return parseLongName(i);
- }
-
- protected Name parseLongName(int q) throws IOException
- {
- // As explained above, will ignore UTF-8 encoding at this point
- final int[] codes = _icLatin1;
- int qlen = 2;
-
- while (true) {
- /* Let's offline if we hit buffer boundary (otherwise would
- * need to [try to] align input, which is bit complicated
- * and may not always be possible)
- */
- if ((_inputEnd - _inputPtr) < 4) {
- return parseEscapedName(_quadBuffer, qlen, 0, q, 0);
- }
- // Otherwise can skip boundary checks for 4 bytes in loop
-
- int i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) {
- return findName(_quadBuffer, qlen, q, 1);
- }
- return parseEscapedName(_quadBuffer, qlen, q, i, 1);
- }
-
- q = (q << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) {
- return findName(_quadBuffer, qlen, q, 2);
- }
- return parseEscapedName(_quadBuffer, qlen, q, i, 2);
- }
-
- q = (q << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) {
- return findName(_quadBuffer, qlen, q, 3);
- }
- return parseEscapedName(_quadBuffer, qlen, q, i, 3);
- }
-
- q = (q << 8) | i;
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (codes[i] != 0) {
- if (i == INT_QUOTE) {
- return findName(_quadBuffer, qlen, q, 4);
- }
- return parseEscapedName(_quadBuffer, qlen, q, i, 4);
- }
-
- // Nope, no end in sight. Need to grow quad array etc
- if (qlen >= _quadBuffer.length) {
- _quadBuffer = growArrayBy(_quadBuffer, qlen);
- }
- _quadBuffer[qlen++] = q;
- q = i;
- }
- }
-
- /**
- * Method called when not even first 8 bytes are guaranteed
- * to come consequtively. Happens rarely, so this is offlined;
- * plus we'll also do full checks for escaping etc.
- */
- protected Name slowParseName() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing '\"' for name");
- }
- }
- int i = _inputBuffer[_inputPtr++] & 0xFF;
- if (i == INT_QUOTE) { // special case, ""
- return BytesToNameCanonicalizer.getEmptyName();
- }
- return parseEscapedName(_quadBuffer, 0, 0, i, 0);
- }
-
- private final Name parseName(int q1, int ch, int lastQuadBytes) throws IOException
- {
- return parseEscapedName(_quadBuffer, 0, q1, ch, lastQuadBytes);
- }
-
- private final Name parseName(int q1, int q2, int ch, int lastQuadBytes) throws IOException
- {
- _quadBuffer[0] = q1;
- return parseEscapedName(_quadBuffer, 1, q2, ch, lastQuadBytes);
- }
-
- /**
- * Slower parsing method which is generally branched to when
- * an escape sequence is detected (or alternatively for long
- * names, or ones crossing input buffer boundary). In any case,
- * needs to be able to handle more exceptional cases, gets
- * slower, and hance is offlined to a separate method.
- */
- protected Name parseEscapedName(int[] quads, int qlen, int currQuad, int ch,
- int currQuadBytes) throws IOException
- {
- /* 25-Nov-2008, tatu: This may seem weird, but here we do
- * NOT want to worry about UTF-8 decoding. Rather, we'll
- * assume that part is ok (if not it will get caught
- * later on), and just handle quotes and backslashes here.
- */
- final int[] codes = _icLatin1;
-
- while (true) {
- if (codes[ch] != 0) {
- if (ch == INT_QUOTE) { // we are done
- break;
- }
- // Unquoted white space?
- if (ch != INT_BACKSLASH) {
- // As per [JACKSON-208], call can now return:
- _throwUnquotedSpace(ch, "name");
- } else {
- // Nope, escape sequence
- ch = _decodeEscaped();
- }
- /* Oh crap. May need to UTF-8 (re-)encode it, if it's
- * beyond 7-bit ascii. Gets pretty messy.
- * If this happens often, may want to use different name
- * canonicalization to avoid these hits.
- */
- if (ch > 127) {
- // Ok, we'll need room for first byte right away
- if (currQuadBytes >= 4) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = 0;
- currQuadBytes = 0;
- }
- if (ch < 0x800) { // 2-byte
- currQuad = (currQuad << 8) | (0xc0 | (ch >> 6));
- ++currQuadBytes;
- // Second byte gets output below:
- } else { // 3 bytes; no need to worry about surrogates here
- currQuad = (currQuad << 8) | (0xe0 | (ch >> 12));
- ++currQuadBytes;
- // need room for middle byte?
- if (currQuadBytes >= 4) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = 0;
- currQuadBytes = 0;
- }
- currQuad = (currQuad << 8) | (0x80 | ((ch >> 6) & 0x3f));
- ++currQuadBytes;
- }
- // And same last byte in both cases, gets output below:
- ch = 0x80 | (ch & 0x3f);
- }
- }
- // Ok, we have one more byte to add at any rate:
- if (currQuadBytes < 4) {
- ++currQuadBytes;
- currQuad = (currQuad << 8) | ch;
- } else {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = ch;
- currQuadBytes = 1;
- }
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in field name");
- }
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- }
-
- if (currQuadBytes > 0) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- }
- Name name = _symbols.findName(quads, qlen);
- if (name == null) {
- name = addName(quads, qlen, currQuadBytes);
- }
- return name;
- }
-
- /**
- * Method called when we see non-white space character other
- * than double quote, when expecting a field name.
- * In standard mode will just throw an expection; but
- * in non-standard modes may be able to parse name.
- */
- protected Name _handleOddName(int ch) throws IOException
- {
- // [JACKSON-173]: allow single quotes
- if (ch == '\'' && isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
- return _parseAposName();
- }
- // [JACKSON-69]: allow unquoted names if feature enabled:
- if (!isEnabled(Feature.ALLOW_UNQUOTED_FIELD_NAMES)) {
- _reportUnexpectedChar(ch, "was expecting double-quote to start field name");
- }
- /* Also: note that although we use a different table here,
- * it does NOT handle UTF-8 decoding. It'll just pass those
- * high-bit codes as acceptable for later decoding.
- */
- final int[] codes = CharTypes.getInputCodeUtf8JsNames();
- // Also: must start with a valid character...
- if (codes[ch] != 0) {
- _reportUnexpectedChar(ch, "was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name");
- }
-
- /* Ok, now; instead of ultra-optimizing parsing here (as with
- * regular JSON names), let's just use the generic "slow"
- * variant. Can measure its impact later on if need be
- */
- int[] quads = _quadBuffer;
- int qlen = 0;
- int currQuad = 0;
- int currQuadBytes = 0;
-
- while (true) {
- // Ok, we have one more byte to add at any rate:
- if (currQuadBytes < 4) {
- ++currQuadBytes;
- currQuad = (currQuad << 8) | ch;
- } else {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = ch;
- currQuadBytes = 1;
- }
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in field name");
- }
- }
- ch = _inputBuffer[_inputPtr] & 0xFF;
- if (codes[ch] != 0) {
- break;
- }
- ++_inputPtr;
- }
-
- if (currQuadBytes > 0) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- }
- Name name = _symbols.findName(quads, qlen);
- if (name == null) {
- name = addName(quads, qlen, currQuadBytes);
- }
- return name;
- }
-
- /* Parsing to support [JACKSON-173]. Plenty of duplicated code;
- * main reason being to try to avoid slowing down fast path
- * for valid JSON -- more alternatives, more code, generally
- * bit slower execution.
- */
- protected Name _parseAposName() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(": was expecting closing '\'' for name");
- }
- }
- int ch = _inputBuffer[_inputPtr++] & 0xFF;
- if (ch == '\'') { // special case, ''
- return BytesToNameCanonicalizer.getEmptyName();
- }
- int[] quads = _quadBuffer;
- int qlen = 0;
- int currQuad = 0;
- int currQuadBytes = 0;
-
- // Copied from parseEscapedFieldName, with minor mods:
-
- final int[] codes = _icLatin1;
-
- while (true) {
- if (ch == '\'') {
- break;
- }
- // additional check to skip handling of double-quotes
- if (ch != '"' && codes[ch] != 0) {
- if (ch != '\\') {
- // Unquoted white space?
- // As per [JACKSON-208], call can now return:
- _throwUnquotedSpace(ch, "name");
- } else {
- // Nope, escape sequence
- ch = _decodeEscaped();
- }
- /* Oh crap. May need to UTF-8 (re-)encode it, if it's
- * beyond 7-bit ascii. Gets pretty messy.
- * If this happens often, may want to use different name
- * canonicalization to avoid these hits.
- */
- if (ch > 127) {
- // Ok, we'll need room for first byte right away
- if (currQuadBytes >= 4) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = 0;
- currQuadBytes = 0;
- }
- if (ch < 0x800) { // 2-byte
- currQuad = (currQuad << 8) | (0xc0 | (ch >> 6));
- ++currQuadBytes;
- // Second byte gets output below:
- } else { // 3 bytes; no need to worry about surrogates here
- currQuad = (currQuad << 8) | (0xe0 | (ch >> 12));
- ++currQuadBytes;
- // need room for middle byte?
- if (currQuadBytes >= 4) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = 0;
- currQuadBytes = 0;
- }
- currQuad = (currQuad << 8) | (0x80 | ((ch >> 6) & 0x3f));
- ++currQuadBytes;
- }
- // And same last byte in both cases, gets output below:
- ch = 0x80 | (ch & 0x3f);
- }
- }
- // Ok, we have one more byte to add at any rate:
- if (currQuadBytes < 4) {
- ++currQuadBytes;
- currQuad = (currQuad << 8) | ch;
- } else {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- currQuad = ch;
- currQuadBytes = 1;
- }
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in field name");
- }
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- }
-
- if (currQuadBytes > 0) {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = currQuad;
- }
- Name name = _symbols.findName(quads, qlen);
- if (name == null) {
- name = addName(quads, qlen, currQuadBytes);
- }
- return name;
- }
-
- /*
- /**********************************************************
- /* Internal methods, symbol (name) handling
- /**********************************************************
- */
-
- private final Name findName(int q1, int lastQuadBytes)
- throws JsonParseException
- {
- // Usually we'll find it from the canonical symbol table already
- Name name = _symbols.findName(q1);
- if (name != null) {
- return name;
- }
- // If not, more work. We'll need add stuff to buffer
- _quadBuffer[0] = q1;
- return addName(_quadBuffer, 1, lastQuadBytes);
- }
-
- private final Name findName(int q1, int q2, int lastQuadBytes)
- throws JsonParseException
- {
- // Usually we'll find it from the canonical symbol table already
- Name name = _symbols.findName(q1, q2);
- if (name != null) {
- return name;
- }
- // If not, more work. We'll need add stuff to buffer
- _quadBuffer[0] = q1;
- _quadBuffer[1] = q2;
- return addName(_quadBuffer, 2, lastQuadBytes);
- }
-
- private final Name findName(int[] quads, int qlen, int lastQuad, int lastQuadBytes)
- throws JsonParseException
- {
- if (qlen >= quads.length) {
- _quadBuffer = quads = growArrayBy(quads, quads.length);
- }
- quads[qlen++] = lastQuad;
- Name name = _symbols.findName(quads, qlen);
- if (name == null) {
- return addName(quads, qlen, lastQuadBytes);
- }
- return name;
- }
-
- /**
- * This is the main workhorse method used when we take a symbol
- * table miss. It needs to demultiplex individual bytes, decode
- * multi-byte chars (if any), and then construct Name instance
- * and add it to the symbol table.
- */
- private final Name addName(int[] quads, int qlen, int lastQuadBytes)
- throws JsonParseException
- {
- /* Ok: must decode UTF-8 chars. No other validation is
- * needed, since unescaping has been done earlier as necessary
- * (as well as error reporting for unescaped control chars)
- */
- // 4 bytes per quad, except last one maybe less
- int byteLen = (qlen << 2) - 4 + lastQuadBytes;
-
- /* And last one is not correctly aligned (leading zero bytes instead
- * need to shift a bit, instead of trailing). Only need to shift it
- * for UTF-8 decoding; need revert for storage (since key will not
- * be aligned, to optimize lookup speed)
- */
- int lastQuad;
-
- if (lastQuadBytes < 4) {
- lastQuad = quads[qlen-1];
- // 8/16/24 bit left shift
- quads[qlen-1] = (lastQuad << ((4 - lastQuadBytes) << 3));
- } else {
- lastQuad = 0;
- }
-
- // Need some working space, TextBuffer works well:
- char[] cbuf = _textBuffer.emptyAndGetCurrentSegment();
- int cix = 0;
-
- for (int ix = 0; ix < byteLen; ) {
- int ch = quads[ix >> 2]; // current quad, need to shift+mask
- int byteIx = (ix & 3);
- ch = (ch >> ((3 - byteIx) << 3)) & 0xFF;
- ++ix;
-
- if (ch > 127) { // multi-byte
- int needed;
- if ((ch & 0xE0) == 0xC0) { // 2 bytes (0x0080 - 0x07FF)
- ch &= 0x1F;
- needed = 1;
- } else if ((ch & 0xF0) == 0xE0) { // 3 bytes (0x0800 - 0xFFFF)
- ch &= 0x0F;
- needed = 2;
- } else if ((ch & 0xF8) == 0xF0) { // 4 bytes; double-char with surrogates and all...
- ch &= 0x07;
- needed = 3;
- } else { // 5- and 6-byte chars not valid xml chars
- _reportInvalidInitial(ch);
- needed = ch = 1; // never really gets this far
- }
- if ((ix + needed) > byteLen) {
- _reportInvalidEOF(" in field name");
- }
-
- // Ok, always need at least one more:
- int ch2 = quads[ix >> 2]; // current quad, need to shift+mask
- byteIx = (ix & 3);
- ch2 = (ch2 >> ((3 - byteIx) << 3));
- ++ix;
-
- if ((ch2 & 0xC0) != 0x080) {
- _reportInvalidOther(ch2);
- }
- ch = (ch << 6) | (ch2 & 0x3F);
- if (needed > 1) {
- ch2 = quads[ix >> 2];
- byteIx = (ix & 3);
- ch2 = (ch2 >> ((3 - byteIx) << 3));
- ++ix;
-
- if ((ch2 & 0xC0) != 0x080) {
- _reportInvalidOther(ch2);
- }
- ch = (ch << 6) | (ch2 & 0x3F);
- if (needed > 2) { // 4 bytes? (need surrogates on output)
- ch2 = quads[ix >> 2];
- byteIx = (ix & 3);
- ch2 = (ch2 >> ((3 - byteIx) << 3));
- ++ix;
- if ((ch2 & 0xC0) != 0x080) {
- _reportInvalidOther(ch2 & 0xFF);
- }
- ch = (ch << 6) | (ch2 & 0x3F);
- }
- }
- if (needed > 2) { // surrogate pair? once again, let's output one here, one later on
- ch -= 0x10000; // to normalize it starting with 0x0
- if (cix >= cbuf.length) {
- cbuf = _textBuffer.expandCurrentSegment();
- }
- cbuf[cix++] = (char) (0xD800 + (ch >> 10));
- ch = 0xDC00 | (ch & 0x03FF);
- }
- }
- if (cix >= cbuf.length) {
- cbuf = _textBuffer.expandCurrentSegment();
- }
- cbuf[cix++] = (char) ch;
- }
-
- // Ok. Now we have the character array, and can construct the String
- String baseName = new String(cbuf, 0, cix);
- // And finally, un-align if necessary
- if (lastQuadBytes < 4) {
- quads[qlen-1] = lastQuad;
- }
- return _symbols.addName(baseName, quads, qlen);
- }
-
- /*
- /**********************************************************
- /* Internal methods, String value parsing
- /**********************************************************
- */
-
- @Override
- protected void _finishString() throws IOException
- {
- // First, single tight loop for ASCII content, not split across input buffer boundary:
- int ptr = _inputPtr;
- if (ptr >= _inputEnd) {
- loadMoreGuaranteed();
- ptr = _inputPtr;
- }
- int outPtr = 0;
- char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
- final int[] codes = _icUTF8;
-
- final int max = Math.min(_inputEnd, (ptr + outBuf.length));
- final byte[] inputBuffer = _inputBuffer;
- while (ptr < max) {
- int c = (int) inputBuffer[ptr] & 0xFF;
- if (codes[c] != 0) {
- if (c == INT_QUOTE) {
- _inputPtr = ptr+1;
- _textBuffer.setCurrentLength(outPtr);
- return;
- }
- break;
- }
- ++ptr;
- outBuf[outPtr++] = (char) c;
- }
- _inputPtr = ptr;
- _finishString2(outBuf, outPtr);
- }
-
- private final void _finishString2(char[] outBuf, int outPtr)
- throws IOException
- {
- int c;
-
- // Here we do want to do full decoding, hence:
- final int[] codes = _icUTF8;
- final byte[] inputBuffer = _inputBuffer;
-
- main_loop:
- while (true) {
- // Then the tight ASCII non-funny-char loop:
- ascii_loop:
- while (true) {
- int ptr = _inputPtr;
- if (ptr >= _inputEnd) {
- loadMoreGuaranteed();
- ptr = _inputPtr;
- }
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- final int max = Math.min(_inputEnd, (ptr + (outBuf.length - outPtr)));
- while (ptr < max) {
- c = (int) inputBuffer[ptr++] & 0xFF;
- if (codes[c] != 0) {
- _inputPtr = ptr;
- break ascii_loop;
- }
- outBuf[outPtr++] = (char) c;
- }
- _inputPtr = ptr;
- }
- // Ok: end marker, escape or multi-byte?
- if (c == INT_QUOTE) {
- break main_loop;
- }
-
- switch (codes[c]) {
- case 1: // backslash
- c = _decodeEscaped();
- break;
- case 2: // 2-byte UTF
- c = _decodeUtf8_2(c);
- break;
- case 3: // 3-byte UTF
- if ((_inputEnd - _inputPtr) >= 2) {
- c = _decodeUtf8_3fast(c);
- } else {
- c = _decodeUtf8_3(c);
- }
- break;
- case 4: // 4-byte UTF
- c = _decodeUtf8_4(c);
- // Let's add first part right away:
- outBuf[outPtr++] = (char) (0xD800 | (c >> 10));
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- c = 0xDC00 | (c & 0x3FF);
- // And let the other char output down below
- break;
- default:
- if (c < INT_SPACE) {
- // As per [JACKSON-208], call can now return:
- _throwUnquotedSpace(c, "string value");
- } else {
- // Is this good enough error message?
- _reportInvalidChar(c);
- }
- }
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- // Ok, let's add char to output:
- outBuf[outPtr++] = (char) c;
- }
- _textBuffer.setCurrentLength(outPtr);
- }
-
- /**
- * Method called to skim through rest of unparsed String value,
- * if it is not needed. This can be done bit faster if contents
- * need not be stored for future access.
- */
- protected void _skipString() throws IOException
- {
- _tokenIncomplete = false;
-
- // Need to be fully UTF-8 aware here:
- final int[] codes = _icUTF8;
- final byte[] inputBuffer = _inputBuffer;
-
- main_loop:
- while (true) {
- int c;
-
- ascii_loop:
- while (true) {
- int ptr = _inputPtr;
- int max = _inputEnd;
- if (ptr >= max) {
- loadMoreGuaranteed();
- ptr = _inputPtr;
- max = _inputEnd;
- }
- while (ptr < max) {
- c = (int) inputBuffer[ptr++] & 0xFF;
- if (codes[c] != 0) {
- _inputPtr = ptr;
- break ascii_loop;
- }
- }
- _inputPtr = ptr;
- }
- // Ok: end marker, escape or multi-byte?
- if (c == INT_QUOTE) {
- break main_loop;
- }
-
- switch (codes[c]) {
- case 1: // backslash
- _decodeEscaped();
- break;
- case 2: // 2-byte UTF
- _skipUtf8_2(c);
- break;
- case 3: // 3-byte UTF
- _skipUtf8_3(c);
- break;
- case 4: // 4-byte UTF
- _skipUtf8_4(c);
- break;
- default:
- if (c < INT_SPACE) {
- // As per [JACKSON-208], call can now return:
- _throwUnquotedSpace(c, "string value");
- } else {
- // Is this good enough error message?
- _reportInvalidChar(c);
- }
- }
- }
- }
-
- /**
- * Method for handling cases where first non-space character
- * of an expected value token is not legal for standard JSON content.
- */
- protected JsonToken _handleUnexpectedValue(int c)
- throws IOException
- {
- // Most likely an error, unless we are to allow single-quote-strings
- switch (c) {
- case '\'':
- if (isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
- return _handleApos();
- }
- break;
- case 'N':
- _matchToken("NaN", 1);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN("NaN", Double.NaN);
- }
- _reportError("Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- break;
- case 'I':
- _matchToken("Infinity", 1);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN("Infinity", Double.POSITIVE_INFINITY);
- }
- _reportError("Non-standard token 'Infinity': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- break;
- case '+': // note: '-' is taken as number
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOFInValue();
- }
- }
- return _handleInvalidNumberStart(_inputBuffer[_inputPtr++] & 0xFF, false);
- }
- // [Issue#77] Try to decode most likely token
- if (Character.isJavaIdentifierStart(c)) {
- _reportInvalidToken(""+((char) c), "('true', 'false' or 'null')");
- }
- // but if it doesn't look like a token:
- _reportUnexpectedChar(c, "expected a valid value (number, String, array, object, 'true', 'false' or 'null')");
- return null;
- }
-
- protected JsonToken _handleApos()
- throws IOException
- {
- int c = 0;
- // Otherwise almost verbatim copy of _finishString()
- int outPtr = 0;
- char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
-
- // Here we do want to do full decoding, hence:
- final int[] codes = _icUTF8;
- final byte[] inputBuffer = _inputBuffer;
-
- main_loop:
- while (true) {
- // Then the tight ascii non-funny-char loop:
- ascii_loop:
- while (true) {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- int max = _inputEnd;
- {
- int max2 = _inputPtr + (outBuf.length - outPtr);
- if (max2 < max) {
- max = max2;
- }
- }
- while (_inputPtr < max) {
- c = (int) inputBuffer[_inputPtr++] & 0xFF;
- if (c == '\'' || codes[c] != 0) {
- break ascii_loop;
- }
- outBuf[outPtr++] = (char) c;
- }
- }
-
- // Ok: end marker, escape or multi-byte?
- if (c == '\'') {
- break main_loop;
- }
-
- switch (codes[c]) {
- case 1: // backslash
- if (c != '\'') { // marked as special, isn't here
- c = _decodeEscaped();
- }
- break;
- case 2: // 2-byte UTF
- c = _decodeUtf8_2(c);
- break;
- case 3: // 3-byte UTF
- if ((_inputEnd - _inputPtr) >= 2) {
- c = _decodeUtf8_3fast(c);
- } else {
- c = _decodeUtf8_3(c);
- }
- break;
- case 4: // 4-byte UTF
- c = _decodeUtf8_4(c);
- // Let's add first part right away:
- outBuf[outPtr++] = (char) (0xD800 | (c >> 10));
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- c = 0xDC00 | (c & 0x3FF);
- // And let the other char output down below
- break;
- default:
- if (c < INT_SPACE) {
- _throwUnquotedSpace(c, "string value");
- }
- // Is this good enough error message?
- _reportInvalidChar(c);
- }
- // Need more room?
- if (outPtr >= outBuf.length) {
- outBuf = _textBuffer.finishCurrentSegment();
- outPtr = 0;
- }
- // Ok, let's add char to output:
- outBuf[outPtr++] = (char) c;
- }
- _textBuffer.setCurrentLength(outPtr);
-
- return JsonToken.VALUE_STRING;
- }
-
- /**
- * Method called if expected numeric value (due to leading sign) does not
- * look like a number
- */
- protected JsonToken _handleInvalidNumberStart(int ch, boolean neg)
- throws IOException
- {
- while (ch == 'I') {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOFInValue();
- }
- }
- ch = _inputBuffer[_inputPtr++];
- String match;
- if (ch == 'N') {
- match = neg ? "-INF" :"+INF";
- } else if (ch == 'n') {
- match = neg ? "-Infinity" :"+Infinity";
- } else {
- break;
- }
- _matchToken(match, 3);
- if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) {
- return resetAsNaN(match, neg ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY);
- }
- _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow");
- }
- reportUnexpectedNumberChar(ch, "expected digit (0-9) to follow minus sign, for valid numeric value");
- return null;
- }
-
- protected void _matchToken(String matchStr, int i)
- throws IOException
- {
- final int len = matchStr.length();
-
- do {
- if (((_inputPtr >= _inputEnd) && !loadMore())
- || (_inputBuffer[_inputPtr] != matchStr.charAt(i))) {
- _reportInvalidToken(matchStr.substring(0, i));
- }
- ++_inputPtr;
- } while (++i < len);
-
- // but let's also ensure we either get EOF, or non-alphanum char...
- if (_inputPtr >= _inputEnd && !loadMore()) {
- return;
- }
- int ch = _inputBuffer[_inputPtr] & 0xFF;
- if (ch < '0' || ch == ']' || ch == '}') { // expected/allowed chars
- return;
- }
- // but actually only alphanums are problematic
- char c = (char) _decodeCharForError(ch);
- if (Character.isJavaIdentifierPart(c)) {
- _reportInvalidToken(matchStr.substring(0, i));
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, ws skipping, escape/unescape
- /**********************************************************
- */
-
- private final int _skipWS() throws IOException
- {
- final int[] codes = _icWS;
- while (_inputPtr < _inputEnd || loadMore()) {
- final int i = _inputBuffer[_inputPtr++] & 0xFF;
- switch (codes[i]) {
- case 0: // done!
- return i;
- case 1: // skip
- continue;
- case 2: // 2-byte UTF
- _skipUtf8_2(i);
- break;
- case 3: // 3-byte UTF
- _skipUtf8_3(i);
- break;
- case 4: // 4-byte UTF
- _skipUtf8_4(i);
- break;
- case INT_LF:
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case INT_CR:
- _skipCR();
- break;
- case '/':
- _skipComment();
- break;
- case '#':
- if (!_skipYAMLComment()) {
- return i;
- }
- break;
- default: // e.g. -1
- // Is this good enough error message?
- if (i < 32) {
- _throwInvalidSpace(i);
- }
- _reportInvalidChar(i);
- }
- }
- throw _constructError("Unexpected end-of-input within/between "+_parsingContext.getTypeDesc()+" entries");
- }
-
- private final int _skipWSOrEnd() throws IOException
- {
- final int[] codes = _icWS;
- while ((_inputPtr < _inputEnd) || loadMore()) {
- final int i = _inputBuffer[_inputPtr++] & 0xFF;
- switch (codes[i]) {
- case 0: // done!
- return i;
- case 1: // skip
- continue;
- case 2: // 2-byte UTF
- _skipUtf8_2(i);
- break;
- case 3: // 3-byte UTF
- _skipUtf8_3(i);
- break;
- case 4: // 4-byte UTF
- _skipUtf8_4(i);
- break;
- case INT_LF:
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case INT_CR:
- _skipCR();
- break;
- case '/':
- _skipComment();
- break;
- case '#':
- if (!_skipYAMLComment()) {
- return i;
- }
- break;
- default: // e.g. -1
- _reportInvalidChar(i);
- }
- }
- // We ran out of input...
- _handleEOF();
- return -1;
- }
-
- /**
- * Helper method for matching and skipping a colon character,
- * optionally surrounded by white space
- */
- private final int _skipColon() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- // first fast case: we just got a colon without white space:
- int i = _inputBuffer[_inputPtr++];
- if (i == INT_COLON) {
- if (_inputPtr < _inputEnd) {
- i = _inputBuffer[_inputPtr] & 0xFF;
- if (i > INT_SPACE && i != INT_SLASH) {
- ++_inputPtr;
- return i;
- }
- }
- } else {
- // need to skip potential leading space
- i &= 0xFF;
-
- space_loop:
- while (true) {
- switch (i) {
- case ' ':
- case '\t':
- break;
- case INT_CR:
- _skipCR();
- break;
- case INT_LF:
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case '/':
- _skipComment();
- break;
- default:
- if (i < INT_SPACE) {
- _throwInvalidSpace(i);
- }
- break space_loop;
- }
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- i = _inputBuffer[_inputPtr++] & 0xFF;
- }
- if (i != INT_COLON) {
- _reportUnexpectedChar(i, "was expecting a colon to separate field name and value");
- }
- }
-
- // either way, found colon, skip through trailing WS
- while (_inputPtr < _inputEnd || loadMore()) {
- i = _inputBuffer[_inputPtr++] & 0xFF;
- if (i > INT_SPACE) {
- if (i != INT_SLASH) {
- return i;
- }
- _skipComment();
- } else if (i != INT_SPACE) {
- if (i == INT_LF) {
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- } else if (i == INT_CR) {
- _skipCR();
- } else if (i != INT_TAB) {
- _throwInvalidSpace(i);
- }
- }
- }
- throw _constructError("Unexpected end-of-input within/between "+_parsingContext.getTypeDesc()+" entries");
- }
-
- private final void _skipComment() throws IOException
- {
- if (!isEnabled(Feature.ALLOW_COMMENTS)) {
- _reportUnexpectedChar('/', "maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)");
- }
- // First: check which comment (if either) it is:
- if (_inputPtr >= _inputEnd && !loadMore()) {
- _reportInvalidEOF(" in a comment");
- }
- int c = _inputBuffer[_inputPtr++] & 0xFF;
- if (c == '/') {
- _skipLine();
- } else if (c == '*') {
- _skipCComment();
- } else {
- _reportUnexpectedChar(c, "was expecting either '*' or '/' for a comment");
- }
- }
-
- private final void _skipCComment() throws IOException
- {
- // Need to be UTF-8 aware here to decode content (for skipping)
- final int[] codes = CharTypes.getInputCodeComment();
-
- // Ok: need the matching '*/'
- main_loop:
- while ((_inputPtr < _inputEnd) || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++] & 0xFF;
- int code = codes[i];
- if (code != 0) {
- switch (code) {
- case '*':
- if (_inputPtr >= _inputEnd && !loadMore()) {
- break main_loop;
- }
- if (_inputBuffer[_inputPtr] == INT_SLASH) {
- ++_inputPtr;
- return;
- }
- break;
- case INT_LF:
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- break;
- case INT_CR:
- _skipCR();
- break;
- case 2: // 2-byte UTF
- _skipUtf8_2(i);
- break;
- case 3: // 3-byte UTF
- _skipUtf8_3(i);
- break;
- case 4: // 4-byte UTF
- _skipUtf8_4(i);
- break;
- default: // e.g. -1
- // Is this good enough error message?
- _reportInvalidChar(i);
- }
- }
- }
- _reportInvalidEOF(" in a comment");
- }
-
- private final boolean _skipYAMLComment() throws IOException
- {
- if (!isEnabled(Feature.ALLOW_YAML_COMMENTS)) {
- return false;
- }
- _skipLine();
- return true;
- }
-
- /**
- * Method for skipping contents of an input line; usually for CPP
- * and YAML style comments.
- */
- private final void _skipLine() throws IOException
- {
- // Ok: need to find EOF or linefeed
- final int[] codes = CharTypes.getInputCodeComment();
- while ((_inputPtr < _inputEnd) || loadMore()) {
- int i = (int) _inputBuffer[_inputPtr++] & 0xFF;
- int code = codes[i];
- if (code != 0) {
- switch (code) {
- case INT_LF:
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- return;
- case INT_CR:
- _skipCR();
- return;
- case '*': // nop for these comments
- break;
- case 2: // 2-byte UTF
- _skipUtf8_2(i);
- break;
- case 3: // 3-byte UTF
- _skipUtf8_3(i);
- break;
- case 4: // 4-byte UTF
- _skipUtf8_4(i);
- break;
- default: // e.g. -1
- if (code < 0) {
- // Is this good enough error message?
- _reportInvalidChar(i);
- }
- }
- }
- }
- }
-
- @Override
- protected char _decodeEscaped() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in character escape sequence");
- }
- }
- int c = (int) _inputBuffer[_inputPtr++];
-
- switch ((int) c) {
- // First, ones that are mapped
- case 'b':
- return '\b';
- case 't':
- return '\t';
- case 'n':
- return '\n';
- case 'f':
- return '\f';
- case 'r':
- return '\r';
-
- // And these are to be returned as they are
- case '"':
- case '/':
- case '\\':
- return (char) c;
-
- case 'u': // and finally hex-escaped
- break;
-
- default:
- return _handleUnrecognizedCharacterEscape((char) _decodeCharForError(c));
- }
-
- // Ok, a hex escape. Need 4 characters
- int value = 0;
- for (int i = 0; i < 4; ++i) {
- if (_inputPtr >= _inputEnd) {
- if (!loadMore()) {
- _reportInvalidEOF(" in character escape sequence");
- }
- }
- int ch = (int) _inputBuffer[_inputPtr++];
- int digit = CharTypes.charToHex(ch);
- if (digit < 0) {
- _reportUnexpectedChar(ch, "expected a hex-digit for character escape sequence");
- }
- value = (value << 4) | digit;
- }
- return (char) value;
- }
-
- protected int _decodeCharForError(int firstByte) throws IOException
- {
- int c = (int) firstByte;
- if (c < 0) { // if >= 0, is ascii and fine as is
- int needed;
-
- // Ok; if we end here, we got multi-byte combination
- if ((c & 0xE0) == 0xC0) { // 2 bytes (0x0080 - 0x07FF)
- c &= 0x1F;
- needed = 1;
- } else if ((c & 0xF0) == 0xE0) { // 3 bytes (0x0800 - 0xFFFF)
- c &= 0x0F;
- needed = 2;
- } else if ((c & 0xF8) == 0xF0) {
- // 4 bytes; double-char with surrogates and all...
- c &= 0x07;
- needed = 3;
- } else {
- _reportInvalidInitial(c & 0xFF);
- needed = 1; // never gets here
- }
-
- int d = nextByte();
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF);
- }
- c = (c << 6) | (d & 0x3F);
-
- if (needed > 1) { // needed == 1 means 2 bytes total
- d = nextByte(); // 3rd byte
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF);
- }
- c = (c << 6) | (d & 0x3F);
- if (needed > 2) { // 4 bytes? (need surrogates)
- d = nextByte();
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF);
- }
- c = (c << 6) | (d & 0x3F);
- }
- }
- }
- return c;
- }
-
- /*
- /**********************************************************
- /* Internal methods,UTF8 decoding
- /**********************************************************
- */
-
- private final int _decodeUtf8_2(int c) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- int d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- return ((c & 0x1F) << 6) | (d & 0x3F);
- }
-
- private final int _decodeUtf8_3(int c1) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c1 &= 0x0F;
- int d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- int c = (c1 << 6) | (d & 0x3F);
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- c = (c << 6) | (d & 0x3F);
- return c;
- }
-
- private final int _decodeUtf8_3fast(int c1) throws IOException
- {
- c1 &= 0x0F;
- int d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- int c = (c1 << 6) | (d & 0x3F);
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- c = (c << 6) | (d & 0x3F);
- return c;
- }
-
- /**
- * @return Character value minus 0x10000; this so that caller
- * can readily expand it to actual surrogates
- */
- private final int _decodeUtf8_4(int c) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- int d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- c = ((c & 0x07) << 6) | (d & 0x3F);
-
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- c = (c << 6) | (d & 0x3F);
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
-
- /* note: won't change it to negative here, since caller
- * already knows it'll need a surrogate
- */
- return ((c << 6) | (d & 0x3F)) - 0x10000;
- }
-
- private final void _skipUtf8_2(int c) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c = (int) _inputBuffer[_inputPtr++];
- if ((c & 0xC0) != 0x080) {
- _reportInvalidOther(c & 0xFF, _inputPtr);
- }
- }
-
- /* Alas, can't heavily optimize skipping, since we still have to
- * do validity checks...
- */
- private final void _skipUtf8_3(int c) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- //c &= 0x0F;
- c = (int) _inputBuffer[_inputPtr++];
- if ((c & 0xC0) != 0x080) {
- _reportInvalidOther(c & 0xFF, _inputPtr);
- }
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- c = (int) _inputBuffer[_inputPtr++];
- if ((c & 0xC0) != 0x080) {
- _reportInvalidOther(c & 0xFF, _inputPtr);
- }
- }
-
- private final void _skipUtf8_4(int c) throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- int d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- d = (int) _inputBuffer[_inputPtr++];
- if ((d & 0xC0) != 0x080) {
- _reportInvalidOther(d & 0xFF, _inputPtr);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, input loading
- /**********************************************************
- */
-
- /**
- * We actually need to check the character value here
- * (to see if we have \n following \r).
- */
- protected final void _skipCR() throws IOException
- {
- if (_inputPtr < _inputEnd || loadMore()) {
- if (_inputBuffer[_inputPtr] == BYTE_LF) {
- ++_inputPtr;
- }
- }
- ++_currInputRow;
- _currInputRowStart = _inputPtr;
- }
-
- private int nextByte() throws IOException
- {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- return _inputBuffer[_inputPtr++] & 0xFF;
- }
-
- /*
- /**********************************************************
- /* Internal methods, error reporting
- /**********************************************************
- */
-
- protected void _reportInvalidToken(String matchedPart) throws IOException
- {
- _reportInvalidToken(matchedPart, "'null', 'true', 'false' or NaN");
- }
-
- protected void _reportInvalidToken(String matchedPart, String msg) throws IOException
- {
- StringBuilder sb = new StringBuilder(matchedPart);
-
- /* Let's just try to find what appears to be the token, using
- * regular Java identifier character rules. It's just a heuristic,
- * nothing fancy here (nor fast).
- */
- while (true) {
- if (_inputPtr >= _inputEnd && !loadMore()) {
- break;
- }
- int i = (int) _inputBuffer[_inputPtr++];
- char c = (char) _decodeCharForError(i);
- if (!Character.isJavaIdentifierPart(c)) {
- break;
- }
- sb.append(c);
- }
- _reportError("Unrecognized token '"+sb.toString()+"': was expecting "+msg);
- }
-
- protected void _reportInvalidChar(int c)
- throws JsonParseException
- {
- // Either invalid WS or illegal UTF-8 start char
- if (c < INT_SPACE) {
- _throwInvalidSpace(c);
- }
- _reportInvalidInitial(c);
- }
-
- protected void _reportInvalidInitial(int mask)
- throws JsonParseException
- {
- _reportError("Invalid UTF-8 start byte 0x"+Integer.toHexString(mask));
- }
-
- protected void _reportInvalidOther(int mask)
- throws JsonParseException
- {
- _reportError("Invalid UTF-8 middle byte 0x"+Integer.toHexString(mask));
- }
-
- protected void _reportInvalidOther(int mask, int ptr)
- throws JsonParseException
- {
- _inputPtr = ptr;
- _reportInvalidOther(mask);
- }
-
- public static int[] growArrayBy(int[] arr, int more)
- {
- if (arr == null) {
- return new int[more];
- }
- return ArraysCompat.copyOf(arr, arr.length + more);
- }
-
- /*
- /**********************************************************
- /* Binary access
- /**********************************************************
- */
-
- /**
- * Efficient handling for incremental parsing of base64-encoded
- * textual content.
- */
- @SuppressWarnings("resource")
- protected final byte[] _decodeBase64(Base64Variant b64variant) throws IOException
- {
- ByteArrayBuilder builder = _getByteArrayBuilder();
-
- //main_loop:
- while (true) {
- // first, we'll skip preceding white space, if any
- int ch;
- do {
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = (int) _inputBuffer[_inputPtr++] & 0xFF;
- } while (ch <= INT_SPACE);
- int bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) { // reached the end, fair and square?
- if (ch == INT_QUOTE) {
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 0);
- if (bits < 0) { // white space to skip
- continue;
- }
- }
- int decodedData = bits;
-
- // then second base64 char; can't get padding yet, nor ws
-
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- bits = _decodeBase64Escape(b64variant, ch, 1);
- }
- decodedData = (decodedData << 6) | bits;
-
- // third base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
-
- // First branch: can get padding (-> 1 byte)
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 4;
- builder.append(decodedData);
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 2);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- // Ok, must get padding
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- if (!b64variant.usesPaddingChar(ch)) {
- throw reportInvalidBase64Char(b64variant, ch, 3, "expected padding character '"+b64variant.getPaddingChar()+"'");
- }
- // Got 12 bits, only need 8, need to shift
- decodedData >>= 4;
- builder.append(decodedData);
- continue;
- }
- }
- // Nope, 2 or 3 bytes
- decodedData = (decodedData << 6) | bits;
- // fourth and last base64 char; can be padding, but not ws
- if (_inputPtr >= _inputEnd) {
- loadMoreGuaranteed();
- }
- ch = _inputBuffer[_inputPtr++] & 0xFF;
- bits = b64variant.decodeBase64Char(ch);
- if (bits < 0) {
- if (bits != Base64Variant.BASE64_VALUE_PADDING) {
- // as per [JACKSON-631], could also just be 'missing' padding
- if (ch == '"' && !b64variant.usesPadding()) {
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- return builder.toByteArray();
- }
- bits = _decodeBase64Escape(b64variant, ch, 3);
- }
- if (bits == Base64Variant.BASE64_VALUE_PADDING) {
- /* With padding we only get 2 bytes; but we have
- * to shift it a bit so it is identical to triplet
- * case with partial output.
- * 3 chars gives 3x6 == 18 bits, of which 2 are
- * dummies, need to discard:
- */
- decodedData >>= 2;
- builder.appendTwoBytes(decodedData);
- continue;
- }
- }
- // otherwise, our triplet is now complete
- decodedData = (decodedData << 6) | bits;
- builder.appendThreeBytes(decodedData);
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/WriterBasedJsonGenerator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/WriterBasedJsonGenerator.java
deleted file mode 100644
index 7a6b7a946..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/WriterBasedJsonGenerator.java
+++ /dev/null
@@ -1,1913 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.json;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.*;
-
-/**
- * {@link JsonGenerator} that outputs JSON content using a {@link java.io.Writer}
- * which handles character encoding.
- */
-public final class WriterBasedJsonGenerator
- extends JsonGeneratorImpl
-{
- final protected static int SHORT_WRITE = 32;
-
- final protected static char[] HEX_CHARS = CharTypes.copyHexChars();
-
- /*
- /**********************************************************
- /* Output buffering
- /**********************************************************
- */
-
- final protected Writer _writer;
-
- /**
- * Intermediate buffer in which contents are buffered before
- * being written using {@link #_writer}.
- */
- protected char[] _outputBuffer;
-
- /**
- * Pointer to the first buffered character to output
- */
- protected int _outputHead = 0;
-
- /**
- * Pointer to the position right beyond the last character to output
- * (end marker; may point to position right beyond the end of the buffer)
- */
- protected int _outputTail = 0;
-
- /**
- * End marker of the output buffer; one past the last valid position
- * within the buffer.
- */
- protected int _outputEnd;
-
- /**
- * Short (14 char) temporary buffer allocated if needed, for constructing
- * escape sequences
- */
- protected char[] _entityBuffer;
-
- /**
- * When custom escapes are used, this member variable is used
- * internally to hold a reference to currently used escape
- */
- protected SerializableString _currentEscape;
-
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public WriterBasedJsonGenerator(IOContext ctxt, int features,
- ObjectCodec codec, Writer w)
- {
- super(ctxt, features, codec);
- _writer = w;
- _outputBuffer = ctxt.allocConcatBuffer();
- _outputEnd = _outputBuffer.length;
- }
-
- /*
- /**********************************************************
- /* Overridden configuration methods
- /**********************************************************
- */
-
- @Override
- public Object getOutputTarget() {
- return _writer;
- }
-
- /*
- /**********************************************************
- /* Overridden methods
- /**********************************************************
- */
-
- @Override
- public void writeFieldName(String name) throws IOException, JsonGenerationException
- {
- int status = _writeContext.writeFieldName(name);
- if (status == JsonWriteContext.STATUS_EXPECT_VALUE) {
- _reportError("Can not write a field name, expecting a value");
- }
- _writeFieldName(name, (status == JsonWriteContext.STATUS_OK_AFTER_COMMA));
- }
-
- @Override
- public void writeFieldName(SerializableString name)
- throws IOException, JsonGenerationException
- {
- // Object is a value, need to verify it's allowed
- int status = _writeContext.writeFieldName(name.getValue());
- if (status == JsonWriteContext.STATUS_EXPECT_VALUE) {
- _reportError("Can not write a field name, expecting a value");
- }
- _writeFieldName(name, (status == JsonWriteContext.STATUS_OK_AFTER_COMMA));
- }
-
- /*
- /**********************************************************
- /* Output method implementations, structural
- /**********************************************************
- */
-
- @Override
- public void writeStartArray() throws IOException, JsonGenerationException
- {
- _verifyValueWrite("start an array");
- _writeContext = _writeContext.createChildArrayContext();
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeStartArray(this);
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '[';
- }
- }
-
- @Override
- public void writeEndArray() throws IOException, JsonGenerationException
- {
- if (!_writeContext.inArray()) {
- _reportError("Current context not an ARRAY but "+_writeContext.getTypeDesc());
- }
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeEndArray(this, _writeContext.getEntryCount());
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = ']';
- }
- _writeContext = _writeContext.getParent();
- }
-
- @Override
- public void writeStartObject() throws IOException, JsonGenerationException
- {
- _verifyValueWrite("start an object");
- _writeContext = _writeContext.createChildObjectContext();
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeStartObject(this);
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '{';
- }
- }
-
- @Override
- public void writeEndObject() throws IOException, JsonGenerationException
- {
- if (!_writeContext.inObject()) {
- _reportError("Current context not an object but "+_writeContext.getTypeDesc());
- }
- if (_cfgPrettyPrinter != null) {
- _cfgPrettyPrinter.writeEndObject(this, _writeContext.getEntryCount());
- } else {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '}';
- }
- _writeContext = _writeContext.getParent();
- }
-
- protected void _writeFieldName(String name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (_cfgPrettyPrinter != null) {
- _writePPFieldName(name, commaBefore);
- return;
- }
- // for fast+std case, need to output up to 2 chars, comma, dquote
- if ((_outputTail + 1) >= _outputEnd) {
- _flushBuffer();
- }
- if (commaBefore) {
- _outputBuffer[_outputTail++] = ',';
- }
-
- /* To support [JACKSON-46], we'll do this:
- * (Question: should quoting of spaces (etc) still be enabled?)
- */
- if (!isEnabled(Feature.QUOTE_FIELD_NAMES)) {
- _writeString(name);
- return;
- }
-
- // we know there's room for at least one more char
- _outputBuffer[_outputTail++] = '"';
- // The beef:
- _writeString(name);
- // and closing quotes; need room for one more char:
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- public void _writeFieldName(SerializableString name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (_cfgPrettyPrinter != null) {
- _writePPFieldName(name, commaBefore);
- return;
- }
- // for fast+std case, need to output up to 2 chars, comma, dquote
- if ((_outputTail + 1) >= _outputEnd) {
- _flushBuffer();
- }
- if (commaBefore) {
- _outputBuffer[_outputTail++] = ',';
- }
- /* To support [JACKSON-46], we'll do this:
- * (Question: should quoting of spaces (etc) still be enabled?)
- */
- final char[] quoted = name.asQuotedChars();
- if (!isEnabled(Feature.QUOTE_FIELD_NAMES)) {
- writeRaw(quoted, 0, quoted.length);
- return;
- }
- // we know there's room for at least one more char
- _outputBuffer[_outputTail++] = '"';
- // The beef:
- final int qlen = quoted.length;
- if ((_outputTail + qlen + 1) >= _outputEnd) {
- writeRaw(quoted, 0, qlen);
- // and closing quotes; need room for one more char:
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- } else {
- System.arraycopy(quoted, 0, _outputBuffer, _outputTail, qlen);
- _outputTail += qlen;
- _outputBuffer[_outputTail++] = '"';
- }
- }
-
- /**
- * Specialized version of _writeFieldName
, off-lined
- * to keep the "fast path" as simple (and hopefully fast) as possible.
- */
- protected void _writePPFieldName(String name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (commaBefore) {
- _cfgPrettyPrinter.writeObjectEntrySeparator(this);
- } else {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
-
- if (isEnabled(Feature.QUOTE_FIELD_NAMES)) { // standard
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _writeString(name);
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- } else { // non-standard, omit quotes
- _writeString(name);
- }
- }
-
- protected void _writePPFieldName(SerializableString name, boolean commaBefore)
- throws IOException, JsonGenerationException
- {
- if (commaBefore) {
- _cfgPrettyPrinter.writeObjectEntrySeparator(this);
- } else {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
-
- final char[] quoted = name.asQuotedChars();
- if (isEnabled(Feature.QUOTE_FIELD_NAMES)) { // standard
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- writeRaw(quoted, 0, quoted.length);
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- } else { // non-standard, omit quotes
- writeRaw(quoted, 0, quoted.length);
- }
- }
-
- /*
- /**********************************************************
- /* Output method implementations, textual
- /**********************************************************
- */
-
- @Override
- public void writeString(String text)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (text == null) {
- _writeNull();
- return;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _writeString(text);
- // And finally, closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeString(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _writeString(text, offset, len);
- // And finally, closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeString(SerializableString sstr)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write text value");
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- // Note: copied from writeRaw:
- char[] text = sstr.asQuotedChars();
- final int len = text.length;
- // Only worth buffering if it's a short write?
- if (len < SHORT_WRITE) {
- int room = _outputEnd - _outputTail;
- if (len > room) {
- _flushBuffer();
- }
- System.arraycopy(text, 0, _outputBuffer, _outputTail, len);
- _outputTail += len;
- } else {
- // Otherwise, better just pass through:
- _flushBuffer();
- _writer.write(text, 0, len);
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeRawUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException
- {
- // could add support for buffering if we really want it...
- _reportUnsupportedOperation();
- }
-
- @Override
- public void writeUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException
- {
- // could add support for buffering if we really want it...
- _reportUnsupportedOperation();
- }
-
- /*
- /**********************************************************
- /* Output method implementations, unprocessed ("raw")
- /**********************************************************
- */
-
- @Override
- public void writeRaw(String text)
- throws IOException, JsonGenerationException
- {
- // Nothing to check, can just output as is
- int len = text.length();
- int room = _outputEnd - _outputTail;
-
- if (room == 0) {
- _flushBuffer();
- room = _outputEnd - _outputTail;
- }
- // But would it nicely fit in? If yes, it's easy
- if (room >= len) {
- text.getChars(0, len, _outputBuffer, _outputTail);
- _outputTail += len;
- } else {
- writeRawLong(text);
- }
- }
-
- @Override
- public void writeRaw(String text, int start, int len)
- throws IOException, JsonGenerationException
- {
- // Nothing to check, can just output as is
- int room = _outputEnd - _outputTail;
-
- if (room < len) {
- _flushBuffer();
- room = _outputEnd - _outputTail;
- }
- // But would it nicely fit in? If yes, it's easy
- if (room >= len) {
- text.getChars(start, start+len, _outputBuffer, _outputTail);
- _outputTail += len;
- } else {
- writeRawLong(text.substring(start, start+len));
- }
- }
-
- // @since 2.1
- @Override
- public void writeRaw(SerializableString text) throws IOException, JsonGenerationException {
- writeRaw(text.getValue());
- }
-
- @Override
- public void writeRaw(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- // Only worth buffering if it's a short write?
- if (len < SHORT_WRITE) {
- int room = _outputEnd - _outputTail;
- if (len > room) {
- _flushBuffer();
- }
- System.arraycopy(text, offset, _outputBuffer, _outputTail, len);
- _outputTail += len;
- return;
- }
- // Otherwise, better just pass through:
- _flushBuffer();
- _writer.write(text, offset, len);
- }
-
- @Override
- public void writeRaw(char c)
- throws IOException, JsonGenerationException
- {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = c;
- }
-
- private void writeRawLong(String text)
- throws IOException, JsonGenerationException
- {
- int room = _outputEnd - _outputTail;
- // If not, need to do it by looping
- text.getChars(0, room, _outputBuffer, _outputTail);
- _outputTail += room;
- _flushBuffer();
- int offset = room;
- int len = text.length() - room;
-
- while (len > _outputEnd) {
- int amount = _outputEnd;
- text.getChars(offset, offset+amount, _outputBuffer, 0);
- _outputHead = 0;
- _outputTail = amount;
- _flushBuffer();
- offset += amount;
- len -= amount;
- }
- // And last piece (at most length of buffer)
- text.getChars(offset, offset+len, _outputBuffer, 0);
- _outputHead = 0;
- _outputTail = len;
- }
-
- /*
- /**********************************************************
- /* Output method implementations, base64-encoded binary
- /**********************************************************
- */
-
- @Override
- public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write binary value");
- // Starting quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _writeBinary(b64variant, data, offset, offset+len);
- // and closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public int writeBinary(Base64Variant b64variant,
- InputStream data, int dataLength)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write binary value");
- // Starting quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- byte[] encodingBuffer = _ioContext.allocBase64Buffer();
- int bytes;
- try {
- if (dataLength < 0) { // length unknown
- bytes = _writeBinary(b64variant, data, encodingBuffer);
- } else {
- int missing = _writeBinary(b64variant, data, encodingBuffer, dataLength);
- if (missing > 0) {
- _reportError("Too few bytes available: missing "+missing+" bytes (out of "+dataLength+")");
- }
- bytes = dataLength;
- }
- } finally {
- _ioContext.releaseBase64Buffer(encodingBuffer);
- }
- // and closing quotes
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- return bytes;
- }
-
- /*
- /**********************************************************
- /* Output method implementations, primitive
- /**********************************************************
- */
-
- @Override
- public void writeNumber(short s)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedShort(s);
- return;
- }
- // up to 5 digits and possible minus sign
- if ((_outputTail + 6) >= _outputEnd) {
- _flushBuffer();
- }
- _outputTail = NumberOutput.outputInt(s, _outputBuffer, _outputTail);
- }
-
- private void _writeQuotedShort(short s) throws IOException {
- if ((_outputTail + 8) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _outputTail = NumberOutput.outputInt(s, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeNumber(int i)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedInt(i);
- return;
- }
- // up to 10 digits and possible minus sign
- if ((_outputTail + 11) >= _outputEnd) {
- _flushBuffer();
- }
- _outputTail = NumberOutput.outputInt(i, _outputBuffer, _outputTail);
- }
-
- private void _writeQuotedInt(int i) throws IOException {
- if ((_outputTail + 13) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _outputTail = NumberOutput.outputInt(i, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeNumber(long l)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedLong(l);
- return;
- }
- if ((_outputTail + 21) >= _outputEnd) {
- // up to 20 digits, minus sign
- _flushBuffer();
- }
- _outputTail = NumberOutput.outputLong(l, _outputBuffer, _outputTail);
- }
-
- private void _writeQuotedLong(long l) throws IOException {
- if ((_outputTail + 23) >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- _outputTail = NumberOutput.outputLong(l, _outputBuffer, _outputTail);
- _outputBuffer[_outputTail++] = '"';
- }
-
- // !!! 05-Aug-2008, tatus: Any ways to optimize these?
-
- @Override
- public void writeNumber(BigInteger value)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (value == null) {
- _writeNull();
- } else if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(value);
- } else {
- writeRaw(value.toString());
- }
- }
-
-
- @Override
- public void writeNumber(double d)
- throws IOException, JsonGenerationException
- {
- if (_cfgNumbersAsStrings ||
- // [JACKSON-139]
- (((Double.isNaN(d) || Double.isInfinite(d))
- && isEnabled(Feature.QUOTE_NON_NUMERIC_NUMBERS)))) {
- writeString(String.valueOf(d));
- return;
- }
- // What is the max length for doubles? 40 chars?
- _verifyValueWrite("write number");
- writeRaw(String.valueOf(d));
- }
-
- @Override
- public void writeNumber(float f)
- throws IOException, JsonGenerationException
- {
- if (_cfgNumbersAsStrings ||
- // [JACKSON-139]
- (((Float.isNaN(f) || Float.isInfinite(f))
- && isEnabled(Feature.QUOTE_NON_NUMERIC_NUMBERS)))) {
- writeString(String.valueOf(f));
- return;
- }
- // What is the max length for floats?
- _verifyValueWrite("write number");
- writeRaw(String.valueOf(f));
- }
-
- @Override
- public void writeNumber(BigDecimal value)
- throws IOException, JsonGenerationException
- {
- // Don't really know max length for big decimal, no point checking
- _verifyValueWrite("write number");
- if (value == null) {
- _writeNull();
- } else if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(value);
- } else if (isEnabled(Feature.WRITE_BIGDECIMAL_AS_PLAIN)) {
- writeRaw(value.toPlainString());
- } else {
- writeRaw(value.toString());
- }
- }
-
- @Override
- public void writeNumber(String encodedValue)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write number");
- if (_cfgNumbersAsStrings) {
- _writeQuotedRaw(encodedValue);
- } else {
- writeRaw(encodedValue);
- }
- }
-
- private void _writeQuotedRaw(Object value) throws IOException
- {
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- writeRaw(value.toString());
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '"';
- }
-
- @Override
- public void writeBoolean(boolean state)
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write boolean value");
- if ((_outputTail + 5) >= _outputEnd) {
- _flushBuffer();
- }
- int ptr = _outputTail;
- char[] buf = _outputBuffer;
- if (state) {
- buf[ptr] = 't';
- buf[++ptr] = 'r';
- buf[++ptr] = 'u';
- buf[++ptr] = 'e';
- } else {
- buf[ptr] = 'f';
- buf[++ptr] = 'a';
- buf[++ptr] = 'l';
- buf[++ptr] = 's';
- buf[++ptr] = 'e';
- }
- _outputTail = ptr+1;
- }
-
- @Override
- public void writeNull()
- throws IOException, JsonGenerationException
- {
- _verifyValueWrite("write null value");
- _writeNull();
- }
-
- /*
- /**********************************************************
- /* Implementations for other methods
- /**********************************************************
- */
-
- @Override
- protected void _verifyValueWrite(String typeMsg)
- throws IOException, JsonGenerationException
- {
- int status = _writeContext.writeValue();
- if (status == JsonWriteContext.STATUS_EXPECT_NAME) {
- _reportError("Can not "+typeMsg+", expecting field name");
- }
- if (_cfgPrettyPrinter == null) {
- char c;
- switch (status) {
- case JsonWriteContext.STATUS_OK_AFTER_COMMA:
- c = ',';
- break;
- case JsonWriteContext.STATUS_OK_AFTER_COLON:
- c = ':';
- break;
- case JsonWriteContext.STATUS_OK_AFTER_SPACE: // root-value separator
- if (_rootValueSeparator != null) {
- writeRaw(_rootValueSeparator.getValue());
- }
- return;
- case JsonWriteContext.STATUS_OK_AS_IS:
- default:
- return;
- }
- if (_outputTail >= _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail] = c;
- ++_outputTail;
- return;
- }
- // Otherwise, pretty printer knows what to do...
- _verifyPrettyValueWrite(typeMsg, status);
- }
-
- protected void _verifyPrettyValueWrite(String typeMsg, int status)
- throws IOException, JsonGenerationException
- {
- // If we have a pretty printer, it knows what to do:
- switch (status) {
- case JsonWriteContext.STATUS_OK_AFTER_COMMA: // array
- _cfgPrettyPrinter.writeArrayValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AFTER_COLON:
- _cfgPrettyPrinter.writeObjectFieldValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AFTER_SPACE:
- _cfgPrettyPrinter.writeRootValueSeparator(this);
- break;
- case JsonWriteContext.STATUS_OK_AS_IS:
- // First entry, but of which context?
- if (_writeContext.inArray()) {
- _cfgPrettyPrinter.beforeArrayValues(this);
- } else if (_writeContext.inObject()) {
- _cfgPrettyPrinter.beforeObjectEntries(this);
- }
- break;
- default:
- _throwInternal();
- break;
- }
- }
-
- /*
- /**********************************************************
- /* Low-level output handling
- /**********************************************************
- */
-
- @Override
- public void flush()
- throws IOException
- {
- _flushBuffer();
- if (_writer != null) {
- if (isEnabled(Feature.FLUSH_PASSED_TO_STREAM)) {
- _writer.flush();
- }
- }
- }
-
- @Override
- public void close()
- throws IOException
- {
- super.close();
-
- /* 05-Dec-2008, tatu: To add [JACKSON-27], need to close open
- * scopes.
- */
- // First: let's see that we still have buffers...
- if (_outputBuffer != null
- && isEnabled(Feature.AUTO_CLOSE_JSON_CONTENT)) {
- while (true) {
- JsonStreamContext ctxt = getOutputContext();
- if (ctxt.inArray()) {
- writeEndArray();
- } else if (ctxt.inObject()) {
- writeEndObject();
- } else {
- break;
- }
- }
- }
- _flushBuffer();
-
- /* 25-Nov-2008, tatus: As per [JACKSON-16] we are not to call close()
- * on the underlying Reader, unless we "own" it, or auto-closing
- * feature is enabled.
- * One downside: when using UTF8Writer, underlying buffer(s)
- * may not be properly recycled if we don't close the writer.
- */
- if (_writer != null) {
- if (_ioContext.isResourceManaged() || isEnabled(Feature.AUTO_CLOSE_TARGET)) {
- _writer.close();
- } else if (isEnabled(Feature.FLUSH_PASSED_TO_STREAM)) {
- // If we can't close it, we should at least flush
- _writer.flush();
- }
- }
- // Internal buffer(s) generator has can now be released as well
- _releaseBuffers();
- }
-
- @Override
- protected void _releaseBuffers()
- {
- char[] buf = _outputBuffer;
- if (buf != null) {
- _outputBuffer = null;
- _ioContext.releaseConcatBuffer(buf);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing; text, default
- /**********************************************************
- */
-
- private void _writeString(String text)
- throws IOException, JsonGenerationException
- {
- /* One check first: if String won't fit in the buffer, let's
- * segment writes. No point in extending buffer to huge sizes
- * (like if someone wants to include multi-megabyte base64
- * encoded stuff or such)
- */
- final int len = text.length();
- if (len > _outputEnd) { // Let's reserve space for entity at begin/end
- _writeLongString(text);
- return;
- }
-
- // Ok: we know String will fit in buffer ok
- // But do we need to flush first?
- if ((_outputTail + len) > _outputEnd) {
- _flushBuffer();
- }
- text.getChars(0, len, _outputBuffer, _outputTail);
-
- if (_characterEscapes != null) {
- _writeStringCustom(len);
- } else if (_maximumNonEscapedChar != 0) {
- _writeStringASCII(len, _maximumNonEscapedChar);
- } else {
- _writeString2(len);
- }
- }
-
- private void _writeString2(final int len)
- throws IOException, JsonGenerationException
- {
- // And then we'll need to verify need for escaping etc:
- int end = _outputTail + len;
- final int[] escCodes = _outputEscapes;
- final int escLen = escCodes.length;
-
- output_loop:
- while (_outputTail < end) {
- // Fast loop for chars not needing escaping
- escape_loop:
- while (true) {
- char c = _outputBuffer[_outputTail];
- if (c < escLen && escCodes[c] != 0) {
- break escape_loop;
- }
- if (++_outputTail >= end) {
- break output_loop;
- }
- }
-
- // Ok, bumped into something that needs escaping.
- /* First things first: need to flush the buffer.
- * Inlined, as we don't want to lose tail pointer
- */
- int flushLen = (_outputTail - _outputHead);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, _outputHead, flushLen);
- }
- /* In any case, tail will be the new start, so hopefully
- * we have room now.
- */
- char c = _outputBuffer[_outputTail++];
- _prependOrWriteCharacterEscape(c, escCodes[c]);
- }
- }
-
- /**
- * Method called to write "long strings", strings whose length exceeds
- * output buffer length.
- */
- private void _writeLongString(String text)
- throws IOException, JsonGenerationException
- {
- // First things first: let's flush the buffer to get some more room
- _flushBuffer();
-
- // Then we can write
- final int textLen = text.length();
- int offset = 0;
- do {
- int max = _outputEnd;
- int segmentLen = ((offset + max) > textLen)
- ? (textLen - offset) : max;
- text.getChars(offset, offset+segmentLen, _outputBuffer, 0);
- if (_characterEscapes != null) {
- _writeSegmentCustom(segmentLen);
- } else if (_maximumNonEscapedChar != 0) {
- _writeSegmentASCII(segmentLen, _maximumNonEscapedChar);
- } else {
- _writeSegment(segmentLen);
- }
- offset += segmentLen;
- } while (offset < textLen);
- }
-
- /**
- * Method called to output textual context which has been copied
- * to the output buffer prior to call. If any escaping is needed,
- * it will also be handled by the method.
- *
- * Note: when called, textual content to write is within output
- * buffer, right after buffered content (if any). That's why only
- * length of that text is passed, as buffer and offset are implied.
- */
- private void _writeSegment(int end)
- throws IOException, JsonGenerationException
- {
- final int[] escCodes = _outputEscapes;
- final int escLen = escCodes.length;
-
- int ptr = 0;
- int start = ptr;
-
- output_loop:
- while (ptr < end) {
- // Fast loop for chars not needing escaping
- char c;
- while (true) {
- c = _outputBuffer[ptr];
- if (c < escLen && escCodes[c] != 0) {
- break;
- }
- if (++ptr >= end) {
- break;
- }
- }
-
- // Ok, bumped into something that needs escaping.
- /* First things first: need to flush the buffer.
- * Inlined, as we don't want to lose tail pointer
- */
- int flushLen = (ptr - start);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, start, flushLen);
- if (ptr >= end) {
- break output_loop;
- }
- }
- ++ptr;
- // So; either try to prepend (most likely), or write directly:
- start = _prependOrWriteCharacterEscape(_outputBuffer, ptr, end, c, escCodes[c]);
- }
- }
-
- /**
- * This method called when the string content is already in
- * a char buffer, and need not be copied for processing.
- */
- private void _writeString(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- if (_characterEscapes != null) {
- _writeStringCustom(text, offset, len);
- return;
- }
- if (_maximumNonEscapedChar != 0) {
- _writeStringASCII(text, offset, len, _maximumNonEscapedChar);
- return;
- }
-
- /* Let's just find longest spans of non-escapable
- * content, and for each see if it makes sense
- * to copy them, or write through
- */
- len += offset; // -> len marks the end from now on
- final int[] escCodes = _outputEscapes;
- final int escLen = escCodes.length;
- while (offset < len) {
- int start = offset;
-
- while (true) {
- char c = text[offset];
- if (c < escLen && escCodes[c] != 0) {
- break;
- }
- if (++offset >= len) {
- break;
- }
- }
-
- // Short span? Better just copy it to buffer first:
- int newAmount = offset - start;
- if (newAmount < SHORT_WRITE) {
- // Note: let's reserve room for escaped char (up to 6 chars)
- if ((_outputTail + newAmount) > _outputEnd) {
- _flushBuffer();
- }
- if (newAmount > 0) {
- System.arraycopy(text, start, _outputBuffer, _outputTail, newAmount);
- _outputTail += newAmount;
- }
- } else { // Nope: better just write through
- _flushBuffer();
- _writer.write(text, start, newAmount);
- }
- // Was this the end?
- if (offset >= len) { // yup
- break;
- }
- // Nope, need to escape the char.
- char c = text[offset++];
- _appendCharacterEscape(c, escCodes[c]);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, text segment
- /* with additional escaping (ASCII or such)
- /**********************************************************
- */
-
- /* Same as "_writeString2()", except needs additional escaping
- * for subset of characters
- */
- private void _writeStringASCII(final int len, final int maxNonEscaped)
- throws IOException, JsonGenerationException
- {
- // And then we'll need to verify need for escaping etc:
- int end = _outputTail + len;
- final int[] escCodes = _outputEscapes;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
- int escCode = 0;
-
- output_loop:
- while (_outputTail < end) {
- char c;
- // Fast loop for chars not needing escaping
- escape_loop:
- while (true) {
- c = _outputBuffer[_outputTail];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break escape_loop;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break escape_loop;
- }
- if (++_outputTail >= end) {
- break output_loop;
- }
- }
- int flushLen = (_outputTail - _outputHead);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, _outputHead, flushLen);
- }
- ++_outputTail;
- _prependOrWriteCharacterEscape(c, escCode);
- }
- }
-
- private void _writeSegmentASCII(int end, final int maxNonEscaped)
- throws IOException, JsonGenerationException
- {
- final int[] escCodes = _outputEscapes;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
-
- int ptr = 0;
- int escCode = 0;
- int start = ptr;
-
- output_loop:
- while (ptr < end) {
- // Fast loop for chars not needing escaping
- char c;
- while (true) {
- c = _outputBuffer[ptr];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break;
- }
- if (++ptr >= end) {
- break;
- }
- }
- int flushLen = (ptr - start);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, start, flushLen);
- if (ptr >= end) {
- break output_loop;
- }
- }
- ++ptr;
- start = _prependOrWriteCharacterEscape(_outputBuffer, ptr, end, c, escCode);
- }
- }
-
- private void _writeStringASCII(char[] text, int offset, int len,
- final int maxNonEscaped)
- throws IOException, JsonGenerationException
- {
- len += offset; // -> len marks the end from now on
- final int[] escCodes = _outputEscapes;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
-
- int escCode = 0;
-
- while (offset < len) {
- int start = offset;
- char c;
-
- while (true) {
- c = text[offset];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break;
- }
- if (++offset >= len) {
- break;
- }
- }
-
- // Short span? Better just copy it to buffer first:
- int newAmount = offset - start;
- if (newAmount < SHORT_WRITE) {
- // Note: let's reserve room for escaped char (up to 6 chars)
- if ((_outputTail + newAmount) > _outputEnd) {
- _flushBuffer();
- }
- if (newAmount > 0) {
- System.arraycopy(text, start, _outputBuffer, _outputTail, newAmount);
- _outputTail += newAmount;
- }
- } else { // Nope: better just write through
- _flushBuffer();
- _writer.write(text, start, newAmount);
- }
- // Was this the end?
- if (offset >= len) { // yup
- break;
- }
- // Nope, need to escape the char.
- ++offset;
- _appendCharacterEscape(c, escCode);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, text segment
- /* with custom escaping (possibly coupling with ASCII limits)
- /**********************************************************
- */
-
- /* Same as "_writeString2()", except needs additional escaping
- * for subset of characters
- */
- private void _writeStringCustom(final int len)
- throws IOException, JsonGenerationException
- {
- // And then we'll need to verify need for escaping etc:
- int end = _outputTail + len;
- final int[] escCodes = _outputEscapes;
- final int maxNonEscaped = (_maximumNonEscapedChar < 1) ? 0xFFFF : _maximumNonEscapedChar;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
- int escCode = 0;
- final CharacterEscapes customEscapes = _characterEscapes;
-
- output_loop:
- while (_outputTail < end) {
- char c;
- // Fast loop for chars not needing escaping
- escape_loop:
- while (true) {
- c = _outputBuffer[_outputTail];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break escape_loop;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break escape_loop;
- } else {
- if ((_currentEscape = customEscapes.getEscapeSequence(c)) != null) {
- escCode = CharacterEscapes.ESCAPE_CUSTOM;
- break escape_loop;
- }
- }
- if (++_outputTail >= end) {
- break output_loop;
- }
- }
- int flushLen = (_outputTail - _outputHead);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, _outputHead, flushLen);
- }
- ++_outputTail;
- _prependOrWriteCharacterEscape(c, escCode);
- }
- }
-
- private void _writeSegmentCustom(int end)
- throws IOException, JsonGenerationException
- {
- final int[] escCodes = _outputEscapes;
- final int maxNonEscaped = (_maximumNonEscapedChar < 1) ? 0xFFFF : _maximumNonEscapedChar;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
- final CharacterEscapes customEscapes = _characterEscapes;
-
- int ptr = 0;
- int escCode = 0;
- int start = ptr;
-
- output_loop:
- while (ptr < end) {
- // Fast loop for chars not needing escaping
- char c;
- while (true) {
- c = _outputBuffer[ptr];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break;
- } else {
- if ((_currentEscape = customEscapes.getEscapeSequence(c)) != null) {
- escCode = CharacterEscapes.ESCAPE_CUSTOM;
- break;
- }
- }
- if (++ptr >= end) {
- break;
- }
- }
- int flushLen = (ptr - start);
- if (flushLen > 0) {
- _writer.write(_outputBuffer, start, flushLen);
- if (ptr >= end) {
- break output_loop;
- }
- }
- ++ptr;
- start = _prependOrWriteCharacterEscape(_outputBuffer, ptr, end, c, escCode);
- }
- }
-
- private void _writeStringCustom(char[] text, int offset, int len)
- throws IOException, JsonGenerationException
- {
- len += offset; // -> len marks the end from now on
- final int[] escCodes = _outputEscapes;
- final int maxNonEscaped = (_maximumNonEscapedChar < 1) ? 0xFFFF : _maximumNonEscapedChar;
- final int escLimit = Math.min(escCodes.length, maxNonEscaped+1);
- final CharacterEscapes customEscapes = _characterEscapes;
-
- int escCode = 0;
-
- while (offset < len) {
- int start = offset;
- char c;
-
- while (true) {
- c = text[offset];
- if (c < escLimit) {
- escCode = escCodes[c];
- if (escCode != 0) {
- break;
- }
- } else if (c > maxNonEscaped) {
- escCode = CharacterEscapes.ESCAPE_STANDARD;
- break;
- } else {
- if ((_currentEscape = customEscapes.getEscapeSequence(c)) != null) {
- escCode = CharacterEscapes.ESCAPE_CUSTOM;
- break;
- }
- }
- if (++offset >= len) {
- break;
- }
- }
-
- // Short span? Better just copy it to buffer first:
- int newAmount = offset - start;
- if (newAmount < SHORT_WRITE) {
- // Note: let's reserve room for escaped char (up to 6 chars)
- if ((_outputTail + newAmount) > _outputEnd) {
- _flushBuffer();
- }
- if (newAmount > 0) {
- System.arraycopy(text, start, _outputBuffer, _outputTail, newAmount);
- _outputTail += newAmount;
- }
- } else { // Nope: better just write through
- _flushBuffer();
- _writer.write(text, start, newAmount);
- }
- // Was this the end?
- if (offset >= len) { // yup
- break;
- }
- // Nope, need to escape the char.
- ++offset;
- _appendCharacterEscape(c, escCode);
- }
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing; binary
- /**********************************************************
- */
-
- protected void _writeBinary(Base64Variant b64variant, byte[] input, int inputPtr, final int inputEnd)
- throws IOException, JsonGenerationException
- {
- // Encoding is by chunks of 3 input, 4 output chars, so:
- int safeInputEnd = inputEnd - 3;
- // Let's also reserve room for possible (and quoted) lf char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- // Ok, first we loop through all full triplets of data:
- while (inputPtr <= safeInputEnd) {
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- // First, mash 3 bytes into lsb of 32-bit int
- int b24 = ((int) input[inputPtr++]) << 8;
- b24 |= ((int) input[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) input[inputPtr++]) & 0xFF);
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- // note: must quote in JSON value
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- int inputLeft = inputEnd - inputPtr; // 0, 1 or 2
- if (inputLeft > 0) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) input[inputPtr++]) << 16;
- if (inputLeft == 2) {
- b24 |= (((int) input[inputPtr++]) & 0xFF) << 8;
- }
- _outputTail = b64variant.encodeBase64Partial(b24, inputLeft, _outputBuffer, _outputTail);
- }
- }
-
- // write-method called when length is definitely known
- protected int _writeBinary(Base64Variant b64variant,
- InputStream data, byte[] readBuffer, int bytesLeft)
- throws IOException, JsonGenerationException
- {
- int inputPtr = 0;
- int inputEnd = 0;
- int lastFullOffset = -3;
-
- // Let's also reserve room for possible (and quoted) lf char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- while (bytesLeft > 2) { // main loop for full triplets
- if (inputPtr > lastFullOffset) {
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, bytesLeft);
- inputPtr = 0;
- if (inputEnd < 3) { // required to try to read to have at least 3 bytes
- break;
- }
- lastFullOffset = inputEnd-3;
- }
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 8;
- b24 |= ((int) readBuffer[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) readBuffer[inputPtr++]) & 0xFF);
- bytesLeft -= 3;
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- if (bytesLeft > 0) {
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, bytesLeft);
- inputPtr = 0;
- if (inputEnd > 0) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 16;
- int amount;
- if (inputPtr < inputEnd) {
- b24 |= (((int) readBuffer[inputPtr]) & 0xFF) << 8;
- amount = 2;
- } else {
- amount = 1;
- }
- _outputTail = b64variant.encodeBase64Partial(b24, amount, _outputBuffer, _outputTail);
- bytesLeft -= amount;
- }
- }
- return bytesLeft;
- }
-
- // write method when length is unknown
- protected int _writeBinary(Base64Variant b64variant,
- InputStream data, byte[] readBuffer)
- throws IOException, JsonGenerationException
- {
- int inputPtr = 0;
- int inputEnd = 0;
- int lastFullOffset = -3;
- int bytesDone = 0;
-
- // Let's also reserve room for possible (and quoted) LF char each round
- int safeOutputEnd = _outputEnd - 6;
- int chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
-
- // Ok, first we loop through all full triplets of data:
- while (true) {
- if (inputPtr > lastFullOffset) { // need to load more
- inputEnd = _readMore(data, readBuffer, inputPtr, inputEnd, readBuffer.length);
- inputPtr = 0;
- if (inputEnd < 3) { // required to try to read to have at least 3 bytes
- break;
- }
- lastFullOffset = inputEnd-3;
- }
- if (_outputTail > safeOutputEnd) { // need to flush
- _flushBuffer();
- }
- // First, mash 3 bytes into lsb of 32-bit int
- int b24 = ((int) readBuffer[inputPtr++]) << 8;
- b24 |= ((int) readBuffer[inputPtr++]) & 0xFF;
- b24 = (b24 << 8) | (((int) readBuffer[inputPtr++]) & 0xFF);
- bytesDone += 3;
- _outputTail = b64variant.encodeBase64Chunk(b24, _outputBuffer, _outputTail);
- if (--chunksBeforeLF <= 0) {
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = 'n';
- chunksBeforeLF = b64variant.getMaxLineLength() >> 2;
- }
- }
-
- // And then we may have 1 or 2 leftover bytes to encode
- if (inputPtr < inputEnd) { // yes, but do we have room for output?
- if (_outputTail > safeOutputEnd) { // don't really need 6 bytes but...
- _flushBuffer();
- }
- int b24 = ((int) readBuffer[inputPtr++]) << 16;
- int amount = 1;
- if (inputPtr < inputEnd) {
- b24 |= (((int) readBuffer[inputPtr]) & 0xFF) << 8;
- amount = 2;
- }
- bytesDone += amount;
- _outputTail = b64variant.encodeBase64Partial(b24, amount, _outputBuffer, _outputTail);
- }
- return bytesDone;
- }
-
- private int _readMore(InputStream in,
- byte[] readBuffer, int inputPtr, int inputEnd,
- int maxRead) throws IOException
- {
- // anything to shift to front?
- int i = 0;
- while (inputPtr < inputEnd) {
- readBuffer[i++] = readBuffer[inputPtr++];
- }
- inputPtr = 0;
- inputEnd = i;
- maxRead = Math.min(maxRead, readBuffer.length);
-
- do {
- int length = maxRead - inputEnd;
- if (length == 0) {
- break;
- }
- int count = in.read(readBuffer, inputEnd, length);
- if (count < 0) {
- return inputEnd;
- }
- inputEnd += count;
- } while (inputEnd < 3);
- return inputEnd;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, other
- /**********************************************************
- */
-
- private void _writeNull() throws IOException
- {
- if ((_outputTail + 4) >= _outputEnd) {
- _flushBuffer();
- }
- int ptr = _outputTail;
- char[] buf = _outputBuffer;
- buf[ptr] = 'n';
- buf[++ptr] = 'u';
- buf[++ptr] = 'l';
- buf[++ptr] = 'l';
- _outputTail = ptr+1;
- }
-
- /*
- /**********************************************************
- /* Internal methods, low-level writing, escapes
- /**********************************************************
- */
-
- /**
- * Method called to try to either prepend character escape at front of
- * given buffer; or if not possible, to write it out directly.
- * Uses head and tail pointers (and updates as necessary)
- */
- private void _prependOrWriteCharacterEscape(char ch, int escCode)
- throws IOException, JsonGenerationException
- {
- if (escCode >= 0) { // \\N (2 char)
- if (_outputTail >= 2) { // fits, just prepend
- int ptr = _outputTail - 2;
- _outputHead = ptr;
- _outputBuffer[ptr++] = '\\';
- _outputBuffer[ptr] = (char) escCode;
- return;
- }
- // won't fit, write
- char[] buf = _entityBuffer;
- if (buf == null) {
- buf = _allocateEntityBuffer();
- }
- _outputHead = _outputTail;
- buf[1] = (char) escCode;
- _writer.write(buf, 0, 2);
- return;
- }
- if (escCode != CharacterEscapes.ESCAPE_CUSTOM) { // std, \\uXXXX
- if (_outputTail >= 6) { // fits, prepend to buffer
- char[] buf = _outputBuffer;
- int ptr = _outputTail - 6;
- _outputHead = ptr;
- buf[ptr] = '\\';
- buf[++ptr] = 'u';
- // We know it's a control char, so only the last 2 chars are non-0
- if (ch > 0xFF) { // beyond 8 bytes
- int hi = (ch >> 8) & 0xFF;
- buf[++ptr] = HEX_CHARS[hi >> 4];
- buf[++ptr] = HEX_CHARS[hi & 0xF];
- ch &= 0xFF;
- } else {
- buf[++ptr] = '0';
- buf[++ptr] = '0';
- }
- buf[++ptr] = HEX_CHARS[ch >> 4];
- buf[++ptr] = HEX_CHARS[ch & 0xF];
- return;
- }
- // won't fit, flush and write
- char[] buf = _entityBuffer;
- if (buf == null) {
- buf = _allocateEntityBuffer();
- }
- _outputHead = _outputTail;
- if (ch > 0xFF) { // beyond 8 bytes
- int hi = (ch >> 8) & 0xFF;
- int lo = ch & 0xFF;
- buf[10] = HEX_CHARS[hi >> 4];
- buf[11] = HEX_CHARS[hi & 0xF];
- buf[12] = HEX_CHARS[lo >> 4];
- buf[13] = HEX_CHARS[lo & 0xF];
- _writer.write(buf, 8, 6);
- } else { // We know it's a control char, so only the last 2 chars are non-0
- buf[6] = HEX_CHARS[ch >> 4];
- buf[7] = HEX_CHARS[ch & 0xF];
- _writer.write(buf, 2, 6);
- }
- return;
- }
- String escape;
-
- if (_currentEscape == null) {
- escape = _characterEscapes.getEscapeSequence(ch).getValue();
- } else {
- escape = _currentEscape.getValue();
- _currentEscape = null;
- }
- int len = escape.length();
- if (_outputTail >= len) { // fits in, prepend
- int ptr = _outputTail - len;
- _outputHead = ptr;
- escape.getChars(0, len, _outputBuffer, ptr);
- return;
- }
- // won't fit, write separately
- _outputHead = _outputTail;
- _writer.write(escape);
- }
-
- /**
- * Method called to try to either prepend character escape at front of
- * given buffer; or if not possible, to write it out directly.
- *
- * @return Pointer to start of prepended entity (if prepended); or 'ptr'
- * if not.
- */
- private int _prependOrWriteCharacterEscape(char[] buffer, int ptr, int end,
- char ch, int escCode)
- throws IOException, JsonGenerationException
- {
- if (escCode >= 0) { // \\N (2 char)
- if (ptr > 1 && ptr < end) { // fits, just prepend
- ptr -= 2;
- buffer[ptr] = '\\';
- buffer[ptr+1] = (char) escCode;
- } else { // won't fit, write
- char[] ent = _entityBuffer;
- if (ent == null) {
- ent = _allocateEntityBuffer();
- }
- ent[1] = (char) escCode;
- _writer.write(ent, 0, 2);
- }
- return ptr;
- }
- if (escCode != CharacterEscapes.ESCAPE_CUSTOM) { // std, \\uXXXX
- if (ptr > 5 && ptr < end) { // fits, prepend to buffer
- ptr -= 6;
- buffer[ptr++] = '\\';
- buffer[ptr++] = 'u';
- // We know it's a control char, so only the last 2 chars are non-0
- if (ch > 0xFF) { // beyond 8 bytes
- int hi = (ch >> 8) & 0xFF;
- buffer[ptr++] = HEX_CHARS[hi >> 4];
- buffer[ptr++] = HEX_CHARS[hi & 0xF];
- ch &= 0xFF;
- } else {
- buffer[ptr++] = '0';
- buffer[ptr++] = '0';
- }
- buffer[ptr++] = HEX_CHARS[ch >> 4];
- buffer[ptr] = HEX_CHARS[ch & 0xF];
- ptr -= 5;
- } else {
- // won't fit, flush and write
- char[] ent = _entityBuffer;
- if (ent == null) {
- ent = _allocateEntityBuffer();
- }
- _outputHead = _outputTail;
- if (ch > 0xFF) { // beyond 8 bytes
- int hi = (ch >> 8) & 0xFF;
- int lo = ch & 0xFF;
- ent[10] = HEX_CHARS[hi >> 4];
- ent[11] = HEX_CHARS[hi & 0xF];
- ent[12] = HEX_CHARS[lo >> 4];
- ent[13] = HEX_CHARS[lo & 0xF];
- _writer.write(ent, 8, 6);
- } else { // We know it's a control char, so only the last 2 chars are non-0
- ent[6] = HEX_CHARS[ch >> 4];
- ent[7] = HEX_CHARS[ch & 0xF];
- _writer.write(ent, 2, 6);
- }
- }
- return ptr;
- }
- String escape;
- if (_currentEscape == null) {
- escape = _characterEscapes.getEscapeSequence(ch).getValue();
- } else {
- escape = _currentEscape.getValue();
- _currentEscape = null;
- }
- int len = escape.length();
- if (ptr >= len && ptr < end) { // fits in, prepend
- ptr -= len;
- escape.getChars(0, len, buffer, ptr);
- } else { // won't fit, write separately
- _writer.write(escape);
- }
- return ptr;
- }
-
- /**
- * Method called to append escape sequence for given character, at the
- * end of standard output buffer; or if not possible, write out directly.
- */
- private void _appendCharacterEscape(char ch, int escCode)
- throws IOException, JsonGenerationException
- {
- if (escCode >= 0) { // \\N (2 char)
- if ((_outputTail + 2) > _outputEnd) {
- _flushBuffer();
- }
- _outputBuffer[_outputTail++] = '\\';
- _outputBuffer[_outputTail++] = (char) escCode;
- return;
- }
- if (escCode != CharacterEscapes.ESCAPE_CUSTOM) { // std, \\uXXXX
- if ((_outputTail + 2) > _outputEnd) {
- _flushBuffer();
- }
- int ptr = _outputTail;
- char[] buf = _outputBuffer;
- buf[ptr++] = '\\';
- buf[ptr++] = 'u';
- // We know it's a control char, so only the last 2 chars are non-0
- if (ch > 0xFF) { // beyond 8 bytes
- int hi = (ch >> 8) & 0xFF;
- buf[ptr++] = HEX_CHARS[hi >> 4];
- buf[ptr++] = HEX_CHARS[hi & 0xF];
- ch &= 0xFF;
- } else {
- buf[ptr++] = '0';
- buf[ptr++] = '0';
- }
- buf[ptr++] = HEX_CHARS[ch >> 4];
- buf[ptr++] = HEX_CHARS[ch & 0xF];
- _outputTail = ptr;
- return;
- }
- String escape;
- if (_currentEscape == null) {
- escape = _characterEscapes.getEscapeSequence(ch).getValue();
- } else {
- escape = _currentEscape.getValue();
- _currentEscape = null;
- }
- int len = escape.length();
- if ((_outputTail + len) > _outputEnd) {
- _flushBuffer();
- if (len > _outputEnd) { // very very long escape; unlikely but theoretically possible
- _writer.write(escape);
- return;
- }
- }
- escape.getChars(0, len, _outputBuffer, _outputTail);
- _outputTail += len;
- }
-
- private char[] _allocateEntityBuffer()
- {
- char[] buf = new char[14];
- // first 2 chars, non-numeric escapes (like \n)
- buf[0] = '\\';
- // next 6; 8-bit escapes (control chars mostly)
- buf[2] = '\\';
- buf[3] = 'u';
- buf[4] = '0';
- buf[5] = '0';
- // last 6, beyond 8 bits
- buf[8] = '\\';
- buf[9] = 'u';
- _entityBuffer = buf;
- return buf;
- }
-
- protected void _flushBuffer() throws IOException
- {
- int len = _outputTail - _outputHead;
- if (len > 0) {
- int offset = _outputHead;
- _outputTail = _outputHead = 0;
- _writer.write(_outputBuffer, offset, len);
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/package-info.java
deleted file mode 100644
index 7c2f5b087..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/json/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * JSON-specific parser and generator implementation classes that
- * Jackson defines and uses.
- * Application code should not (need to) use contents of this package;
- * nor are these implementations likely to be of use for sub-classing.
- */
-package com.fr.third.fasterxml.jackson.core.json;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/package-info.java
deleted file mode 100644
index 5a5497dce..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Main public API classes of the core streaming JSON
- * processor: most importantly {@link com.fr.third.fasterxml.jackson.core.JsonFactory}
- * used for constructing
- * JSON parser ({@link com.fr.third.fasterxml.jackson.core.JsonParser})
- * and generator
- * ({@link com.fr.third.fasterxml.jackson.core.JsonParser})
- * instances.
- *
- * Public API of the higher-level mapping interfaces ("Mapping API")
- * is found from the "jackson-databind" bundle, except for following
- * base interfaces that are defined here:
- *
- *{@link com.fr.third.fasterxml.jackson.core.TreeNode} is included
- *within Streaming API to support integration of the Tree Model
- *(which is based on JsonNode
) with the basic
- *parsers and generators (iff using mapping-supporting factory: which
- *is part of Mapping API, not core)
- *
- *{@link com.fr.third.fasterxml.jackson.core.ObjectCodec} is included so that
- * reference to the object capable of serializing/deserializing
- * Objects to/from JSON (usually, com.fr.third.fasterxml.jackson.databind.ObjectMapper
)
- * can be exposed, without adding direct dependency to implementation.
- *
- *
- */
-
-package com.fr.third.fasterxml.jackson.core;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/BytesToNameCanonicalizer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/BytesToNameCanonicalizer.java
deleted file mode 100644
index 6705563f2..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/BytesToNameCanonicalizer.java
+++ /dev/null
@@ -1,1199 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicReference;
-
-import com.fr.third.fasterxml.jackson.core.util.ArraysCompat;
-import com.fr.third.fasterxml.jackson.core.util.InternCache;
-
-/**
- * A caching symbol table implementation used for canonicalizing JSON field
- * names (as {@link Name}s which are constructed directly from a byte-based
- * input source).
- * Complications arise from trying to do efficient reuse and merging of
- * symbol tables, to be able to make use of usually shared vocabulary
- * of subsequent parsing runs.
- *
- * @author Tatu Saloranta
- */
-public final class BytesToNameCanonicalizer
-{
- protected static final int DEFAULT_TABLE_SIZE = 64;
-
- /**
- * Let's not expand symbol tables past some maximum size;
- * this should protected against OOMEs caused by large documents
- * with unique (~= random) names.
- */
- protected static final int MAX_TABLE_SIZE = 0x10000; // 64k entries == 256k mem
-
- /**
- * Let's only share reasonably sized symbol tables. Max size set to 3/4 of 16k;
- * this corresponds to 64k main hash index. This should allow for enough distinct
- * names for almost any case.
- */
- final static int MAX_ENTRIES_FOR_REUSE = 6000;
-
- /**
- * Also: to thwart attacks based on hash collisions (which may or may not
- * be cheap to calculate), we will need to detect "too long"
- * collision chains. Let's start with static value of 255 entries
- * for the longest legal chain.
- *
- * Note: longest chain we have been able to produce without malicious
- * intent has been 60 (with "com.fr.third.fasterxml.jackson.core.main.TestWithTonsaSymbols");
- * our setting should be reasonable here.
- *
- * @since 2.1
- */
- final static int MAX_COLL_CHAIN_LENGTH = 255;
-
- /**
- * And to support reduce likelihood of accidental collisions causing
- * exceptions, let's prevent reuse of tables with long collision
- * overflow lists as well.
- *
- * @since 2.1
- */
- final static int MAX_COLL_CHAIN_FOR_REUSE = 63;
-
- /**
- * No point in trying to construct tiny tables, just need to resize
- * soon.
- */
- final static int MIN_HASH_SIZE = 16;
-
- /**
- * We will also need to defin
- */
- final static int INITIAL_COLLISION_LEN = 32;
-
- /**
- * Bucket index is 8 bits, and value 0 is reserved to represent
- * 'empty' status.
- */
- final static int LAST_VALID_BUCKET = 0xFE;
-
- /*
- /**********************************************************
- /* Linkage, needed for merging symbol tables
- /**********************************************************
- */
-
- /**
- * Reference to the root symbol table, for child tables, so
- * that they can merge table information back as necessary.
- */
- final protected BytesToNameCanonicalizer _parent;
-
- /**
- * Member that is only used by the root table instance: root
- * passes immutable state into child instances, and children
- * may return new state if they add entries to the table.
- * Child tables do NOT use the reference.
- */
- final protected AtomicReference _tableInfo;
-
- /**
- * Seed value we use as the base to make hash codes non-static between
- * different runs, but still stable for lifetime of a single symbol table
- * instance.
- * This is done for security reasons, to avoid potential DoS attack via
- * hash collisions.
- *
- * @since 2.1
- */
- final private int _hashSeed;
-
- /*
- /**********************************************************
- /* Main table state
- /**********************************************************
- */
-
- /**
- * Whether canonical symbol Strings are to be intern()ed before added
- * to the table or not
- */
- protected final boolean _intern;
-
- // // // First, global information
-
- /**
- * Total number of Names in the symbol table;
- * only used for child tables.
- */
- protected int _count;
-
- /**
- * We need to keep track of the longest collision list; this is needed
- * both to indicate problems with attacks and to allow flushing for
- * other cases.
- *
- * @since 2.1
- */
- protected int _longestCollisionList;
-
- // // // Then information regarding primary hash array and its
- // // // matching Name array
-
- /**
- * Mask used to truncate 32-bit hash value to current hash array
- * size; essentially, hash array size - 1 (since hash array sizes
- * are 2^N).
- */
- protected int _mainHashMask;
-
- /**
- * Array of 2^N size, which contains combination
- * of 24-bits of hash (0 to indicate 'empty' slot),
- * and 8-bit collision bucket index (0 to indicate empty
- * collision bucket chain; otherwise subtract one from index)
- */
- protected int[] _mainHash;
-
- /**
- * Array that contains Name
instances matching
- * entries in _mainHash
. Contains nulls for unused
- * entries.
- */
- protected Name[] _mainNames;
-
- // // // Then the collision/spill-over area info
-
- /**
- * Array of heads of collision bucket chains; size dynamically
- */
- protected Bucket[] _collList;
-
- /**
- * Total number of Names in collision buckets (included in
- * _count
along with primary entries)
- */
- protected int _collCount;
-
- /**
- * Index of the first unused collision bucket entry (== size of
- * the used portion of collision list): less than
- * or equal to 0xFF (255), since max number of entries is 255
- * (8-bit, minus 0 used as 'empty' marker)
- */
- protected int _collEnd;
-
- // // // Info regarding pending rehashing...
-
- /**
- * This flag is set if, after adding a new entry, it is deemed
- * that a rehash is warranted if any more entries are to be added.
- */
- private transient boolean _needRehash;
-
- /*
- /**********************************************************
- /* Sharing, versioning
- /**********************************************************
- */
-
- // // // Which of the buffers may be shared (and are copy-on-write)?
-
- /**
- * Flag that indicates whether underlying data structures for
- * the main hash area are shared or not. If they are, then they
- * need to be handled in copy-on-write way, i.e. if they need
- * to be modified, a copy needs to be made first; at this point
- * it will not be shared any more, and can be modified.
- *
- * This flag needs to be checked both when adding new main entries,
- * and when adding new collision list queues (i.e. creating a new
- * collision list head entry)
- */
- private boolean _mainHashShared;
-
- private boolean _mainNamesShared;
-
- /**
- * Flag that indicates whether underlying data structures for
- * the collision list are shared or not. If they are, then they
- * need to be handled in copy-on-write way, i.e. if they need
- * to be modified, a copy needs to be made first; at this point
- * it will not be shared any more, and can be modified.
- *
- * This flag needs to be checked when adding new collision entries.
- */
- private boolean _collListShared;
-
- /*
- /**********************************************************
- /* Life-cycle: constructors
- /**********************************************************
- */
-
- /**
- * Constructor used for creating per-JsonFactory
"root"
- * symbol tables: ones used for merging and sharing common symbols
- *
- * @param hashSize Initial hash area size
- * @param intern Whether Strings contained should be {@link String#intern}ed
- * @param seed Random seed valued used to make it more difficult to cause
- * collisions (used for collision-based DoS attacks).
- */
- private BytesToNameCanonicalizer(int hashSize, boolean intern, int seed)
- {
- _parent = null;
- _hashSeed = seed;
- _intern = intern;
- // Sanity check: let's now allow hash sizes below certain minimum value
- if (hashSize < MIN_HASH_SIZE) {
- hashSize = MIN_HASH_SIZE;
- } else {
- /* Also; size must be 2^N; otherwise hash algorithm won't
- * work... so let's just pad it up, if so
- */
- if ((hashSize & (hashSize - 1)) != 0) { // only true if it's 2^N
- int curr = MIN_HASH_SIZE;
- while (curr < hashSize) {
- curr += curr;
- }
- hashSize = curr;
- }
- }
- _tableInfo = new AtomicReference(initTableInfo(hashSize));
- }
-
- /**
- * Constructor used when creating a child instance
- */
- private BytesToNameCanonicalizer(BytesToNameCanonicalizer parent, boolean intern, int seed,
- TableInfo state)
- {
- _parent = parent;
- _hashSeed = seed;
- _intern = intern;
- _tableInfo = null; // not used by child tables
-
- // Then copy shared state
- _count = state.count;
- _mainHashMask = state.mainHashMask;
- _mainHash = state.mainHash;
- _mainNames = state.mainNames;
- _collList = state.collList;
- _collCount = state.collCount;
- _collEnd = state.collEnd;
- _longestCollisionList = state.longestCollisionList;
-
- // and then set other state to reflect sharing status
- _needRehash = false;
- _mainHashShared = true;
- _mainNamesShared = true;
- _collListShared = true;
- }
-
- /*
- public TableInfo(int count, int mainHashMask, int[] mainHash, Name[] mainNames,
- Bucket[] collList, int collCount, int collEnd, int longestCollisionList)
- */
- private TableInfo initTableInfo(int hashSize)
- {
- return new TableInfo(0, // count
- hashSize - 1, // mainHashMask
- new int[hashSize], // mainHash
- new Name[hashSize], // mainNames
- null, // collList
- 0, // collCount,
- 0, // collEnd
- 0 // longestCollisionList
- );
- }
-
- /*
- /**********************************************************
- /* Life-cycle: factory methods, merging
- /**********************************************************
- */
-
- /**
- * Factory method to call to create a symbol table instance with a
- * randomized seed value.
- */
- public static BytesToNameCanonicalizer createRoot()
- {
- /* [Issue-21]: Need to use a variable seed, to thwart hash-collision
- * based attacks.
- */
- long now = System.currentTimeMillis();
- // ensure it's not 0; and might as well require to be odd so:
- int seed = (((int) now) + ((int) (now >>> 32))) | 1;
- return createRoot(seed);
- }
-
- /**
- * Factory method that should only be called from unit tests, where seed
- * value should remain the same.
- */
- protected static BytesToNameCanonicalizer createRoot(int hashSeed) {
- return new BytesToNameCanonicalizer(DEFAULT_TABLE_SIZE, true, hashSeed);
- }
-
- /**
- * Factory method used to create actual symbol table instance to
- * use for parsing.
- *
- * @param intern Whether canonical symbol Strings should be interned
- * or not
- */
- public BytesToNameCanonicalizer makeChild(boolean canonicalize,
- boolean intern)
- {
- return new BytesToNameCanonicalizer(this, intern, _hashSeed, _tableInfo.get());
- }
-
- /**
- * Method called by the using code to indicate it is done
- * with this instance. This lets instance merge accumulated
- * changes into parent (if need be), safely and efficiently,
- * and without calling code having to know about parent
- * information
- */
- public void release()
- {
- // we will try to merge if child table has new entries
- if (_parent != null && maybeDirty()) {
- _parent.mergeChild(new TableInfo(this));
- /* Let's also mark this instance as dirty, so that just in
- * case release was too early, there's no corruption of possibly shared data.
- */
- _mainHashShared = true;
- _mainNamesShared = true;
- _collListShared = true;
- }
- }
-
- private void mergeChild(TableInfo childState)
- {
- final int childCount = childState.count;
- TableInfo currState = _tableInfo.get();
-
- // Only makes sense if child actually has more entries
- if (childCount <= currState.count) {
- return;
- }
-
- /* One caveat: let's try to avoid problems with
- * degenerate cases of documents with generated "random"
- * names: for these, symbol tables would bloat indefinitely.
- * One way to do this is to just purge tables if they grow
- * too large, and that's what we'll do here.
- */
- if (childCount > MAX_ENTRIES_FOR_REUSE
- || childState.longestCollisionList > MAX_COLL_CHAIN_FOR_REUSE) {
- /* Should there be a way to get notified about this
- * event, to log it or such? (as it's somewhat abnormal
- * thing to happen)
- */
- // At any rate, need to clean up the tables
- childState = initTableInfo(DEFAULT_TABLE_SIZE);
- }
- _tableInfo.compareAndSet(currState, childState);
- }
-
- /*
- /**********************************************************
- /* API, accessors
- /**********************************************************
- */
-
- public int size()
- {
- if (_tableInfo != null) { // root table
- return _tableInfo.get().count;
- }
- // nope, child table
- return _count;
- }
-
- /**
- * @since 2.1
- */
- public int bucketCount() { return _mainHash.length; }
-
- /**
- * Method called to check to quickly see if a child symbol table
- * may have gotten additional entries. Used for checking to see
- * if a child table should be merged into shared table.
- */
- public boolean maybeDirty() {
- return !_mainHashShared;
- }
-
- /**
- * @since 2.1
- */
- public int hashSeed() { return _hashSeed; }
-
- /**
- * Method mostly needed by unit tests; calculates number of
- * entries that are in collision list. Value can be at most
- * ({@link #size} - 1), but should usually be much lower, ideally 0.
- *
- * @since 2.1
- */
- public int collisionCount() {
- return _collCount;
- }
-
- /**
- * Method mostly needed by unit tests; calculates length of the
- * longest collision chain. This should typically be a low number,
- * but may be up to {@link #size} - 1 in the pathological case
- *
- * @since 2.1
- */
- public int maxCollisionLength() {
- return _longestCollisionList;
- }
-
- /*
- /**********************************************************
- /* Public API, accessing symbols:
- /**********************************************************
- */
-
- public static Name getEmptyName()
- {
- return Name1.getEmptyName();
- }
-
- /**
- * Finds and returns name matching the specified symbol, if such
- * name already exists in the table.
- * If not, will return null.
- *
- * Note: separate methods to optimize common case of
- * short element/attribute names (4 or less ascii characters)
- *
- * @param firstQuad int32 containing first 4 bytes of the name;
- * if the whole name less than 4 bytes, padded with zero bytes
- * in front (zero MSBs, ie. right aligned)
- *
- * @return Name matching the symbol passed (or constructed for
- * it)
- */
- public Name findName(int firstQuad)
- {
- int hash = calcHash(firstQuad);
- int ix = (hash & _mainHashMask);
- int val = _mainHash[ix];
-
- /* High 24 bits of the value are low 24 bits of hash (low 8 bits
- * are bucket index)... match?
- */
- if ((((val >> 8) ^ hash) << 8) == 0) { // match
- // Ok, but do we have an actual match?
- Name name = _mainNames[ix];
- if (name == null) { // main slot empty; can't find
- return null;
- }
- if (name.equals(firstQuad)) {
- return name;
- }
- } else if (val == 0) { // empty slot? no match
- return null;
- }
- // Maybe a spill-over?
- val &= 0xFF;
- if (val > 0) { // 0 means 'empty'
- val -= 1; // to convert from 1-based to 0...
- Bucket bucket = _collList[val];
- if (bucket != null) {
- return bucket.find(hash, firstQuad, 0);
- }
- }
- // Nope, no match whatsoever
- return null;
- }
-
- /**
- * Finds and returns name matching the specified symbol, if such
- * name already exists in the table.
- * If not, will return null.
- *
- * Note: separate methods to optimize common case of relatively
- * short element/attribute names (8 or less ascii characters)
- *
- * @param firstQuad int32 containing first 4 bytes of the name.
- * @param secondQuad int32 containing bytes 5 through 8 of the
- * name; if less than 8 bytes, padded with up to 3 zero bytes
- * in front (zero MSBs, ie. right aligned)
- *
- * @return Name matching the symbol passed (or constructed for it)
- */
- public Name findName(int firstQuad, int secondQuad)
- {
- int hash = (secondQuad == 0) ? calcHash(firstQuad) : calcHash(firstQuad, secondQuad);
- int ix = (hash & _mainHashMask);
- int val = _mainHash[ix];
-
- /* High 24 bits of the value are low 24 bits of hash (low 8 bits
- * are bucket index)... match?
- */
- if ((((val >> 8) ^ hash) << 8) == 0) { // match
- // Ok, but do we have an actual match?
- Name name = _mainNames[ix];
- if (name == null) { // main slot empty; can't find
- return null;
- }
- if (name.equals(firstQuad, secondQuad)) {
- return name;
- }
- } else if (val == 0) { // empty slot? no match
- return null;
- }
- // Maybe a spill-over?
- val &= 0xFF;
- if (val > 0) { // 0 means 'empty'
- val -= 1; // to convert from 1-based to 0...
- Bucket bucket = _collList[val];
- if (bucket != null) {
- return bucket.find(hash, firstQuad, secondQuad);
- }
- }
- // Nope, no match whatsoever
- return null;
- }
-
- /**
- * Finds and returns name matching the specified symbol, if such
- * name already exists in the table; or if not, creates name object,
- * adds to the table, and returns it.
- *
- * Note: this is the general purpose method that can be called for
- * names of any length. However, if name is less than 9 bytes long,
- * it is preferable to call the version optimized for short
- * names.
- *
- * @param quads Array of int32s, each of which contain 4 bytes of
- * encoded name
- * @param qlen Number of int32s, starting from index 0, in quads
- * parameter
- *
- * @return Name matching the symbol passed (or constructed for it)
- */
- public Name findName(int[] quads, int qlen)
- {
- if (qlen < 3) { // another sanity check
- return findName(quads[0], (qlen < 2) ? 0 : quads[1]);
- }
- int hash = calcHash(quads, qlen);
- // (for rest of comments regarding logic, see method above)
- int ix = (hash & _mainHashMask);
- int val = _mainHash[ix];
- if ((((val >> 8) ^ hash) << 8) == 0) {
- Name name = _mainNames[ix];
- if (name == null // main slot empty; no collision list then either
- || name.equals(quads, qlen)) { // should be match, let's verify
- return name;
- }
- } else if (val == 0) { // empty slot? no match
- return null;
- }
- val &= 0xFF;
- if (val > 0) { // 0 means 'empty'
- val -= 1; // to convert from 1-based to 0...
- Bucket bucket = _collList[val];
- if (bucket != null) {
- return bucket.find(hash, quads, qlen);
- }
- }
- return null;
- }
-
- /*
- /**********************************************************
- /* API, mutators
- /**********************************************************
- */
-
- public Name addName(String symbolStr, int q1, int q2)
- {
- if (_intern) {
- symbolStr = InternCache.instance.intern(symbolStr);
- }
- int hash = (q2 == 0) ? calcHash(q1) : calcHash(q1, q2);
- Name symbol = constructName(hash, symbolStr, q1, q2);
- _addSymbol(hash, symbol);
- return symbol;
- }
-
- public Name addName(String symbolStr, int[] quads, int qlen)
- {
- if (_intern) {
- symbolStr = InternCache.instance.intern(symbolStr);
- }
- int hash;
- if (qlen < 3) {
- hash = (qlen == 1) ? calcHash(quads[0]) : calcHash(quads[0], quads[1]);
- } else {
- hash = calcHash(quads, qlen);
- }
- Name symbol = constructName(hash, symbolStr, quads, qlen);
- _addSymbol(hash, symbol);
- return symbol;
- }
-
- /*
- /**********************************************************
- /* Helper methods
- /**********************************************************
- */
-
- /* Note on hash calculation: we try to make it more difficult to
- * generate collisions automatically; part of this is to avoid
- * simple "multiply-add" algorithm (like JDK String.hashCode()),
- * and add bit of shifting. And other part is to make this
- * non-linear, at least for shorter symbols.
- */
-
- // JDK uses 31; other fine choices are 33 and 65599, let's use 33
- // as it seems to give fewest collisions for us
- // (see [http://www.cse.yorku.ca/~oz/hash.html] for details)
- private final static int MULT = 33;
- private final static int MULT2 = 65599;
- private final static int MULT3 = 31;
-
- public int calcHash(int firstQuad)
- {
- int hash = firstQuad ^ _hashSeed;
- hash += (hash >>> 15); // to xor hi- and low- 16-bits
- hash ^= (hash >>> 9); // as well as lowest 2 bytes
- return hash;
- }
-
- public int calcHash(int firstQuad, int secondQuad)
- {
- /* For two quads, let's change algorithm a bit, to spice
- * things up (can do bit more processing anyway)
- */
- int hash = firstQuad;
- hash ^= (hash >>> 15); // try mixing first and second byte pairs first
- hash += (secondQuad * MULT); // then add second quad
- hash ^= _hashSeed;
- hash += (hash >>> 7); // and shuffle some more
- return hash;
- }
-
- public int calcHash(int[] quads, int qlen)
- {
- // Note: may be called for qlen < 3; but has at least one int
- if (qlen < 3) {
- throw new IllegalArgumentException();
- }
-
- /* And then change handling again for "multi-quad" case; mostly
- * to make calculation of collisions less fun. For example,
- * add seed bit later in the game, and switch plus/xor around,
- * use different shift lengths.
- */
- int hash = quads[0] ^ _hashSeed;
- hash += (hash >>> 9);
- hash *= MULT;
- hash += quads[1];
- hash *= MULT2;
- hash += (hash >>> 15);
- hash ^= quads[2];
- hash += (hash >>> 17);
-
- for (int i = 3; i < qlen; ++i) {
- hash = (hash * MULT3) ^ quads[i];
- // for longer entries, mess a bit in-between too
- hash += (hash >>> 3);
- hash ^= (hash << 7);
- }
- // and finally shuffle some more once done
- hash += (hash >>> 15); // to get high-order bits to mix more
- hash ^= (hash << 9); // as well as lowest 2 bytes
- return hash;
- }
-
- // Method only used by unit tests
- protected static int[] calcQuads(byte[] wordBytes)
- {
- int blen = wordBytes.length;
- int[] result = new int[(blen + 3) / 4];
- for (int i = 0; i < blen; ++i) {
- int x = wordBytes[i] & 0xFF;
-
- if (++i < blen) {
- x = (x << 8) | (wordBytes[i] & 0xFF);
- if (++i < blen) {
- x = (x << 8) | (wordBytes[i] & 0xFF);
- if (++i < blen) {
- x = (x << 8) | (wordBytes[i] & 0xFF);
- }
- }
- }
- result[i >> 2] = x;
- }
- return result;
- }
-
- /*
- /**********************************************************
- /* Standard methods
- /**********************************************************
- */
-
- /*
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder();
- sb.append("[BytesToNameCanonicalizer, size: ");
- sb.append(_count);
- sb.append('/');
- sb.append(_mainHash.length);
- sb.append(", ");
- sb.append(_collCount);
- sb.append(" coll; avg length: ");
-
- // Average length: minimum of 1 for all (1 == primary hit);
- // and then 1 per each traversal for collisions/buckets
- //int maxDist = 1;
- int pathCount = _count;
- for (int i = 0; i < _collEnd; ++i) {
- int spillLen = _collList[i].length();
- for (int j = 1; j <= spillLen; ++j) {
- pathCount += j;
- }
- }
- double avgLength;
-
- if (_count == 0) {
- avgLength = 0.0;
- } else {
- avgLength = (double) pathCount / (double) _count;
- }
- // let's round up a bit (two 2 decimal places)
- //avgLength -= (avgLength % 0.01);
-
- sb.append(avgLength);
- sb.append(']');
- return sb.toString();
- }
- */
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private void _addSymbol(int hash, Name symbol)
- {
- if (_mainHashShared) { // always have to modify main entry
- unshareMain();
- }
- // First, do we need to rehash?
- if (_needRehash) {
- rehash();
- }
-
- ++_count;
-
- /* Ok, enough about set up: now we need to find the slot to add
- * symbol in:
- */
- int ix = (hash & _mainHashMask);
- if (_mainNames[ix] == null) { // primary empty?
- _mainHash[ix] = (hash << 8);
- if (_mainNamesShared) {
- unshareNames();
- }
- _mainNames[ix] = symbol;
- } else { // nope, it's a collision, need to spill over
- /* How about spill-over area... do we already know the bucket
- * (is the case if it's not the first collision)
- */
- if (_collListShared) {
- unshareCollision(); // also allocates if list was null
- }
- ++_collCount;
- int entryValue = _mainHash[ix];
- int bucket = entryValue & 0xFF;
- if (bucket == 0) { // first spill over?
- if (_collEnd <= LAST_VALID_BUCKET) { // yup, still unshared bucket
- bucket = _collEnd;
- ++_collEnd;
- // need to expand?
- if (bucket >= _collList.length) {
- expandCollision();
- }
- } else { // nope, have to share... let's find shortest?
- bucket = findBestBucket();
- }
- // Need to mark the entry... and the spill index is 1-based
- _mainHash[ix] = (entryValue & ~0xFF) | (bucket + 1);
- } else {
- --bucket; // 1-based index in value
- }
-
- // And then just need to link the new bucket entry in
- Bucket newB = new Bucket(symbol, _collList[bucket]);
- _collList[bucket] = newB;
- // but, be careful wrt attacks
- _longestCollisionList = Math.max(newB.length(), _longestCollisionList);
- if (_longestCollisionList > MAX_COLL_CHAIN_LENGTH) {
- reportTooManyCollisions(MAX_COLL_CHAIN_LENGTH);
- }
- }
-
- /* Ok. Now, do we need a rehash next time? Need to have at least
- * 50% fill rate no matter what:
- */
- {
- int hashSize = _mainHash.length;
- if (_count > (hashSize >> 1)) {
- int hashQuarter = (hashSize >> 2);
- /* And either strictly above 75% (the usual) or
- * just 50%, and collision count >= 25% of total hash size
- */
- if (_count > (hashSize - hashQuarter)) {
- _needRehash = true;
- } else if (_collCount >= hashQuarter) {
- _needRehash = true;
- }
- }
- }
- }
-
- private void rehash()
- {
- _needRehash = false;
- // Note: since we'll make copies, no need to unshare, can just mark as such:
- _mainNamesShared = false;
-
- /* And then we can first deal with the main hash area. Since we
- * are expanding linearly (double up), we know there'll be no
- * collisions during this phase.
- */
- int[] oldMainHash = _mainHash;
- int len = oldMainHash.length;
- int newLen = len+len;
-
- /* 13-Mar-2010, tatu: Let's guard against OOME that could be caused by
- * large documents with unique (or mostly so) names
- */
- if (newLen > MAX_TABLE_SIZE) {
- nukeSymbols();
- return;
- }
-
- _mainHash = new int[newLen];
- _mainHashMask = (newLen - 1);
- Name[] oldNames = _mainNames;
- _mainNames = new Name[newLen];
- int symbolsSeen = 0; // let's do a sanity check
- for (int i = 0; i < len; ++i) {
- Name symbol = oldNames[i];
- if (symbol != null) {
- ++symbolsSeen;
- int hash = symbol.hashCode();
- int ix = (hash & _mainHashMask);
- _mainNames[ix] = symbol;
- _mainHash[ix] = hash << 8; // will clear spill index
- }
- }
-
- /* And then the spill area. This may cause collisions, although
- * not necessarily as many as there were earlier. Let's allocate
- * same amount of space, however
- */
- int oldEnd = _collEnd;
- if (oldEnd == 0) { // no prior collisions...
- _longestCollisionList = 0;
- return;
- }
-
- _collCount = 0;
- _collEnd = 0;
- _collListShared = false;
-
- int maxColl = 0;
-
- Bucket[] oldBuckets = _collList;
- _collList = new Bucket[oldBuckets.length];
- for (int i = 0; i < oldEnd; ++i) {
- for (Bucket curr = oldBuckets[i]; curr != null; curr = curr._next) {
- ++symbolsSeen;
- Name symbol = curr._name;
- int hash = symbol.hashCode();
- int ix = (hash & _mainHashMask);
- int val = _mainHash[ix];
- if (_mainNames[ix] == null) { // no primary entry?
- _mainHash[ix] = (hash << 8);
- _mainNames[ix] = symbol;
- } else { // nope, it's a collision, need to spill over
- ++_collCount;
- int bucket = val & 0xFF;
- if (bucket == 0) { // first spill over?
- if (_collEnd <= LAST_VALID_BUCKET) { // yup, still unshared bucket
- bucket = _collEnd;
- ++_collEnd;
- // need to expand?
- if (bucket >= _collList.length) {
- expandCollision();
- }
- } else { // nope, have to share... let's find shortest?
- bucket = findBestBucket();
- }
- // Need to mark the entry... and the spill index is 1-based
- _mainHash[ix] = (val & ~0xFF) | (bucket + 1);
- } else {
- --bucket; // 1-based index in value
- }
- // And then just need to link the new bucket entry in
- Bucket newB = new Bucket(symbol, _collList[bucket]);
- _collList[bucket] = newB;
- maxColl = Math.max(maxColl, newB.length());
- }
- } // for (... buckets in the chain ...)
- } // for (... list of bucket heads ... )
-
- _longestCollisionList = maxColl;
-
- if (symbolsSeen != _count) { // sanity check
- throw new RuntimeException("Internal error: count after rehash "+symbolsSeen+"; should be "+_count);
- }
- }
-
- /**
- * Helper method called to empty all shared symbols, but to leave
- * arrays allocated
- */
- private void nukeSymbols()
- {
- _count = 0;
- _longestCollisionList = 0;
- Arrays.fill(_mainHash, 0);
- Arrays.fill(_mainNames, null);
- Arrays.fill(_collList, null);
- _collCount = 0;
- _collEnd = 0;
- }
-
- /**
- * Method called to find the best bucket to spill a Name over to:
- * usually the first bucket that has only one entry, but in general
- * first one of the buckets with least number of entries
- */
- private int findBestBucket()
- {
- Bucket[] buckets = _collList;
- int bestCount = Integer.MAX_VALUE;
- int bestIx = -1;
-
- for (int i = 0, len = _collEnd; i < len; ++i) {
- int count = buckets[i].length();
- if (count < bestCount) {
- if (count == 1) { // best possible
- return i;
- }
- bestCount = count;
- bestIx = i;
- }
- }
- return bestIx;
- }
-
- /**
- * Method that needs to be called, if the main hash structure
- * is (may be) shared. This happens every time something is added,
- * even if addition is to the collision list (since collision list
- * index comes from lowest 8 bits of the primary hash entry)
- */
- private void unshareMain()
- {
- final int[] old = _mainHash;
- _mainHash = ArraysCompat.copyOf(old, old.length);
- _mainHashShared = false;
- }
-
- private void unshareCollision()
- {
- Bucket[] old = _collList;
- if (old == null) {
- _collList = new Bucket[INITIAL_COLLISION_LEN];
- } else {
- _collList = ArraysCompat.copyOf(old, old.length);
- }
- _collListShared = false;
- }
-
- private void unshareNames()
- {
- final Name[] old = _mainNames;
- _mainNames = ArraysCompat.copyOf(old, old.length);
- _mainNamesShared = false;
- }
-
- private void expandCollision()
- {
- final Bucket[] old = _collList;
- _collList = ArraysCompat.copyOf(old, old.length * 2);
- }
-
- /*
- /**********************************************************
- /* Constructing name objects
- /**********************************************************
- */
-
- private static Name constructName(int hash, String name, int q1, int q2)
- {
- if (q2 == 0) { // one quad only?
- return new Name1(name, hash, q1);
- }
- return new Name2(name, hash, q1, q2);
- }
-
- private static Name constructName(int hash, String name, int[] quads, int qlen)
- {
- if (qlen < 4) { // Need to check for 3 quad one, can do others too
- switch (qlen) {
- case 1:
- return new Name1(name, hash, quads[0]);
- case 2:
- return new Name2(name, hash, quads[0], quads[1]);
- case 3:
- return new Name3(name, hash, quads[0], quads[1], quads[2]);
- default:
- }
- }
- // Otherwise, need to copy the incoming buffer
- int[] buf = new int[qlen];
- for (int i = 0; i < qlen; ++i) {
- buf[i] = quads[i];
- }
- return new NameN(name, hash, buf, qlen);
- }
-
- /*
- /**********************************************************
- /* Other helper methods
- /**********************************************************
- */
-
- /**
- * @since 2.1
- */
- protected void reportTooManyCollisions(int maxLen)
- {
- throw new IllegalStateException("Longest collision chain in symbol table (of size "+_count
- +") now exceeds maximum, "+maxLen+" -- suspect a DoS attack based on hash collisions");
- }
-
- /*
- /**********************************************************
- /* Helper classes
- /**********************************************************
- */
-
- /**
- * Immutable value class used for sharing information as efficiently
- * as possible, by only require synchronization of reference manipulation
- * but not access to contents.
- *
- * @since 2.1
- */
- private final static class TableInfo
- {
- public final int count;
- public final int mainHashMask;
- public final int[] mainHash;
- public final Name[] mainNames;
- public final Bucket[] collList;
- public final int collCount;
- public final int collEnd;
- public final int longestCollisionList;
-
- public TableInfo(int count, int mainHashMask, int[] mainHash, Name[] mainNames,
- Bucket[] collList, int collCount, int collEnd, int longestCollisionList)
- {
- this.count = count;
- this.mainHashMask = mainHashMask;
- this.mainHash = mainHash;
- this.mainNames = mainNames;
- this.collList = collList;
- this.collCount = collCount;
- this.collEnd = collEnd;
- this.longestCollisionList = longestCollisionList;
- }
-
- public TableInfo(BytesToNameCanonicalizer src)
- {
- count = src._count;
- mainHashMask = src._mainHashMask;
- mainHash = src._mainHash;
- mainNames = src._mainNames;
- collList = src._collList;
- collCount = src._collCount;
- collEnd = src._collEnd;
- longestCollisionList = src._longestCollisionList;
- }
-
- }
-
- /**
- *
- */
- final static class Bucket
- {
- protected final Name _name;
- protected final Bucket _next;
- private final int _length;
-
- Bucket(Name name, Bucket next)
- {
- _name = name;
- _next = next;
- _length = (next == null) ? 1 : next._length+1;
- }
-
- public int length() { return _length; }
-
- public Name find(int hash, int firstQuad, int secondQuad)
- {
- if (_name.hashCode() == hash) {
- if (_name.equals(firstQuad, secondQuad)) {
- return _name;
- }
- }
- for (Bucket curr = _next; curr != null; curr = curr._next) {
- Name currName = curr._name;
- if (currName.hashCode() == hash) {
- if (currName.equals(firstQuad, secondQuad)) {
- return currName;
- }
- }
- }
- return null;
- }
-
- public Name find(int hash, int[] quads, int qlen)
- {
- if (_name.hashCode() == hash) {
- if (_name.equals(quads, qlen)) {
- return _name;
- }
- }
- for (Bucket curr = _next; curr != null; curr = curr._next) {
- Name currName = curr._name;
- if (currName.hashCode() == hash) {
- if (currName.equals(quads, qlen)) {
- return currName;
- }
- }
- }
- return null;
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/CharsToNameCanonicalizer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/CharsToNameCanonicalizer.java
deleted file mode 100644
index 65ae8f73a..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/CharsToNameCanonicalizer.java
+++ /dev/null
@@ -1,728 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-import java.util.Arrays;
-
-import com.fr.third.fasterxml.jackson.core.util.ArraysCompat;
-import com.fr.third.fasterxml.jackson.core.util.InternCache;
-
-/**
- * This class is a kind of specialized type-safe Map, from char array to
- * String value. Specialization means that in addition to type-safety
- * and specific access patterns (key char array, Value optionally interned
- * String; values added on access if necessary), and that instances are
- * meant to be used concurrently, but by using well-defined mechanisms
- * to obtain such concurrently usable instances. Main use for the class
- * is to store symbol table information for things like compilers and
- * parsers; especially when number of symbols (keywords) is limited.
- *
- * For optimal performance, usage pattern should be one where matches
- * should be very common (especially after "warm-up"), and as with most hash-based
- * maps/sets, that hash codes are uniformly distributed. Also, collisions
- * are slightly more expensive than with HashMap or HashSet, since hash codes
- * are not used in resolving collisions; that is, equals() comparison is
- * done with all symbols in same bucket index.
- * Finally, rehashing is also more expensive, as hash codes are not
- * stored; rehashing requires all entries' hash codes to be recalculated.
- * Reason for not storing hash codes is reduced memory usage, hoping
- * for better memory locality.
- *
- * Usual usage pattern is to create a single "master" instance, and either
- * use that instance in sequential fashion, or to create derived "child"
- * instances, which after use, are asked to return possible symbol additions
- * to master instance. In either case benefit is that symbol table gets
- * initialized so that further uses are more efficient, as eventually all
- * symbols needed will already be in symbol table. At that point no more
- * Symbol String allocations are needed, nor changes to symbol table itself.
- *
- * Note that while individual SymbolTable instances are NOT thread-safe
- * (much like generic collection classes), concurrently used "child"
- * instances can be freely used without synchronization. However, using
- * master table concurrently with child instances can only be done if
- * access to master instance is read-only (i.e. no modifications done).
- */
-public final class CharsToNameCanonicalizer
-{
- /* If we use "multiply-add" based hash algorithm, this is the multiplier
- * we use.
- */
- public final static int HASH_MULT = 33;
-
- /**
- * Default initial table size. Shouldn't be miniscule (as there's
- * cost to both array realloc and rehashing), but let's keep
- * it reasonably small nonetheless. For systems that properly
- * reuse factories it doesn't matter either way; but when
- * recreating factories often, initial overhead may dominate.
- */
- protected static final int DEFAULT_TABLE_SIZE = 64;
-
- /**
- * Let's not expand symbol tables past some maximum size;
- * this should protected against OOMEs caused by large documents
- * with uniquer (~= random) names.
- */
- protected static final int MAX_TABLE_SIZE = 0x10000; // 64k entries == 256k mem
-
- /**
- * Let's only share reasonably sized symbol tables. Max size set to 3/4 of 16k;
- * this corresponds to 64k main hash index. This should allow for enough distinct
- * names for almost any case.
- */
- final static int MAX_ENTRIES_FOR_REUSE = 12000;
-
- /**
- * Also: to thwart attacks based on hash collisions (which may or may not
- * be cheap to calculate), we will need to detect "too long"
- * collision chains. Let's start with static value of 255 entries
- * for the longest legal chain.
- *
- * Note: longest chain we have been able to produce without malicious
- * intent has been 38 (with "com.fr.third.fasterxml.jackson.core.main.TestWithTonsaSymbols");
- * our setting should be reasonable here.
- *
- * @since 2.1
- */
- final static int MAX_COLL_CHAIN_LENGTH = 255;
-
- /**
- * And to support reduce likelihood of accidental collisons causing
- * exceptions, let's prevent reuse of tables with long collision
- * overflow lists as well.
- *
- * @since 2.1
- */
- final static int MAX_COLL_CHAIN_FOR_REUSE = 63;
-
- final static CharsToNameCanonicalizer sBootstrapSymbolTable;
- static {
- sBootstrapSymbolTable = new CharsToNameCanonicalizer();
- }
-
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Sharing of learnt symbols is done by optional linking of symbol
- * table instances with their parents. When parent linkage is
- * defined, and child instance is released (call to release
),
- * parent's shared tables may be updated from the child instance.
- */
- protected CharsToNameCanonicalizer _parent;
-
- /**
- * Seed value we use as the base to make hash codes non-static between
- * different runs, but still stable for lifetime of a single symbol table
- * instance.
- * This is done for security reasons, to avoid potential DoS attack via
- * hash collisions.
- *
- * @since 2.1
- */
- final private int _hashSeed;
-
- /**
- * Whether canonical symbol Strings are to be intern()ed before added
- * to the table or not
- */
- final protected boolean _intern;
-
- /**
- * Whether any canonicalization should be attempted (whether using
- * intern or not)
- */
- final protected boolean _canonicalize;
-
- /*
- /**********************************************************
- /* Actual symbol table data
- /**********************************************************
- */
-
- /**
- * Primary matching symbols; it's expected most match occur from
- * here.
- */
- protected String[] _symbols;
-
- /**
- * Overflow buckets; if primary doesn't match, lookup is done
- * from here.
- *
- * Note: Number of buckets is half of number of symbol entries, on
- * assumption there's less need for buckets.
- */
- protected Bucket[] _buckets;
-
- /**
- * Current size (number of entries); needed to know if and when
- * rehash.
- */
- protected int _size;
-
- /**
- * Limit that indicates maximum size this instance can hold before
- * it needs to be expanded and rehashed. Calculated using fill
- * factor passed in to constructor.
- */
- protected int _sizeThreshold;
-
- /**
- * Mask used to get index from hash values; equal to
- * _buckets.length - 1
, when _buckets.length is
- * a power of two.
- */
- protected int _indexMask;
-
- /**
- * We need to keep track of the longest collision list; this is needed
- * both to indicate problems with attacks and to allow flushing for
- * other cases.
- *
- * @since 2.1
- */
- protected int _longestCollisionList;
-
- /*
- /**********************************************************
- /* State regarding shared arrays
- /**********************************************************
- */
-
- /**
- * Flag that indicates if any changes have been made to the data;
- * used to both determine if bucket array needs to be copied when
- * (first) change is made, and potentially if updated bucket list
- * is to be resync'ed back to master instance.
- */
- protected boolean _dirty;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- /**
- * Method called to create root canonicalizer for a {@link com.fr.third.fasterxml.jackson.core.JsonFactory}
- * instance. Root instance is never used directly; its main use is for
- * storing and sharing underlying symbol arrays as needed.
- */
- public static CharsToNameCanonicalizer createRoot()
- {
- /* [Issue-21]: Need to use a variable seed, to thwart hash-collision
- * based attacks.
- */
- long now = System.currentTimeMillis();
- // ensure it's not 0; and might as well require to be odd so:
- int seed = (((int) now) + ((int) (now >>> 32))) | 1;
- return createRoot(seed);
- }
-
- protected static CharsToNameCanonicalizer createRoot(int hashSeed) {
- return sBootstrapSymbolTable.makeOrphan(hashSeed);
- }
-
- /**
- * Main method for constructing a master symbol table instance.
- *
- * @param initialSize Minimum initial size for bucket array; internally
- * will always use a power of two equal to or bigger than this value.
- */
- private CharsToNameCanonicalizer()
- {
- // these settings don't really matter for the bootstrap instance
- _canonicalize = true;
- _intern = true;
- // And we'll also set flags so no copying of buckets is needed:
- _dirty = true;
- _hashSeed = 0;
- _longestCollisionList = 0;
- initTables(DEFAULT_TABLE_SIZE);
- }
-
- private void initTables(int initialSize)
- {
- _symbols = new String[initialSize];
- _buckets = new Bucket[initialSize >> 1];
- // Mask is easy to calc for powers of two.
- _indexMask = initialSize - 1;
- _size = 0;
- _longestCollisionList = 0;
- // Hard-coded fill factor is 75%
- _sizeThreshold = _thresholdSize(initialSize);
- }
-
- private static int _thresholdSize(int hashAreaSize) {
- return hashAreaSize - (hashAreaSize >> 2);
- }
-
- /**
- * Internal constructor used when creating child instances.
- */
- private CharsToNameCanonicalizer(CharsToNameCanonicalizer parent,
- boolean canonicalize, boolean intern,
- String[] symbols, Bucket[] buckets, int size,
- int hashSeed, int longestColl)
- {
- _parent = parent;
- _canonicalize = canonicalize;
- _intern = intern;
-
- _symbols = symbols;
- _buckets = buckets;
- _size = size;
- _hashSeed = hashSeed;
- // Hard-coded fill factor, 75%
- int arrayLen = (symbols.length);
- _sizeThreshold = _thresholdSize(arrayLen);
- _indexMask = (arrayLen - 1);
- _longestCollisionList = longestColl;
-
- // Need to make copies of arrays, if/when adding new entries
- _dirty = false;
- }
-
- /**
- * "Factory" method; will create a new child instance of this symbol
- * table. It will be a copy-on-write instance, ie. it will only use
- * read-only copy of parent's data, but when changes are needed, a
- * copy will be created.
- *
- * Note: while this method is synchronized, it is generally not
- * safe to both use makeChild/mergeChild, AND to use instance
- * actively. Instead, a separate 'root' instance should be used
- * on which only makeChild/mergeChild are called, but instance itself
- * is not used as a symbol table.
- */
- public CharsToNameCanonicalizer makeChild(final boolean canonicalize,
- final boolean intern)
- {
- /* 24-Jul-2012, tatu: Trying to reduce scope of synchronization, assuming
- * that synchronizing construction is the (potentially) expensive part,
- * and not so much short copy-the-variables thing.
- */
- final String[] symbols;
- final Bucket[] buckets;
- final int size;
- final int hashSeed;
- final int longestCollisionList;
-
- synchronized (this) {
- symbols = _symbols;
- buckets = _buckets;
- size = _size;
- hashSeed = _hashSeed;
- longestCollisionList = _longestCollisionList;
- }
-
- return new CharsToNameCanonicalizer(this, canonicalize, intern,
- symbols, buckets, size, hashSeed, longestCollisionList);
- }
-
- private CharsToNameCanonicalizer makeOrphan(int seed)
- {
- return new CharsToNameCanonicalizer(null, true, true,
- _symbols, _buckets, _size, seed, _longestCollisionList);
- }
-
- /**
- * Method that allows contents of child table to potentially be
- * "merged in" with contents of this symbol table.
- *
- * Note that caller has to make sure symbol table passed in is
- * really a child or sibling of this symbol table.
- */
- private void mergeChild(CharsToNameCanonicalizer child)
- {
- /* One caveat: let's try to avoid problems with
- * degenerate cases of documents with generated "random"
- * names: for these, symbol tables would bloat indefinitely.
- * One way to do this is to just purge tables if they grow
- * too large, and that's what we'll do here.
- */
- if (child.size() > MAX_ENTRIES_FOR_REUSE
- || child._longestCollisionList > MAX_COLL_CHAIN_FOR_REUSE) {
- // Should there be a way to get notified about this event, to log it or such?
- // (as it's somewhat abnormal thing to happen)
- // At any rate, need to clean up the tables, then:
- synchronized (this) {
- initTables(DEFAULT_TABLE_SIZE);
- // Dirty flag... well, let's just clear it. Shouldn't really matter for master tables
- // (which this is, given something is merged to it)
- _dirty = false;
- }
- } else {
- // Otherwise, we'll merge changed stuff in, if there are more entries (which
- // may not be the case if one of siblings has added symbols first or such)
- if (child.size() <= size()) { // nothing to add
- return;
- }
- // Okie dokie, let's get the data in!
- synchronized (this) {
- _symbols = child._symbols;
- _buckets = child._buckets;
- _size = child._size;
- _sizeThreshold = child._sizeThreshold;
- _indexMask = child._indexMask;
- _longestCollisionList = child._longestCollisionList;
- // Dirty flag... well, let's just clear it. Shouldn't really matter for master tables
- // (which this is, given something is merged to it)
- _dirty = false;
- }
- }
- }
-
- public void release()
- {
- // If nothing has been added, nothing to do
- if (!maybeDirty()) {
- return;
- }
- if (_parent != null) {
- _parent.mergeChild(this);
- /* Let's also mark this instance as dirty, so that just in
- * case release was too early, there's no corruption
- * of possibly shared data.
- */
- _dirty = false;
- }
- }
-
- /*
- /**********************************************************
- /* Public API, generic accessors:
- /**********************************************************
- */
-
- public int size() { return _size; }
-
- /**
- * Method for checking number of primary hash buckets this symbol
- * table uses.
- *
- * @since 2.1
- */
- public int bucketCount() {
- return _symbols.length; }
-
- public boolean maybeDirty() { return _dirty; }
-
- public int hashSeed() { return _hashSeed; }
-
- /**
- * Method mostly needed by unit tests; calculates number of
- * entries that are in collision list. Value can be at most
- * ({@link #size} - 1), but should usually be much lower, ideally 0.
- *
- * @since 2.1
- */
- public int collisionCount()
- {
- int count = 0;
-
- for (Bucket bucket : _buckets) {
- if (bucket != null) {
- count += bucket.length();
- }
- }
- return count;
- }
-
- /**
- * Method mostly needed by unit tests; calculates length of the
- * longest collision chain. This should typically be a low number,
- * but may be up to {@link #size} - 1 in the pathological case
- *
- * @since 2.1
- */
- public int maxCollisionLength()
- {
- return _longestCollisionList;
- }
-
- /*
- /**********************************************************
- /* Public API, accessing symbols:
- /**********************************************************
- */
-
- public String findSymbol(char[] buffer, int start, int len, int h)
- {
- if (len < 1) { // empty Strings are simplest to handle up front
- return "";
- }
- if (!_canonicalize) { // [JACKSON-259]
- return new String(buffer, start, len);
- }
-
- /* Related to problems with sub-standard hashing (somewhat
- * relevant for collision attacks too), let's try little
- * bit of shuffling to improve hash codes.
- * (note, however, that this can't help with full collisions)
- */
- int index = _hashToIndex(h);
- String sym = _symbols[index];
-
- // Optimal case; checking existing primary symbol for hash index:
- if (sym != null) {
- // Let's inline primary String equality checking:
- if (sym.length() == len) {
- int i = 0;
- do {
- if (sym.charAt(i) != buffer[start+i]) {
- break;
- }
- } while (++i < len);
- // Optimal case; primary match found
- if (i == len) {
- return sym;
- }
- }
- // How about collision bucket?
- Bucket b = _buckets[index >> 1];
- if (b != null) {
- sym = b.find(buffer, start, len);
- if (sym != null) {
- return sym;
- }
- }
- }
-
- if (!_dirty) { //need to do copy-on-write?
- copyArrays();
- _dirty = true;
- } else if (_size >= _sizeThreshold) { // Need to expand?
- rehash();
- /* Need to recalc hash; rare occurence (index mask has been
- * recalculated as part of rehash)
- */
- index = _hashToIndex(calcHash(buffer, start, len));
- }
-
- String newSymbol = new String(buffer, start, len);
- if (_intern) {
- newSymbol = InternCache.instance.intern(newSymbol);
- }
- ++_size;
- // Ok; do we need to add primary entry, or a bucket?
- if (_symbols[index] == null) {
- _symbols[index] = newSymbol;
- } else {
- int bix = (index >> 1);
- Bucket newB = new Bucket(newSymbol, _buckets[bix]);
- _buckets[bix] = newB;
- _longestCollisionList = Math.max(newB.length(), _longestCollisionList);
- if (_longestCollisionList > MAX_COLL_CHAIN_LENGTH) {
- reportTooManyCollisions(MAX_COLL_CHAIN_LENGTH);
- }
- }
-
- return newSymbol;
- }
-
- /**
- * Helper method that takes in a "raw" hash value, shuffles it as necessary,
- * and truncates to be used as the index.
- */
- public int _hashToIndex(int rawHash)
- {
- rawHash += (rawHash >>> 15); // this seems to help quite a bit, at least for our tests
- return (rawHash & _indexMask);
- }
-
- /**
- * Implementation of a hashing method for variable length
- * Strings. Most of the time intention is that this calculation
- * is done by caller during parsing, not here; however, sometimes
- * it needs to be done for parsed "String" too.
- *
- * @param len Length of String; has to be at least 1 (caller guarantees
- * this pre-condition)
- */
- public int calcHash(char[] buffer, int start, int len)
- {
- int hash = _hashSeed;
- for (int i = 0; i < len; ++i) {
- hash = (hash * HASH_MULT) + (int) buffer[i];
- }
- // NOTE: shuffling, if any, is done in 'findSymbol()', not here:
- return (hash == 0) ? 1 : hash;
- }
-
- public int calcHash(String key)
- {
- final int len = key.length();
-
- int hash = _hashSeed;
- for (int i = 0; i < len; ++i) {
- hash = (hash * HASH_MULT) + (int) key.charAt(i);
- }
- // NOTE: shuffling, if any, is done in 'findSymbol()', not here:
- return (hash == 0) ? 1 : hash;
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- /**
- * Method called when copy-on-write is needed; generally when first
- * change is made to a derived symbol table.
- */
- private void copyArrays()
- {
- final String[] oldSyms = _symbols;
- _symbols = ArraysCompat.copyOf(oldSyms, oldSyms.length);
- final Bucket[] oldBuckets = _buckets;
- _buckets = ArraysCompat.copyOf(oldBuckets, oldBuckets.length);
- }
-
- /**
- * Method called when size (number of entries) of symbol table grows
- * so big that load factor is exceeded. Since size has to remain
- * power of two, arrays will then always be doubled. Main work
- * is really redistributing old entries into new String/Bucket
- * entries.
- */
- private void rehash()
- {
- int size = _symbols.length;
- int newSize = size + size;
-
- /* 12-Mar-2010, tatu: Let's actually limit maximum size we are
- * prepared to use, to guard against OOME in case of unbounded
- * name sets (unique [non-repeating] names)
- */
- if (newSize > MAX_TABLE_SIZE) {
- /* If this happens, there's no point in either growing or
- * shrinking hash areas. Rather, it's better to just clean
- * them up for reuse.
- */
- _size = 0;
- Arrays.fill(_symbols, null);
- Arrays.fill(_buckets, null);
- _dirty = true;
- return;
- }
-
- String[] oldSyms = _symbols;
- Bucket[] oldBuckets = _buckets;
- _symbols = new String[newSize];
- _buckets = new Bucket[newSize >> 1];
- // Let's update index mask, threshold, now (needed for rehashing)
- _indexMask = newSize - 1;
- _sizeThreshold = _thresholdSize(newSize);
-
- int count = 0; // let's do sanity check
-
- /* Need to do two loops, unfortunately, since spill-over area is
- * only half the size:
- */
- int maxColl = 0;
- for (int i = 0; i < size; ++i) {
- String symbol = oldSyms[i];
- if (symbol != null) {
- ++count;
- int index = _hashToIndex(calcHash(symbol));
- if (_symbols[index] == null) {
- _symbols[index] = symbol;
- } else {
- int bix = (index >> 1);
- Bucket newB = new Bucket(symbol, _buckets[bix]);
- _buckets[bix] = newB;
- maxColl = Math.max(maxColl, newB.length());
- }
- }
- }
-
- size >>= 1;
- for (int i = 0; i < size; ++i) {
- Bucket b = oldBuckets[i];
- while (b != null) {
- ++count;
- String symbol = b.getSymbol();
- int index = _hashToIndex(calcHash(symbol));
- if (_symbols[index] == null) {
- _symbols[index] = symbol;
- } else {
- int bix = (index >> 1);
- Bucket newB = new Bucket(symbol, _buckets[bix]);
- _buckets[bix] = newB;
- maxColl = Math.max(maxColl, newB.length());
- }
- b = b.getNext();
- }
- }
- _longestCollisionList = maxColl;
-
- if (count != _size) {
- throw new Error("Internal error on SymbolTable.rehash(): had "+_size+" entries; now have "+count+".");
- }
- }
-
- /**
- * @since 2.1
- */
- protected void reportTooManyCollisions(int maxLen)
- {
- throw new IllegalStateException("Longest collision chain in symbol table (of size "+_size
- +") now exceeds maximum, "+maxLen+" -- suspect a DoS attack based on hash collisions");
- }
-
- /*
- /**********************************************************
- /* Bucket class
- /**********************************************************
- */
-
- /**
- * This class is a symbol table entry. Each entry acts as a node
- * in a linked list.
- */
- static final class Bucket
- {
- private final String _symbol;
- private final Bucket _next;
- private final int _length;
-
- public Bucket(String symbol, Bucket next) {
- _symbol = symbol;
- _next = next;
- _length = (next == null) ? 1 : next._length+1;
- }
-
- public String getSymbol() { return _symbol; }
- public Bucket getNext() { return _next; }
- public int length() { return _length; }
-
- public String find(char[] buf, int start, int len) {
- String sym = _symbol;
- Bucket b = _next;
-
- while (true) { // Inlined equality comparison:
- if (sym.length() == len) {
- int i = 0;
- do {
- if (sym.charAt(i) != buf[start+i]) {
- break;
- }
- } while (++i < len);
- if (i == len) {
- return sym;
- }
- }
- if (b == null) {
- break;
- }
- sym = b.getSymbol();
- b = b.getNext();
- }
- return null;
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name.java
deleted file mode 100644
index ea2128680..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-/**
- * Base class for tokenized names (key strings in objects) that have
- * been tokenized from byte-based input sources (like
- * {@link java.io.InputStream}.
- *
- * @author Tatu Saloranta
- */
-public abstract class Name
-{
- protected final String _name;
-
- protected final int _hashCode;
-
- protected Name(String name, int hashCode) {
- _name = name;
- _hashCode = hashCode;
- }
-
- public String getName() { return _name; }
-
- /*
- /**********************************************************
- /* Methods for package/core parser
- /**********************************************************
- */
-
- public abstract boolean equals(int quad1);
-
- public abstract boolean equals(int quad1, int quad2);
-
- public abstract boolean equals(int[] quads, int qlen);
-
- /*
- /**********************************************************
- /* Overridden standard methods
- /**********************************************************
- */
-
- @Override public String toString() { return _name; }
-
- @Override public final int hashCode() { return _hashCode; }
-
- @Override public boolean equals(Object o)
- {
- // Canonical instances, can usually just do identity comparison
- return (o == this);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name1.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name1.java
deleted file mode 100644
index 1c9ec3872..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name1.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-/**
- * Specialized implementation of PName: can be used for short Strings
- * that consists of at most 4 bytes. Usually this means short
- * ascii-only names.
- *
- * The reason for such specialized classes is mostly space efficiency;
- * and to a lesser degree performance. Both are achieved for short
- * Strings by avoiding another level of indirection (via quad arrays)
- */
-public final class Name1
- extends Name
-{
- final static Name1 sEmptyName = new Name1("", 0, 0);
-
- final int mQuad;
-
- Name1(String name, int hash, int quad)
- {
- super(name, hash);
- mQuad = quad;
- }
-
- static Name1 getEmptyName() { return sEmptyName; }
-
- @Override
- public boolean equals(int quad)
- {
- return (quad == mQuad);
- }
-
- @Override
- public boolean equals(int quad1, int quad2)
- {
- return (quad1 == mQuad) && (quad2 == 0);
- }
-
- @Override
- public boolean equals(int[] quads, int qlen)
- {
- return (qlen == 1 && quads[0] == mQuad);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name2.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name2.java
deleted file mode 100644
index 1294b8c09..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name2.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-/**
- * Specialized implementation of PName: can be used for short Strings
- * that consists of 5 to 8 bytes. Usually this means relatively short
- * ascii-only names.
- *
- * The reason for such specialized classes is mostly space efficiency;
- * and to a lesser degree performance. Both are achieved for short
- * Strings by avoiding another level of indirection (via quad arrays)
- */
-public final class Name2
- extends Name
-{
- final int mQuad1;
-
- final int mQuad2;
-
- Name2(String name, int hash, int quad1, int quad2)
- {
- super(name, hash);
- mQuad1 = quad1;
- mQuad2 = quad2;
- }
-
- @Override
- public boolean equals(int quad) { return false; }
-
- @Override
- public boolean equals(int quad1, int quad2)
- {
- return (quad1 == mQuad1) && (quad2 == mQuad2);
- }
-
- @Override
- public boolean equals(int[] quads, int qlen)
- {
- return (qlen == 2 && quads[0] == mQuad1 && quads[1] == mQuad2);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name3.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name3.java
deleted file mode 100644
index 20fdfc863..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/Name3.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-/**
- * Specialized implementation of PName: can be used for short Strings
- * that consists of 9 to 12 bytes. It's the longest special purpose
- * implementaion; longer ones are expressed using {@link NameN}.
- */
-public final class Name3
- extends Name
-{
- final int mQuad1;
- final int mQuad2;
- final int mQuad3;
-
- Name3(String name, int hash, int q1, int q2, int q3)
- {
- super(name, hash);
- mQuad1 = q1;
- mQuad2 = q2;
- mQuad3 = q3;
- }
-
- // Implies quad length == 1, never matches
- @Override
- public boolean equals(int quad) { return false; }
-
- // Implies quad length == 2, never matches
- @Override
- public boolean equals(int quad1, int quad2) { return false; }
-
- @Override
- public boolean equals(int[] quads, int qlen)
- {
- return (qlen == 3)
- && (quads[0] == mQuad1)
- && (quads[1] == mQuad2)
- && (quads[2] == mQuad3);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/NameN.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/NameN.java
deleted file mode 100644
index 1e5a56c67..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/NameN.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.sym;
-
-/**
- * Generic implementation of PName used for "long" names, where long
- * means that its byte (UTF-8) representation is 13 bytes or more.
- */
-public final class NameN
- extends Name
-{
- final int[] mQuads;
- final int mQuadLen;
-
- NameN(String name, int hash, int[] quads, int quadLen)
- {
- super(name, hash);
- /* We have specialized implementations for shorter
- * names, so let's not allow runt instances here
- */
- if (quadLen < 3) {
- throw new IllegalArgumentException("Qlen must >= 3");
- }
- mQuads = quads;
- mQuadLen = quadLen;
- }
-
- // Implies quad length == 1, never matches
- @Override
- public boolean equals(int quad) { return false; }
-
- // Implies quad length == 2, never matches
- @Override
- public boolean equals(int quad1, int quad2) { return false; }
-
- @Override
- public boolean equals(int[] quads, int qlen)
- {
- if (qlen != mQuadLen) {
- return false;
- }
-
- /* 26-Nov-2008, tatus: Strange, but it does look like
- * unrolling here is counter-productive, reducing
- * speed. Perhaps it prevents inlining by HotSpot or
- * something...
- */
- // Will always have >= 3 quads, can unroll
- /*
- if (quads[0] == mQuads[0]
- && quads[1] == mQuads[1]
- && quads[2] == mQuads[2]) {
- for (int i = 3; i < qlen; ++i) {
- if (quads[i] != mQuads[i]) {
- return false;
- }
- }
- return true;
- }
- */
-
- // or simpler way without unrolling:
- for (int i = 0; i < qlen; ++i) {
- if (quads[i] != mQuads[i]) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/package-info.java
deleted file mode 100644
index 05b714e13..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/sym/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * Internal implementation classes for efficient handling of
- * of symbols in JSON (field names in Objects)
- */
-package com.fr.third.fasterxml.jackson.core.sym;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/ResolvedType.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/ResolvedType.java
deleted file mode 100644
index 47e4a6423..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/ResolvedType.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.type;
-
-/**
- * Type abstraction that represents Java type that has been resolved
- * (i.e. has all generic information, if any, resolved to concrete
- * types).
- * Note that this is an intermediate type, and all concrete instances
- * MUST be of type JavaType
from "databind" bundle -- this
- * abstraction is only needed so that types can be passed through
- * {@link com.fr.third.fasterxml.jackson.core.JsonParser#readValueAs} methods.
- *
- * @since 2.0
- */
-public abstract class ResolvedType
-{
- /*
- /**********************************************************
- /* Public API, simple property accessors
- /**********************************************************
- */
-
- /**
- * Accessor for type-erased {@link Class} of resolved type.
- */
- public abstract Class> getRawClass();
-
- public abstract boolean hasRawClass(Class> clz);
-
- public abstract boolean isAbstract();
-
- public abstract boolean isConcrete();
-
- public abstract boolean isThrowable();
-
- public abstract boolean isArrayType();
-
- public abstract boolean isEnumType();
-
- public abstract boolean isInterface();
-
- public abstract boolean isPrimitive();
-
- public abstract boolean isFinal();
-
- public abstract boolean isContainerType();
-
- public abstract boolean isCollectionLikeType();
-
- public abstract boolean isMapLikeType();
-
- /*
- /**********************************************************
- /* Public API, type parameter access
- /**********************************************************
- */
-
- /**
- * Method that can be used to find out if the type directly declares generic
- * parameters (for its direct super-class and/or super-interfaces).
- */
- public abstract boolean hasGenericTypes();
-
- /**
- * Method for accessing key type for this type, assuming type
- * has such a concept (only Map types do)
- */
- public abstract ResolvedType getKeyType();
-
- /**
- * Method for accessing content type of this type, if type has
- * such a thing: simple types do not, structured types do
- * (like arrays, Collections and Maps)
- */
- public abstract ResolvedType getContentType();
-
- /**
- * Method for checking how many contained types this type
- * has. Contained types are usually generic types, so that
- * generic Maps have 2 contained types.
- */
- public abstract int containedTypeCount();
-
- /**
- * Method for accessing definitions of contained ("child")
- * types.
- *
- * @param index Index of contained type to return
- *
- * @return Contained type at index, or null if no such type
- * exists (no exception thrown)
- */
- public abstract ResolvedType containedType(int index);
-
- /**
- * Method for accessing name of type variable in indicated
- * position. If no name is bound, will use placeholders (derived
- * from 0-based index); if no type variable or argument exists
- * with given index, null is returned.
- *
- * @param index Index of contained type to return
- *
- * @return Contained type at index, or null if no such type
- * exists (no exception thrown)
- */
- public abstract String containedTypeName(int index);
-
- /*
- /**********************************************************
- /* Public API, other
- /**********************************************************
- */
-
- /**
- * Method that can be used to serialize type into form from which
- * it can be fully deserialized from at a later point (using
- * TypeFactory
from mapper package).
- * For simple types this is same as calling
- * {@link Class#getName}, but for structured types it may additionally
- * contain type information about contents.
- */
- public abstract String toCanonical();
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/TypeReference.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/TypeReference.java
deleted file mode 100644
index d90df7001..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/TypeReference.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.type;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-
-/**
- * This generic abstract class is used for obtaining full generics type information
- * by sub-classing; it must be converted to {@link ResolvedType} implementation
- * (implemented by JavaType
from "databind" bundle) to be used.
- * Class is based on ideas from
- * http://gafter.blogspot.com/2006/12/super-type-tokens.html ,
- * Additional idea (from a suggestion made in comments of the article)
- * is to require bogus implementation of Comparable
- * (any such generic interface would do, as long as it forces a method
- * with generic type to be implemented).
- * to ensure that a Type argument is indeed given.
- *
- * Usage is by sub-classing: here is one way to instantiate reference
- * to generic type List<Integer>
:
- *
- * TypeReference ref = new TypeReference<List<Integer>>() { };
- *
- * which can be passed to methods that accept TypeReference, or resolved
- * using TypeFactory
to obtain {@link ResolvedType}.
- */
-public abstract class TypeReference
- implements Comparable>
-{
- protected final Type _type;
-
- protected TypeReference()
- {
- Type superClass = getClass().getGenericSuperclass();
- if (superClass instanceof Class>) { // sanity check, should never happen
- throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
- }
- /* 22-Dec-2008, tatu: Not sure if this case is safe -- I suspect
- * it is possible to make it fail?
- * But let's deal with specific
- * case when we know an actual use case, and thereby suitable
- * workarounds for valid case(s) and/or error to throw
- * on invalid one(s).
- */
- _type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
- }
-
- public Type getType() { return _type; }
-
- /**
- * The only reason we define this method (and require implementation
- * of Comparable
) is to prevent constructing a
- * reference without type information.
- */
- @Override
- public int compareTo(TypeReference o) {
- // just need an implementation, not a good one... hence:
- return 0;
- }
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/package-info.java
deleted file mode 100644
index 0e68d6f50..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/type/package-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Contains classes needed for type introspection, mostly used by data binding
- * functionality. Most of this functionality is needed to properly handled
- * generic types, and to simplify and unify processing of things Jackson needs
- * to determine how contained types (of {@link java.util.Collection} and
- * {@link java.util.Map} classes) are to be handled.
- */
-package com.fr.third.fasterxml.jackson.core.type;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ArraysCompat.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ArraysCompat.java
deleted file mode 100644
index 52492b2f9..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ArraysCompat.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.lang.reflect.Array;
-
-/**
- * ArraysCompat implements {@link java.util.Arrays} methods which are not available in Android 2.2 (FroYo).
- */
-public class ArraysCompat {
- /**
- * Copies {@code newLength} elements from {@code original} into a new array.
- * If {@code newLength} is greater than {@code original.length}, the result is padded
- * with the value {@code '\\u0000'}.
- *
- * @param original the original array
- * @param newLength the length of the new array
- * @return the new array
- * @throws NegativeArraySizeException if {@code newLength < 0}
- * @throws NullPointerException if {@code original == null}
- */
- public static char[] copyOf(char[] original, int newLength) {
- return copyOfRange(original, 0, newLength);
- }
-
- /**
- * Copies {@code newLength} elements from {@code original} into a new array.
- * If {@code newLength} is greater than {@code original.length}, the result is padded
- * with the value {@code 0}.
- *
- * @param original the original array
- * @param newLength the length of the new array
- * @return the new array
- * @throws NegativeArraySizeException if {@code newLength < 0}
- * @throws NullPointerException if {@code original == null}
- */
- public static int[] copyOf(int[] original, int newLength) {
- return copyOfRange(original, 0, newLength);
- }
-
- /**
- * Copies {@code newLength} elements from {@code original} into a new array.
- * If {@code newLength} is greater than {@code original.length}, the result is padded
- * with the value {@code null}.
- *
- * @param original the original array
- * @param newLength the length of the new array
- * @return the new array
- * @throws NegativeArraySizeException if {@code newLength < 0}
- * @throws NullPointerException if {@code original == null}
- */
- public static T[] copyOf(T[] original, int newLength) {
- return copyOfRange(original, 0, newLength);
- }
-
- /**
- * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
- * end (exclusive). The original order of elements is preserved.
- * If {@code end} is greater than {@code original.length}, the result is padded
- * with the value {@code '\\u0000'}.
- *
- * @param original the original array
- * @param start the start index, inclusive
- * @param end the end index, exclusive
- * @return the new array
- * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
- * @throws IllegalArgumentException if {@code start > end}
- * @throws NullPointerException if {@code original == null}
- */
- public static char[] copyOfRange(char[] original, int start, int end) {
- int originalLength = original.length;
- int resultLength = end - start;
- int copyLength = Math.min(resultLength, originalLength - start);
- char[] result = new char[resultLength];
- System.arraycopy(original, start, result, 0, copyLength);
- return result;
- }
-
- /**
- * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
- * end (exclusive). The original order of elements is preserved.
- * If {@code end} is greater than {@code original.length}, the result is padded
- * with the value {@code 0}.
- *
- * @param original the original array
- * @param start the start index, inclusive
- * @param end the end index, exclusive
- * @return the new array
- * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
- * @throws IllegalArgumentException if {@code start > end}
- * @throws NullPointerException if {@code original == null}
- */
- public static int[] copyOfRange(int[] original, int start, int end) {
- int originalLength = original.length;
- int resultLength = end - start;
- int copyLength = Math.min(resultLength, originalLength - start);
- int[] result = new int[resultLength];
- System.arraycopy(original, start, result, 0, copyLength);
- return result;
- }
-
- /**
- * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
- * end (exclusive). The original order of elements is preserved.
- * If {@code end} is greater than {@code original.length}, the result is padded
- * with the value {@code null}.
- *
- * @param original the original array
- * @param start the start index, inclusive
- * @param end the end index, exclusive
- * @return the new array
- * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
- * @throws IllegalArgumentException if {@code start > end}
- * @throws NullPointerException if {@code original == null}
- */
- @SuppressWarnings("unchecked")
- public static T[] copyOfRange(T[] original, int start, int end) {
- int originalLength = original.length;
- int resultLength = end - start;
- int copyLength = Math.min(resultLength, originalLength - start);
- T[] result = (T[]) Array.newInstance(original.getClass().getComponentType(), resultLength);
- System.arraycopy(original, start, result, 0, copyLength);
- return result;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/BufferRecycler.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/BufferRecycler.java
deleted file mode 100644
index 95cc9dd67..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/BufferRecycler.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-/**
- * This is a small utility class, whose main functionality is to allow
- * simple reuse of raw byte/char buffers. It is usually used through
- * ThreadLocal
member of the owning class pointing to
- * instance of this class through a SoftReference
. The
- * end result is a low-overhead GC-cleanable recycling: hopefully
- * ideal for use by stream readers.
- */
-public class BufferRecycler
-{
- public final static int DEFAULT_WRITE_CONCAT_BUFFER_LEN = 2000;
-
- public enum ByteBufferType {
- READ_IO_BUFFER(4000)
- /**
- * Buffer used for temporarily storing encoded content; used
- * for example by UTF-8 encoding writer
- */
- ,WRITE_ENCODING_BUFFER(4000)
-
- /**
- * Buffer used for temporarily concatenating output; used for
- * example when requesting output as byte array.
- */
- ,WRITE_CONCAT_BUFFER(2000)
-
- /**
- * Buffer used for concatenating binary data that is either being
- * encoded as base64 output, or decoded from base64 input.
- *
- * @since 2.1
- */
- ,BASE64_CODEC_BUFFER(2000)
- ;
-
- protected final int size;
-
- ByteBufferType(int size) { this.size = size; }
- }
-
- public enum CharBufferType {
- TOKEN_BUFFER(2000) // Tokenizable input
- ,CONCAT_BUFFER(2000) // concatenated output
- ,TEXT_BUFFER(200) // Text content from input
- ,NAME_COPY_BUFFER(200) // Temporary buffer for getting name characters
- ;
-
- protected final int size;
-
- CharBufferType(int size) { this.size = size; }
- }
-
- final protected byte[][] _byteBuffers = new byte[ByteBufferType.values().length][];
- final protected char[][] _charBuffers = new char[CharBufferType.values().length][];
-
- public BufferRecycler() { }
-
- public final byte[] allocByteBuffer(ByteBufferType type) {
- return allocByteBuffer(type, 0);
- }
-
- public final byte[] allocByteBuffer(ByteBufferType type, int minSize)
- {
- final int ix = type.ordinal();
- final int DEF_SIZE = type.size;
- if (minSize < DEF_SIZE) {
- minSize = DEF_SIZE;
- }
- byte[] buffer = _byteBuffers[ix];
- if (buffer == null || buffer.length < minSize) {
- buffer = balloc(minSize);
- } else {
- _byteBuffers[ix] = null;
- }
- return buffer;
- }
-
- public final void releaseByteBuffer(ByteBufferType type, byte[] buffer)
- {
- _byteBuffers[type.ordinal()] = buffer;
- }
-
- public final char[] allocCharBuffer(CharBufferType type)
- {
- return allocCharBuffer(type, 0);
- }
-
- public final char[] allocCharBuffer(CharBufferType type, int minSize)
- {
- if (type.size > minSize) {
- minSize = type.size;
- }
- int ix = type.ordinal();
- char[] buffer = _charBuffers[ix];
- if (buffer == null || buffer.length < minSize) {
- buffer = calloc(minSize);
- } else {
- _charBuffers[ix] = null;
- }
- return buffer;
- }
-
- public final void releaseCharBuffer(CharBufferType type, char[] buffer)
- {
- _charBuffers[type.ordinal()] = buffer;
- }
-
- /*
- /**********************************************************
- /* Actual allocations separated for easier debugging/profiling
- /**********************************************************
- */
-
- private byte[] balloc(int size)
- {
- return new byte[size];
- }
-
- private char[] calloc(int size)
- {
- return new char[size];
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ByteArrayBuilder.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ByteArrayBuilder.java
deleted file mode 100644
index 7e80d3c48..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/ByteArrayBuilder.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- */
-
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.OutputStream;
-import java.util.*;
-
-/**
- * Helper class that is similar to {@link java.io.ByteArrayOutputStream}
- * in usage, but more geared to Jackson use cases internally.
- * Specific changes include segment storage (no need to have linear
- * backing buffer, can avoid reallocs, copying), as well API
- * not based on {@link java.io.OutputStream}. In short, a very much
- * specialized builder object.
- *
- * Since version 1.5, also implements {@link OutputStream} to allow
- * efficient aggregation of output content as a byte array, similar
- * to how {@link java.io.ByteArrayOutputStream} works, but somewhat more
- * efficiently for many use cases.
- */
-public final class ByteArrayBuilder
- extends OutputStream
-{
- private final static byte[] NO_BYTES = new byte[0];
-
- /**
- * Size of the first block we will allocate.
- */
- private final static int INITIAL_BLOCK_SIZE = 500;
-
- /**
- * Maximum block size we will use for individual non-aggregated
- * blocks. Let's limit to using 256k chunks.
- */
- private final static int MAX_BLOCK_SIZE = (1 << 18);
-
- final static int DEFAULT_BLOCK_ARRAY_SIZE = 40;
-
- /**
- * Optional buffer recycler instance that we can use for allocating
- * the first block.
- */
- private final BufferRecycler _bufferRecycler;
-
- private final LinkedList _pastBlocks = new LinkedList();
-
- /**
- * Number of bytes within byte arrays in {@link _pastBlocks}.
- */
- private int _pastLen;
-
- private byte[] _currBlock;
-
- private int _currBlockPtr;
-
- public ByteArrayBuilder() { this(null); }
-
- public ByteArrayBuilder(BufferRecycler br) { this(br, INITIAL_BLOCK_SIZE); }
-
- public ByteArrayBuilder(int firstBlockSize) { this(null, firstBlockSize); }
-
- public ByteArrayBuilder(BufferRecycler br, int firstBlockSize)
- {
- _bufferRecycler = br;
- if (br == null) {
- _currBlock = new byte[firstBlockSize];
- } else {
- _currBlock = br.allocByteBuffer(BufferRecycler.ByteBufferType.WRITE_CONCAT_BUFFER);
- }
- }
-
- public void reset()
- {
- _pastLen = 0;
- _currBlockPtr = 0;
-
- if (!_pastBlocks.isEmpty()) {
- _pastBlocks.clear();
- }
- }
-
- /**
- * Clean up method to call to release all buffers this object may be
- * using. After calling the method, no other accessors can be used (and
- * attempt to do so may result in an exception)
- */
- public void release() {
- reset();
- if (_bufferRecycler != null && _currBlock != null) {
- _bufferRecycler.releaseByteBuffer(BufferRecycler.ByteBufferType.WRITE_CONCAT_BUFFER, _currBlock);
- _currBlock = null;
- }
- }
-
- public void append(int i)
- {
- if (_currBlockPtr >= _currBlock.length) {
- _allocMore();
- }
- _currBlock[_currBlockPtr++] = (byte) i;
- }
-
- public void appendTwoBytes(int b16)
- {
- if ((_currBlockPtr + 1) < _currBlock.length) {
- _currBlock[_currBlockPtr++] = (byte) (b16 >> 8);
- _currBlock[_currBlockPtr++] = (byte) b16;
- } else {
- append(b16 >> 8);
- append(b16);
- }
- }
-
- public void appendThreeBytes(int b24)
- {
- if ((_currBlockPtr + 2) < _currBlock.length) {
- _currBlock[_currBlockPtr++] = (byte) (b24 >> 16);
- _currBlock[_currBlockPtr++] = (byte) (b24 >> 8);
- _currBlock[_currBlockPtr++] = (byte) b24;
- } else {
- append(b24 >> 16);
- append(b24 >> 8);
- append(b24);
- }
- }
-
- /**
- * Method called when results are finalized and we can get the
- * full aggregated result buffer to return to the caller
- */
- public byte[] toByteArray()
- {
- int totalLen = _pastLen + _currBlockPtr;
-
- if (totalLen == 0) { // quick check: nothing aggregated?
- return NO_BYTES;
- }
-
- byte[] result = new byte[totalLen];
- int offset = 0;
-
- for (byte[] block : _pastBlocks) {
- int len = block.length;
- System.arraycopy(block, 0, result, offset, len);
- offset += len;
- }
- System.arraycopy(_currBlock, 0, result, offset, _currBlockPtr);
- offset += _currBlockPtr;
- if (offset != totalLen) { // just a sanity check
- throw new RuntimeException("Internal error: total len assumed to be "+totalLen+", copied "+offset+" bytes");
- }
- // Let's only reset if there's sizable use, otherwise will get reset later on
- if (!_pastBlocks.isEmpty()) {
- reset();
- }
- return result;
- }
-
- /*
- /**********************************************************
- /* Non-stream API (similar to TextBuffer), since 1.6
- /**********************************************************
- */
-
- /**
- * Method called when starting "manual" output: will clear out
- * current state and return the first segment buffer to fill
- */
- public byte[] resetAndGetFirstSegment() {
- reset();
- return _currBlock;
- }
-
- /**
- * Method called when the current segment buffer is full; will
- * append to current contents, allocate a new segment buffer
- * and return it
- */
- public byte[] finishCurrentSegment() {
- _allocMore();
- return _currBlock;
- }
-
- /**
- * Method that will complete "manual" output process, coalesce
- * content (if necessary) and return results as a contiguous buffer.
- *
- * @param lastBlockLength Amount of content in the current segment
- * buffer.
- *
- * @return Coalesced contents
- */
- public byte[] completeAndCoalesce(int lastBlockLength)
- {
- _currBlockPtr = lastBlockLength;
- return toByteArray();
- }
-
- public byte[] getCurrentSegment() {
- return _currBlock;
- }
-
- public void setCurrentSegmentLength(int len) {
- _currBlockPtr = len;
- }
-
- public int getCurrentSegmentLength() {
- return _currBlockPtr;
- }
-
- /*
- /**********************************************************
- /* OutputStream implementation
- /**********************************************************
- */
-
- @Override
- public void write(byte[] b) {
- write(b, 0, b.length);
- }
-
- @Override
- public void write(byte[] b, int off, int len)
- {
- while (true) {
- int max = _currBlock.length - _currBlockPtr;
- int toCopy = Math.min(max, len);
- if (toCopy > 0) {
- System.arraycopy(b, off, _currBlock, _currBlockPtr, toCopy);
- off += toCopy;
- _currBlockPtr += toCopy;
- len -= toCopy;
- }
- if (len <= 0) break;
- _allocMore();
- }
- }
-
- @Override
- public void write(int b) {
- append(b);
- }
-
- @Override public void close() { /* NOP */ }
-
- @Override public void flush() { /* NOP */ }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- private void _allocMore()
- {
- _pastLen += _currBlock.length;
-
- /* Let's allocate block that's half the total size, except
- * never smaller than twice the initial block size.
- * The idea is just to grow with reasonable rate, to optimize
- * between minimal number of chunks and minimal amount of
- * wasted space.
- */
- int newSize = Math.max((_pastLen >> 1), (INITIAL_BLOCK_SIZE + INITIAL_BLOCK_SIZE));
- // plus not to exceed max we define...
- if (newSize > MAX_BLOCK_SIZE) {
- newSize = MAX_BLOCK_SIZE;
- }
- _pastBlocks.add(_currBlock);
- _currBlock = new byte[newSize];
- _currBlockPtr = 0;
- }
-
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/DefaultPrettyPrinter.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/DefaultPrettyPrinter.java
deleted file mode 100644
index a92b68957..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/DefaultPrettyPrinter.java
+++ /dev/null
@@ -1,483 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.*;
-import java.util.Arrays;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.SerializedString;
-
-/**
- * Default {@link PrettyPrinter} implementation that uses 2-space
- * indentation with platform-default linefeeds.
- * Usually this class is not instantiated directly, but instead
- * method {@link JsonGenerator#useDefaultPrettyPrinter} is
- * used, which will use an instance of this class for operation.
- */
-@SuppressWarnings("serial")
-public class DefaultPrettyPrinter
- implements PrettyPrinter, Instantiatable,
- java.io.Serializable
-{
- private static final long serialVersionUID = -5512586643324525213L;
-
- /**
- * Constant that specifies default "root-level" separator to use between
- * root values: a single space character.
- *
- * @since 2.1
- */
- public final static SerializedString DEFAULT_ROOT_VALUE_SEPARATOR = new SerializedString(" ");
-
- /**
- * Interface that defines objects that can produce indentation used
- * to separate object entries and array values. Indentation in this
- * context just means insertion of white space, independent of whether
- * linefeeds are output.
- */
- public interface Indenter
- {
- void writeIndentation(JsonGenerator jg, int level)
- throws IOException, JsonGenerationException;
-
- /**
- * @return True if indenter is considered inline (does not add linefeeds),
- * false otherwise
- */
- boolean isInline();
- }
-
- // // // Config, indentation
-
- /**
- * By default, let's use only spaces to separate array values.
- */
- protected Indenter _arrayIndenter = FixedSpaceIndenter.instance;
-
- /**
- * By default, let's use linefeed-adding indenter for separate
- * object entries. We'll further configure indenter to use
- * system-specific linefeeds, and 2 spaces per level (as opposed to,
- * say, single tabs)
- */
- protected Indenter _objectIndenter = Lf2SpacesIndenter.instance;
-
- /**
- * String printed between root-level values, if any.
- */
- protected final SerializableString _rootSeparator;
-
- // // // Config, other white space configuration
-
- /**
- * By default we will add spaces around colons used to
- * separate object fields and values.
- * If disabled, will not use spaces around colon.
- */
- protected boolean _spacesInObjectEntries = true;
-
- // // // State:
-
- /**
- * Number of open levels of nesting. Used to determine amount of
- * indentation to use.
- */
- protected transient int _nesting = 0;
-
- /*
- /**********************************************************
- /* Life-cycle (construct, configure)
- /**********************************************************
- */
-
- public DefaultPrettyPrinter() {
- this(DEFAULT_ROOT_VALUE_SEPARATOR);
- }
-
- /**
- * Constructor that specifies separator String to use between root values;
- * if null, no separator is printed.
- *
- * Note: simply constructs a {@link SerializedString} out of parameter,
- * calls {@link #DefaultPrettyPrinter(SerializableString)}
- *
- * @param rootSeparator
- *
- * @since 2.1
- */
- public DefaultPrettyPrinter(String rootSeparator) {
- this((rootSeparator == null) ? null : new SerializedString(rootSeparator));
- }
-
- /**
- * Constructor that specifies separator String to use between root values;
- * if null, no separator is printed.
- *
- * @param rootSeparator
- *
- * @since 2.1
- */
- public DefaultPrettyPrinter(SerializableString rootSeparator) {
- _rootSeparator = rootSeparator;
- }
-
- public DefaultPrettyPrinter(DefaultPrettyPrinter base) {
- this(base, base._rootSeparator);
- }
-
- public DefaultPrettyPrinter(DefaultPrettyPrinter base,
- SerializableString rootSeparator)
- {
- _arrayIndenter = base._arrayIndenter;
- _objectIndenter = base._objectIndenter;
- _spacesInObjectEntries = base._spacesInObjectEntries;
- _nesting = base._nesting;
-
- _rootSeparator = rootSeparator;
- }
-
- public DefaultPrettyPrinter withRootSeparator(SerializableString rootSeparator)
- {
- if (_rootSeparator == rootSeparator ||
- (rootSeparator != null && rootSeparator.equals(_rootSeparator))) {
- return this;
- }
- return new DefaultPrettyPrinter(this, rootSeparator);
- }
-
- public void indentArraysWith(Indenter i) {
- _arrayIndenter = (i == null) ? NopIndenter.instance : i;
- }
-
- public void indentObjectsWith(Indenter i) {
- _objectIndenter = (i == null) ? NopIndenter.instance : i;
- }
-
- /**
- * @deprecated Since 2.3 use {@link #withSpacesInObjectEntries} and {@link #withoutSpacesInObjectEntries()}
- */
- @Deprecated
- public void spacesInObjectEntries(boolean b) { _spacesInObjectEntries = b; }
-
- /**
- * @since 2.3
- */
- public DefaultPrettyPrinter withArrayIndenter(Indenter i) {
- if (i == null) {
- i = NopIndenter.instance;
- }
- if (_arrayIndenter == i) {
- return this;
- }
- DefaultPrettyPrinter pp = new DefaultPrettyPrinter(this);
- pp._arrayIndenter = i;
- return pp;
- }
-
- /**
- * @since 2.3
- */
- public DefaultPrettyPrinter withObjectIndenter(Indenter i) {
- if (i == null) {
- i = NopIndenter.instance;
- }
- if (_objectIndenter == i) {
- return this;
- }
- DefaultPrettyPrinter pp = new DefaultPrettyPrinter(this);
- pp._objectIndenter = i;
- return pp;
- }
-
- /**
- * "Mutant factory" method that will return a pretty printer instance
- * that does use spaces inside object entries; if 'this' instance already
- * does this, it is returned; if not, a new instance will be constructed
- * and returned.
- *
- * @since 2.3
- */
- public DefaultPrettyPrinter withSpacesInObjectEntries() {
- return _withSpaces(true);
- }
-
- /**
- * "Mutant factory" method that will return a pretty printer instance
- * that does not use spaces inside object entries; if 'this' instance already
- * does this, it is returned; if not, a new instance will be constructed
- * and returned.
- *
- * @since 2.3
- */
- public DefaultPrettyPrinter withoutSpacesInObjectEntries() {
- return _withSpaces(false);
- }
-
- protected DefaultPrettyPrinter _withSpaces(boolean state)
- {
- if (_spacesInObjectEntries == state) {
- return this;
- }
- DefaultPrettyPrinter pp = new DefaultPrettyPrinter(this);
- pp._spacesInObjectEntries = state;
- return pp;
- }
-
- /*
- /**********************************************************
- /* Instantiatable impl
- /**********************************************************
- */
-
- @Override
- public DefaultPrettyPrinter createInstance() {
- return new DefaultPrettyPrinter(this);
- }
-
- /*
- /**********************************************************
- /* PrettyPrinter impl
- /**********************************************************
- */
-
- @Override
- public void writeRootValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- if (_rootSeparator != null) {
- jg.writeRaw(_rootSeparator);
- }
- }
-
- @Override
- public void writeStartObject(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw('{');
- if (!_objectIndenter.isInline()) {
- ++_nesting;
- }
- }
-
- @Override
- public void beforeObjectEntries(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- _objectIndenter.writeIndentation(jg, _nesting);
- }
-
- /**
- * Method called after an object field has been output, but
- * before the value is output.
- *
- * Default handling (without pretty-printing) will output a single
- * colon to separate the two. Pretty-printer is
- * to output a colon as well, but can surround that with other
- * (white-space) decoration.
- */
- @Override
- public void writeObjectFieldValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- if (_spacesInObjectEntries) {
- jg.writeRaw(" : ");
- } else {
- jg.writeRaw(':');
- }
- }
-
- /**
- * Method called after an object entry (field:value) has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate the two. Pretty-printer is
- * to output a comma as well, but can surround that with other
- * (white-space) decoration.
- */
- @Override
- public void writeObjectEntrySeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(',');
- _objectIndenter.writeIndentation(jg, _nesting);
- }
-
- @Override
- public void writeEndObject(JsonGenerator jg, int nrOfEntries)
- throws IOException, JsonGenerationException
- {
- if (!_objectIndenter.isInline()) {
- --_nesting;
- }
- if (nrOfEntries > 0) {
- _objectIndenter.writeIndentation(jg, _nesting);
- } else {
- jg.writeRaw(' ');
- }
- jg.writeRaw('}');
- }
-
- @Override
- public void writeStartArray(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- if (!_arrayIndenter.isInline()) {
- ++_nesting;
- }
- jg.writeRaw('[');
- }
-
- @Override
- public void beforeArrayValues(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- _arrayIndenter.writeIndentation(jg, _nesting);
- }
-
- /**
- * Method called after an array value has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate the two. Pretty-printer is
- * to output a comma as well, but can surround that with other
- * (white-space) decoration.
- */
- @Override
- public void writeArrayValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(',');
- _arrayIndenter.writeIndentation(jg, _nesting);
- }
-
- @Override
- public void writeEndArray(JsonGenerator jg, int nrOfValues)
- throws IOException, JsonGenerationException
- {
- if (!_arrayIndenter.isInline()) {
- --_nesting;
- }
- if (nrOfValues > 0) {
- _arrayIndenter.writeIndentation(jg, _nesting);
- } else {
- jg.writeRaw(' ');
- }
- jg.writeRaw(']');
- }
-
- /*
- /**********************************************************
- /* Helper classes
- /**********************************************************
- */
-
- /**
- * Dummy implementation that adds no indentation whatsoever
- */
- public static class NopIndenter
- implements Indenter, java.io.Serializable
- {
- public static final NopIndenter instance = new NopIndenter();
-
- @Override
- public void writeIndentation(JsonGenerator jg, int level)
- throws IOException, JsonGenerationException
- { }
-
- @Override
- public boolean isInline() { return true; }
- }
-
- /**
- * This is a very simple indenter that only every adds a
- * single space for indentation. It is used as the default
- * indenter for array values.
- */
- public static class FixedSpaceIndenter extends NopIndenter
- {
- @SuppressWarnings("hiding")
- public static final FixedSpaceIndenter instance = new FixedSpaceIndenter();
-
- @Override
- public void writeIndentation(JsonGenerator jg, int level)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(' ');
- }
-
- @Override
- public boolean isInline() { return true; }
- }
-
- /**
- * Default linefeed-based indenter uses system-specific linefeeds and
- * 2 spaces for indentation per level.
- */
- public static class Lf2SpacesIndenter extends NopIndenter
- {
- private final static String SYS_LF;
- static {
- String lf = null;
- try {
- lf = System.getProperty("line.separator");
- } catch (Throwable t) { } // access exception?
- SYS_LF = (lf == null) ? "\n" : lf;
- }
-
- final static int SPACE_COUNT = 64;
- final static char[] SPACES = new char[SPACE_COUNT];
- static {
- Arrays.fill(SPACES, ' ');
- }
-
- @SuppressWarnings("hiding")
- public static final Lf2SpacesIndenter instance = new Lf2SpacesIndenter();
-
- /**
- * Linefeed used; default value is the platform-specific linefeed.
- */
- protected final String _lf;
-
- public Lf2SpacesIndenter() { this(SYS_LF); }
-
- /**
- * @since 2.3
- */
- public Lf2SpacesIndenter(String lf) {
- _lf = lf;
- }
-
- /**
- * "Mutant factory" method that will return an instance that uses
- * specified String as linefeed.
- *
- * @since 2.3
- */
- public Lf2SpacesIndenter withLinefeed(String lf)
- {
- if (lf.equals(_lf)) {
- return this;
- }
- return new Lf2SpacesIndenter(lf);
- }
-
- @Override
- public boolean isInline() { return false; }
-
- @Override
- public void writeIndentation(JsonGenerator jg, int level)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(_lf);
- if (level > 0) { // should we err on negative values (as there's some flaw?)
- level += level; // 2 spaces per level
- while (level > SPACE_COUNT) { // should never happen but...
- jg.writeRaw(SPACES, 0, SPACE_COUNT);
- level -= SPACES.length;
- }
- jg.writeRaw(SPACES, 0, level);
- }
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/Instantiatable.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/Instantiatable.java
deleted file mode 100644
index 43aa7acad..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/Instantiatable.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-/**
- * Add-on interface used to indicate things that may be "blueprint" objects
- * which can not be used as is, but are used for creating usable per-process
- * (serialization, deserialization) instances, using
- * {@link #createInstance} method.
- *
- * Note that some implementations may choose to implement {@link #createInstance}
- * by simply returning 'this': this is acceptable if instances are stateless.
- *
- * @see DefaultPrettyPrinter
- *
- * @since 2.1
- */
-public interface Instantiatable
-{
- /**
- * Method called to ensure that we have a non-blueprint object to use;
- * it is either this object (if stateless), or a newly created object
- * with separate state.
- */
- T createInstance();
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/InternCache.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/InternCache.java
deleted file mode 100644
index b5e5c92e0..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/InternCache.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.util.LinkedHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Singleton class that adds a simple first-level cache in front of
- * regular String.intern() functionality. This is done as a minor
- * performance optimization, to avoid calling native intern() method
- * in cases where same String is being interned multiple times.
- *
- * Note: that this class extends {@link LinkedHashMap} is an implementation
- * detail -- no code should ever directly call Map methods.
- */
-@SuppressWarnings("serial")
-public final class InternCache
- extends ConcurrentHashMap // since 2.3
-{
- /**
- * Size to use is somewhat arbitrary, so let's choose something that's
- * neither too small (low hit ratio) nor too large (waste of memory).
- *
- * One consideration is possible attack via colliding {@link String#hashCode};
- * because of this, limit to reasonably low setting.
- */
- private final static int MAX_ENTRIES = 180;
-
- public final static InternCache instance = new InternCache();
-
- /**
- * As minor optimization let's try to avoid "flush storms",
- * cases where multiple threads might try to concurrently
- * flush the map.
- */
- private final static Object _flushLock = new Object();
-
- private InternCache() {
- super(MAX_ENTRIES, 0.8f, 4);
- }
-
- public String intern(String input)
- {
- String result = get(input);
- if (result != null) {
- return result;
- }
-
- /* 18-Sep-2013, tatu: We used to use LinkedHashMap, which has simple LRU
- * method. No such functionality exists with CHM; and let's use simplest
- * possible limitation: just clear all contents. This because otherwise
- * we are simply likely to keep on clearing same, commonly used entries.
- */
- if (size() >= MAX_ENTRIES) {
- /* Not incorrect wrt well-known double-locking anti-pattern because underlying
- * storage gives close enough answer to real one here; and we are
- * more concerned with flooding than starvation.
- */
- synchronized (_flushLock) {
- if (size() >= MAX_ENTRIES) {
- clear();
- }
- }
- }
- result = input.intern();
- put(result, result);
- return result;
- }
-}
-
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonGeneratorDelegate.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
deleted file mode 100644
index 1541a0ad2..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
+++ /dev/null
@@ -1,555 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.CharacterEscapes;
-
-public class JsonGeneratorDelegate extends JsonGenerator
-{
- /**
- * Delegate object that method calls are delegated to.
- */
- protected JsonGenerator delegate;
-
- /**
- * Whether copy methods
- * ({@link #copyCurrentEvent}, {@link #copyCurrentStructure}, {@link #writeTree} and {@link #writeObject})
- * are to be called (true), or handled by this object (false).
- */
- protected boolean delegateCopyMethods;
-
- /*
- /**********************************************************
- /* Construction, initialization
- /**********************************************************
- */
-
- public JsonGeneratorDelegate(JsonGenerator d) {
- this(d, true);
- }
-
- /**
- * @param delegateCopyMethods Flag assigned to delagateCopyMethod
- * and which defines whether copy methods are handled locally (false), or
- * delegated to configured
- */
- public JsonGeneratorDelegate(JsonGenerator d, boolean delegateCopyMethods) {
- delegate = d;
- this.delegateCopyMethods = delegateCopyMethods;
- }
-
- /*
- /**********************************************************
- /* Extended API
- /**********************************************************
- */
-
- public JsonGenerator getDelegate() {
- return delegate;
- }
-
- /*
- /**********************************************************
- /* Public API, metadata
- /**********************************************************
- */
-
- @Override
- public ObjectCodec getCodec() {
- return delegate.getCodec();
- }
-
- @Override
- public JsonGenerator setCodec(ObjectCodec oc) {
- delegate.setCodec(oc);
- return this;
- }
-
- @Override
- public void setSchema(FormatSchema schema) {
- delegate.setSchema(schema);
- }
-
- @Override
- public FormatSchema getSchema() {
- return delegate.getSchema();
- }
-
- @Override
- public Version version() {
- return delegate.version();
- }
-
- @Override
- public Object getOutputTarget() {
- return delegate.getOutputTarget();
- }
-
- /*
- /**********************************************************
- /* Public API, capability introspection (since 2.3, mostly)
- /**********************************************************
- */
-
- @Override
- public boolean canUseSchema(FormatSchema schema) {
- return delegate.canUseSchema(schema);
- }
-
- @Override
- public boolean canWriteTypeId() {
- return delegate.canWriteTypeId();
- }
-
- @Override
- public boolean canWriteObjectId() {
- return delegate.canWriteObjectId();
- }
-
- @Override
- public boolean canWriteBinaryNatively() {
- return delegate.canWriteBinaryNatively();
- }
-
- @Override
- public boolean canOmitFields() {
- return delegate.canOmitFields();
- }
-
- /*
- /**********************************************************
- /* Public API, configuration
- /**********************************************************
- */
-
- @Override
- public JsonGenerator enable(Feature f) {
- delegate.enable(f);
- return this;
- }
-
- @Override
- public JsonGenerator disable(Feature f) {
- delegate.disable(f);
- return this;
- }
-
- @Override
- public boolean isEnabled(Feature f) {
- return delegate.isEnabled(f);
- }
-
- // final, can't override (and no need to)
- //public final JsonGenerator configure(Feature f, boolean state)
-
- @Override
- public int getFeatureMask() {
- return delegate.getFeatureMask();
- }
-
- @Override
- public JsonGenerator setFeatureMask(int mask) {
- delegate.setFeatureMask(mask);
- return this;
- }
-
- /*
- /**********************************************************
- /* Configuring generator
- /**********************************************************
- */
-
- @Override
- public JsonGenerator setPrettyPrinter(PrettyPrinter pp) {
- delegate.setPrettyPrinter(pp);
- return this;
- }
-
- @Override
- public PrettyPrinter getPrettyPrinter() {
- return delegate.getPrettyPrinter();
- }
-
- @Override
- public JsonGenerator useDefaultPrettyPrinter() {
- delegate.useDefaultPrettyPrinter();
- return this;
- }
-
- @Override
- public JsonGenerator setHighestNonEscapedChar(int charCode) {
- delegate.setHighestNonEscapedChar(charCode);
- return this;
- }
-
- @Override
- public int getHighestEscapedChar() {
- return delegate.getHighestEscapedChar();
- }
-
- @Override
- public CharacterEscapes getCharacterEscapes() {
- return delegate.getCharacterEscapes();
- }
-
- @Override
- public JsonGenerator setCharacterEscapes(CharacterEscapes esc) {
- delegate.setCharacterEscapes(esc);
- return this;
- }
-
- @Override
- public JsonGenerator setRootValueSeparator(SerializableString sep) {
- delegate.setRootValueSeparator(sep);
- return this;
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, structural
- /**********************************************************
- */
-
- @Override
- public void writeStartArray() throws IOException, JsonGenerationException {
- delegate.writeStartArray();
- }
-
-
- @Override
- public void writeEndArray() throws IOException, JsonGenerationException {
- delegate.writeEndArray();
- }
-
- @Override
- public void writeStartObject() throws IOException, JsonGenerationException {
- delegate.writeStartObject();
- }
-
- @Override
- public void writeEndObject() throws IOException, JsonGenerationException {
- delegate.writeEndObject();
- }
-
- @Override
- public void writeFieldName(String name)
- throws IOException, JsonGenerationException
- {
- delegate.writeFieldName(name);
- }
-
- @Override
- public void writeFieldName(SerializableString name)
- throws IOException, JsonGenerationException
- {
- delegate.writeFieldName(name);
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, text/String values
- /**********************************************************
- */
-
- @Override
- public void writeString(String text) throws IOException,JsonGenerationException {
- delegate.writeString(text);
- }
-
- @Override
- public void writeString(char[] text, int offset, int len) throws IOException, JsonGenerationException {
- delegate.writeString(text, offset, len);
- }
-
- @Override
- public void writeString(SerializableString text) throws IOException, JsonGenerationException {
- delegate.writeString(text);
- }
-
- @Override
- public void writeRawUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException
- {
- delegate.writeRawUTF8String(text, offset, length);
- }
-
- @Override
- public void writeUTF8String(byte[] text, int offset, int length)
- throws IOException, JsonGenerationException
- {
- delegate.writeUTF8String(text, offset, length);
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, binary/raw content
- /**********************************************************
- */
-
- @Override
- public void writeRaw(String text) throws IOException, JsonGenerationException {
- delegate.writeRaw(text);
- }
-
- @Override
- public void writeRaw(String text, int offset, int len) throws IOException, JsonGenerationException {
- delegate.writeRaw(text, offset, len);
- }
-
- @Override
- public void writeRaw(SerializableString raw)
- throws IOException, JsonGenerationException {
- delegate.writeRaw(raw);
- }
-
- @Override
- public void writeRaw(char[] text, int offset, int len) throws IOException, JsonGenerationException {
- delegate.writeRaw(text, offset, len);
- }
-
- @Override
- public void writeRaw(char c) throws IOException, JsonGenerationException {
- delegate.writeRaw(c);
- }
-
- @Override
- public void writeRawValue(String text) throws IOException, JsonGenerationException {
- delegate.writeRawValue(text);
- }
-
- @Override
- public void writeRawValue(String text, int offset, int len) throws IOException, JsonGenerationException {
- delegate.writeRawValue(text, offset, len);
- }
-
- @Override
- public void writeRawValue(char[] text, int offset, int len) throws IOException, JsonGenerationException {
- delegate.writeRawValue(text, offset, len);
- }
-
- @Override
- public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len)
- throws IOException, JsonGenerationException
- {
- delegate.writeBinary(b64variant, data, offset, len);
- }
-
- @Override
- public int writeBinary(Base64Variant b64variant, InputStream data, int dataLength)
- throws IOException, JsonGenerationException {
- return delegate.writeBinary(b64variant, data, dataLength);
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, other value types
- /**********************************************************
- */
-
- @Override
- public void writeNumber(short v) throws IOException, JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(int v) throws IOException, JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(long v) throws IOException, JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(BigInteger v) throws IOException,
- JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(double v) throws IOException,
- JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(float v) throws IOException,
- JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(BigDecimal v) throws IOException,
- JsonGenerationException {
- delegate.writeNumber(v);
- }
-
- @Override
- public void writeNumber(String encodedValue) throws IOException, JsonGenerationException, UnsupportedOperationException {
- delegate.writeNumber(encodedValue);
- }
-
- @Override
- public void writeBoolean(boolean state) throws IOException, JsonGenerationException {
- delegate.writeBoolean(state);
- }
-
- @Override
- public void writeNull() throws IOException, JsonGenerationException {
- delegate.writeNull();
- }
-
- /*
- /**********************************************************
- /* Overridden field methods
- /**********************************************************
- */
-
- @Override
- public void writeOmittedField(String fieldName)
- throws IOException, JsonGenerationException
- {
- delegate.writeOmittedField(fieldName);
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, Native Ids
- /**********************************************************
- */
-
- @Override
- public void writeObjectId(Object id)
- throws IOException, JsonGenerationException {
- delegate.writeObjectId(id);
- }
-
- @Override
- public void writeObjectRef(Object id)
- throws IOException, JsonGenerationException {
- delegate.writeObjectRef(id);
- }
-
- @Override
- public void writeTypeId(Object id)
- throws IOException, JsonGenerationException {
- delegate.writeTypeId(id);
- }
-
- /*
- /**********************************************************
- /* Public API, write methods, serializing Java objects
- /**********************************************************
- */
-
- @Override
- public void writeObject(Object pojo) throws IOException,JsonProcessingException {
- if (delegateCopyMethods) {
- delegate.writeObject(pojo);
- return;
- }
- // NOTE: copied from
- if (pojo == null) {
- writeNull();
- } else {
- if (getCodec() != null) {
- getCodec().writeValue(this, pojo);
- return;
- }
- _writeSimpleObject(pojo);
- }
- }
-
- @Override
- public void writeTree(TreeNode rootNode) throws IOException, JsonProcessingException {
- if (delegateCopyMethods) {
- delegate.writeTree(rootNode);
- return;
- }
- // As with 'writeObject()', we are not check if write would work
- if (rootNode == null) {
- writeNull();
- } else {
- if (getCodec() == null) {
- throw new IllegalStateException("No ObjectCodec defined");
- }
- getCodec().writeValue(this, rootNode);
- }
- }
-
- /*
- /**********************************************************
- /* Public API, convenience field write methods
- /**********************************************************
- */
-
- // // These are fine, just delegate to other methods...
-
- /*
- /**********************************************************
- /* Public API, copy-through methods
- /**********************************************************
- */
-
- @Override
- public void copyCurrentEvent(JsonParser jp) throws IOException, JsonProcessingException {
- if (delegateCopyMethods) {
- delegate.copyCurrentEvent(jp);
- } else {
- super.copyCurrentEvent(jp);
- }
- }
-
- @Override
- public void copyCurrentStructure(JsonParser jp) throws IOException, JsonProcessingException
- {
- if (delegateCopyMethods) {
- delegate.copyCurrentStructure(jp);
- } else {
- super.copyCurrentStructure(jp);
- }
- }
-
- /*
- /**********************************************************
- /* Public API, context access
- /**********************************************************
- */
-
- @Override
- public JsonStreamContext getOutputContext() {
- return delegate.getOutputContext();
- }
-
- /*
- /**********************************************************
- /* Public API, buffer handling
- /**********************************************************
- */
-
- @Override
- public void flush() throws IOException {
- delegate.flush();
- }
-
- @Override
- public void close() throws IOException {
- delegate.close();
- }
-
- /*
- /**********************************************************
- /* Closeable implementation
- /**********************************************************
- */
-
- @Override
- public boolean isClosed() {
- return delegate.isClosed();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserDelegate.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserDelegate.java
deleted file mode 100644
index 746680f09..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserDelegate.java
+++ /dev/null
@@ -1,462 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Iterator;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.type.TypeReference;
-
-/**
- * Helper class that implements
- * delegation pattern for {@link JsonParser},
- * to allow for simple overridability of basic parsing functionality.
- * The idea is that any functionality to be modified can be simply
- * overridden; and anything else will be delegated by default.
- */
-public class JsonParserDelegate extends JsonParser
-{
- /**
- * Delegate object that method calls are delegated to.
- */
- protected JsonParser delegate;
-
- public JsonParserDelegate(JsonParser d) {
- delegate = d;
- }
-
- /*
- /**********************************************************
- /* Public API, configuration
- /**********************************************************
- */
-
- @Override
- public void setCodec(ObjectCodec c) {
- delegate.setCodec(c);
- }
-
- @Override
- public ObjectCodec getCodec() {
- return delegate.getCodec();
- }
-
- @Override
- public JsonParser enable(Feature f) {
- delegate.enable(f);
- return this;
- }
-
- @Override
- public JsonParser disable(Feature f) {
- delegate.disable(f);
- return this;
- }
-
- @Override
- public boolean isEnabled(Feature f) {
- return delegate.isEnabled(f);
- }
-
- public JsonParser configure(Feature f, boolean state) {
- return delegate.configure(f, state);
- }
-
- @Override
- public int getFeatureMask() {
- return delegate.getFeatureMask();
- }
-
- @Override
- public JsonParser setFeatureMask(int mask) {
- delegate.setFeatureMask(mask);
- return this;
- }
-
- @Override
- public FormatSchema getSchema() {
- return delegate.getSchema();
- }
-
- @Override
- public void setSchema(FormatSchema schema) {
- delegate.setSchema(schema);
- }
-
- @Override
- public boolean canUseSchema(FormatSchema schema) {
- return delegate.canUseSchema(schema);
- }
-
- @Override
- public Version version() {
- return delegate.version();
- }
-
- @Override
- public Object getInputSource() {
- return delegate.getInputSource();
- }
-
- /*
- /**********************************************************
- /* Capability introspection
- /**********************************************************
- */
-
- @Override
- public boolean requiresCustomCodec() {
- return delegate.requiresCustomCodec();
- }
-
- /*
- /**********************************************************
- /* Closeable impl
- /**********************************************************
- */
-
- @Override
- public void close() throws IOException {
- delegate.close();
- }
-
- @Override
- public boolean isClosed() {
- return delegate.isClosed();
- }
-
- /*
- /**********************************************************
- /* Public API, token accessors
- /**********************************************************
- */
-
- @Override
- public JsonToken getCurrentToken() {
- return delegate.getCurrentToken();
- }
-
- @Override
- public int getCurrentTokenId() {
- return delegate.getCurrentTokenId();
- }
-
- @Override
- public boolean hasCurrentToken() {
- return delegate.hasCurrentToken();
- }
-
- @Override
- public String getCurrentName() throws IOException, JsonParseException {
- return delegate.getCurrentName();
- }
-
- @Override
- public JsonLocation getCurrentLocation() {
- return delegate.getCurrentLocation();
- }
-
- @Override
- public JsonStreamContext getParsingContext() {
- return delegate.getParsingContext();
- }
-
- @Override public boolean isExpectedStartArrayToken() { return delegate.isExpectedStartArrayToken(); }
-
- /*
- /**********************************************************
- /* Public API, token state overrides
- /**********************************************************
- */
-
- @Override
- public void clearCurrentToken() {
- delegate.clearCurrentToken();
- }
-
- @Override
- public JsonToken getLastClearedToken() {
- return delegate.getLastClearedToken();
- }
-
- @Override
- public void overrideCurrentName(String name) {
- delegate.overrideCurrentName(name);
- }
-
- /*
- /**********************************************************
- /* Public API, access to token information, text
- /**********************************************************
- */
-
- @Override
- public String getText() throws IOException, JsonParseException {
- return delegate.getText();
- }
-
- @Override
- public boolean hasTextCharacters() {
- return delegate.hasTextCharacters();
- }
-
- @Override
- public char[] getTextCharacters() throws IOException, JsonParseException {
- return delegate.getTextCharacters();
- }
-
- @Override
- public int getTextLength() throws IOException, JsonParseException {
- return delegate.getTextLength();
- }
-
- @Override
- public int getTextOffset() throws IOException, JsonParseException {
- return delegate.getTextOffset();
- }
-
- public String nextTextValue() throws IOException, JsonParseException {
- return delegate.nextTextValue();
- }
-
- /*
- /**********************************************************
- /* Public API, access to token information, numeric
- /**********************************************************
- */
-
- @Override
- public BigInteger getBigIntegerValue() throws IOException, JsonParseException {
- return delegate.getBigIntegerValue();
- }
-
- @Override
- public boolean getBooleanValue() throws IOException, JsonParseException {
- return delegate.getBooleanValue();
- }
-
- @Override
- public byte getByteValue() throws IOException, JsonParseException {
- return delegate.getByteValue();
- }
-
- @Override
- public short getShortValue() throws IOException, JsonParseException {
- return delegate.getShortValue();
- }
-
- @Override
- public BigDecimal getDecimalValue() throws IOException, JsonParseException {
- return delegate.getDecimalValue();
- }
-
- @Override
- public double getDoubleValue() throws IOException, JsonParseException {
- return delegate.getDoubleValue();
- }
-
- @Override
- public float getFloatValue() throws IOException, JsonParseException {
- return delegate.getFloatValue();
- }
-
- @Override
- public int getIntValue() throws IOException, JsonParseException {
- return delegate.getIntValue();
- }
-
- @Override
- public long getLongValue() throws IOException, JsonParseException {
- return delegate.getLongValue();
- }
-
- @Override
- public NumberType getNumberType() throws IOException, JsonParseException {
- return delegate.getNumberType();
- }
-
- @Override
- public Number getNumberValue() throws IOException, JsonParseException {
- return delegate.getNumberValue();
- }
-
- public Boolean nextBooleanValue() throws IOException, JsonParseException {
- return delegate.nextBooleanValue();
- }
-
- public int nextIntValue(int defaultValue) throws IOException, JsonParseException {
- return delegate.nextIntValue(defaultValue);
- }
-
- public long nextLongValue(long defaultValue) throws IOException, JsonParseException {
- return delegate.nextLongValue(defaultValue);
- }
-
- /*
- /**********************************************************
- /* Public API, access to token information, coercion/conversion
- /**********************************************************
- */
-
- @Override
- public int getValueAsInt() throws IOException, JsonParseException {
- return delegate.getValueAsInt();
- }
-
- @Override
- public int getValueAsInt(int defaultValue) throws IOException, JsonParseException {
- return delegate.getValueAsInt(defaultValue);
- }
-
- @Override
- public long getValueAsLong() throws IOException, JsonParseException {
- return delegate.getValueAsLong();
- }
-
- @Override
- public long getValueAsLong(long defaultValue) throws IOException, JsonParseException {
- return delegate.getValueAsLong(defaultValue);
- }
-
- @Override
- public double getValueAsDouble() throws IOException, JsonParseException {
- return delegate.getValueAsDouble();
- }
-
- @Override
- public double getValueAsDouble(double defaultValue) throws IOException, JsonParseException {
- return delegate.getValueAsDouble(defaultValue);
- }
-
- @Override
- public boolean getValueAsBoolean() throws IOException, JsonParseException {
- return delegate.getValueAsBoolean();
- }
-
- @Override
- public boolean getValueAsBoolean(boolean defaultValue) throws IOException, JsonParseException {
- return delegate.getValueAsBoolean(defaultValue);
- }
-
- @Override
- public String getValueAsString() throws IOException, JsonParseException {
- return delegate.getValueAsString();
- }
-
- @Override
- public String getValueAsString(String defaultValue) throws IOException, JsonParseException {
- return delegate.getValueAsString(defaultValue);
- }
-
- public T readValueAs(Class valueType) throws IOException, JsonProcessingException {
- return delegate.readValueAs(valueType);
- }
-
- public T readValueAs(TypeReference> valueTypeRef) throws IOException, JsonProcessingException {
- return delegate.readValueAs(valueTypeRef);
- }
-
- public Iterator readValuesAs(Class valueType) throws IOException, JsonProcessingException {
- return delegate.readValuesAs(valueType);
- }
-
- public Iterator readValuesAs(TypeReference> valueTypeRef) throws IOException, JsonProcessingException {
- return delegate.readValuesAs(valueTypeRef);
- }
-
- public T readValueAsTree() throws IOException, JsonProcessingException {
- return delegate.readValueAsTree();
- }
-
- /*
- /**********************************************************
- /* Public API, access to token values, other
- /**********************************************************
- */
-
- @Override
- public Object getEmbeddedObject() throws IOException, JsonParseException {
- return delegate.getEmbeddedObject();
- }
-
- @Override
- public byte[] getBinaryValue(Base64Variant b64variant) throws IOException, JsonParseException {
- return delegate.getBinaryValue(b64variant);
- }
-
- public byte[] getBinaryValue() throws IOException, JsonParseException {
- return delegate.getBinaryValue();
- }
-
- @Override
- public int readBinaryValue(Base64Variant b64variant, OutputStream out) throws IOException, JsonParseException {
- return delegate.readBinaryValue(b64variant, out);
- }
-
- public int readBinaryValue(OutputStream out) throws IOException, JsonParseException {
- return delegate.readBinaryValue(out);
- }
-
- @Override
- public JsonLocation getTokenLocation() {
- return delegate.getTokenLocation();
- }
-
- @Override
- public JsonToken nextToken() throws IOException, JsonParseException {
- return delegate.nextToken();
- }
-
- @Override
- public JsonToken nextValue() throws IOException, JsonParseException {
- return delegate.nextValue();
- }
-
- public boolean nextFieldName(SerializableString str) throws IOException, JsonParseException {
- return delegate.nextFieldName(str);
- }
-
- @Override
- public JsonParser skipChildren() throws IOException, JsonParseException {
- delegate.skipChildren();
- // NOTE: must NOT delegate this method to delegate, needs to be self-reference for chaining
- return this;
- }
-
- public int releaseBuffered(OutputStream out) throws IOException {
- return delegate.releaseBuffered(out);
- }
-
- public int releaseBuffered(Writer w) throws IOException {
- return delegate.releaseBuffered(w);
- }
-
- /*
- /**********************************************************
- /* Public API, Native Ids (type, object)
- /**********************************************************
- */
-
- @Override
- public boolean canReadObjectId() {
- return delegate.canReadObjectId();
- }
-
- @Override
- public boolean canReadTypeId() {
- return delegate.canReadTypeId();
- }
-
- @Override
- public Object getObjectId() throws IOException, JsonGenerationException {
- return delegate.getObjectId();
- }
-
- @Override
- public Object getTypeId() throws IOException, JsonGenerationException {
- return delegate.getTypeId();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserSequence.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserSequence.java
deleted file mode 100644
index fc72bc662..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/JsonParserSequence.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.IOException;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Helper class that can be used to sequence multiple physical
- * {@link JsonParser}s to create a single logical sequence of
- * tokens, as a single {@link JsonParser}.
- *
- * Fairly simple use of {@link JsonParserDelegate}: only need
- * to override {@link #nextToken} to handle transition
- */
-public class JsonParserSequence extends JsonParserDelegate
-{
- /**
- * Parsers other than the first one (which is initially assigned
- * as delegate)
- */
- protected final JsonParser[] _parsers;
-
- /**
- * Index of the next parser in {@link #_parsers}.
- */
- protected int _nextParser;
-
- /*
- *******************************************************
- * Construction
- *******************************************************
- */
-
- protected JsonParserSequence(JsonParser[] parsers)
- {
- super(parsers[0]);
- _parsers = parsers;
- _nextParser = 1;
- }
-
- /**
- * Method that will construct a parser (possibly a sequence) that
- * contains all given sub-parsers.
- * All parsers given are checked to see if they are sequences: and
- * if so, they will be "flattened", that is, contained parsers are
- * directly added in a new sequence instead of adding sequences
- * within sequences. This is done to minimize delegation depth,
- * ideally only having just a single level of delegation.
- */
- public static JsonParserSequence createFlattened(JsonParser first, JsonParser second)
- {
- if (!(first instanceof JsonParserSequence || second instanceof JsonParserSequence)) {
- // simple:
- return new JsonParserSequence(new JsonParser[] { first, second });
- }
- ArrayList p = new ArrayList();
- if (first instanceof JsonParserSequence) {
- ((JsonParserSequence) first).addFlattenedActiveParsers(p);
- } else {
- p.add(first);
- }
- if (second instanceof JsonParserSequence) {
- ((JsonParserSequence) second).addFlattenedActiveParsers(p);
- } else {
- p.add(second);
- }
- return new JsonParserSequence(p.toArray(new JsonParser[p.size()]));
- }
-
- @SuppressWarnings("resource")
- protected void addFlattenedActiveParsers(List result)
- {
- for (int i = _nextParser-1, len = _parsers.length; i < len; ++i) {
- JsonParser p = _parsers[i];
- if (p instanceof JsonParserSequence) {
- ((JsonParserSequence) p).addFlattenedActiveParsers(result);
- } else {
- result.add(p);
- }
- }
- }
-
- /*
- *******************************************************
- * Overridden methods, needed: cases where default
- * delegation does not work
- *******************************************************
- */
-
- @Override
- public void close() throws IOException
- {
- do {
- delegate.close();
- } while (switchToNext());
- }
-
- @Override
- public JsonToken nextToken() throws IOException, JsonParseException
- {
- JsonToken t = delegate.nextToken();
- if (t != null) return t;
- while (switchToNext()) {
- t = delegate.nextToken();
- if (t != null) return t;
- }
- return null;
- }
-
- /*
- /*******************************************************
- /* Additional extended API
- /*******************************************************
- */
-
- /**
- * Method that is most useful for debugging or testing;
- * returns actual number of underlying parsers sequence
- * was constructed with (nor just ones remaining active)
- */
- public int containedParsersCount() {
- return _parsers.length;
- }
-
- /*
- /*******************************************************
- /* Helper methods
- /*******************************************************
- */
-
- /**
- * Method that will switch active parser from the current one
- * to next parser in sequence, if there is another parser left,
- * making this the new delegate. Old delegate is returned if
- * switch succeeds.
- *
- * @return True if switch succeeded; false otherwise
- */
- protected boolean switchToNext()
- {
- if (_nextParser >= _parsers.length) {
- return false;
- }
- delegate = _parsers[_nextParser++];
- return true;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/MinimalPrettyPrinter.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/MinimalPrettyPrinter.java
deleted file mode 100644
index 60108924f..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/MinimalPrettyPrinter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.JsonGenerationException;
-import com.fr.third.fasterxml.jackson.core.JsonGenerator;
-import com.fr.third.fasterxml.jackson.core.PrettyPrinter;
-
-/**
- * {@link PrettyPrinter} implementation that adds no indentation,
- * just implements everything necessary for value output to work
- * as expected, and provide simpler extension points to allow
- * for creating simple custom implementations that add specific
- * decoration or overrides. Since behavior then is very similar
- * to using no pretty printer at all, usually sub-classes are used.
- *
- * Beyond purely minimal implementation, there is limited amount of
- * configurability which may be useful for actual use: for example,
- * it is possible to redefine separator used between root-level
- * values (default is single space; can be changed to line-feed).
- *
- * Note: does NOT implement {@link Instantiatable} since this is
- * a stateless implementation; that is, a single instance can be
- * shared between threads.
- */
-public class MinimalPrettyPrinter
- implements PrettyPrinter, java.io.Serializable
-{
- private static final long serialVersionUID = -562765100295218442L;
-
- /**
- * Default String used for separating root values is single space.
- */
- public final static String DEFAULT_ROOT_VALUE_SEPARATOR = " ";
-
- protected String _rootValueSeparator = DEFAULT_ROOT_VALUE_SEPARATOR;
-
- /*
- /**********************************************************
- /* Life-cycle, construction, configuration
- /**********************************************************
- */
-
- public MinimalPrettyPrinter() {
- this(DEFAULT_ROOT_VALUE_SEPARATOR);
- }
-
- public MinimalPrettyPrinter(String rootValueSeparator) {
- _rootValueSeparator = rootValueSeparator;
- }
-
- public void setRootValueSeparator(String sep) {
- _rootValueSeparator = sep;
- }
-
- /*
- /**********************************************************
- /* PrettyPrinter impl
- /**********************************************************
- */
-
- @Override
- public void writeRootValueSeparator(JsonGenerator jg) throws IOException, JsonGenerationException
- {
- if (_rootValueSeparator != null) {
- jg.writeRaw(_rootValueSeparator);
- }
- }
-
- @Override
- public void writeStartObject(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw('{');
- }
-
- @Override
- public void beforeObjectEntries(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- // nothing special, since no indentation is added
- }
-
- /**
- * Method called after an object field has been output, but
- * before the value is output.
- *
- * Default handling will just output a single
- * colon to separate the two, without additional spaces.
- */
- @Override
- public void writeObjectFieldValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(':');
- }
-
- /**
- * Method called after an object entry (field:value) has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate the two.
- */
- @Override
- public void writeObjectEntrySeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(',');
- }
-
- @Override
- public void writeEndObject(JsonGenerator jg, int nrOfEntries)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw('}');
- }
-
- @Override
- public void writeStartArray(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw('[');
- }
-
- @Override
- public void beforeArrayValues(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- // nothing special, since no indentation is added
- }
-
- /**
- * Method called after an array value has been completely
- * output, and before another value is to be output.
- *
- * Default handling (without pretty-printing) will output a single
- * comma to separate values.
- */
- @Override
- public void writeArrayValueSeparator(JsonGenerator jg)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(',');
- }
-
- @Override
- public void writeEndArray(JsonGenerator jg, int nrOfValues)
- throws IOException, JsonGenerationException
- {
- jg.writeRaw(']');
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/TextBuffer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/TextBuffer.java
deleted file mode 100644
index 9a0900d40..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/TextBuffer.java
+++ /dev/null
@@ -1,704 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-
-import com.fr.third.fasterxml.jackson.core.io.NumberInput;
-
-/**
- * TextBuffer is a class similar to {@link StringBuffer}, with
- * following differences:
- *
- * TextBuffer uses segments character arrays, to avoid having
- * to do additional array copies when array is not big enough.
- * This means that only reallocating that is necessary is done only once:
- * if and when caller
- * wants to access contents in a linear array (char[], String).
- *
-* TextBuffer can also be initialized in "shared mode", in which
-* it will just act as a wrapper to a single char array managed
-* by another object (like parser that owns it)
- *
- * TextBuffer is not synchronized.
- *
- *
- */
-public final class TextBuffer
-{
- final static char[] NO_CHARS = new char[0];
-
- /**
- * Let's start with sizable but not huge buffer, will grow as necessary
- */
- final static int MIN_SEGMENT_LEN = 1000;
-
- /**
- * Let's limit maximum segment length to something sensible
- * like 256k
- */
- final static int MAX_SEGMENT_LEN = 0x40000;
-
- /*
- /**********************************************************
- /* Configuration:
- /**********************************************************
- */
-
- private final BufferRecycler _allocator;
-
- /*
- /**********************************************************
- /* Shared input buffers
- /**********************************************************
- */
-
- /**
- * Shared input buffer; stored here in case some input can be returned
- * as is, without being copied to collector's own buffers. Note that
- * this is read-only for this Object.
- */
- private char[] _inputBuffer;
-
- /**
- * Character offset of first char in input buffer; -1 to indicate
- * that input buffer currently does not contain any useful char data
- */
- private int _inputStart;
-
- private int _inputLen;
-
- /*
- /**********************************************************
- /* Aggregation segments (when not using input buf)
- /**********************************************************
- */
-
- /**
- * List of segments prior to currently active segment.
- */
- private ArrayList _segments;
-
- /**
- * Flag that indicates whether _seqments is non-empty
- */
- private boolean _hasSegments = false;
-
- // // // Currently used segment; not (yet) contained in _seqments
-
- /**
- * Amount of characters in segments in {@link _segments}
- */
- private int _segmentSize;
-
- private char[] _currentSegment;
-
- /**
- * Number of characters in currently active (last) segment
- */
- private int _currentSize;
-
- /*
- /**********************************************************
- /* Caching of results
- /**********************************************************
- */
-
- /**
- * String that will be constructed when the whole contents are
- * needed; will be temporarily stored in case asked for again.
- */
- private String _resultString;
-
- private char[] _resultArray;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public TextBuffer(BufferRecycler allocator) {
- _allocator = allocator;
- }
-
- /**
- * Method called to indicate that the underlying buffers should now
- * be recycled if they haven't yet been recycled. Although caller
- * can still use this text buffer, it is not advisable to call this
- * method if that is likely, since next time a buffer is needed,
- * buffers need to reallocated.
- * Note: calling this method automatically also clears contents
- * of the buffer.
- */
- public void releaseBuffers()
- {
- if (_allocator == null) {
- resetWithEmpty();
- } else {
- if (_currentSegment != null) {
- // First, let's get rid of all but the largest char array
- resetWithEmpty();
- // And then return that array
- char[] buf = _currentSegment;
- _currentSegment = null;
- _allocator.releaseCharBuffer(BufferRecycler.CharBufferType.TEXT_BUFFER, buf);
- }
- }
- }
-
- /**
- * Method called to clear out any content text buffer may have, and
- * initializes buffer to use non-shared data.
- */
- public void resetWithEmpty()
- {
- _inputStart = -1; // indicates shared buffer not used
- _currentSize = 0;
- _inputLen = 0;
-
- _inputBuffer = null;
- _resultString = null;
- _resultArray = null;
-
- // And then reset internal input buffers, if necessary:
- if (_hasSegments) {
- clearSegments();
- }
- }
-
- /**
- * Method called to initialize the buffer with a shared copy of data;
- * this means that buffer will just have pointers to actual data. It
- * also means that if anything is to be appended to the buffer, it
- * will first have to unshare it (make a local copy).
- */
- public void resetWithShared(char[] buf, int start, int len)
- {
- // First, let's clear intermediate values, if any:
- _resultString = null;
- _resultArray = null;
-
- // Then let's mark things we need about input buffer
- _inputBuffer = buf;
- _inputStart = start;
- _inputLen = len;
-
- // And then reset internal input buffers, if necessary:
- if (_hasSegments) {
- clearSegments();
- }
- }
-
- public void resetWithCopy(char[] buf, int start, int len)
- {
- _inputBuffer = null;
- _inputStart = -1; // indicates shared buffer not used
- _inputLen = 0;
-
- _resultString = null;
- _resultArray = null;
-
- // And then reset internal input buffers, if necessary:
- if (_hasSegments) {
- clearSegments();
- } else if (_currentSegment == null) {
- _currentSegment = buf(len);
- }
- _currentSize = _segmentSize = 0;
- append(buf, start, len);
- }
-
- public void resetWithString(String value)
- {
- _inputBuffer = null;
- _inputStart = -1;
- _inputLen = 0;
-
- _resultString = value;
- _resultArray = null;
-
- if (_hasSegments) {
- clearSegments();
- }
- _currentSize = 0;
-
- }
-
- /**
- * Helper method used to find a buffer to use, ideally one
- * recycled earlier.
- */
- private char[] buf(int needed)
- {
- if (_allocator != null) {
- return _allocator.allocCharBuffer(BufferRecycler.CharBufferType.TEXT_BUFFER, needed);
- }
- return new char[Math.max(needed, MIN_SEGMENT_LEN)];
- }
-
- private void clearSegments()
- {
- _hasSegments = false;
- /* Let's start using _last_ segment from list; for one, it's
- * the biggest one, and it's also most likely to be cached
- */
- /* 28-Aug-2009, tatu: Actually, the current segment should
- * be the biggest one, already
- */
- //_currentSegment = _segments.get(_segments.size() - 1);
- _segments.clear();
- _currentSize = _segmentSize = 0;
- }
-
- /*
- /**********************************************************
- /* Accessors for implementing public interface
- /**********************************************************
- */
-
- /**
- * @return Number of characters currently stored by this collector
- */
- public int size() {
- if (_inputStart >= 0) { // shared copy from input buf
- return _inputLen;
- }
- if (_resultArray != null) {
- return _resultArray.length;
- }
- if (_resultString != null) {
- return _resultString.length();
- }
- // local segmented buffers
- return _segmentSize + _currentSize;
- }
-
- public int getTextOffset() {
- /* Only shared input buffer can have non-zero offset; buffer
- * segments start at 0, and if we have to create a combo buffer,
- * that too will start from beginning of the buffer
- */
- return (_inputStart >= 0) ? _inputStart : 0;
- }
-
- /**
- * Method that can be used to check whether textual contents can
- * be efficiently accessed using {@link #getTextBuffer}.
- */
- public boolean hasTextAsCharacters()
- {
- // if we have array in some form, sure
- if (_inputStart >= 0 || _resultArray != null) return true;
- // not if we have String as value
- if (_resultString != null) return false;
- return true;
- }
-
- public char[] getTextBuffer()
- {
- // Are we just using shared input buffer?
- if (_inputStart >= 0) return _inputBuffer;
- if (_resultArray != null) return _resultArray;
- if (_resultString != null) {
- return (_resultArray = _resultString.toCharArray());
- }
- // Nope; but does it fit in just one segment?
- if (!_hasSegments) return _currentSegment;
- // Nope, need to have/create a non-segmented array and return it
- return contentsAsArray();
- }
-
- /*
- /**********************************************************
- /* Other accessors:
- /**********************************************************
- */
-
- public String contentsAsString()
- {
- if (_resultString == null) {
- // Has array been requested? Can make a shortcut, if so:
- if (_resultArray != null) {
- _resultString = new String(_resultArray);
- } else {
- // Do we use shared array?
- if (_inputStart >= 0) {
- if (_inputLen < 1) {
- return (_resultString = "");
- }
- _resultString = new String(_inputBuffer, _inputStart, _inputLen);
- } else { // nope... need to copy
- // But first, let's see if we have just one buffer
- int segLen = _segmentSize;
- int currLen = _currentSize;
-
- if (segLen == 0) { // yup
- _resultString = (currLen == 0) ? "" : new String(_currentSegment, 0, currLen);
- } else { // no, need to combine
- StringBuilder sb = new StringBuilder(segLen + currLen);
- // First stored segments
- if (_segments != null) {
- for (int i = 0, len = _segments.size(); i < len; ++i) {
- char[] curr = _segments.get(i);
- sb.append(curr, 0, curr.length);
- }
- }
- // And finally, current segment:
- sb.append(_currentSegment, 0, _currentSize);
- _resultString = sb.toString();
- }
- }
- }
- }
- return _resultString;
- }
-
- public char[] contentsAsArray() {
- char[] result = _resultArray;
- if (result == null) {
- _resultArray = result = resultArray();
- }
- return result;
- }
-
- /**
- * Convenience method for converting contents of the buffer
- * into a {@link BigDecimal}.
- */
- public BigDecimal contentsAsDecimal() throws NumberFormatException
- {
- // Already got a pre-cut array?
- if (_resultArray != null) {
- return NumberInput.parseBigDecimal(_resultArray);
- }
- // Or a shared buffer?
- if ((_inputStart >= 0) && (_inputBuffer != null)) {
- return NumberInput.parseBigDecimal(_inputBuffer, _inputStart, _inputLen);
- }
- // Or if not, just a single buffer (the usual case)
- if ((_segmentSize == 0) && (_currentSegment != null)) {
- return NumberInput.parseBigDecimal(_currentSegment, 0, _currentSize);
- }
- // If not, let's just get it aggregated...
- return NumberInput.parseBigDecimal(contentsAsArray());
- }
-
- /**
- * Convenience method for converting contents of the buffer
- * into a Double value.
- */
- public double contentsAsDouble() throws NumberFormatException {
- return NumberInput.parseDouble(contentsAsString());
- }
-
- /*
- /**********************************************************
- /* Public mutators:
- /**********************************************************
- */
-
- /**
- * Method called to make sure that buffer is not using shared input
- * buffer; if it is, it will copy such contents to private buffer.
- */
- public void ensureNotShared() {
- if (_inputStart >= 0) {
- unshare(16);
- }
- }
-
- public void append(char c) {
- // Using shared buffer so far?
- if (_inputStart >= 0) {
- unshare(16);
- }
- _resultString = null;
- _resultArray = null;
- // Room in current segment?
- char[] curr = _currentSegment;
- if (_currentSize >= curr.length) {
- expand(1);
- curr = _currentSegment;
- }
- curr[_currentSize++] = c;
- }
-
- public void append(char[] c, int start, int len)
- {
- // Can't append to shared buf (sanity check)
- if (_inputStart >= 0) {
- unshare(len);
- }
- _resultString = null;
- _resultArray = null;
-
- // Room in current segment?
- char[] curr = _currentSegment;
- int max = curr.length - _currentSize;
-
- if (max >= len) {
- System.arraycopy(c, start, curr, _currentSize, len);
- _currentSize += len;
- return;
- }
- // No room for all, need to copy part(s):
- if (max > 0) {
- System.arraycopy(c, start, curr, _currentSize, max);
- start += max;
- len -= max;
- }
- /* And then allocate new segment; we are guaranteed to now
- * have enough room in segment.
- */
- // Except, as per [Issue-24], not for HUGE appends... so:
- do {
- expand(len);
- int amount = Math.min(_currentSegment.length, len);
- System.arraycopy(c, start, _currentSegment, 0, amount);
- _currentSize += amount;
- start += amount;
- len -= amount;
- } while (len > 0);
- }
-
- public void append(String str, int offset, int len)
- {
- // Can't append to shared buf (sanity check)
- if (_inputStart >= 0) {
- unshare(len);
- }
- _resultString = null;
- _resultArray = null;
-
- // Room in current segment?
- char[] curr = _currentSegment;
- int max = curr.length - _currentSize;
- if (max >= len) {
- str.getChars(offset, offset+len, curr, _currentSize);
- _currentSize += len;
- return;
- }
- // No room for all, need to copy part(s):
- if (max > 0) {
- str.getChars(offset, offset+max, curr, _currentSize);
- len -= max;
- offset += max;
- }
- /* And then allocate new segment; we are guaranteed to now
- * have enough room in segment.
- */
- // Except, as per [Issue-24], not for HUGE appends... so:
- do {
- expand(len);
- int amount = Math.min(_currentSegment.length, len);
- str.getChars(offset, offset+amount, _currentSegment, 0);
- _currentSize += amount;
- offset += amount;
- len -= amount;
- } while (len > 0);
- }
-
- /*
- /**********************************************************
- /* Raw access, for high-performance use:
- /**********************************************************
- */
-
- public char[] getCurrentSegment()
- {
- /* Since the intention of the caller is to directly add stuff into
- * buffers, we should NOT have anything in shared buffer... ie. may
- * need to unshare contents.
- */
- if (_inputStart >= 0) {
- unshare(1);
- } else {
- char[] curr = _currentSegment;
- if (curr == null) {
- _currentSegment = buf(0);
- } else if (_currentSize >= curr.length) {
- // Plus, we better have room for at least one more char
- expand(1);
- }
- }
- return _currentSegment;
- }
-
- public char[] emptyAndGetCurrentSegment()
- {
- // inlined 'resetWithEmpty()'
- _inputStart = -1; // indicates shared buffer not used
- _currentSize = 0;
- _inputLen = 0;
-
- _inputBuffer = null;
- _resultString = null;
- _resultArray = null;
-
- // And then reset internal input buffers, if necessary:
- if (_hasSegments) {
- clearSegments();
- }
- char[] curr = _currentSegment;
- if (curr == null) {
- _currentSegment = curr = buf(0);
- }
- return curr;
- }
-
- public int getCurrentSegmentSize() { return _currentSize; }
- public void setCurrentLength(int len) { _currentSize = len; }
-
- public char[] finishCurrentSegment() {
- if (_segments == null) {
- _segments = new ArrayList();
- }
- _hasSegments = true;
- _segments.add(_currentSegment);
- int oldLen = _currentSegment.length;
- _segmentSize += oldLen;
- // Let's grow segments by 50%
- int newLen = Math.min(oldLen + (oldLen >> 1), MAX_SEGMENT_LEN);
- char[] curr = carr(newLen);
- _currentSize = 0;
- _currentSegment = curr;
- return curr;
- }
-
- /**
- * Method called to expand size of the current segment, to
- * accommodate for more contiguous content. Usually only
- * used when parsing tokens like names if even then.
- */
- public char[] expandCurrentSegment()
- {
- final char[] curr = _currentSegment;
- // Let's grow by 50%
- final int len = curr.length;
- // Must grow by at least 1 char, no matter what
- int newLen = (len == MAX_SEGMENT_LEN) ? (MAX_SEGMENT_LEN+1) : Math.min(MAX_SEGMENT_LEN, len + (len >> 1));
- return (_currentSegment = ArraysCompat.copyOf(curr, newLen));
- }
-
- /**
- * Method called to expand size of the current segment, to
- * accommodate for more contiguous content. Usually only
- * used when parsing tokens like names if even then.
- *
- * @param minSize Required minimum strength of the current segment
- *
- * @since 2.4.0
- */
- public char[] expandCurrentSegment(int minSize) {
- char[] curr = _currentSegment;
- if (curr.length >= minSize) return curr;
- _currentSegment = curr = ArraysCompat.copyOf(curr, minSize);
- return curr;
- }
-
- /*
- /**********************************************************
- /* Standard methods:
- /**********************************************************
- */
-
- /**
- * Note: calling this method may not be as efficient as calling
- * {@link #contentsAsString}, since it's not guaranteed that resulting
- * String is cached.
- */
- @Override public String toString() { return contentsAsString(); }
-
- /*
- /**********************************************************
- /* Internal methods:
- /**********************************************************
- */
-
- /**
- * Method called if/when we need to append content when we have been
- * initialized to use shared buffer.
- */
- private void unshare(int needExtra)
- {
- int sharedLen = _inputLen;
- _inputLen = 0;
- char[] inputBuf = _inputBuffer;
- _inputBuffer = null;
- int start = _inputStart;
- _inputStart = -1;
-
- // Is buffer big enough, or do we need to reallocate?
- int needed = sharedLen+needExtra;
- if (_currentSegment == null || needed > _currentSegment.length) {
- _currentSegment = buf(needed);
- }
- if (sharedLen > 0) {
- System.arraycopy(inputBuf, start, _currentSegment, 0, sharedLen);
- }
- _segmentSize = 0;
- _currentSize = sharedLen;
- }
-
- /**
- * Method called when current segment is full, to allocate new
- * segment.
- */
- private void expand(int minNewSegmentSize)
- {
- // First, let's move current segment to segment list:
- if (_segments == null) {
- _segments = new ArrayList();
- }
- char[] curr = _currentSegment;
- _hasSegments = true;
- _segments.add(curr);
- _segmentSize += curr.length;
- int oldLen = curr.length;
- // Let's grow segments by 50% minimum
- int sizeAddition = oldLen >> 1;
- if (sizeAddition < minNewSegmentSize) {
- sizeAddition = minNewSegmentSize;
- }
- _currentSize = 0;
- _currentSegment = carr(Math.min(MAX_SEGMENT_LEN, oldLen + sizeAddition));
- }
-
- private char[] resultArray()
- {
- if (_resultString != null) { // Can take a shortcut...
- return _resultString.toCharArray();
- }
- // Do we use shared array?
- if (_inputStart >= 0) {
- final int len = _inputLen;
- if (len < 1) {
- return NO_CHARS;
- }
- final int start = _inputStart;
- if (start == 0) {
- return ArraysCompat.copyOf(_inputBuffer, len);
- }
- return ArraysCompat.copyOfRange(_inputBuffer, start, start+len);
- }
- // nope, not shared
- int size = size();
- if (size < 1) {
- return NO_CHARS;
- }
- int offset = 0;
- final char[] result = carr(size);
- if (_segments != null) {
- for (int i = 0, len = _segments.size(); i < len; ++i) {
- char[] curr = (char[]) _segments.get(i);
- int currLen = curr.length;
- System.arraycopy(curr, 0, result, offset, currLen);
- offset += currLen;
- }
- }
- System.arraycopy(_currentSegment, 0, result, offset, _currentSize);
- return result;
- }
-
- private char[] carr(int len) { return new char[len]; }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/VersionUtil.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/VersionUtil.java
deleted file mode 100644
index b9aba4df1..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/VersionUtil.java
+++ /dev/null
@@ -1,216 +0,0 @@
-package com.fr.third.fasterxml.jackson.core.util;
-
-import java.io.*;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
-import com.fr.third.fasterxml.jackson.core.Version;
-import com.fr.third.fasterxml.jackson.core.Versioned;
-
-/**
- * Functionality for supporting exposing of component {@link Version}s.
- * Also contains other misc methods that have no other place to live in.
- *
- * Note that this class can be used in two roles: first, as a static
- * utility class for loading purposes, and second, as a singleton
- * loader of per-module version information.
- *
- * Note that method for accessing version information changed between versions
- * 2.1 and 2.2; earlier code used file named "VERSION.txt"; but this has serious
- * performance issues on some platforms (Android), so a replacement system
- * was implemented to use class generation and dynamic class loading.
- */
-public class VersionUtil
-{
- private final static Pattern VERSION_SEPARATOR = Pattern.compile("[-_./;:]");
-
- private final Version _version;
-
- /*
- /**********************************************************
- /* Instance life-cycle
- /**********************************************************
- */
-
- protected VersionUtil()
- {
- Version v = null;
- try {
- /* Class we pass only matters for resource-loading: can't use this Class
- * (as it's just being loaded at this point), nor anything that depends on it.
- */
- v = VersionUtil.versionFor(getClass());
- } catch (Exception e) { // not good to dump to stderr; but that's all we have at this low level
- System.err.println("ERROR: Failed to load Version information from "+getClass());
- }
- if (v == null) {
- v = Version.unknownVersion();
- }
- _version = v;
- }
-
- public Version version() { return _version; }
-
- /*
- /**********************************************************
- /* Static load methods
- /**********************************************************
- */
-
- /**
- * Helper method that will try to load version information for specified
- * class. Implementation is as follows:
- *
- * First, tries to load version info from a class named
- * "PackageVersion" in the same package as the class.
- *
- * Next, if that fails, class loader that loaded specified class is
- * asked to load resource with name "VERSION" from same location
- * (package) as class itself had.
- *
- * If no version information is found, {@link Version#unknownVersion()} is returned.
- */
- @SuppressWarnings("resource")
- public static Version versionFor(Class> cls)
- {
- Version packageVersion = packageVersionFor(cls);
- if (packageVersion != null) {
- return packageVersion;
- }
- final InputStream in = cls.getResourceAsStream("VERSION.txt");
- if (in == null) {
- return Version.unknownVersion();
- }
- try {
- InputStreamReader reader = new InputStreamReader(in, "UTF-8");
- return doReadVersion(reader);
- } catch (UnsupportedEncodingException e) {
- return Version.unknownVersion();
- } finally {
- _close(in);
- }
- }
-
- /**
- * Loads version information by introspecting a class named
- * "PackageVersion" in the same package as the given class.
- *
- * If the class could not be found or does not have a public
- * static Version field named "VERSION", returns null.
- */
- public static Version packageVersionFor(Class> cls)
- {
- try {
- String versionInfoClassName = cls.getPackage().getName() + ".PackageVersion";
- Class> vClass = Class.forName(versionInfoClassName, true, cls.getClassLoader());
- // However, if class exists, it better work correctly, no swallowing exceptions
- try {
- return ((Versioned) vClass.newInstance()).version();
- } catch (Exception e) {
- throw new IllegalArgumentException("Failed to get Versioned out of "+vClass);
- }
- } catch (Exception e) { // ok to be missing (not good, acceptable)
- return null;
- }
- }
-
- private static Version doReadVersion(final Reader reader)
- {
- String version = null, group = null, artifact = null;
-
- final BufferedReader br = new BufferedReader(reader);
- try {
- version = br.readLine();
- if (version != null) {
- group = br.readLine();
- if (group != null) {
- artifact = br.readLine();
- }
- }
- } catch (IOException ignored) {
- } finally {
- _close(br);
- }
- // We don't trim() version: parseVersion() takes care ot that
- if (group != null) {
- group = group.trim();
- }
- if (artifact != null) {
- artifact = artifact.trim();
- }
- return parseVersion(version, group, artifact);
- }
-
- /**
- * Will attempt to load the maven version for the given groupId and
- * artifactId. Maven puts a pom.properties file in
- * META-INF/maven/groupId/artifactId, containing the groupId,
- * artifactId and version of the library.
- *
- * @param classLoader the ClassLoader to load the pom.properties file from
- * @param groupId the groupId of the library
- * @param artifactId the artifactId of the library
- * @return The version
- */
- @SuppressWarnings("resource")
- public static Version mavenVersionFor(ClassLoader classLoader, String groupId, String artifactId)
- {
- InputStream pomProperties = classLoader.getResourceAsStream("META-INF/maven/"
- + groupId.replaceAll("\\.", "/")+ "/" + artifactId + "/pom.properties");
- if (pomProperties != null) {
- try {
- Properties props = new Properties();
- props.load(pomProperties);
- String versionStr = props.getProperty("version");
- String pomPropertiesArtifactId = props.getProperty("artifactId");
- String pomPropertiesGroupId = props.getProperty("groupId");
- return parseVersion(versionStr, pomPropertiesGroupId, pomPropertiesArtifactId);
- } catch (IOException e) {
- // Ignore
- } finally {
- _close(pomProperties);
- }
- }
- return Version.unknownVersion();
- }
-
- public static Version parseVersion(String versionStr, String groupId, String artifactId)
- {
- if (versionStr != null && (versionStr = versionStr.trim()).length() > 0) {
- String[] parts = VERSION_SEPARATOR.split(versionStr);
- return new Version(parseVersionPart(parts[0]),
- (parts.length > 1) ? parseVersionPart(parts[1]) : 0,
- (parts.length > 2) ? parseVersionPart(parts[2]) : 0,
- (parts.length > 3) ? parts[3] : null,
- groupId, artifactId);
- }
- return null;
- }
-
- protected static int parseVersionPart(String partStr)
- {
- int number = 0;
- for (int i = 0, len = partStr.length(); i < len; ++i) {
- char c = partStr.charAt(i);
- if (c > '9' || c < '0') break;
- number = (number * 10) + (c - '0');
- }
- return number;
- }
-
- private final static void _close(Closeable c) {
- try {
- c.close();
- } catch (IOException e) { }
- }
-
- /*
- /**********************************************************
- /* Orphan utility methods
- /**********************************************************
- */
-
- public final static void throwInternal() {
- throw new RuntimeException("Internal error: this code path should never get executed");
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/package-info.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/package-info.java
deleted file mode 100644
index 3404c9569..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/core/util/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Utility classes used by Jackson Core functionality.
- */
-package com.fr.third.fasterxml.jackson.core.util;
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AbstractTypeResolver.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AbstractTypeResolver.java
deleted file mode 100644
index 5450b8779..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AbstractTypeResolver.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-
-/**
- * Defines interface for resolvers that can resolve abstract types into concrete
- * ones; either by using static mappings, or possibly by materializing
- * implementations dynamically.
- */
-public abstract class AbstractTypeResolver
-{
- /**
- * Try to locate a subtype for given abstract type, to either resolve
- * to a concrete type, or at least to a more-specific (and hopefully supported)
- * abstract type, one which may have registered deserializers.
- * Method is called before trying to locate registered deserializers
- * (as well as standard abstract type defaulting that core Jackson does),
- * so it is typically implemented to add custom mappings of common abstract
- * types (like specify which concrete implementation to use for binding
- * {@link java.util.List}s).
- *
- * Note that this method does not necessarily have to do full resolution
- * of bindings; that is, it is legal to return type that could be further
- * resolved: caller is expected to keep calling this method on registered
- * resolvers, until a concrete type is located.
- *
- * @param config Configuration in use; should always be of type
- * DeserializationConfig
- */
- public JavaType findTypeMapping(DeserializationConfig config, JavaType type) {
- return null;
- }
-
- /**
- * Method called to try to resolve an abstract type into
- * concrete type (usually for purposes of deserializing),
- * when no concrete implementation was found.
- * It will be called after checking all other possibilities,
- * including defaulting.
- *
- * @param config Configuration in use; should always be of type
- * DeserializationConfig
- * @param type Type for which materialization maybe needed
- *
- * @return Resolved concrete type (which should retain generic
- * type parameters of input type, if any), if resolution succeeds;
- * null if resolver does not know how to resolve type
- */
- public JavaType resolveAbstractType(DeserializationConfig config,
- JavaType type) {
- return null;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AnnotationIntrospector.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AnnotationIntrospector.java
deleted file mode 100644
index ddff1790a..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/AnnotationIntrospector.java
+++ /dev/null
@@ -1,1113 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.lang.annotation.Annotation;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.annotation.JsonFormat;
-import com.fr.third.fasterxml.jackson.annotation.JsonInclude;
-
-import com.fr.third.fasterxml.jackson.core.Version;
-import com.fr.third.fasterxml.jackson.core.Versioned;
-
-import com.fr.third.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
-import com.fr.third.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fr.third.fasterxml.jackson.databind.cfg.MapperConfig;
-import com.fr.third.fasterxml.jackson.databind.deser.ValueInstantiator;
-import com.fr.third.fasterxml.jackson.databind.introspect.*;
-import com.fr.third.fasterxml.jackson.databind.jsontype.NamedType;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
-import com.fr.third.fasterxml.jackson.databind.util.Converter;
-import com.fr.third.fasterxml.jackson.databind.util.NameTransformer;
-
-/**
- * Abstract class that defines API used for introspecting annotation-based
- * configuration for serialization and deserialization. Separated
- * so that different sets of annotations can be supported, and support
- * plugged-in dynamically.
- *
- * NOTE: due to rapid addition of new methods (and changes to existing methods),
- * it is strongly recommended that custom implementations should not directly
- * extend this class, but rather extend {@link NopAnnotationIntrospector}.
- * This way added methods will not break backwards compatibility of custom annotation
- * introspectors.
- */
-@SuppressWarnings("serial")
-public abstract class AnnotationIntrospector
- implements Versioned, java.io.Serializable
-{
- /*
- /**********************************************************
- /* Helper types
- /**********************************************************
- */
-
- /**
- * Value type used with managed and back references; contains type and
- * logic name, used to link related references
- */
- public static class ReferenceProperty
- {
- public enum Type {
- /**
- * Reference property that Jackson manages and that is serialized normally (by serializing
- * reference object), but is used for resolving back references during
- * deserialization.
- * Usually this can be defined by using
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonManagedReference}
- */
- MANAGED_REFERENCE
-
- /**
- * Reference property that Jackson manages by suppressing it during serialization,
- * and reconstructing during deserialization.
- * Usually this can be defined by using
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonBackReference}
- */
- ,BACK_REFERENCE
- ;
- }
-
- private final Type _type;
- private final String _name;
-
- public ReferenceProperty(Type t, String n) {
- _type = t;
- _name = n;
- }
-
- public static ReferenceProperty managed(String name) { return new ReferenceProperty(Type.MANAGED_REFERENCE, name); }
- public static ReferenceProperty back(String name) { return new ReferenceProperty(Type.BACK_REFERENCE, name); }
-
- public Type getType() { return _type; }
- public String getName() { return _name; }
-
- public boolean isManagedReference() { return _type == Type.MANAGED_REFERENCE; }
- public boolean isBackReference() { return _type == Type.BACK_REFERENCE; }
- }
-
- /*
- /**********************************************************
- /* Factory methods
- /**********************************************************
- */
-
- /**
- * Factory method for accessing "no operation" implementation
- * of introspector: instance that will never find any annotation-based
- * configuration.
- */
- public static AnnotationIntrospector nopInstance() {
- return NopAnnotationIntrospector.instance;
- }
-
- public static AnnotationIntrospector pair(AnnotationIntrospector a1, AnnotationIntrospector a2) {
- return new AnnotationIntrospectorPair(a1, a2);
- }
-
- /*
- /**********************************************************
- /* Access to possibly chained introspectors (1.7)
- /**********************************************************
- */
-
- /**
- * Method that can be used to collect all "real" introspectors that
- * this introspector contains, if any; or this introspector
- * if it is not a container. Used to get access to all container
- * introspectors in their priority order.
- *
- * Default implementation returns a Singleton list with this introspector
- * as contents.
- * This usually works for sub-classes, except for proxy or delegating "container
- * introspectors" which need to override implementation.
- */
- public Collection allIntrospectors() {
- return Collections.singletonList(this);
- }
-
- /**
- * Method that can be used to collect all "real" introspectors that
- * this introspector contains, if any; or this introspector
- * if it is not a container. Used to get access to all container
- * introspectors in their priority order.
- *
- * Default implementation adds this introspector in result; this usually
- * works for sub-classes, except for proxy or delegating "container
- * introspectors" which need to override implementation.
- */
- public Collection allIntrospectors(Collection result) {
- result.add(this);
- return result;
- }
-
- /*
- /**********************************************************
- /* Default Versioned impl
- /**********************************************************
- */
-
- @Override
- public abstract Version version();
-
- /*
- /**********************************************************
- /* Meta-annotations (annotations for annotation types)
- /**********************************************************
- */
-
- /**
- * Method for checking whether given annotation is considered an
- * annotation bundle: if so, all meta-annotations it has will
- * be used instead of annotation ("bundle") itself.
- *
- * @since 2.0
- */
- public boolean isAnnotationBundle(Annotation ann) {
- return false;
- }
-
- /*
- /**********************************************************
- /* General annotations (for classes, properties)
- /**********************************************************
- */
-
- /**
- * Method for checking whether given annotated thing
- * (type, or accessor) indicates that values
- * referenced (values of type of annotated class, or
- * values referenced by annotated property; latter
- * having precedence) should include Object Identifier,
- * and if so, specify details of Object Identity used.
- *
- * @since 2.0
- */
- public ObjectIdInfo findObjectIdInfo(Annotated ann) {
- return null;
- }
-
- /**
- * Method for figuring out additional properties of an Object Identity reference
- *
- * @since 2.1
- */
- public ObjectIdInfo findObjectReferenceInfo(Annotated ann, ObjectIdInfo objectIdInfo) {
- return objectIdInfo;
- }
-
- /*
- /**********************************************************
- /* General class annotations
- /**********************************************************
- */
-
- /**
- * Method for locating name used as "root name" (for use by
- * some serializers when outputting root-level object -- mostly
- * for XML compatibility purposes) for given class, if one
- * is defined. Returns null if no declaration found; can return
- * explicit empty String, which is usually ignored as well as null.
- *
- * NOTE: method signature changed in 2.1, to return {@link PropertyName}
- * instead of String.
- */
- public PropertyName findRootName(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * Method for finding list of properties to ignore for given class
- * (null is returned if not specified).
- * List of property names is applied
- * after other detection mechanisms, to filter out these specific
- * properties from being serialized and deserialized.
- */
- public String[] findPropertiesToIgnore(Annotated ac) {
- return null;
- }
-
- /**
- * Method for checking whether an annotation indicates that all unknown properties
- */
- public Boolean findIgnoreUnknownProperties(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * Method for checking whether properties that have specified type
- * (class, not generics aware) should be completely ignored for
- * serialization and deserialization purposes.
- *
- * @param ac Type to check
- *
- * @return Boolean.TRUE if properties of type should be ignored;
- * Boolean.FALSE if they are not to be ignored, null for default
- * handling (which is 'do not ignore')
- */
- public Boolean isIgnorableType(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * @deprecated Since 2.3: use the one that takes generic {@link Annotated}
- */
- @Deprecated
- public Object findFilterId(AnnotatedClass ac) {
- return findFilterId((Annotated) ac);
- }
-
- /**
- * Method for finding if annotated class has associated filter; and if so,
- * to return id that is used to locate filter.
- *
- * @return Id of the filter to use for filtering properties of annotated
- * class, if any; or null if none found.
- */
- public Object findFilterId(Annotated ann) {
- return null;
- }
-
- /**
- * Method for finding {@link PropertyNamingStrategy} for given
- * class, if any specified by annotations; and if so, either return
- * a {@link PropertyNamingStrategy} instance, or Class to use for
- * creating instance
- *
- * @return Sub-class or instance of {@link PropertyNamingStrategy}, if one
- * is specified for given class; null if not.
- *
- * @since 2.1
- */
- public Object findNamingStrategy(AnnotatedClass ac) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Property auto-detection
- /**********************************************************
- */
-
- /**
- * Method for checking if annotations indicate changes to minimum visibility levels
- * needed for auto-detecting property elements (fields, methods, constructors).
- * A baseline checker is given, and introspector is to either return it as is
- * (if no annotations are found), or build and return a derived instance (using
- * checker's build methods).
- */
- public VisibilityChecker> findAutoDetectVisibility(AnnotatedClass ac,
- VisibilityChecker> checker) {
- return checker;
- }
-
- /*
- /**********************************************************
- /* Class annotations for Polymorphic type handling (1.5+)
- /**********************************************************
- */
-
- /**
- * Method for checking if given class has annotations that indicate
- * that specific type resolver is to be used for handling instances.
- * This includes not only
- * instantiating resolver builder, but also configuring it based on
- * relevant annotations (not including ones checked with a call to
- * {@link #findSubtypes}
- *
- * @param config Configuration settings in effect (for serialization or deserialization)
- * @param ac Annotated class to check for annotations
- * @param baseType Base java type of value for which resolver is to be found
- *
- * @return Type resolver builder for given type, if one found; null if none
- */
- public TypeResolverBuilder> findTypeResolver(MapperConfig> config,
- AnnotatedClass ac, JavaType baseType) {
- return null;
- }
-
- /**
- * Method for checking if given property entity (field or method) has annotations
- * that indicate that specific type resolver is to be used for handling instances.
- * This includes not only
- * instantiating resolver builder, but also configuring it based on
- * relevant annotations (not including ones checked with a call to
- * {@link #findSubtypes}
- *
- * @param config Configuration settings in effect (for serialization or deserialization)
- * @param am Annotated member (field or method) to check for annotations
- * @param baseType Base java type of property for which resolver is to be found
- *
- * @return Type resolver builder for properties of given entity, if one found;
- * null if none
- */
- public TypeResolverBuilder> findPropertyTypeResolver(MapperConfig> config,
- AnnotatedMember am, JavaType baseType) {
- return null;
- }
-
- /**
- * Method for checking if given structured property entity (field or method that
- * has nominal value of Map, Collection or array type) has annotations
- * that indicate that specific type resolver is to be used for handling type
- * information of contained values.
- * This includes not only
- * instantiating resolver builder, but also configuring it based on
- * relevant annotations (not including ones checked with a call to
- * {@link #findSubtypes}
- *
- * @param config Configuration settings in effect (for serialization or deserialization)
- * @param am Annotated member (field or method) to check for annotations
- * @param containerType Type of property for which resolver is to be found (must be a container type)
- *
- * @return Type resolver builder for values contained in properties of given entity,
- * if one found; null if none
- */
- public TypeResolverBuilder> findPropertyContentTypeResolver(MapperConfig> config,
- AnnotatedMember am, JavaType containerType) {
- return null;
- }
-
- /**
- * Method for locating annotation-specified subtypes related to annotated
- * entity (class, method, field). Note that this is only guaranteed to be
- * a list of directly
- * declared subtypes, no recursive processing is guarantees (i.e. caller
- * has to do it if/as necessary)
- *
- * @param a Annotated entity (class, field/method) to check for annotations
- */
- public List findSubtypes(Annotated a) {
- return null;
- }
-
- /**
- * Method for checking if specified type has explicit name.
- *
- * @param ac Class to check for type name annotations
- */
- public String findTypeName(AnnotatedClass ac) {
- return null;
- }
-
- /*
- /**********************************************************
- /* General member (field, method/constructor) annotations
- /**********************************************************
- */
-
- /**
- * Method for checking if given member indicates that it is part
- * of a reference (parent/child).
- */
- public ReferenceProperty findReferenceType(AnnotatedMember member) {
- return null;
- }
-
- /**
- * Method called to check whether given property is marked to be "unwrapped"
- * when being serialized (and appropriately handled in reverse direction,
- * i.e. expect unwrapped representation during deserialization).
- * Return value is the name transformation to use, if wrapping/unwrapping
- * should be done, or null if not -- note that transformation may simply
- * be identity transformation (no changes).
- */
- public NameTransformer findUnwrappingNameTransformer(AnnotatedMember member) {
- return null;
- }
-
- /**
- * Method called to check whether given property is marked to
- * be ignored. This is used to determine whether to ignore
- * properties, on per-property basis, usually combining
- * annotations from multiple accessors (getters, setters, fields,
- * constructor parameters).
- */
- public boolean hasIgnoreMarker(AnnotatedMember m) {
- return false;
- }
-
- /**
- * Method called to find out whether given member expectes a value
- * to be injected, and if so, what is the identifier of the value
- * to use during injection.
- * Type if identifier needs to be compatible with provider of
- * values (of type {@link InjectableValues}); often a simple String
- * id is used.
- *
- * @param m Member to check
- *
- * @return Identifier of value to inject, if any; null if no injection
- * indicator is found
- */
- public Object findInjectableValueId(AnnotatedMember m) {
- return null;
- }
-
- /**
- * Method that can be called to check whether this member has
- * an annotation that suggests whether value for matching property
- * is required or not.
- *
- * @since 2.0
- */
- public Boolean hasRequiredMarker(AnnotatedMember m) {
- return null;
- }
-
- /**
- * Method for checking if annotated property (represented by a field or
- * getter/setter method) has definitions for views it is to be included in.
- * If null is returned, no view definitions exist and property is always
- * included (or always excluded as per default view inclusion configuration);
- * otherwise it will only be included for views included in returned
- * array. View matches are checked using class inheritance rules (sub-classes
- * inherit inclusions of super-classes)
- *
- * @param a Annotated property (represented by a method, field or ctor parameter)
- * @return Array of views (represented by classes) that the property is included in;
- * if null, always included (same as returning array containing Object.class
)
- */
- public Class>[] findViews(Annotated a) {
- return null;
- }
-
- /**
- * Method for finding format annotations for property or class.
- * Return value is typically used by serializers and/or
- * deserializers to customize presentation aspects of the
- * serialized value.
- *
- * @since 2.1
- */
- public JsonFormat.Value findFormat(Annotated memberOrClass) {
- return null;
- }
-
- /**
- * Method for checking whether given accessor claims to represent
- * type id: if so, its value may be used as an override,
- * instead of generated type id.
- *
- * @since 2.0
- */
- public Boolean isTypeId(AnnotatedMember member) {
- return null;
- }
-
-
- /**
- * Method used to check if specified property has annotation that indicates
- * that it should be wrapped in an element; and if so, name to use.
- * Note that not all serializers and deserializers support use this method:
- * currently (2.1) it is only used by XML-backed handlers.
- *
- * @return Wrapper name to use, if any, or {@link PropertyName#USE_DEFAULT}
- * to indicate that no wrapper element should be used.
- *
- * @since 2.1
- */
- public PropertyName findWrapperName(Annotated ann) {
- return null;
- }
-
- /**
- * Method used to check whether specified property member (accessor
- * or mutator) defines human-readable description to use for documentation.
- * There are no further definitions for contents; for example, whether
- * these may be marked up using HTML is not defined.
- *
- * @return Human-readable description, if any.
- *
- * @since 2.3
- */
- public String findPropertyDescription(Annotated ann) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Serialization: general annotations
- /**********************************************************
- */
-
- /**
- * Method for getting a serializer definition on specified method
- * or field. Type of definition is either instance (of type
- * {@link JsonSerializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findSerializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for getting a serializer definition for keys of associated Map
property.
- * Type of definition is either instance (of type
- * {@link JsonSerializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findKeySerializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for getting a serializer definition for content (values) of
- * associated Collection
, array
or Map
property.
- * Type of definition is either instance (of type
- * {@link JsonSerializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findContentSerializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for getting a serializer definition for serializer to use
- * for nulls (null values) of associated property or type.
- *
- * @since 2.3
- */
- public Object findNullSerializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for checking whether given annotated entity (class, method,
- * field) defines which Bean/Map properties are to be included in
- * serialization.
- * If no annotation is found, method should return given second
- * argument; otherwise value indicated by the annotation
- *
- * @return Enumerated value indicating which properties to include
- * in serialization
- */
- public JsonInclude.Include findSerializationInclusion(Annotated a, JsonInclude.Include defValue) {
- return defValue;
- }
-
- /**
- * Method for accessing annotated type definition that a
- * method/field can have, to be used as the type for serialization
- * instead of the runtime type.
- * Type returned (if any) needs to be widening conversion (super-type).
- * Declared return type of the method is also considered acceptable.
- *
- * @return Class to use instead of runtime type
- */
- public Class> findSerializationType(Annotated a) {
- return null;
- }
-
- /**
- * Method for finding possible widening type definition that a property
- * value can have, to define less specific key type to use for serialization.
- * It should be only be used with {@link java.util.Map} types.
- *
- * @return Class specifying more general type to use instead of
- * declared type, if annotation found; null if not
- */
- public Class> findSerializationKeyType(Annotated am, JavaType baseType) {
- return null;
- }
-
- /**
- * Method for finding possible widening type definition that a property
- * value can have, to define less specific key type to use for serialization.
- * It should be only used with structured types (arrays, collections, maps).
- *
- * @return Class specifying more general type to use instead of
- * declared type, if annotation found; null if not
- */
- public Class> findSerializationContentType(Annotated am, JavaType baseType) {
- return null;
- }
-
- /**
- * Method for accessing declared typing mode annotated (if any).
- * This is used for type detection, unless more granular settings
- * (such as actual exact type; or serializer to use which means
- * no type information is needed) take precedence.
- *
- * @return Typing mode to use, if annotation is found; null otherwise
- */
- public JsonSerialize.Typing findSerializationTyping(Annotated a) {
- return null;
- }
-
- /**
- * Method for finding {@link Converter} that annotated entity
- * (property or class) has indicated to be used as part of
- * serialization. If not null, either has to be actual
- * {@link Converter} instance, or class for such converter;
- * and resulting converter will be used first to convert property
- * value to converter target type, and then serializer for that
- * type is used for actual serialization.
- *
- * This feature is typically used to convert internal values into types
- * that Jackson can convert.
- *
- * Note also that this feature does not necessarily work well with polymorphic
- * type handling, or object identity handling; if such features are needed
- * an explicit serializer is usually better way to handle serialization.
- *
- * @param a Annotated property (field, method) or class to check for
- * annotations
- *
- * @since 2.2
- */
- public Object findSerializationConverter(Annotated a) {
- return null;
- }
-
- /**
- * Method for finding {@link Converter} that annotated property
- * has indicated needs to be used for values of container type
- * (this also means that method should only be called for properties
- * of container types, List/Map/array properties).
- *
- * If not null, either has to be actual
- * {@link Converter} instance, or class for such converter;
- * and resulting converter will be used first to convert property
- * value to converter target type, and then serializer for that
- * type is used for actual serialization.
- *
- * Other notes are same as those for {@link #findSerializationConverter}
- *
- * @param a Annotated property (field, method) to check.
- *
- * @since 2.2
- */
- public Object findSerializationContentConverter(AnnotatedMember a) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Serialization: class annotations
- /**********************************************************
- */
-
- /**
- * Method for accessing defined property serialization order (which may be
- * partial). May return null if no ordering is defined.
- */
- public String[] findSerializationPropertyOrder(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * Method for checking whether an annotation indicates that serialized properties
- * for which no explicit is defined should be alphabetically (lexicograpically)
- * ordered
- */
- public Boolean findSerializationSortAlphabetically(AnnotatedClass ac) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Serialization: property annotations
- /**********************************************************
- */
-
- /**
- * Method for checking whether given property accessors (method,
- * field) has an annotation that suggests property name to use
- * for serialization.
- * Should return null if no annotation
- * is found; otherwise a non-null name (possibly
- * {@link PropertyName#USE_DEFAULT}, which means "use default heuristics").
- *
- * @param a Property accessor to check
- *
- * @return Name to use if found; null if not.
- *
- * @since 2.1
- */
- public PropertyName findNameForSerialization(Annotated a)
- {
- // [Issue#69], need bit of delegation
- // !!! TODO: in 2.2, remove old methods?
- String name;
- if (a instanceof AnnotatedField) {
- name = findSerializationName((AnnotatedField) a);
- } else if (a instanceof AnnotatedMethod) {
- name = findSerializationName((AnnotatedMethod) a);
- } else {
- name = null;
- }
- if (name != null) {
- if (name.length() == 0) { // empty String means 'default'
- return PropertyName.USE_DEFAULT;
- }
- return new PropertyName(name);
- }
- return null;
- }
-
- /**
- * Method for checking whether given method has an annotation
- * that suggests property name associated with method that
- * may be a "getter". Should return null if no annotation
- * is found; otherwise a non-null String.
- * If non-null value is returned, it is used as the property
- * name, except for empty String ("") which is taken to mean
- * "use standard bean name detection if applicable;
- * method name if not".
- *
- * @deprecated Since 2.1 should use {@link #findNameForSerialization} instead
- */
- @Deprecated
- public String findSerializationName(AnnotatedMethod am) {
- return null;
- }
-
- /**
- * Method for checking whether given member field represent
- * a serializable logical property; and if so, returns the
- * name of that property.
- * Should return null if no annotation is found (indicating it
- * is not a serializable field); otherwise a non-null String.
- * If non-null value is returned, it is used as the property
- * name, except for empty String ("") which is taken to mean
- * "use the field name as is".
- *
- * @deprecated Since 2.1 should use {@link #findNameForSerialization} instead
- */
- @Deprecated
- public String findSerializationName(AnnotatedField af) {
- return null;
- }
-
- /**
- * Method for checking whether given method has an annotation
- * that suggests that the return value of annotated method
- * should be used as "the value" of the object instance; usually
- * serialized as a primitive value such as String or number.
- *
- * @return True if such annotation is found (and is not disabled);
- * false if no enabled annotation is found
- */
- public boolean hasAsValueAnnotation(AnnotatedMethod am) {
- return false;
- }
-
- /**
- * Method for determining the String value to use for serializing
- * given enumeration entry; used when serializing enumerations
- * as Strings (the standard method).
- *
- * @return Serialized enum value.
- */
- public String findEnumValue(Enum> value) {
- // as per [JACKSON-875], should use default here
- return value.name();
- }
- /*
- /**********************************************************
- /* Deserialization: general annotations
- /**********************************************************
- */
-
- /**
- * Method for getting a deserializer definition on specified method
- * or field.
- * Type of definition is either instance (of type
- * {@link JsonDeserializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findDeserializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for getting a deserializer definition for keys of
- * associated Map
property.
- * Type of definition is either instance (of type
- * {@link JsonDeserializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findKeyDeserializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for getting a deserializer definition for content (values) of
- * associated Collection
, array
or
- * Map
property.
- * Type of definition is either instance (of type
- * {@link JsonDeserializer}) or Class (of type
- * Class
); if value of different
- * type is returned, a runtime exception may be thrown by caller.
- */
- public Object findContentDeserializer(Annotated am) {
- return null;
- }
-
- /**
- * Method for accessing annotated type definition that a
- * method can have, to be used as the type for serialization
- * instead of the runtime type.
- * Type must be a narrowing conversion
- * (i.e.subtype of declared type).
- * Declared return type of the method is also considered acceptable.
- *
- * @param baseType Assumed type before considering annotations
- *
- * @return Class to use for deserialization instead of declared type
- */
- public Class> findDeserializationType(Annotated am, JavaType baseType) {
- return null;
- }
-
- /**
- * Method for accessing additional narrowing type definition that a
- * method can have, to define more specific key type to use.
- * It should be only be used with {@link java.util.Map} types.
- *
- * @param baseKeyType Assumed key type before considering annotations
- *
- * @return Class specifying more specific type to use instead of
- * declared type, if annotation found; null if not
- */
- public Class> findDeserializationKeyType(Annotated am, JavaType baseKeyType) {
- return null;
- }
-
- /**
- * Method for accessing additional narrowing type definition that a
- * method can have, to define more specific content type to use;
- * content refers to Map values and Collection/array elements.
- * It should be only be used with Map, Collection and array types.
- *
- * @param baseContentType Assumed content (value) type before considering annotations
- *
- * @return Class specifying more specific type to use instead of
- * declared type, if annotation found; null if not
- */
- public Class> findDeserializationContentType(Annotated am, JavaType baseContentType) {
- return null;
- }
-
- /**
- * Method for finding {@link Converter} that annotated entity
- * (property or class) has indicated to be used as part of
- * deserialization.
- * If not null, either has to be actual
- * {@link Converter} instance, or class for such converter;
- * and resulting converter will be used after Jackson has deserializer
- * data into intermediate type (Converter input type), and Converter
- * needs to convert this into its target type to be set as property value.
- *
- * This feature is typically used to convert intermediate Jackson types
- * (that default deserializers can produce) into custom type instances.
- *
- * Note also that this feature does not necessarily work well with polymorphic
- * type handling, or object identity handling; if such features are needed
- * an explicit deserializer is usually better way to handle deserialization.
- *
- * @param a Annotated property (field, method) or class to check for
- * annotations
- *
- * @since 2.2
- */
- public Object findDeserializationConverter(Annotated a) {
- return null;
- }
-
- /**
- * Method for finding {@link Converter} that annotated property
- * has indicated needs to be used for values of container type
- * (this also means that method should only be called for properties
- * of container types, List/Map/array properties).
- *
- * If not null, either has to be actual
- * {@link Converter} instance, or class for such converter;
- * and resulting converter will be used after Jackson has deserializer
- * data into intermediate type (Converter input type), and Converter
- * needs to convert this into its target type to be set as property value.
- *
- * Other notes are same as those for {@link #findDeserializationConverter}
- *
- * @param a Annotated property (field, method) to check.
- *
- * @since 2.2
- */
- public Object findDeserializationContentConverter(AnnotatedMember a) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Deserialization: class annotations
- /**********************************************************
- */
-
- /**
- * Method getting {@link ValueInstantiator} to use for given
- * type (class): return value can either be an instance of
- * instantiator, or class of instantiator to create.
- */
- public Object findValueInstantiator(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * Method for finding Builder object to use for constructing
- * value instance and binding data (sort of combining value
- * instantiators that can construct, and deserializers
- * that can bind data).
- *
- * Note that unlike accessors for some helper Objects, this
- * method does not allow returning instances: the reason is
- * that builders have state, and a separate instance needs
- * to be created for each deserialization call.
- *
- * @since 2.0
- */
- public Class> findPOJOBuilder(AnnotatedClass ac) {
- return null;
- }
-
- /**
- * @since 2.0
- */
- public JsonPOJOBuilder.Value findPOJOBuilderConfig(AnnotatedClass ac) {
- return null;
- }
-
- /*
- /**********************************************************
- /* Deserialization: property annotations
- /**********************************************************
- */
-
- /**
- * Method for checking whether given property accessors (method,
- * field) has an annotation that suggests property name to use
- * for deserialization (reading JSON into POJOs).
- * Should return null if no annotation
- * is found; otherwise a non-null name (possibly
- * {@link PropertyName#USE_DEFAULT}, which means "use default heuristics").
- *
- * @param a Property accessor to check
- *
- * @return Name to use if found; null if not.
- *
- * @since 2.1
- */
- public PropertyName findNameForDeserialization(Annotated a)
- {
- // [Issue#69], need bit of delegation
- // !!! TODO: in 2.2, remove old methods?
- String name;
- if (a instanceof AnnotatedField) {
- name = findDeserializationName((AnnotatedField) a);
- } else if (a instanceof AnnotatedMethod) {
- name = findDeserializationName((AnnotatedMethod) a);
- } else if (a instanceof AnnotatedParameter) {
- name = findDeserializationName((AnnotatedParameter) a);
- } else {
- name = null;
- }
- if (name != null) {
- if (name.length() == 0) { // empty String means 'default'
- return PropertyName.USE_DEFAULT;
- }
- return new PropertyName(name);
- }
- return null;
- }
-
- /**
- * Method for checking whether given method has an annotation
- * that suggests property name associated with method that
- * may be a "setter". Should return null if no annotation
- * is found; otherwise a non-null String.
- * If non-null value is returned, it is used as the property
- * name, except for empty String ("") which is taken to mean
- * "use standard bean name detection if applicable;
- * method name if not".
- *
- * @deprecated Since 2.1 should use {@link #findNameForDeserialization} instead
- */
- @Deprecated
- public String findDeserializationName(AnnotatedMethod am) {
- return null;
- }
-
- /**
- * Method for checking whether given member field represent
- * a deserializable logical property; and if so, returns the
- * name of that property.
- * Should return null if no annotation is found (indicating it
- * is not a deserializable field); otherwise a non-null String.
- * If non-null value is returned, it is used as the property
- * name, except for empty String ("") which is taken to mean
- * "use the field name as is".
- *
- * @deprecated Since 2.1 should use {@link #findNameForDeserialization} instead
- */
- @Deprecated
- public String findDeserializationName(AnnotatedField af) {
- return null;
- }
-
- /**
- * Method for checking whether given set of annotations indicates
- * property name for associated parameter.
- * No actual parameter object can be passed since JDK offers no
- * representation; just annotations.
- *
- * @deprecated Since 2.1 should use {@link #findNameForDeserialization} instead
- */
- @Deprecated
- public String findDeserializationName(AnnotatedParameter param) {
- return null;
- }
-
- /**
- * Method for checking whether given method has an annotation
- * that suggests that the method is to serve as "any setter";
- * method to be used for setting values of any properties for
- * which no dedicated setter method is found.
- *
- * @return True if such annotation is found (and is not disabled),
- * false otherwise
- */
- public boolean hasAnySetterAnnotation(AnnotatedMethod am) {
- return false;
- }
-
- /**
- * Method for checking whether given method has an annotation
- * that suggests that the method is to serve as "any setter";
- * method to be used for accessing set of miscellaneous "extra"
- * properties, often bound with matching "any setter" method.
- *
- * @return True if such annotation is found (and is not disabled),
- * false otherwise
- */
- public boolean hasAnyGetterAnnotation(AnnotatedMethod am) {
- return false;
- }
-
- /**
- * Method for checking whether given annotated item (method, constructor)
- * has an annotation
- * that suggests that the method is a "creator" (aka factory)
- * method to be used for construct new instances of deserialized
- * values.
- *
- * @return True if such annotation is found (and is not disabled),
- * false otherwise
- */
- public boolean hasCreatorAnnotation(Annotated a) {
- return false;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanDescription.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanDescription.java
deleted file mode 100644
index e6bfc6190..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanDescription.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.annotation.JsonFormat;
-import com.fr.third.fasterxml.jackson.annotation.JsonInclude;
-import com.fr.third.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
-import com.fr.third.fasterxml.jackson.databind.introspect.*;
-import com.fr.third.fasterxml.jackson.databind.type.TypeBindings;
-import com.fr.third.fasterxml.jackson.databind.util.Annotations;
-import com.fr.third.fasterxml.jackson.databind.util.Converter;
-
-/**
- * Basic container for information gathered by {@link ClassIntrospector} to
- * help in constructing serializers and deserializers.
- * Note that the main implementation type is
- * {@link com.fr.third.fasterxml.jackson.databind.introspect.BasicBeanDescription},
- * meaning that it is safe to upcast to this type.
- */
-public abstract class BeanDescription
-{
- /*
- /**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Bean type information, including raw class and possible
- * * generics information
- */
- protected final JavaType _type;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected BeanDescription(JavaType type)
- {
- _type = type;
- }
-
- /*
- /**********************************************************
- /* Simple accesors
- /**********************************************************
- */
-
- /**
- * Method for accessing declared type of bean being introspected,
- * including full generic type information (from declaration)
- */
- public JavaType getType() { return _type; }
-
- public Class> getBeanClass() { return _type.getRawClass(); }
-
- /**
- * Method for accessing low-level information about Class this
- * item describes.
- */
- public abstract AnnotatedClass getClassInfo();
-
- /**
- * Accessor for getting information about Object Id expected to
- * be used for this POJO type, if any.
- */
- public abstract ObjectIdInfo getObjectIdInfo();
-
- /**
- * Method for checking whether class being described has any
- * annotations recognized by registered annotation introspector.
- */
- public abstract boolean hasKnownClassAnnotations();
-
- /**
- * Accessor for type bindings that may be needed to fully resolve
- * types of member object, such as return and argument types of
- * methods and constructors, and types of fields.
- */
- public abstract TypeBindings bindingsForBeanType();
-
- /**
- * Method for resolving given JDK type, using this bean as the
- * generic type resolution context.
- */
- public abstract JavaType resolveType(java.lang.reflect.Type jdkType);
-
- /**
- * Method for accessing collection of annotations the bean
- * class has.
- */
- public abstract Annotations getClassAnnotations();
-
- /*
- /**********************************************************
- /* Basic API for finding properties
- /**********************************************************
- */
-
- /**
- * @return Ordered Map with logical property name as key, and
- * matching getter method as value.
- */
- public abstract List findProperties();
-
- /**
- * Method for locating all back-reference properties (setters, fields) bean has
- */
- public abstract Map findBackReferenceProperties();
-
- public abstract Set getIgnoredPropertyNames();
-
- /*
- /**********************************************************
- /* Basic API for finding creator members
- /**********************************************************
- */
-
- public abstract List getConstructors();
-
- public abstract List getFactoryMethods();
-
- /**
- * Method that will locate the no-arg constructor for this class,
- * if it has one, and that constructor has not been marked as
- * ignorable.
- */
- public abstract AnnotatedConstructor findDefaultConstructor();
-
- /**
- * Method that can be called to locate a single-arg constructor that
- * takes specified exact type (will not accept supertype constructors)
- *
- * @param argTypes Type(s) of the argument that we are looking for
- */
- public abstract Constructor> findSingleArgConstructor(Class>... argTypes);
-
- /**
- * Method that can be called to find if introspected class declares
- * a static "valueOf" factory method that returns an instance of
- * introspected type, given one of acceptable types.
- *
- * @param expArgTypes Types that the matching single argument factory
- * method can take: will also accept super types of these types
- * (ie. arg just has to be assignable from expArgType)
- */
- public abstract Method findFactoryMethod(Class>... expArgTypes);
-
- /*
- /**********************************************************
- /* Basic API for finding property accessors
- /**********************************************************
- */
-
- public abstract AnnotatedMember findAnyGetter();
-
- /**
- * Method used to locate the method of introspected class that
- * implements {@link com.fr.third.fasterxml.jackson.annotation.JsonAnySetter}. If no such method exists
- * null is returned. If more than one are found, an exception
- * is thrown.
- * Additional checks are also made to see that method signature
- * is acceptable: needs to take 2 arguments, first one String or
- * Object; second any can be any type.
- */
- public abstract AnnotatedMethod findAnySetter();
-
- /**
- * Method for locating the getter method that is annotated with
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonValue} annotation,
- * if any. If multiple ones are found,
- * an error is reported by throwing {@link IllegalArgumentException}
- */
- public abstract AnnotatedMethod findJsonValueMethod();
-
- public abstract AnnotatedMethod findMethod(String name, Class>[] paramTypes);
-
- /*
- /**********************************************************
- /* Basic API, class configuration
- /**********************************************************
- */
-
- public abstract JsonInclude.Include findSerializationInclusion(JsonInclude.Include defValue);
-
- /**
- * Method for checking what is the expected format for POJO, as
- * defined by defaults and possible annotations.
- * Note that this may be further refined by per-property annotations.
- *
- * @since 2.1
- */
- public abstract JsonFormat.Value findExpectedFormat(JsonFormat.Value defValue);
-
- /**
- * Method for finding {@link Converter} used for serializing instances
- * of this class.
- *
- * @since 2.2
- */
- public abstract Converter findSerializationConverter();
-
- /**
- * Method for finding {@link Converter} used for serializing instances
- * of this class.
- *
- * @since 2.2
- */
- public abstract Converter findDeserializationConverter();
-
- /*
- /**********************************************************
- /* Basic API, other
- /**********************************************************
- */
-
- public abstract Map findInjectables();
-
- /**
- * Method for checking if the POJO type has annotations to
- * indicate that a builder is to be used for instantiating
- * instances and handling data binding, instead of standard
- * bean deserializer.
- */
- public abstract Class> findPOJOBuilder();
-
- /**
- * Method for finding configuration for POJO Builder class.
- */
- public abstract JsonPOJOBuilder.Value findPOJOBuilderConfig();
-
- /**
- * Method called to create a "default instance" of the bean, currently
- * only needed for obtaining default field values which may be used for
- * suppressing serialization of fields that have "not changed".
- *
- * @param fixAccess If true, method is allowed to fix access to the
- * default constructor (to be able to call non-public constructor);
- * if false, has to use constructor as is.
- *
- * @return Instance of class represented by this descriptor, if
- * suitable default constructor was found; null otherwise.
- */
- public abstract Object instantiateBean(boolean fixAccess);
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanProperty.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanProperty.java
deleted file mode 100644
index a1b152e82..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/BeanProperty.java
+++ /dev/null
@@ -1,222 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.lang.annotation.Annotation;
-
-import com.fr.third.fasterxml.jackson.databind.introspect.AnnotatedMember;
-import com.fr.third.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
-import com.fr.third.fasterxml.jackson.databind.util.Annotations;
-import com.fr.third.fasterxml.jackson.databind.util.Named;
-
-/**
- * Bean properties are logical entities that represent data
- * that Java objects (POJOs (Plain Old Java Objects), sometimes also called "beans")
- * contain; and that are accessed using accessors (methods like getters
- * and setters, fields, contstructor parametrers).
- * Instances allow access to annotations directly associated
- * to property (via field or method), as well as contextual
- * annotations (annotations for class that contains properties).
- *
- * Instances are not typically passed when constructing serializers
- * and deserializers, but rather only passed when context
- * is known when
- * {@link com.fr.third.fasterxml.jackson.databind.ser.ContextualSerializer} and
- * {@link com.fr.third.fasterxml.jackson.databind.deser.ContextualDeserializer}
- * resolution occurs (createContextual(...)
method is called).
- * References may (need to) be retained by serializers and deserializers,
- * especially when further resolving dependant handlers like value
- * serializers/deserializers or structured types.
- */
-public interface BeanProperty extends Named
-{
- /**
- * Method to get logical name of the property
- */
- @Override
- public String getName();
-
- /**
- * Method for getting full name definition, including possible
- * format-specific additional properties (such as namespace when
- * using XML backend).
- *
- * @since 2.3
- */
- public PropertyName getFullName();
-
- /**
- * Method to get declared type of the property.
- */
- public JavaType getType();
-
- /**
- * If property is indicated to be wrapped, name of
- * wrapper element to use.
- *
- * @since 2.2
- */
- public PropertyName getWrapperName();
-
- /**
- * Accessor for additional optional information about property.
- *
- * @since 2.3
- */
- public PropertyMetadata getMetadata();
-
- /**
- * Whether value for property is marked as required using
- * annotations or associated schema.
- *
- * @since 2.2
- */
- public boolean isRequired();
-
- /**
- * Method for finding annotation associated with this property;
- * meaning annotation associated with one of entities used to
- * access property.
- */
- public A getAnnotation(Class acls);
-
- /**
- * Method for finding annotation associated with context of
- * this property; usually class in which member is declared
- * (or its subtype if processing subtype).
- */
- public A getContextAnnotation(Class acls);
-
- /**
- * Method for accessing primary physical entity that represents the property;
- * annotated field, method or constructor property.
- */
- public AnnotatedMember getMember();
-
- /**
- * Method that can be called to visit the type structure that this
- * property is part of.
- * Note that not all implementations support traversal with this
- * method; those that do not should throw
- * {@link UnsupportedOperationException}.
- *
- * @param objectVisitor Visitor to used as the callback handler
- *
- * @since 2.2
- */
- public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
- throws JsonMappingException;
-
- /*
- /**********************************************************
- /* Helper classes
- /**********************************************************
- */
-
- /**
- * Simple stand-alone implementation, useful as a placeholder
- * or base class for more complex implementations.
- */
- public static class Std implements BeanProperty
- {
- protected final PropertyName _name;
- protected final JavaType _type;
- protected final PropertyName _wrapperName;
-
- protected final PropertyMetadata _metadata;
-
- /**
- * Physical entity (field, method or constructor argument) that
- * is used to access value of property (or in case of constructor
- * property, just placeholder)
- */
- protected final AnnotatedMember _member;
-
- /**
- * Annotations defined in the context class (if any); may be null
- * if no annotations were found
- */
- protected final Annotations _contextAnnotations;
-
- public Std(PropertyName name, JavaType type, PropertyName wrapperName,
- Annotations contextAnnotations, AnnotatedMember member,
- PropertyMetadata metadata)
- {
- _name = name;
- _type = type;
- _wrapperName = wrapperName;
- _metadata = metadata;
- _member = member;
- _contextAnnotations = contextAnnotations;
- }
-
- @Deprecated // since 2.3
- public Std(String name, JavaType type, PropertyName wrapperName,
- Annotations contextAnnotations, AnnotatedMember member,
- boolean isRequired)
- {
- this(new PropertyName(name), type, wrapperName, contextAnnotations,
- member,
- isRequired ? PropertyMetadata.STD_REQUIRED : PropertyMetadata.STD_OPTIONAL);
- }
-
- public Std withType(JavaType type) {
- return new Std(_name, type, _wrapperName, _contextAnnotations, _member, _metadata);
- }
-
- @Override
- public A getAnnotation(Class acls) {
- return (_member == null) ? null : _member.getAnnotation(acls);
- }
-
- @Override
- public A getContextAnnotation(Class acls) {
- return (_contextAnnotations == null) ? null : _contextAnnotations.get(acls);
- }
-
- @Override
- public String getName() {
- return _name.getSimpleName();
- }
-
- @Override
- public PropertyName getFullName() {
- return _name;
- }
-
- @Override
- public JavaType getType() {
- return _type;
- }
-
- @Override
- public PropertyName getWrapperName() {
- return _wrapperName;
- }
-
- @Override
- public boolean isRequired() {
- return _metadata.isRequired();
- }
-
- @Override
- public PropertyMetadata getMetadata() {
- return _metadata;
- }
-
- @Override
- public AnnotatedMember getMember() {
- return _member;
- }
-
- /**
- * Implementation of this method throws
- * {@link UnsupportedOperationException}, since instances of this
- * implementation should not be used as part of actual structure
- * visited. Rather, other implementations should handle it.
- */
- @Override
- public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor) {
- throw new UnsupportedOperationException("Instances of "+getClass().getName()
- +" should not get visited");
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DatabindContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DatabindContext.java
deleted file mode 100644
index 7acfbcf8d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DatabindContext.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.lang.reflect.Type;
-
-import com.fr.third.fasterxml.jackson.annotation.ObjectIdGenerator;
-
-import com.fr.third.fasterxml.jackson.databind.annotation.NoClass;
-import com.fr.third.fasterxml.jackson.databind.cfg.HandlerInstantiator;
-import com.fr.third.fasterxml.jackson.databind.cfg.MapperConfig;
-import com.fr.third.fasterxml.jackson.databind.introspect.Annotated;
-import com.fr.third.fasterxml.jackson.databind.introspect.ObjectIdInfo;
-import com.fr.third.fasterxml.jackson.databind.type.TypeFactory;
-import com.fr.third.fasterxml.jackson.databind.util.ClassUtil;
-import com.fr.third.fasterxml.jackson.databind.util.Converter;
-
-/**
- * Shared base class for {@link DeserializationContext} and
- * {@link SerializerProvider}, context objects passed through data-binding
- * process. Designed so that some of implementations can rely on shared
- * aspects like access to secondary contextual objects like type factories
- * or handler instantiators.
- *
- * @since 2.2
- */
-public abstract class DatabindContext
-{
- /*
- /**********************************************************
- /* Generic config access
- /**********************************************************
- */
-
- /**
- * Accessor to currently active configuration (both per-request configs
- * and per-mapper config).
- */
- public abstract MapperConfig> getConfig();
-
- /**
- * Convenience method for accessing serialization view in use (if any); equivalent to:
- *
- * getConfig().getAnnotationIntrospector();
- *
- */
- public abstract AnnotationIntrospector getAnnotationIntrospector();
-
- /*
- /**********************************************************
- /* Access to specific config settings
- /**********************************************************
- */
-
- /**
- * Convenience method for checking whether specified serialization
- * feature is enabled or not.
- * Shortcut for:
- *
- * getConfig().isEnabled(feature);
- *
- */
- public final boolean isEnabled(MapperFeature feature) {
- return getConfig().isEnabled(feature);
- }
-
- /**
- * Convenience method for accessing serialization view in use (if any); equivalent to:
- *
- * getConfig().canOverrideAccessModifiers();
- *
- */
- public final boolean canOverrideAccessModifiers() {
- return getConfig().canOverrideAccessModifiers();
- }
-
- /**
- * Accessor for locating currently active view, if any;
- * returns null if no view has been set.
- */
- public abstract Class> getActiveView();
-
- /*
- /**********************************************************
- /* Generic attributes (2.3+)
- /**********************************************************
- */
-
- /**
- * Method for accessing attributes available in this context.
- * Per-call attributes have highest precedence; attributes set
- * via {@link ObjectReader} or {@link ObjectWriter} have lower
- * precedence.
- *
- * @param key Key of the attribute to get
- * @return Value of the attribute, if any; null otherwise
- *
- * @since 2.3
- */
- public abstract Object getAttribute(Object key);
-
- /**
- * Method for setting per-call value of given attribute.
- * This will override any previously defined value for the
- * attribute within this context.
- *
- * @param key Key of the attribute to set
- * @param value Value to set attribute to
- *
- * @return This context object, to allow chaining
- *
- * @since 2.3
- */
- public abstract DatabindContext setAttribute(Object key, Object value);
-
- /*
- /**********************************************************
- /* Type instantiation/resolution
- /**********************************************************
- */
-
- /**
- * Convenience method for constructing {@link JavaType} for given JDK
- * type (usually {@link java.lang.Class})
- */
- public JavaType constructType(Type type) {
- return getTypeFactory().constructType(type);
- }
-
- /**
- * Convenience method for constructing subtypes, retaining generic
- * type parameter (if any)
- */
- public JavaType constructSpecializedType(JavaType baseType, Class> subclass) {
- // simple optimization to avoid costly introspection if type-erased type does NOT differ
- if (baseType.getRawClass() == subclass) {
- return baseType;
- }
- return getConfig().constructSpecializedType(baseType, subclass);
- }
-
- public abstract TypeFactory getTypeFactory();
-
- /*
- /**********************************************************
- /* Helper object construction
- /**********************************************************
- */
-
- public ObjectIdGenerator> objectIdGeneratorInstance(Annotated annotated,
- ObjectIdInfo objectIdInfo)
- throws JsonMappingException
- {
- Class> implClass = objectIdInfo.getGeneratorType();
- final MapperConfig> config = getConfig();
- HandlerInstantiator hi = config.getHandlerInstantiator();
- ObjectIdGenerator> gen = (hi == null) ? null : hi.objectIdGeneratorInstance(config, annotated, implClass);
- if (gen == null) {
- gen = (ObjectIdGenerator>) ClassUtil.createInstance(implClass,
- config.canOverrideAccessModifiers());
- }
- return gen.forScope(objectIdInfo.getScope());
- }
-
- /**
- * Helper method to use to construct a {@link Converter}, given a definition
- * that may be either actual converter instance, or Class for instantiating one.
- *
- * @since 2.2
- */
- @SuppressWarnings("unchecked")
- public Converter converterInstance(Annotated annotated,
- Object converterDef)
- throws JsonMappingException
- {
- if (converterDef == null) {
- return null;
- }
- if (converterDef instanceof Converter,?>) {
- return (Converter) converterDef;
- }
- if (!(converterDef instanceof Class)) {
- throw new IllegalStateException("AnnotationIntrospector returned Converter definition of type "
- +converterDef.getClass().getName()+"; expected type Converter or Class instead");
- }
- Class> converterClass = (Class>)converterDef;
- // there are some known "no class" markers to consider too:
- if (converterClass == Converter.None.class || converterClass == NoClass.class) {
- return null;
- }
- if (!Converter.class.isAssignableFrom(converterClass)) {
- throw new IllegalStateException("AnnotationIntrospector returned Class "
- +converterClass.getName()+"; expected Class");
- }
- final MapperConfig> config = getConfig();
- HandlerInstantiator hi = config.getHandlerInstantiator();
- Converter,?> conv = (hi == null) ? null : hi.converterInstance(config, annotated, converterClass);
- if (conv == null) {
- conv = (Converter,?>) ClassUtil.createInstance(converterClass,
- config.canOverrideAccessModifiers());
- }
- return (Converter) conv;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationConfig.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationConfig.java
deleted file mode 100644
index ae2065220..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationConfig.java
+++ /dev/null
@@ -1,566 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.text.DateFormat;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.annotation.*;
-import com.fr.third.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.cfg.BaseSettings;
-import com.fr.third.fasterxml.jackson.databind.cfg.ContextAttributes;
-import com.fr.third.fasterxml.jackson.databind.cfg.HandlerInstantiator;
-import com.fr.third.fasterxml.jackson.databind.cfg.MapperConfigBase;
-import com.fr.third.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
-import com.fr.third.fasterxml.jackson.databind.introspect.ClassIntrospector;
-import com.fr.third.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector;
-import com.fr.third.fasterxml.jackson.databind.introspect.VisibilityChecker;
-import com.fr.third.fasterxml.jackson.databind.jsontype.SubtypeResolver;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
-import com.fr.third.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fr.third.fasterxml.jackson.databind.type.ClassKey;
-import com.fr.third.fasterxml.jackson.databind.type.TypeFactory;
-import com.fr.third.fasterxml.jackson.databind.util.LinkedNode;
-
-/**
- * Object that contains baseline configuration for deserialization
- * process. An instance is owned by {@link ObjectMapper}, which
- * passes an immutable instance to be used for deserialization process.
- *
- * Note that instances are considered immutable and as such no copies
- * should need to be created for sharing; all copying is done with
- * "fluent factory" methods.
- * Note also that unlike with Jackson 1, these instances can not be
- * assigned to {@link ObjectMapper}; in fact, application code should
- * rarely interact directly with these instance (unlike core Jackson code)
- */
-public final class DeserializationConfig
- extends MapperConfigBase
- implements java.io.Serializable // since 2.1
-{
- // for 2.1.0
- private static final long serialVersionUID = -4227480407273773599L;
-
- /**
- * Set of features enabled; actual type (kind of features)
- * depends on sub-classes.
- */
- protected final int _deserFeatures;
-
- /**
- * Linked list that contains all registered problem handlers.
- * Implementation as front-added linked list allows for sharing
- * of the list (tail) without copying the list.
- */
- protected final LinkedNode _problemHandlers;
-
- /**
- * Factory used for constructing {@link com.fr.third.fasterxml.jackson.databind.JsonNode} instances.
- */
- protected final JsonNodeFactory _nodeFactory;
-
- /*
- /**********************************************************
- /* Life-cycle, constructors
- /**********************************************************
- */
-
- /**
- * Constructor used by ObjectMapper to create default configuration object instance.
- */
- public DeserializationConfig(BaseSettings base,
- SubtypeResolver str, Map> mixins)
- {
- super(base, str, mixins);
- _deserFeatures = collectFeatureDefaults(DeserializationFeature.class);
- _nodeFactory = JsonNodeFactory.instance;
- _problemHandlers = null;
- }
-
- /**
- * Copy constructor used to create a non-shared instance with given mix-in
- * annotation definitions and subtype resolver.
- */
- private DeserializationConfig(DeserializationConfig src, SubtypeResolver str)
- {
- super(src, str);
- _deserFeatures = src._deserFeatures;
- _nodeFactory = src._nodeFactory;
- _problemHandlers = src._problemHandlers;
- }
-
- private DeserializationConfig(DeserializationConfig src,
- int mapperFeatures, int deserFeatures)
- {
- super(src, mapperFeatures);
- _deserFeatures = deserFeatures;
- _nodeFactory = src._nodeFactory;
- _problemHandlers = src._problemHandlers;
- }
-
- private DeserializationConfig(DeserializationConfig src, BaseSettings base)
- {
- super(src, base);
- _deserFeatures = src._deserFeatures;
- _nodeFactory = src._nodeFactory;
- _problemHandlers = src._problemHandlers;
- }
-
- private DeserializationConfig(DeserializationConfig src, JsonNodeFactory f)
- {
- super(src);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = src._problemHandlers;
- _nodeFactory = f;
- }
-
- private DeserializationConfig(DeserializationConfig src,
- LinkedNode problemHandlers)
- {
- super(src);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = problemHandlers;
- _nodeFactory = src._nodeFactory;
- }
-
- private DeserializationConfig(DeserializationConfig src, String rootName)
- {
- super(src, rootName);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = src._problemHandlers;
- _nodeFactory = src._nodeFactory;
- }
-
- private DeserializationConfig(DeserializationConfig src, Class> view)
- {
- super(src, view);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = src._problemHandlers;
- _nodeFactory = src._nodeFactory;
- }
-
- /**
- * @since 2.1
- */
- protected DeserializationConfig(DeserializationConfig src, Map> mixins)
- {
- super(src, mixins);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = src._problemHandlers;
- _nodeFactory = src._nodeFactory;
- }
-
- /**
- * @since 2.3
- */
- protected DeserializationConfig(DeserializationConfig src, ContextAttributes attrs)
- {
- super(src, attrs);
- _deserFeatures = src._deserFeatures;
- _problemHandlers = src._problemHandlers;
- _nodeFactory = src._nodeFactory;
- }
-
- // for unit tests only:
- protected BaseSettings getBaseSettings() { return _base; }
-
- /*
- /**********************************************************
- /* Life-cycle, factory methods from MapperConfig
- /**********************************************************
- */
-
- @Override
- public DeserializationConfig with(MapperFeature... features)
- {
- int newMapperFlags = _mapperFeatures;
- for (MapperFeature f : features) {
- newMapperFlags |= f.getMask();
- }
- return (newMapperFlags == _mapperFeatures) ? this :
- new DeserializationConfig(this, newMapperFlags, _deserFeatures);
- }
-
- @Override
- public DeserializationConfig without(MapperFeature... features)
- {
- int newMapperFlags = _mapperFeatures;
- for (MapperFeature f : features) {
- newMapperFlags &= ~f.getMask();
- }
- return (newMapperFlags == _mapperFeatures) ? this :
- new DeserializationConfig(this, newMapperFlags, _deserFeatures);
- }
-
- @Override
- public DeserializationConfig with(MapperFeature feature, boolean state)
- {
- int newMapperFlags;
- if (state) {
- newMapperFlags = _mapperFeatures | feature.getMask();
- } else {
- newMapperFlags = _mapperFeatures & ~feature.getMask();
- }
- return (newMapperFlags == _mapperFeatures) ? this :
- new DeserializationConfig(this, newMapperFlags, _deserFeatures);
- }
-
- @Override
- public DeserializationConfig with(ClassIntrospector ci) {
- return _withBase(_base.withClassIntrospector(ci));
- }
-
- @Override
- public DeserializationConfig with(AnnotationIntrospector ai) {
- return _withBase(_base.withAnnotationIntrospector(ai));
- }
-
- @Override
- public DeserializationConfig with(VisibilityChecker> vc) {
- return _withBase(_base.withVisibilityChecker(vc));
- }
-
- @Override
- public DeserializationConfig withVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility) {
- return _withBase( _base.withVisibility(forMethod, visibility));
- }
-
- @Override
- public DeserializationConfig with(TypeResolverBuilder> trb) {
- return _withBase(_base.withTypeResolverBuilder(trb));
- }
-
- @Override
- public DeserializationConfig with(SubtypeResolver str) {
- return (_subtypeResolver == str) ? this : new DeserializationConfig(this, str);
- }
-
- @Override
- public DeserializationConfig with(PropertyNamingStrategy pns) {
- return _withBase(_base.withPropertyNamingStrategy(pns));
- }
-
- @Override
- public DeserializationConfig withRootName(String rootName) {
- if (rootName == null) {
- if (_rootName == null) {
- return this;
- }
- } else if (rootName.equals(_rootName)) {
- return this;
- }
- return new DeserializationConfig(this, rootName);
- }
-
- @Override
- public DeserializationConfig with(TypeFactory tf) {
- return _withBase( _base.withTypeFactory(tf));
- }
-
- @Override
- public DeserializationConfig with(DateFormat df) {
- return _withBase(_base.withDateFormat(df));
- }
-
- @Override
- public DeserializationConfig with(HandlerInstantiator hi) {
- return _withBase(_base.withHandlerInstantiator(hi));
- }
-
- @Override
- public DeserializationConfig withInsertedAnnotationIntrospector(AnnotationIntrospector ai) {
- return _withBase(_base.withInsertedAnnotationIntrospector(ai));
- }
-
- @Override
- public DeserializationConfig withAppendedAnnotationIntrospector(AnnotationIntrospector ai) {
- return _withBase(_base.withAppendedAnnotationIntrospector(ai));
- }
-
- @Override
- public DeserializationConfig withView(Class> view) {
- return (_view == view) ? this : new DeserializationConfig(this, view);
- }
-
- @Override
- public DeserializationConfig with(Locale l) {
- return _withBase(_base.with(l));
- }
-
- @Override
- public DeserializationConfig with(TimeZone tz) {
- return _withBase(_base.with(tz));
- }
-
- @Override
- public DeserializationConfig with(Base64Variant base64) {
- return _withBase(_base.with(base64));
- }
-
- @Override
- public DeserializationConfig with(ContextAttributes attrs) {
- return (attrs == _attributes) ? this : new DeserializationConfig(this, attrs);
- }
-
- private final DeserializationConfig _withBase(BaseSettings newBase) {
- return (_base == newBase) ? this : new DeserializationConfig(this, newBase);
- }
-
- /*
- /**********************************************************
- /* Life-cycle, deserialization-specific factory methods
- /**********************************************************
- */
-
- /**
- * Fluent factory method that will construct a new instance with
- * specified {@link JsonNodeFactory}
- */
- public DeserializationConfig with(JsonNodeFactory f) {
- if (_nodeFactory == f) {
- return this;
- }
- return new DeserializationConfig(this, f);
- }
-
- /**
- * Method that can be used to add a handler that can (try to)
- * resolve non-fatal deserialization problems.
- */
- public DeserializationConfig withHandler(DeserializationProblemHandler h)
- {
- // Sanity check: let's prevent adding same handler multiple times
- if (LinkedNode.contains(_problemHandlers, h)) {
- return this;
- }
- return new DeserializationConfig(this,
- new LinkedNode(h, _problemHandlers));
- }
-
- /**
- * Method for removing all configured problem handlers; usually done to replace
- * existing handler(s) with different one(s)
- */
- public DeserializationConfig withNoProblemHandlers() {
- if (_problemHandlers == null) {
- return this;
- }
- return new DeserializationConfig(this,
- (LinkedNode) null);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified features enabled.
- */
- public DeserializationConfig with(DeserializationFeature feature)
- {
- int newDeserFeatures = (_deserFeatures | feature.getMask());
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified features enabled.
- */
- public DeserializationConfig with(DeserializationFeature first,
- DeserializationFeature... features)
- {
- int newDeserFeatures = _deserFeatures | first.getMask();
- for (DeserializationFeature f : features) {
- newDeserFeatures |= f.getMask();
- }
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified features enabled.
- */
- public DeserializationConfig withFeatures(DeserializationFeature... features)
- {
- int newDeserFeatures = _deserFeatures;
- for (DeserializationFeature f : features) {
- newDeserFeatures |= f.getMask();
- }
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified feature disabled.
- */
- public DeserializationConfig without(DeserializationFeature feature)
- {
- int newDeserFeatures = _deserFeatures & ~feature.getMask();
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified features disabled.
- */
- public DeserializationConfig without(DeserializationFeature first,
- DeserializationFeature... features)
- {
- int newDeserFeatures = _deserFeatures & ~first.getMask();
- for (DeserializationFeature f : features) {
- newDeserFeatures &= ~f.getMask();
- }
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /**
- * Fluent factory method that will construct and return a new configuration
- * object instance with specified features disabled.
- */
- public DeserializationConfig withoutFeatures(DeserializationFeature... features)
- {
- int newDeserFeatures = _deserFeatures;
- for (DeserializationFeature f : features) {
- newDeserFeatures &= ~f.getMask();
- }
- return (newDeserFeatures == _deserFeatures) ? this :
- new DeserializationConfig(this, _mapperFeatures, newDeserFeatures);
- }
-
- /*
- /**********************************************************
- /* MapperConfig implementation
- /**********************************************************
- */
-
- /**
- * Method for getting {@link AnnotationIntrospector} configured
- * to introspect annotation values used for configuration.
- */
- @Override
- public AnnotationIntrospector getAnnotationIntrospector()
- {
- /* 29-Jul-2009, tatu: it's now possible to disable use of
- * annotations; can be done using "no-op" introspector
- */
- if (isEnabled(MapperFeature.USE_ANNOTATIONS)) {
- return super.getAnnotationIntrospector();
- }
- return NopAnnotationIntrospector.instance;
- }
-
- @Override
- public boolean useRootWrapping()
- {
- if (_rootName != null) { // empty String disables wrapping; non-empty enables
- return (_rootName.length() > 0);
- }
- return isEnabled(DeserializationFeature.UNWRAP_ROOT_VALUE);
- }
-
- /**
- * Accessor for getting bean description that only contains class
- * annotations: useful if no getter/setter/creator information is needed.
- */
- @Override
- public BeanDescription introspectClassAnnotations(JavaType type) {
- return getClassIntrospector().forClassAnnotations(this, type, this);
- }
-
- /**
- * Accessor for getting bean description that only contains immediate class
- * annotations: ones from the class, and its direct mix-in, if any, but
- * not from super types.
- */
- @Override
- public BeanDescription introspectDirectClassAnnotations(JavaType type) {
- return getClassIntrospector().forDirectClassAnnotations(this, type, this);
- }
-
- @Override
- public VisibilityChecker> getDefaultVisibilityChecker()
- {
- VisibilityChecker> vchecker = super.getDefaultVisibilityChecker();
- if (!isEnabled(MapperFeature.AUTO_DETECT_SETTERS)) {
- vchecker = vchecker.withSetterVisibility(Visibility.NONE);
- }
- if (!isEnabled(MapperFeature.AUTO_DETECT_CREATORS)) {
- vchecker = vchecker.withCreatorVisibility(Visibility.NONE);
- }
- if (!isEnabled(MapperFeature.AUTO_DETECT_FIELDS)) {
- vchecker = vchecker.withFieldVisibility(Visibility.NONE);
- }
- return vchecker;
- }
-
- public final boolean isEnabled(DeserializationFeature f) {
- return (_deserFeatures & f.getMask()) != 0;
- }
-
- /**
- * "Bulk" access method for checking that all features specified by
- * mask are enabled.
- *
- * @since 2.3
- */
- public final boolean hasDeserializationFeatures(int featureMask) {
- return (_deserFeatures & featureMask) == featureMask;
- }
-
- public final int getDeserializationFeatures() {
- return _deserFeatures;
- }
-
- /*
- /**********************************************************
- /* Other configuration
- /**********************************************************
- */
-
- /**
- * Method for getting head of the problem handler chain. May be null,
- * if no handlers have been added.
- */
- public LinkedNode getProblemHandlers() {
- return _problemHandlers;
- }
-
- public final JsonNodeFactory getNodeFactory() {
- return _nodeFactory;
- }
-
- /*
- /**********************************************************
- /* Introspection methods
- /**********************************************************
- */
-
- /**
- * Method that will introspect full bean properties for the purpose
- * of building a bean deserializer
- *
- * @param type Type of class to be introspected
- */
- @SuppressWarnings("unchecked")
- public T introspect(JavaType type) {
- return (T) getClassIntrospector().forDeserialization(this, type, this);
- }
-
- /**
- * Method that will introspect subset of bean properties needed to
- * construct bean instance.
- */
- @SuppressWarnings("unchecked")
- public T introspectForCreation(JavaType type) {
- return (T) getClassIntrospector().forCreation(this, type, this);
- }
-
- /**
- * @since 2.0
- */
- @SuppressWarnings("unchecked")
- public T introspectForBuilder(JavaType type) {
- return (T) getClassIntrospector().forDeserializationWithBuilder(this, type, this);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationContext.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationContext.java
deleted file mode 100644
index dd7b38ea6..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationContext.java
+++ /dev/null
@@ -1,858 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
-
-import com.fr.third.fasterxml.jackson.annotation.ObjectIdGenerator;
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.cfg.ContextAttributes;
-import com.fr.third.fasterxml.jackson.databind.deser.*;
-import com.fr.third.fasterxml.jackson.databind.deser.impl.ReadableObjectId;
-import com.fr.third.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer;
-import com.fr.third.fasterxml.jackson.databind.exc.InvalidFormatException;
-import com.fr.third.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
-import com.fr.third.fasterxml.jackson.databind.introspect.Annotated;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeDeserializer;
-import com.fr.third.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fr.third.fasterxml.jackson.databind.type.TypeFactory;
-import com.fr.third.fasterxml.jackson.databind.util.*;
-
-/**
- * Context for the process of deserialization a single root-level value.
- * Used to allow passing in configuration settings and reusable temporary
- * objects (scrap arrays, containers).
- *
- * Instance life-cycle is such that an partially configured "blueprint" object
- * is registered with {@link ObjectMapper} (and {@link ObjectReader},
- * and when an actual instance is needed for deserialization,
- * a fully configured instance will
- * be created using a method in excented API of sub-class
- * ({@link com.fr.third.fasterxml.jackson.databind.deser.DefaultDeserializationContext#createInstance}).
- * Each instance is guaranteed to only be used from single-threaded context;
- * instances may be reused iff no configuration has changed.
- *
- * Defined as abstract class so that implementations must define methods
- * for reconfiguring blueprints and creating instances.
- */
-public abstract class DeserializationContext
- extends DatabindContext
- implements java.io.Serializable
-{
- private static final long serialVersionUID = -7727373309391091315L;
-
- /**
- * Let's limit length of error messages, for cases where underlying data
- * may be very large -- no point in spamming logs with megs of meaningless
- * data.
- */
- private final static int MAX_ERROR_STR_LEN = 500;
-
- /*
- /**********************************************************
- /* Configuration, immutable
- /**********************************************************
- */
-
- /**
- * Object that handle details of {@link JsonDeserializer} caching.
- */
- protected final DeserializerCache _cache;
-
- /*
- /**********************************************************
- /* Configuration, changeable via fluent factories
- /**********************************************************
- */
-
- /**
- * Read-only factory instance; exposed to let
- * owners (ObjectMapper
, ObjectReader
)
- * access it.
- */
- protected final DeserializerFactory _factory;
-
- /*
- /**********************************************************
- /* Configuration that gets set for instances (not blueprints)
- /* (partly denormalized for performance)
- /**********************************************************
- */
-
- /**
- * Generic deserialization processing configuration
- */
- protected final DeserializationConfig _config;
-
- /**
- * Bitmap of {@link DeserializationFeature}s that are enabled
- */
- protected final int _featureFlags;
-
- /**
- * Currently active view, if any.
- */
- protected final Class> _view;
-
- /**
- * Currently active parser used for deserialization.
- * May be different from the outermost parser
- * when content is buffered.
- */
- protected transient JsonParser _parser;
-
- /**
- * Object used for resolving references to injectable
- * values.
- */
- protected final InjectableValues _injectableValues;
-
- /*
- /**********************************************************
- /* Per-operation reusable helper objects (not for blueprints)
- /**********************************************************
- */
-
- protected transient ArrayBuilders _arrayBuilders;
-
- protected transient ObjectBuffer _objectBuffer;
-
- protected transient DateFormat _dateFormat;
-
- /**
- * Lazily-constructed holder for per-call attributes.
- *
- * @since 2.3
- */
- protected transient ContextAttributes _attributes;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- protected DeserializationContext(DeserializerFactory df) {
- this(df, null);
- }
-
- protected DeserializationContext(DeserializerFactory df,
- DeserializerCache cache)
- {
- if (df == null) {
- throw new IllegalArgumentException("Can not pass null DeserializerFactory");
- }
- _factory = df;
- _cache = (cache == null) ? new DeserializerCache() : cache;
-
- _featureFlags = 0;
- _config = null;
- _injectableValues = null;
- _view = null;
- _attributes = null;
- }
-
- protected DeserializationContext(DeserializationContext src,
- DeserializerFactory factory)
- {
- _cache = src._cache;
- _factory = factory;
-
- _config = src._config;
- _featureFlags = src._featureFlags;
- _view = src._view;
- _parser = src._parser;
- _injectableValues = src._injectableValues;
- _attributes = src._attributes;
- }
-
- /**
- * Constructor used for creating actual per-call instances.
- */
- protected DeserializationContext(DeserializationContext src,
- DeserializationConfig config, JsonParser jp,
- InjectableValues injectableValues)
- {
- _cache = src._cache;
- _factory = src._factory;
-
- _config = config;
- _featureFlags = config.getDeserializationFeatures();
- _view = config.getActiveView();
- _parser = jp;
- _injectableValues = injectableValues;
- _attributes = config.getAttributes();
- }
-
- /*
- /**********************************************************
- /* DatabindContext implementation
- /**********************************************************
- */
-
- @Override
- public DeserializationConfig getConfig() { return _config; }
-
- @Override
- public final Class> getActiveView() { return _view; }
-
- @Override
- public final AnnotationIntrospector getAnnotationIntrospector() {
- return _config.getAnnotationIntrospector();
- }
-
- @Override
- public final TypeFactory getTypeFactory() {
- return _config.getTypeFactory();
- }
-
- /*
- /**********************************************************
- /* Generic attributes (2.3+)
- /**********************************************************
- */
-
- @Override
- public Object getAttribute(Object key) {
- return _attributes.getAttribute(key);
- }
-
- @Override
- public DeserializationContext setAttribute(Object key, Object value)
- {
- _attributes = _attributes.withPerCallAttribute(key, value);
- return this;
- }
-
- /*
- /**********************************************************
- /* Public API, accessors
- /**********************************************************
- */
-
- /**
- * Method for getting current {@link DeserializerFactory}.
- */
- public DeserializerFactory getFactory() {
- return _factory;
- }
-
- /**
- * Convenience method for checking whether specified on/off
- * feature is enabled
- */
- public final boolean isEnabled(DeserializationFeature feat) {
- /* 03-Dec-2010, tatu: minor shortcut; since this is called quite often,
- * let's use a local copy of feature settings:
- */
- return (_featureFlags & feat.getMask()) != 0;
- }
-
- /**
- * "Bulk" access method for checking that all features specified by
- * mask are enabled.
- *
- * @since 2.3
- */
- public final boolean hasDeserializationFeatures(int featureMask) {
- return _config.hasDeserializationFeatures(featureMask);
- }
-
- /**
- * Method for accessing the currently active parser.
- * May be different from the outermost parser
- * when content is buffered.
- *
- * Use of this method is discouraged: if code has direct access
- * to the active parser, that should be used instead.
- */
- public final JsonParser getParser() { return _parser; }
-
- public final Object findInjectableValue(Object valueId,
- BeanProperty forProperty, Object beanInstance)
- {
- if (_injectableValues == null) {
- throw new IllegalStateException("No 'injectableValues' configured, can not inject value with id ["+valueId+"]");
- }
- return _injectableValues.findInjectableValue(valueId, this, forProperty, beanInstance);
- }
-
- /**
- * Convenience method for accessing the default Base64 encoding
- * used for decoding base64 encoded binary content.
- * Same as calling:
- *
- * getConfig().getBase64Variant();
- *
- */
- public final Base64Variant getBase64Variant() {
- return _config.getBase64Variant();
- }
-
- /**
- * Convenience method, functionally equivalent to:
- *
- * getConfig().getNodeFactory();
- *
- */
- public final JsonNodeFactory getNodeFactory() {
- return _config.getNodeFactory();
- }
-
- /**
- * Method for accessing default Locale to use: convenience method for
- *
- * getConfig().getLocale();
- *
- */
- public Locale getLocale() {
- return _config.getLocale();
- }
-
- /**
- * Method for accessing default TimeZone to use: convenience method for
- *
- * getConfig().getTimeZone();
- *
- */
- public TimeZone getTimeZone() {
- return _config.getTimeZone();
- }
-
- /*
- /**********************************************************
- /* Public API, pass-through to DeserializerCache
- /**********************************************************
- */
-
- @Deprecated // since 2.3, use overloaded variant
- public boolean hasValueDeserializerFor(JavaType type) {
- return hasValueDeserializerFor(type, null);
- }
-
- /**
- * Method for checking whether we could find a deserializer
- * for given type.
- *
- * @param type
- * @since 2.3
- */
- public boolean hasValueDeserializerFor(JavaType type, AtomicReference cause) {
- try {
- return _cache.hasValueDeserializerFor(this, _factory, type);
- } catch (JsonMappingException e) {
- if (cause != null) {
- cause.set(e);
- }
- } catch (RuntimeException e) {
- if (cause == null) { // earlier behavior
- throw e;
- }
- cause.set(e);
- }
- return false;
- }
-
- /**
- * Method for finding a value deserializer, and creating a contextual
- * version if necessary, for value reached via specified property.
- */
- @SuppressWarnings("unchecked")
- public final JsonDeserializer findContextualValueDeserializer(JavaType type,
- BeanProperty property) throws JsonMappingException
- {
- JsonDeserializer deser = _cache.findValueDeserializer(this,
- _factory, type);
- if (deser != null) {
- deser = (JsonDeserializer) handleSecondaryContextualization(deser, property);
- }
- return deser;
- }
-
- /**
- * Method for finding a deserializer for root-level value.
- */
- @SuppressWarnings("unchecked")
- public final JsonDeserializer findRootValueDeserializer(JavaType type)
- throws JsonMappingException
- {
- JsonDeserializer deser = _cache.findValueDeserializer(this,
- _factory, type);
- if (deser == null) { // can this occur?
- return null;
- }
- deser = (JsonDeserializer) handleSecondaryContextualization(deser, null);
- TypeDeserializer typeDeser = _factory.findTypeDeserializer(_config, type);
- if (typeDeser != null) {
- // important: contextualize to indicate this is for root value
- typeDeser = typeDeser.forProperty(null);
- return new TypeWrappedDeserializer(typeDeser, deser);
- }
- return deser;
- }
-
- /**
- * Convenience method, functionally same as:
- *
- * getDeserializerProvider().findKeyDeserializer(getConfig(), propertyType, property);
- *
- */
- public final KeyDeserializer findKeyDeserializer(JavaType keyType,
- BeanProperty property) throws JsonMappingException {
- KeyDeserializer kd = _cache.findKeyDeserializer(this,
- _factory, keyType);
- // Second: contextualize?
- if (kd instanceof ContextualKeyDeserializer) {
- kd = ((ContextualKeyDeserializer) kd).createContextual(this, property);
- }
- return kd;
- }
-
- /*
- /**********************************************************
- /* Public API, ObjectId handling
- /**********************************************************
- */
-
- /**
- * Method called to find and return entry corresponding to given
- * Object Id: will add an entry if necessary, and never returns null
- */
- public abstract ReadableObjectId findObjectId(Object id,
- ObjectIdGenerator> generator);
-
- /*
- /**********************************************************
- /* Public API, type handling
- /**********************************************************
- */
-
- /**
- * Convenience method, functionally equivalent to:
- *
- * getConfig().constructType(cls);
- *
- */
- public final JavaType constructType(Class> cls) {
- return _config.constructType(cls);
- }
-
- /**
- * Helper method to use for locating Class for given name. Should be used
- * instead of basic Class.forName(className);
as it can
- * try using contextual class loader, or use platform-specific workarounds
- * (like on Android, GAE).
- */
- public Class> findClass(String className) throws ClassNotFoundException
- {
- // By default, delegate to ClassUtil: can be overridden with custom handling
- return ClassUtil.findClass(className);
- }
-
- /*
- /**********************************************************
- /* Public API, helper object recycling
- /**********************************************************
- */
-
- /**
- * Method that can be used to get access to a reusable ObjectBuffer,
- * useful for efficiently constructing Object arrays and Lists.
- * Note that leased buffers should be returned once deserializer
- * is done, to allow for reuse during same round of deserialization.
- */
- public final ObjectBuffer leaseObjectBuffer()
- {
- ObjectBuffer buf = _objectBuffer;
- if (buf == null) {
- buf = new ObjectBuffer();
- } else {
- _objectBuffer = null;
- }
- return buf;
- }
-
- /**
- * Method to call to return object buffer previously leased with
- * {@link #leaseObjectBuffer}.
- *
- * @param buf Returned object buffer
- */
- public final void returnObjectBuffer(ObjectBuffer buf)
- {
- /* Already have a reusable buffer? Let's retain bigger one
- * (or if equal, favor newer one, shorter life-cycle)
- */
- if (_objectBuffer == null
- || buf.initialCapacity() >= _objectBuffer.initialCapacity()) {
- _objectBuffer = buf;
- }
- }
-
- /**
- * Method for accessing object useful for building arrays of
- * primitive types (such as int[]).
- */
- public final ArrayBuilders getArrayBuilders()
- {
- if (_arrayBuilders == null) {
- _arrayBuilders = new ArrayBuilders();
- }
- return _arrayBuilders;
- }
-
- /*
- /**********************************************************
- /* Extended API: handler instantiation
- /**********************************************************
- */
-
- public abstract JsonDeserializer deserializerInstance(Annotated annotated,
- Object deserDef)
- throws JsonMappingException;
-
- public abstract KeyDeserializer keyDeserializerInstance(Annotated annotated,
- Object deserDef)
- throws JsonMappingException;
-
- /*
- /**********************************************************
- /* Extended API: resolving contextual deserializers; called
- /* by structured deserializers for their value/component
- /* deserializers
- /**********************************************************
- */
-
- /**
- * Method called for primary property deserializers (ones
- * directly created to deserialize values of a POJO property),
- * to handle details of resolving
- * {@link ContextualDeserializer} with given property context.
- *
- * @param property Property for which the given primary deserializer is used; never null.
- *
- * @since 2.3
- */
- public JsonDeserializer> handlePrimaryContextualization(JsonDeserializer> deser,
- BeanProperty property)
- throws JsonMappingException
- {
- if (deser != null) {
- if (deser instanceof ContextualDeserializer) {
- deser = ((ContextualDeserializer) deser).createContextual(this, property);
- }
- }
- return deser;
- }
-
- /**
- * Method called for secondary property deserializers (ones
- * NOT directly created to deal with an annotatable POJO property,
- * but instead created as a component -- such as value deserializers
- * for structured types, or deserializers for root values)
- * to handle details of resolving
- * {@link ContextualDeserializer} with given property context.
- * Given that these deserializers are not directly related to given property
- * (or, in case of root value property, to any property), annotations
- * accessible may or may not be relevant.
- *
- * @param property Property for which deserializer is used, if any; null
- * when deserializing root values
- *
- * @since 2.3
- */
- public JsonDeserializer> handleSecondaryContextualization(JsonDeserializer> deser,
- BeanProperty property)
- throws JsonMappingException
- {
- if (deser != null) {
- if (deser instanceof ContextualDeserializer) {
- deser = ((ContextualDeserializer) deser).createContextual(this, property);
- }
- }
- return deser;
- }
-
- /*
- /**********************************************************
- /* Parsing methods that may use reusable/-cyclable objects
- /**********************************************************
- */
-
- /**
- * Convenience method for parsing a Date from given String, using
- * currently configured date format (accessed using
- * {@link DeserializationConfig#getDateFormat()}).
- *
- * Implementation will handle thread-safety issues related to
- * date formats such that first time this method is called,
- * date format is cloned, and cloned instance will be retained
- * for use during this deserialization round.
- */
- public Date parseDate(String dateStr)
- throws IllegalArgumentException
- {
- try {
- DateFormat df = getDateFormat();
- return df.parse(dateStr);
- } catch (ParseException e) {
- throw new IllegalArgumentException("Failed to parse Date value '"+dateStr+"': "+e.getMessage());
- }
- }
-
- /**
- * Convenience method for constructing Calendar instance set
- * to specified time, to be modified and used by caller.
- */
- public Calendar constructCalendar(Date d)
- {
- /* 08-Jan-2008, tatu: not optimal, but should work for the
- * most part; let's revise as needed.
- */
- Calendar c = Calendar.getInstance(getTimeZone());
- c.setTime(d);
- return c;
- }
-
- /*
- /**********************************************************
- /* Methods for problem handling, reporting
- /**********************************************************
- */
-
- /**
- * Method deserializers can call to inform configured {@link DeserializationProblemHandler}s
- * of an unrecognized property.
- *
- * @return True if there was a configured problem handler that was able to handle the
- * problem
- */
- /**
- * Method deserializers can call to inform configured {@link DeserializationProblemHandler}s
- * of an unrecognized property.
- */
- public boolean handleUnknownProperty(JsonParser jp, JsonDeserializer> deser,
- Object instanceOrClass, String propName)
- throws IOException, JsonProcessingException
- {
- LinkedNode h = _config.getProblemHandlers();
- if (h != null) {
- while (h != null) {
- // Can bail out if it's handled
- if (h.value().handleUnknownProperty(this, jp, deser, instanceOrClass, propName)) {
- return true;
- }
- h = h.next();
- }
- }
- return false;
- }
-
- /**
- * Helper method for reporting a problem with unhandled unknown exception
- *
- * @param instanceOrClass Either value being populated (if one has been
- * instantiated), or Class that indicates type that would be (or
- * have been) instantiated
- * @param deser Deserializer that had the problem, if called by deserializer
- * (or on behalf of one)
- */
- public void reportUnknownProperty(Object instanceOrClass, String fieldName,
- JsonDeserializer> deser)
- throws JsonMappingException
- {
- if (!isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)) {
- return;
- }
- // Do we know properties that are expected instead?
- Collection propIds = (deser == null) ? null : deser.getKnownPropertyNames();
- throw UnrecognizedPropertyException.from(_parser,
- instanceOrClass, fieldName, propIds);
- }
-
- /*
- /**********************************************************
- /* Methods for constructing exceptions
- /**********************************************************
- */
-
- /**
- * Helper method for constructing generic mapping exception for specified type
- */
- public JsonMappingException mappingException(Class> targetClass) {
- return mappingException(targetClass, _parser.getCurrentToken());
- }
-
- public JsonMappingException mappingException(Class> targetClass, JsonToken token)
- {
- String clsName = _calcName(targetClass);
- return JsonMappingException.from(_parser,
- "Can not deserialize instance of "+clsName+" out of "+token+" token");
- }
-
- /**
- * Helper method for constructing generic mapping exception with specified
- * message and current location information
- */
- public JsonMappingException mappingException(String message) {
- return JsonMappingException.from(getParser(), message);
- }
-
- /**
- * Helper method for constructing instantiation exception for specified type,
- * to indicate problem with physically constructing instance of
- * specified class (missing constructor, exception from constructor)
- */
- public JsonMappingException instantiationException(Class> instClass, Throwable t)
- {
- return JsonMappingException.from(_parser,
- "Can not construct instance of "+instClass.getName()+", problem: "+t.getMessage(),
- t);
- }
-
- public JsonMappingException instantiationException(Class> instClass, String msg) {
- return JsonMappingException.from(_parser, "Can not construct instance of "+instClass.getName()+", problem: "+msg);
- }
-
- /**
- * Method that will construct an exception suitable for throwing when
- * some String values are acceptable, but the one encountered is not.
- *
- *
- * @deprecated Since 2.1 should use variant that takes value
- */
- @Deprecated
- public JsonMappingException weirdStringException(Class> instClass, String msg) {
- return weirdStringException(null, instClass, msg);
- }
-
- /**
- * Method that will construct an exception suitable for throwing when
- * some String values are acceptable, but the one encountered is not.
- *
- * @param value String value from input being deserialized
- * @param instClass Type that String should be deserialized into
- * @param msg Message that describes specific problem
- *
- * @since 2.1
- */
- public JsonMappingException weirdStringException(String value, Class> instClass, String msg) {
- return InvalidFormatException.from(_parser,
- "Can not construct instance of "+instClass.getName()+" from String value '"+_valueDesc()+"': "+msg,
- value, instClass);
- }
-
- /**
- * Helper method for constructing exception to indicate that input JSON
- * Number was not suitable for deserializing into given type.
- */
- @Deprecated
- public JsonMappingException weirdNumberException(Class> instClass, String msg) {
- return weirdStringException(null, instClass, msg);
- }
-
- /**
- * Helper method for constructing exception to indicate that input JSON
- * Number was not suitable for deserializing into given target type.
- */
- public JsonMappingException weirdNumberException(Number value, Class> instClass, String msg) {
- return InvalidFormatException.from(_parser,
- "Can not construct instance of "+instClass.getName()+" from number value ("+_valueDesc()+"): "+msg,
- null, instClass);
- }
-
- /**
- * Helper method for constructing exception to indicate that given JSON
- * Object field name was not in format to be able to deserialize specified
- * key type.
- */
- public JsonMappingException weirdKeyException(Class> keyClass, String keyValue, String msg)
- {
- return InvalidFormatException.from(_parser,
- "Can not construct Map key of type "+keyClass.getName()+" from String \""+_desc(keyValue)+"\": "+msg,
- keyValue, keyClass);
- }
-
- /**
- * Helper method for indicating that the current token was expected to be another
- * token.
- */
- public JsonMappingException wrongTokenException(JsonParser jp, JsonToken expToken, String msg)
- {
- return JsonMappingException.from(jp, "Unexpected token ("+jp.getCurrentToken()+"), expected "+expToken+": "+msg);
- }
-
- /**
- * Helper method for constructing exception to indicate that given
- * type id (parsed from JSON) could not be converted to a Java type.
- */
- public JsonMappingException unknownTypeException(JavaType type, String id)
- {
- return JsonMappingException.from(_parser, "Could not resolve type id '"+id+"' into a subtype of "+type);
- }
-
- public JsonMappingException endOfInputException(Class> instClass)
- {
- return JsonMappingException.from(_parser, "Unexpected end-of-input when trying to deserialize a "
- +instClass.getName());
- }
-
- /*
- /**********************************************************
- /* Overridable internal methods
- /**********************************************************
- */
-
- protected DateFormat getDateFormat()
- {
- if (_dateFormat != null) {
- return _dateFormat;
- }
- /* 24-Feb-2012, tatu: At this point, all timezone configuration
- * should have occured, with respect to default dateformat
- * and timezone configuration. But we still better clone
- * an instance as formatters may be stateful.
- */
- DateFormat df = _config.getDateFormat();
- _dateFormat = df = (DateFormat) df.clone();
- return df;
- }
-
- protected String determineClassName(Object instance)
- {
- return ClassUtil.getClassDescription(instance);
- }
-
- /*
- /**********************************************************
- /* Other internal methods
- /**********************************************************
- */
-
- protected String _calcName(Class> cls)
- {
- if (cls.isArray()) {
- return _calcName(cls.getComponentType())+"[]";
- }
- return cls.getName();
- }
-
- protected String _valueDesc()
- {
- try {
- return _desc(_parser.getText());
- } catch (Exception e) {
- return "[N/A]";
- }
- }
- protected String _desc(String desc)
- {
- // !!! should we quote it? (in case there are control chars, linefeeds)
- if (desc.length() > MAX_ERROR_STR_LEN) {
- desc = desc.substring(0, MAX_ERROR_STR_LEN) + "]...[" + desc.substring(desc.length() - MAX_ERROR_STR_LEN);
- }
- return desc;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationFeature.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationFeature.java
deleted file mode 100644
index 3b5c6a82d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/DeserializationFeature.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import com.fr.third.fasterxml.jackson.databind.cfg.ConfigFeature;
-
-/**
- * Enumeration that defines simple on/off features that affect
- * the way Java objects are deserialized from JSON
- *
- * Note that features can be set both through
- * {@link ObjectMapper} (as sort of defaults) and through
- * {@link ObjectReader}.
- * In first case these defaults must follow "config-then-use" patterns
- * (i.e. defined once, not changed afterwards); all per-call
- * changes must be done using {@link ObjectReader}.
- */
-public enum DeserializationFeature implements ConfigFeature
-{
- /*
- /******************************************************
- /* Type conversion features
- /******************************************************
- */
-
- /**
- * Feature that determines whether JSON floating point numbers
- * are to be deserialized into {@link java.math.BigDecimal}s
- * if only generic type description (either {@link Object} or
- * {@link Number}, or within untyped {@link java.util.Map}
- * or {@link java.util.Collection} context) is available.
- * If enabled such values will be deserialized as {@link java.math.BigDecimal}s;
- * if disabled, will be deserialized as {@link Double}s.
- *
- * Feature is disabled by default, meaning that "untyped" floating
- * point numbers will by default be deserialized as {@link Double}s
- * (choice is for performance reason -- BigDecimals are slower than
- * Doubles).
- */
- USE_BIG_DECIMAL_FOR_FLOATS(false),
-
- /**
- * Feature that determines whether JSON integral (non-floating-point)
- * numbers are to be deserialized into {@link java.math.BigInteger}s
- * if only generic type description (either {@link Object} or
- * {@link Number}, or within untyped {@link java.util.Map}
- * or {@link java.util.Collection} context) is available.
- * If enabled such values will be deserialized as
- * {@link java.math.BigInteger}s;
- * if disabled, will be deserialized as "smallest" available type,
- * which is either {@link Integer}, {@link Long} or
- * {@link java.math.BigInteger}, depending on number of digits.
- *
- * Feature is disabled by default, meaning that "untyped" floating
- * point numbers will by default be deserialized using whatever
- * is the most compact integral type, to optimize efficiency.
- */
- USE_BIG_INTEGER_FOR_INTS(false),
-
- // [JACKSON-652]
- /**
- * Feature that determines whether JSON Array is mapped to
- * Object[]
or List<Object>
when binding
- * "untyped" objects (ones with nominal type of java.lang.Object
).
- * If true, binds as Object[]
; if false, as List<Object>
.
- *
- * Feature is disabled by default, meaning that JSON arrays are bound as
- * {@link java.util.List}s.
- */
- USE_JAVA_ARRAY_FOR_JSON_ARRAY(false),
-
- /**
- * Feature that determines standard deserialization mechanism used for
- * Enum values: if enabled, Enums are assumed to have been serialized using
- * return value of Enum.toString()
;
- * if disabled, return value of Enum.name()
is assumed to have been used.
- *
- * Note: this feature should usually have same value
- * as {@link SerializationFeature#WRITE_ENUMS_USING_TO_STRING}.
- *
- * Feature is disabled by default.
- */
- READ_ENUMS_USING_TO_STRING(false),
-
- /*
- /******************************************************
- * Error handling features
- /******************************************************
- */
-
- /**
- * Feature that determines whether encountering of unknown
- * properties (ones that do not map to a property, and there is
- * no "any setter" or handler that can handle it)
- * should result in a failure (by throwing a
- * {@link JsonMappingException}) or not.
- * This setting only takes effect after all other handling
- * methods for unknown properties have been tried, and
- * property remains unhandled.
- *
- * Feature is enabled by default (meaning that a
- * {@link JsonMappingException} will be thrown if an unknown property
- * is encountered).
- */
- FAIL_ON_UNKNOWN_PROPERTIES(true),
-
- /**
- * Feature that determines whether encountering of JSON null
- * is an error when deserializing into Java primitive types
- * (like 'int' or 'double'). If it is, a JsonProcessingException
- * is thrown to indicate this; if not, default value is used
- * (0 for 'int', 0.0 for double, same defaulting as what JVM uses).
- *
- * Feature is disabled by default.
- */
- FAIL_ON_NULL_FOR_PRIMITIVES(false),
-
- /**
- * Feature that determines whether JSON integer numbers are valid
- * values to be used for deserializing Java enum values.
- * If set to 'false' numbers are acceptable and are used to map to
- * ordinal() of matching enumeration value; if 'true', numbers are
- * not allowed and a {@link JsonMappingException} will be thrown.
- * Latter behavior makes sense if there is concern that accidental
- * mapping from integer values to enums might happen (and when enums
- * are always serialized as JSON Strings)
- *
- * Feature is disabled by default.
- */
- FAIL_ON_NUMBERS_FOR_ENUMS(false),
-
- /**
- * Feature that determines what happens when type of a polymorphic
- * value (indicated for example by {@link com.fr.third.fasterxml.jackson.annotation.JsonTypeInfo})
- * can not be found (missing) or resolved (invalid class name, unmappable id);
- * if enabled, an exception ir thrown; if false, null value is used instead.
- *
- * Feature is enabled by default so that exception is thrown for missing or invalid
- * type information.
- *
- * @since 2.2
- */
- FAIL_ON_INVALID_SUBTYPE(true),
-
- /**
- * Feature that determines what happens when reading JSON content into tree
- * ({@link com.fr.third.fasterxml.jackson.core.TreeNode}) and a duplicate key
- * is encountered (property name that was already seen for the JSON Object).
- * If enabled, {@link JsonMappingException} will be thrown; if disabled, no exception
- * is thrown and the new (later) value overwrites the earlier value.
- *
- * Note that this property does NOT affect other aspects of data-binding; that is,
- * no detection is done with respect to POJO properties or {@link java.util.Map}
- * keys. New features may be added to control additional cases.
- *
- * Feature is disabled by default so that no exception is thrown.
- *
- * @since 2.3
- */
- FAIL_ON_READING_DUP_TREE_KEY(false),
-
- /**
- * Feature that determines what happens when a property that has been explicitly
- * marked as ignorable is encountered in input: if feature is enabled,
- * {@link JsonMappingException} is thrown; if false, property is quietly skipped.
- *
- * Feature is disabled by default so that no exception is thrown.
- *
- * @since 2.3
- */
- FAIL_ON_IGNORED_PROPERTIES(false),
-
- /**
- * Feature that determines whether Jackson code should catch
- * and wrap {@link Exception}s (but never {@link Error}s!)
- * to add additional information about
- * location (within input) of problem or not. If enabled,
- * most exceptions will be caught and re-thrown (exception
- * specifically being that {@link java.io.IOException}s may be passed
- * as is, since they are declared as throwable); this can be
- * convenient both in that all exceptions will be checked and
- * declared, and so there is more contextual information.
- * However, sometimes calling application may just want "raw"
- * unchecked exceptions passed as is.
- *
- * Feature is enabled by default.
- */
- WRAP_EXCEPTIONS(true),
-
- /*
- /******************************************************
- /* Structural conversion features
- /******************************************************
- */
-
- /**
- * Feature that determines whether it is acceptable to coerce non-array
- * (in JSON) values to work with Java collection (arrays, java.util.Collection)
- * types. If enabled, collection deserializers will try to handle non-array
- * values as if they had "implicit" surrounding JSON array.
- * This feature is meant to be used for compatibility/interoperability reasons,
- * to work with packages (such as XML-to-JSON converters) that leave out JSON
- * array in cases where there is just a single element in array.
- *
- * Feature is disabled by default.
- */
- ACCEPT_SINGLE_VALUE_AS_ARRAY(false),
-
- /**
- * Feature to allow "unwrapping" root-level JSON value, to match setting of
- * {@link SerializationFeature#WRAP_ROOT_VALUE} used for serialization.
- * Will verify that the root JSON value is a JSON Object, and that it has
- * a single property with expected root name. If not, a
- * {@link JsonMappingException} is thrown; otherwise value of the wrapped property
- * will be deserialized as if it was the root value.
- *
- * Feature is disabled by default.
- */
- UNWRAP_ROOT_VALUE(false),
-
- /*
- /******************************************************
- /* Value conversion features
- /******************************************************
- */
-
- /**
- * Feature that can be enabled to allow JSON empty String
- * value ("") to be bound to POJOs as null.
- * If disabled, standard POJOs can only be bound from JSON null or
- * JSON Object (standard meaning that no custom deserializers or
- * constructors are defined; both of which can add support for other
- * kinds of JSON values); if enable, empty JSON String can be taken
- * to be equivalent of JSON null.
- *
- * Feature is enabled by default.
- */
- ACCEPT_EMPTY_STRING_AS_NULL_OBJECT(false),
-
- /**
- * Feature that allows unknown Enum values to be parsed as null values.
- * If disabled, unknown Enum values will throw exceptions.
- *
- * Note that in some cases this will basically ignore unknown Enum values;
- * this is the keys for keys of {@link java.util.EnumMap} and values
- * of {@link java.util.EnumSet} (because nulls are not accepted in these
- * cases).
- *
- * Feature is disabled by default.
- *
- * @since 2.0
- */
- READ_UNKNOWN_ENUM_VALUES_AS_NULL(false),
-
- /**
- * Feature that controls whether numeric timestamp values are expected
- * to be written using nanosecond timestamps (enabled) or not (disabled),
- * if and only if datatype supports such resolution.
- * Only newer datatypes (such as Java8 Date/Time) support such resolution --
- * older types (pre-Java8 java.util.Date etc) and Joda do not --
- * and this setting has no effect on such types.
- *
- * If disabled, standard millisecond timestamps are assumed.
- * This is the counterpart to {@link SerializationFeature#WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS}.
- *
- * Feature is enabled by default, to support most accurate time values possible.
- *
- * @since 2.2
- */
- READ_DATE_TIMESTAMPS_AS_NANOSECONDS(true),
-
- /**
- * Feature that specifies whether context provided {@link java.util.TimeZone}
- * ({@link DeserializationContext#getTimeZone()} should be used to adjust Date/Time
- * values on deserialization, even if value itself contains timezone information.
- * If enabled, contextual TimeZone
will essentially override any other
- * TimeZone information; if disabled, it will only be used if value itself does not
- * contain any TimeZone information.
- *
- * @since 2.2
- */
- ADJUST_DATES_TO_CONTEXT_TIME_ZONE(true),
-
- /*
- /******************************************************
- /* Other
- /******************************************************
- */
-
- /**
- * Feature that determines whether {@link ObjectReader} should
- * try to eagerly fetch necessary {@link JsonDeserializer} when
- * possible. This improves performance in cases where similarly
- * configured {@link ObjectReader} instance is used multiple
- * times; and should not significantly affect single-use cases.
- *
- * Note that there should not be any need to normally disable this
- * feature: only consider that if there are actual perceived problems.
- *
- * Feature is enabled by default.
- *
- * @since 2.1
- */
- EAGER_DESERIALIZER_FETCH(true)
-
- ;
-
- private final boolean _defaultState;
-
- private DeserializationFeature(boolean defaultState) {
- _defaultState = defaultState;
- }
-
- @Override
- public boolean enabledByDefault() { return _defaultState; }
-
- @Override
- public int getMask() { return (1 << ordinal()); }
-}
\ No newline at end of file
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/InjectableValues.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/InjectableValues.java
deleted file mode 100644
index 9b05f4099..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/InjectableValues.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.util.*;
-
-/**
- * Abstract class that defines API for objects that provide value to
- * "inject" during deserialization. An instance of this object
- */
-public abstract class InjectableValues
-{
- /**
- * Method called to find value identified by id valueId
to
- * inject as value of specified property during deserialization, passing
- * POJO instance in which value will be injected if it is available
- * (will be available when injected via field or setter; not available
- * when injected via constructor or factory method argument).
- *
- * @param valueId Object that identifies value to inject; may be a simple
- * name or more complex identifier object, whatever provider needs
- * @param ctxt Deserialization context
- * @param forProperty Bean property in which value is to be injected
- * @param beanInstance Bean instance that contains property to inject,
- * if available; null if bean has not yet been constructed.
- */
- public abstract Object findInjectableValue(Object valueId,
- DeserializationContext ctxt, BeanProperty forProperty,
- Object beanInstance);
-
- /*
- /**********************************************************
- /* Standard implementation
- /**********************************************************
- */
-
- /**
- * Simple standard implementation which uses a simple Map to
- * store values to inject, identified by simple String keys.
- */
- public static class Std
- extends InjectableValues
- implements java.io.Serializable
- {
- private static final long serialVersionUID = 1L;
-
- protected final Map _values;
-
- public Std() {
- this(new HashMap());
- }
-
- public Std(Map values) {
- _values = values;
- }
-
- public Std addValue(String key, Object value)
- {
- _values.put(key, value);
- return this;
- }
-
- public Std addValue(Class> classKey, Object value)
- {
- _values.put(classKey.getName(), value);
- return this;
- }
-
- @Override
- public Object findInjectableValue(Object valueId,
- DeserializationContext ctxt, BeanProperty forProperty,
- Object beanInstance)
- {
- if (!(valueId instanceof String)) {
- String type = (valueId == null) ? "[null]" : valueId.getClass().getName();
- throw new IllegalArgumentException("Unrecognized inject value id type ("+type+"), expecting String");
- }
- String key = (String) valueId;
- Object ob = _values.get(key);
- if (ob == null && !_values.containsKey(key)) {
- throw new IllegalArgumentException("No injectable id with value '"+key+"' found (for property '"
- +forProperty.getName()+"')");
- }
- return ob;
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JavaType.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JavaType.java
deleted file mode 100644
index e46d6b7c3..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JavaType.java
+++ /dev/null
@@ -1,446 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.lang.reflect.Modifier;
-
-import com.fr.third.fasterxml.jackson.core.type.ResolvedType;
-
-/**
- * Base class for type token classes used both to contain information
- * and as keys for deserializers.
- *
- * Instances can (only) be constructed by
- * com.fr.third.fasterxml.jackson.databind.TypeFactory
.
- *
- * Since 2.2 this implements {@link java.lang.reflect.Type} to allow
- * it to be pushed through interfaces that only expose that type.
- */
-public abstract class JavaType
- extends ResolvedType
- implements java.io.Serializable, // 2.1
- java.lang.reflect.Type // 2.2
-{
- private static final long serialVersionUID = 6774285981275451126L;
-
- /**
- * This is the nominal type-erased Class that would be close to the
- * type represented (but not exactly type, due to type erasure: type
- * instance may have more information on this).
- * May be an interface or abstract class, so instantiation
- * may not be possible.
- */
- protected final Class> _class;
-
- protected final int _hashCode;
-
- /**
- * Optional handler (codec) that can be attached to indicate
- * what to use for handling (serializing, deserializing) values of
- * this specific type.
- *
- * Note: untyped (i.e. caller has to cast) because it is used for
- * different kinds of handlers, with unrelated types.
- */
- protected final Object _valueHandler;
-
- /**
- * Optional handler that can be attached to indicate how to handle
- * additional type metadata associated with this type.
- *
- * Note: untyped (i.e. caller has to cast) because it is used for
- * different kinds of handlers, with unrelated types.
- */
- protected final Object _typeHandler;
-
- /**
- * Whether entities defined with this type should be handled using
- * static typing (as opposed to dynamic runtime type) or not.
- *
- * @since 2.2
- */
- protected final boolean _asStatic;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- /**
- * @param raw "Raw" (type-erased) class for this type
- * @param additionalHash Additional hash code to use, in addition
- * to hash code of the class name
- */
- protected JavaType(Class> raw, int additionalHash,
- Object valueHandler, Object typeHandler, boolean asStatic)
- {
- _class = raw;
- _hashCode = raw.getName().hashCode() + additionalHash;
- _valueHandler = valueHandler;
- _typeHandler = typeHandler;
- _asStatic = asStatic;
- }
-
- /**
- * "Copy method" that will construct a new instance that is identical to
- * this instance, except that it will have specified type handler assigned.
- *
- * @return Newly created type instance
- */
- public abstract JavaType withTypeHandler(Object h);
-
- /**
- * "Copy method" that will construct a new instance that is identical to
- * this instance, except that its content type will have specified
- * type handler assigned.
- *
- * @return Newly created type instance
- */
- public abstract JavaType withContentTypeHandler(Object h);
-
- /**
- * "Copy method" that will construct a new instance that is identical to
- * this instance, except that it will have specified value handler assigned.
- *
- * @return Newly created type instance
- */
- public abstract JavaType withValueHandler(Object h);
-
- /**
- * "Copy method" that will construct a new instance that is identical to
- * this instance, except that it will have specified content value handler assigned.
- *
- * @return Newly created type instance
- */
- public abstract JavaType withContentValueHandler(Object h);
-
- /**
- * Method that can be called to get a type instance that indicates
- * that values of the type should be handled using "static typing" for purposes
- * of serialization (as opposed to "dynamic" aka runtime typing):
- * meaning that no runtime information is needed for determining serializers to use.
- * The main use case is to allow forcing of specific root value serialization type,
- * and specifically in resolving serializers for contained types (element types
- * for arrays, Collections and Maps).
- *
- * @since 2.2
- */
- public abstract JavaType withStaticTyping();
-
- /*
- /**********************************************************
- /* Type coercion fluent factory methods
- /**********************************************************
- */
-
- /**
- * Method that can be called to do a "narrowing" conversions; that is,
- * to return a type with a raw class that is assignable to the raw
- * class of this type. If this is not possible, an
- * {@link IllegalArgumentException} is thrown.
- * If class is same as the current raw class, instance itself is
- * returned.
- */
- public JavaType narrowBy(Class> subclass)
- {
- // First: if same raw class, just return this instance
- if (subclass == _class) {
- return this;
- }
- // Otherwise, ensure compatibility
- _assertSubclass(subclass, _class);
- JavaType result = _narrow(subclass);
-
- // TODO: these checks should NOT actually be needed; above should suffice:
- if (_valueHandler != result.getValueHandler()) {
- result = result.withValueHandler(_valueHandler);
- }
- if (_typeHandler != result.getTypeHandler()) {
- result = result.withTypeHandler(_typeHandler);
- }
- return result;
- }
-
- /**
- * More efficient version of {@link #narrowBy}, called by
- * internal framework in cases where compatibility checks
- * are to be skipped.
- */
- public JavaType forcedNarrowBy(Class> subclass)
- {
- if (subclass == _class) { // can still optimize for simple case
- return this;
- }
- JavaType result = _narrow(subclass);
- // TODO: these checks should NOT actually be needed; above should suffice:
- if (_valueHandler != result.getValueHandler()) {
- result = result.withValueHandler(_valueHandler);
- }
- if (_typeHandler != result.getTypeHandler()) {
- result = result.withTypeHandler(_typeHandler);
- }
- return result;
- }
-
- /**
- * Method that can be called to do a "widening" conversions; that is,
- * to return a type with a raw class that could be assigned from this
- * type.
- * If such conversion is not possible, an
- * {@link IllegalArgumentException} is thrown.
- * If class is same as the current raw class, instance itself is
- * returned.
- */
- public JavaType widenBy(Class> superclass)
- {
- // First: if same raw class, just return this instance
- if (superclass == _class) {
- return this;
- }
- // Otherwise, ensure compatibility
- _assertSubclass(_class, superclass);
- return _widen(superclass);
- }
-
- protected abstract JavaType _narrow(Class> subclass);
-
- /**
- *
- * Default implementation is just to call {@link #_narrow}, since
- * underlying type construction is usually identical
- */
- protected JavaType _widen(Class> superclass) {
- return _narrow(superclass);
- }
-
- public abstract JavaType narrowContentsBy(Class> contentClass);
-
- public abstract JavaType widenContentsBy(Class> contentClass);
-
- /*
- /**********************************************************
- /* Implementation of ResolvedType API
- /**********************************************************
- */
-
- @Override
- public final Class> getRawClass() { return _class; }
-
- /**
- * Method that can be used to check whether this type has
- * specified Class as its type erasure. Put another way, returns
- * true if instantiation of this Type is given (type-erased) Class.
- */
- @Override
- public final boolean hasRawClass(Class> clz) {
- return _class == clz;
- }
-
- @Override
- public boolean isAbstract() {
- return Modifier.isAbstract(_class.getModifiers());
- }
-
- /**
- * Convenience method for checking whether underlying Java type
- * is a concrete class or not: abstract classes and interfaces
- * are not.
- */
- @Override
- public boolean isConcrete() {
- int mod = _class.getModifiers();
- if ((mod & (Modifier.INTERFACE | Modifier.ABSTRACT)) == 0) {
- return true;
- }
- /* 19-Feb-2010, tatus: Holy mackarel; primitive types
- * have 'abstract' flag set...
- */
- if (_class.isPrimitive()) {
- return true;
- }
- return false;
- }
-
- @Override
- public boolean isThrowable() {
- return Throwable.class.isAssignableFrom(_class);
- }
-
- @Override
- public boolean isArrayType() { return false; }
-
- @Override
- public final boolean isEnumType() { return _class.isEnum(); }
-
- @Override
- public final boolean isInterface() { return _class.isInterface(); }
-
- @Override
- public final boolean isPrimitive() { return _class.isPrimitive(); }
-
- @Override
- public final boolean isFinal() { return Modifier.isFinal(_class.getModifiers()); }
-
- /**
- * @return True if type represented is a container type; this includes
- * array, Map and Collection types.
- */
- @Override
- public abstract boolean isContainerType();
-
- /**
- * @return True if type is either true {@link java.util.Collection} type,
- * or something similar (meaning it has at least one type parameter,
- * which describes type of contents)
- */
- @Override
- public boolean isCollectionLikeType() { return false; }
-
- /**
- * @return True if type is either true {@link java.util.Map} type,
- * or something similar (meaning it has at least two type parameter;
- * first one describing key type, second value type)
- */
- @Override
- public boolean isMapLikeType() { return false; }
-
- /**
- * Accessor for checking whether handlers for dealing with values of
- * this type should use static typing (as opposed to dynamic typing).
- * Note that while value of 'true' does mean that static typing is to
- * be used, value of 'false' may still be overridden by other settings.
- *
- * @since 2.2
- */
- public final boolean useStaticType() {
- return _asStatic;
- }
-
- /*
- /**********************************************************
- /* Public API, type parameter access; pass-through
- /**********************************************************
- */
-
- @Override
- public boolean hasGenericTypes()
- {
- return containedTypeCount() > 0;
- }
-
- @Override
- public JavaType getKeyType() { return null; }
-
- @Override
- public JavaType getContentType() { return null; }
-
- @Override
- public int containedTypeCount() { return 0; }
-
- @Override
- public JavaType containedType(int index) { return null; }
-
- @Override
- public String containedTypeName(int index) { return null; }
-
- /*
- /**********************************************************
- /* Semi-public API, accessing handlers
- /**********************************************************
- */
-
- /**
- * Method for accessing value handler associated with this type, if any
- */
- @SuppressWarnings("unchecked")
- public T getValueHandler() { return (T) _valueHandler; }
-
- /**
- * Method for accessing type handler associated with this type, if any
- */
- @SuppressWarnings("unchecked")
- public T getTypeHandler() { return (T) _typeHandler; }
-
- /*
- /**********************************************************
- /* Support for producing signatures
- /**********************************************************
- */
-
- //public abstract String toCanonical();
-
- /**
- * Method for accessing signature that contains generic
- * type information, in form compatible with JVM 1.5
- * as per JLS. It is a superset of {@link #getErasedSignature},
- * in that generic information can be automatically removed
- * if necessary (just remove outermost
- * angle brackets along with content inside)
- */
- public String getGenericSignature() {
- StringBuilder sb = new StringBuilder(40);
- getGenericSignature(sb);
- return sb.toString();
- }
-
- /**
- *
- * @param sb StringBuilder to append signature to
- *
- * @return StringBuilder that was passed in; returned to allow
- * call chaining
- */
- public abstract StringBuilder getGenericSignature(StringBuilder sb);
-
- /**
- * Method for accessing signature without generic
- * type information, in form compatible with all versions
- * of JVM, and specifically used for type descriptions
- * when generating byte code.
- */
- public String getErasedSignature() {
- StringBuilder sb = new StringBuilder(40);
- getErasedSignature(sb);
- return sb.toString();
- }
-
- /**
- * Method for accessing signature without generic
- * type information, in form compatible with all versions
- * of JVM, and specifically used for type descriptions
- * when generating byte code.
- *
- * @param sb StringBuilder to append signature to
- *
- * @return StringBuilder that was passed in; returned to allow
- * call chaining
- */
- public abstract StringBuilder getErasedSignature(StringBuilder sb);
-
- /*
- /**********************************************************
- /* Helper methods
- /**********************************************************
- */
-
- protected void _assertSubclass(Class> subclass, Class> superClass)
- {
- if (!_class.isAssignableFrom(subclass)) {
- throw new IllegalArgumentException("Class "+subclass.getName()+" is not assignable to "+_class.getName());
- }
- }
-
- /*
- /**********************************************************
- /* Standard methods; let's make them abstract to force override
- /**********************************************************
- */
-
- @Override
- public abstract String toString();
-
- @Override
- public abstract boolean equals(Object o);
-
- @Override
- public final int hashCode() { return _hashCode; }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonDeserializer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonDeserializer.java
deleted file mode 100644
index 12189e3d1..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonDeserializer.java
+++ /dev/null
@@ -1,302 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
-import com.fr.third.fasterxml.jackson.databind.deser.SettableBeanProperty;
-import com.fr.third.fasterxml.jackson.databind.deser.impl.ObjectIdReader;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeDeserializer;
-import com.fr.third.fasterxml.jackson.databind.util.NameTransformer;
-
-/**
- * Abstract class that defines API used by {@link ObjectMapper} (and
- * other chained {@link JsonDeserializer}s too) to deserialize Objects of
- * arbitrary types from JSON, using provided {@link JsonParser}.
- *
- * Custom deserializers should usually not directly extend this class,
- * but instead extend {@link com.fr.third.fasterxml.jackson.databind.deser.std.StdDeserializer}
- * (or its subtypes like {@link com.fr.third.fasterxml.jackson.databind.deser.std.StdScalarDeserializer}).
- *
- * If deserializer is an aggregate one -- meaning it delegates handling of some
- * of its contents by using other deserializer(s) -- it typically also needs
- * to implement {@link com.fr.third.fasterxml.jackson.databind.deser.ResolvableDeserializer},
- * which can locate dependant deserializers. This is important to allow dynamic
- * overrides of deserializers; separate call interface is needed to separate
- * resolution of dependant deserializers (which may have cyclic link back
- * to deserializer itself, directly or indirectly).
- *
- * In addition, to support per-property annotations (to configure aspects
- * of deserialization on per-property basis), deserializers may want
- * to implement
- * {@link com.fr.third.fasterxml.jackson.databind.deser.ContextualDeserializer},
- * which allows specialization of deserializers: call to
- * {@link com.fr.third.fasterxml.jackson.databind.deser.ContextualDeserializer#createContextual}
- * is passed information on property, and can create a newly configured
- * deserializer for handling that particular property.
- *
- * If both
- * {@link com.fr.third.fasterxml.jackson.databind.deser.ResolvableDeserializer} and
- * {@link com.fr.third.fasterxml.jackson.databind.deser.ContextualDeserializer}
- * are implemented, resolution of deserializers occurs before
- * contextualization.
- */
-public abstract class JsonDeserializer
-{
- /*
- /**********************************************************
- /* Main deserialization methods
- /**********************************************************
- */
-
- /**
- * Method that can be called to ask implementation to deserialize
- * JSON content into the value type this serializer handles.
- * Returned instance is to be constructed by method itself.
- *
- * Pre-condition for this method is that the parser points to the
- * first event that is part of value to deserializer (and which
- * is never JSON 'null' literal, more on this below): for simple
- * types it may be the only value; and for structured types the
- * Object start marker.
- * Post-condition is that the parser will point to the last
- * event that is part of deserialized value (or in case deserialization
- * fails, event that was not recognized or usable, which may be
- * the same event as the one it pointed to upon call).
- *
- * Note that this method is never called for JSON null literal,
- * and thus deserializers need (and should) not check for it.
- *
- * @param jp Parsed used for reading JSON content
- * @param ctxt Context that can be used to access information about
- * this deserialization activity.
- *
- * @return Deserialized value
- */
- public abstract T deserialize(JsonParser jp, DeserializationContext ctxt)
- throws IOException, JsonProcessingException;
-
- /**
- * Alternate deserialization method (compared to the most commonly
- * used, {@link #deserialize(JsonParser, DeserializationContext)}),
- * which takes in initialized value instance, to be
- * configured and/or populated by deserializer.
- * Method is not necessarily used (or supported) by all types
- * (it will not work for immutable types, for obvious reasons):
- * most commonly it is used for Collections and Maps.
- * It may be used both with "updating readers" (for POJOs) and
- * when Collections and Maps use "getter as setter".
- *
- * Default implementation just throws
- * {@link UnsupportedOperationException}, to indicate that types
- * that do not explicitly add support do not necessarily support
- * update-existing-value operation (esp. immutable types)
- */
- public T deserialize(JsonParser jp, DeserializationContext ctxt,
- T intoValue)
- throws IOException, JsonProcessingException
- {
- throw new UnsupportedOperationException("Can not update object of type "
- +intoValue.getClass().getName()+" (by deserializer of type "+getClass().getName()+")");
- }
-
- /**
- * Deserialization called when type being deserialized is defined to
- * contain additional type identifier, to allow for correctly
- * instantiating correct subtype. This can be due to annotation on
- * type (or its supertype), or due to global settings without
- * annotations.
- *
- * Default implementation may work for some types, but ideally subclasses
- * should not rely on current default implementation.
- * Implementation is mostly provided to avoid compilation errors with older
- * code.
- *
- * @param typeDeserializer Deserializer to use for handling type information
- */
- public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
- TypeDeserializer typeDeserializer)
- throws IOException, JsonProcessingException
- {
- // We could try calling
- return typeDeserializer.deserializeTypedFromAny(jp, ctxt);
- }
-
- /*
- /**********************************************************
- /* Fluent factory methods for constructing decorated versions
- /**********************************************************
- */
-
- /**
- * Method that will return deserializer instance that is able
- * to handle "unwrapped" value instances
- * If no unwrapped instance can be constructed, will simply
- * return this object as-is.
- *
- * Default implementation just returns 'this'
- * indicating that no unwrapped variant exists
- */
- public JsonDeserializer unwrappingDeserializer(NameTransformer unwrapper) {
- return this;
- }
-
- /**
- * Method that can be called to try to replace deserializer this deserializer
- * delegates calls to. If not supported (either this deserializer does not
- * delegate anything; or it does not want any changes), should either
- * throw {@link UnsupportedOperationException} (if operation does not
- * make sense or is not allowed); or return this deserializer as is.
- *
- * @since 2.1
- */
- public JsonDeserializer> replaceDelegatee(JsonDeserializer> delegatee) {
- throw new UnsupportedOperationException();
- }
-
- /*
- /**********************************************************
- /* Other accessors
- /**********************************************************
- */
-
- /**
- * Method for accessing type of values this deserializer produces.
- * Note that this information is not guaranteed to be exact -- it
- * may be a more generic (super-type) -- but it should not be
- * incorrect (return a non-related type).
- *
- * Default implementation will return null, which means almost same
- * same as returning Object.class
would; that is, that
- * nothing is known about handled type.
- *
- * @since 2.3
- */
- public Class> handledType() { return null; }
-
- /**
- * Method that can be called to determine value to be used for
- * representing null values (values deserialized when JSON token
- * is {@link JsonToken#VALUE_NULL}). Usually this is simply
- * Java null, but for some types (especially primitives) it may be
- * necessary to use non-null values.
- *
- * Note that deserializers are allowed to call this just once and
- * then reuse returned value; that is, method is not guaranteed to
- * be called once for each conversion.
- *
- * Default implementation simply returns null.
- */
- public T getNullValue() { return null; }
-
- /**
- * Method called to determine value to be used for "empty" values
- * (most commonly when deserializing from empty JSON Strings).
- * Usually this is same as {@link #getNullValue} (which in turn
- * is usually simply Java null), but it can be overridden
- * for types. Or, if type should never be converted from empty
- * String, method can also throw an exception.
- *
- * Default implementation simple calls {@link #getNullValue} and
- * returns value.
- */
- public T getEmptyValue() { return getNullValue(); }
-
- /**
- * Method that will
- * either return null to indicate that type being deserializers
- * has no concept of properties; or a collection of identifiers
- * for which toString
will give external property
- * name.
- * This is only to be used for error reporting and diagnostics
- * purposes (most commonly, to accompany "unknown property"
- * exception).
- *
- * @since 2.0
- */
- public Collection getKnownPropertyNames() {
- return null;
- }
-
- /**
- * Method called to see if deserializer instance is cachable and
- * usable for other properties of same type (type for which instance
- * was created).
- *
- * Note that cached instances are still resolved on per-property basis,
- * if instance implements {@link com.fr.third.fasterxml.jackson.databind.deser.ResolvableDeserializer}:
- * cached instance is just as the base. This means that in most cases it is safe to
- * cache instances; however, it only makes sense to cache instances
- * if instantiation is expensive, or if instances are heavy-weight.
- *
- * Default implementation returns false, to indicate that no caching
- * is done.
- */
- public boolean isCachable() { return false; }
-
- /**
- * Accessor that can be used to check whether this deserializer
- * is expecting to possibly get an Object Identifier value instead of full value
- * serialization, and if so, should be able to resolve it to actual
- * Object instance to return as deserialized value.
- *
- * Default implementation returns null, as support can not be implemented
- * generically. Some standard deserializers (most notably
- * {@link com.fr.third.fasterxml.jackson.databind.deser.BeanDeserializer})
- * do implement this feature, and may return reader instance, depending on exact
- * configuration of instance (which is based on type, and referring property).
- *
- * @return ObjectIdReader used for resolving possible Object Identifier
- * value, instead of full value serialization, if deserializer can do that;
- * null if no Object Id is expected.
- *
- * @since 2.0
- */
- public ObjectIdReader getObjectIdReader() { return null; }
-
- /**
- * Accessor that can be used to determine if this deserializer uses
- * another deserializer for actual deserialization, by delegating
- * calls. If so, will return immediate delegate (which itself may
- * delegate to further deserializers); otherwise will return null.
- *
- * @return Deserializer this deserializer delegates calls to, if null;
- * null otherwise.
- *
- * @since 2.1
- */
- public JsonDeserializer> getDelegatee() {
- return null;
- }
-
-
- /**
- * Method needed by {@link BeanDeserializerFactory} to properly link
- * managed- and back-reference pairs.
- *
- * @since 2.2 (was moved out of BeanDeserializerBase
)
- */
- public SettableBeanProperty findBackReference(String refName)
- {
- throw new IllegalArgumentException("Can not handle managed/back reference '"+refName
- +"': type: value deserializer of type "+getClass().getName()+" does not support them");
- }
-
- /*
- /**********************************************************
- /* Helper classes
- /**********************************************************
- */
-
- /**
- * This marker class is only to be used with annotations, to
- * indicate that no deserializer is configured .
- *
- * Specifically, this class is to be used as the marker for
- * annotation {@link com.fr.third.fasterxml.jackson.databind.annotation.JsonDeserialize}
- */
- public abstract static class None extends JsonDeserializer {
- private None() { } // not to be instantiated
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonMappingException.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonMappingException.java
deleted file mode 100644
index c9d89e2ce..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonMappingException.java
+++ /dev/null
@@ -1,370 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Checked exception used to signal fatal problems with mapping of
- * content.
- *
- * One additional feature is the ability to denote relevant path
- * of references (during serialization/deserialization) to help in
- * troubleshooting.
- */
-public class JsonMappingException
- extends JsonProcessingException
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * Let's limit length of reference chain, to limit damage in cases
- * of infinite recursion.
- */
- final static int MAX_REFS_TO_LIST = 1000;
-
- /*
- /**********************************************************
- /* Helper classes
- /**********************************************************
- */
-
- /**
- * Simple bean class used to contain references. References
- * can be added to indicate execution/reference path that
- * lead to the problem that caused this exception to be
- * thrown.
- */
- public static class Reference implements Serializable
- {
- private static final long serialVersionUID = 1L;
-
- /**
- * Object through which reference was resolved. Can be either
- * actual instance (usually the case for serialization), or
- * Class (usually the case for deserialization).
- */
- protected Object _from;
-
- /**
- * Name of field (for beans) or key (for Maps) that is part
- * of the reference. May be null for Collection types (which
- * generally have {@link #_index} defined), or when resolving
- * Map classes without (yet) having an instance to operate on.
- */
- protected String _fieldName;
-
- /**
- * Index within a {@link Collection} instance that contained
- * the reference; used if index is relevant and available.
- * If either not applicable, or not available, -1 is used to
- * denote "not known".
- */
- protected int _index = -1;
-
- /**
- * Default constructor for deserialization/sub-classing purposes
- */
- protected Reference() { }
-
- public Reference(Object from) { _from = from; }
-
- public Reference(Object from, String fieldName) {
- _from = from;
- if (fieldName == null) {
- throw new NullPointerException("Can not pass null fieldName");
- }
- _fieldName = fieldName;
- }
-
- public Reference(Object from, int index) {
- _from = from;
- _index = index;
- }
-
- public void setFrom(Object o) { _from = o; }
- public void setFieldName(String n) { _fieldName = n; }
- public void setIndex(int ix) { _index = ix; }
-
- public Object getFrom() { return _from; }
- public String getFieldName() { return _fieldName; }
- public int getIndex() { return _index; }
-
- @Override public String toString() {
- StringBuilder sb = new StringBuilder();
- Class> cls = (_from instanceof Class>) ?
- ((Class>)_from) : _from.getClass();
- /* Hmmh. Although Class.getName() is mostly ok, it does look
- * butt-ugly for arrays. So let's use getSimpleName() instead;
- * but have to prepend package name too.
- */
- Package pkg = cls.getPackage();
- if (pkg != null) {
- sb.append(pkg.getName());
- sb.append('.');
- }
- sb.append(cls.getSimpleName());
- sb.append('[');
- if (_fieldName != null) {
- sb.append('"');
- sb.append(_fieldName);
- sb.append('"');
- } else if (_index >= 0) {
- sb.append(_index);
- } else {
- sb.append('?');
- }
- sb.append(']');
- return sb.toString();
- }
- }
-
- /*
- /**********************************************************
- /* State/configuration
- /**********************************************************
- */
-
- /**
- * Path through which problem that triggering throwing of
- * this exception was reached.
- */
- protected LinkedList _path;
-
- /*
- /**********************************************************
- /* Life-cycle
- /**********************************************************
- */
-
- public JsonMappingException(String msg)
- {
- super(msg);
- }
-
- public JsonMappingException(String msg, Throwable rootCause)
- {
- super(msg, rootCause);
- }
-
- public JsonMappingException(String msg, JsonLocation loc)
- {
- super(msg, loc);
- }
-
- public JsonMappingException(String msg, JsonLocation loc, Throwable rootCause)
- {
- super(msg, loc, rootCause);
- }
-
- public static JsonMappingException from(JsonParser jp, String msg)
- {
- return new JsonMappingException(msg, ((jp == null) ? null : jp.getTokenLocation()));
- }
-
- public static JsonMappingException from(JsonParser jp, String msg,
- Throwable problem)
- {
- return new JsonMappingException(msg, ((jp == null) ? null : jp.getTokenLocation()), problem);
- }
-
- /**
- * Factory method used when "upgrading" an {@link IOException} into
- * {@link JsonMappingException}: usually only needed to comply with
- * a signature.
- *
- * @since 2.1
- */
- public static JsonMappingException fromUnexpectedIOE(IOException src)
- {
- return new JsonMappingException("Unexpected IOException (of type "
- +src.getClass().getName()+"): "+src.getMessage(), (JsonLocation)null, src);
- }
-
- /**
- * Method that can be called to either create a new JsonMappingException
- * (if underlying exception is not a JsonMappingException), or augment
- * given exception with given path/reference information.
- *
- * This version of method is called when the reference is through a
- * non-indexed object, such as a Map or POJO/bean.
- */
- public static JsonMappingException wrapWithPath(Throwable src, Object refFrom,
- String refFieldName)
- {
- return wrapWithPath(src, new Reference(refFrom, refFieldName));
- }
-
- /**
- * Method that can be called to either create a new JsonMappingException
- * (if underlying exception is not a JsonMappingException), or augment
- * given exception with given path/reference information.
- *
- * This version of method is called when the reference is through an
- * index, which happens with arrays and Collections.
- */
- public static JsonMappingException wrapWithPath(Throwable src, Object refFrom,
- int index)
- {
- return wrapWithPath(src, new Reference(refFrom, index));
- }
-
- /**
- * Method that can be called to either create a new JsonMappingException
- * (if underlying exception is not a JsonMappingException), or augment
- * given exception with given path/reference information.
- */
- public static JsonMappingException wrapWithPath(Throwable src, Reference ref)
- {
- JsonMappingException jme;
- if (src instanceof JsonMappingException) {
- jme = (JsonMappingException) src;
- } else {
- String msg = src.getMessage();
- /* Related to [JACKSON-62], let's use a more meaningful placeholder
- * if all we have is null
- */
- if (msg == null || msg.length() == 0) {
- msg = "(was "+src.getClass().getName()+")";
- }
- jme = new JsonMappingException(msg, null, src);
- }
- jme.prependPath(ref);
- return jme;
- }
-
- /*
- /**********************************************************
- /* Accessors/mutators
- /**********************************************************
- */
-
- /**
- * Method for accessing full structural path within type hierarchy
- * down to problematic property.
- */
- public List getPath()
- {
- if (_path == null) {
- return Collections.emptyList();
- }
- return Collections.unmodifiableList(_path);
- }
-
- /**
- * Method for accesing description of path that lead to the
- * problem that triggered this exception
- */
- public String getPathReference()
- {
- return getPathReference(new StringBuilder()).toString();
- }
-
- public StringBuilder getPathReference(StringBuilder sb)
- {
- _appendPathDesc(sb);
- return sb;
- }
-
- /**
- * Method called to prepend a reference information in front of
- * current path
- */
- public void prependPath(Object referrer, String fieldName)
- {
- Reference ref = new Reference(referrer, fieldName);
- prependPath(ref);
- }
- /**
- * Method called to prepend a reference information in front of
- * current path
- */
- public void prependPath(Object referrer, int index)
- {
- Reference ref = new Reference(referrer, index);
- prependPath(ref);
- }
-
- public void prependPath(Reference r)
- {
- if (_path == null) {
- _path = new LinkedList();
- }
- /* Also: let's not increase without bounds. Could choose either
- * head or tail; tail is easier (no need to ever remove), as
- * well as potentially more useful so let's use it:
- */
- if (_path.size() < MAX_REFS_TO_LIST) {
- _path.addFirst(r);
- }
- }
-
- /*
- /**********************************************************
- /* Overridden methods
- /**********************************************************
- */
-
- @Override
- public String getLocalizedMessage() {
- return _buildMessage();
- }
-
- /**
- * Method is overridden so that we can properly inject description
- * of problem path, if such is defined.
- */
- @Override
- public String getMessage() {
- return _buildMessage();
- }
-
- protected String _buildMessage()
- {
- /* First: if we have no path info, let's just use parent's
- * definition as is
- */
- String msg = super.getMessage();
- if (_path == null) {
- return msg;
- }
- StringBuilder sb = (msg == null) ? new StringBuilder() : new StringBuilder(msg);
- /* 18-Feb-2009, tatu: initially there was a linefeed between
- * message and path reference; but unfortunately many systems
- * (loggers, junit) seem to assume linefeeds are only added to
- * separate stack trace.
- */
- sb.append(" (through reference chain: ");
- sb = getPathReference(sb);
- sb.append(')');
- return sb.toString();
- }
-
- @Override
- public String toString()
- {
- return getClass().getName()+": "+getMessage();
- }
-
- /*
- /**********************************************************
- /* Internal methods
- /**********************************************************
- */
-
- protected void _appendPathDesc(StringBuilder sb)
- {
- if (_path == null) {
- return;
- }
- Iterator it = _path.iterator();
- while (it.hasNext()) {
- sb.append(it.next().toString());
- if (it.hasNext()) {
- sb.append("->");
- }
- }
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonNode.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonNode.java
deleted file mode 100644
index 88e95409c..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonNode.java
+++ /dev/null
@@ -1,896 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.JsonPointer;
-import com.fr.third.fasterxml.jackson.core.TreeNode;
-import com.fr.third.fasterxml.jackson.databind.node.JsonNodeType;
-import com.fr.third.fasterxml.jackson.databind.node.MissingNode;
-import com.fr.third.fasterxml.jackson.databind.util.EmptyIterator;
-
-/**
- * Base class for all JSON nodes, which form the basis of JSON
- * Tree Model that Jackson implements.
- * One way to think of these nodes is to consider them
- * similar to DOM nodes in XML DOM trees.
- *
- * As a general design rule, most accessors ("getters") are included
- * in this base class, to allow for traversing structure without
- * type casts. Most mutators, however, need to be accessed through
- * specific sub-classes (such as ObjectNode
- * and ArrayNode
).
- * This seems sensible because proper type
- * information is generally available when building or modifying
- * trees, but less often when reading a tree (newly built from
- * parsed JSON content).
- *
- * Actual concrete sub-classes can be found from package
- * {@link com.fr.third.fasterxml.jackson.databind.node}.
- */
-public abstract class JsonNode
- implements TreeNode, Iterable
-{
- /*
- /**********************************************************
- /* Construction, related
- /**********************************************************
- */
-
- protected JsonNode() { }
-
- /**
- * Method that can be called to get a node that is guaranteed
- * not to allow changing of this node through mutators on
- * this node or any of its children.
- * This means it can either make a copy of this node (and all
- * mutable children and grand children nodes), or node itself
- * if it is immutable.
- *
- * Note: return type is guaranteed to have same type as the
- * node method is called on; which is why method is declared
- * with local generic type.
- *
- * @since 2.0
- *
- * @return Node that is either a copy of this node (and all non-leaf
- * children); or, for immutable leaf nodes, node itself.
- */
- public abstract T deepCopy();
-
- /*
- /**********************************************************
- /* TreeNode implementation
- /**********************************************************
- */
-
-// public abstract JsonToken asToken();
-
-// public abstract JsonParser.NumberType numberType();
-
-// public abstract JsonParser traverse();
-
- @Override
- public int size() { return 0; }
-
- @Override
- public final boolean isValueNode()
- {
- switch (getNodeType()) {
- case ARRAY: case OBJECT: case MISSING:
- return false;
- default:
- return true;
- }
- }
-
- @Override
- public final boolean isContainerNode() {
- final JsonNodeType type = getNodeType();
- return type == JsonNodeType.OBJECT || type == JsonNodeType.ARRAY;
- }
-
- @Override
- public final boolean isMissingNode() {
- return getNodeType() == JsonNodeType.MISSING;
- }
-
- @Override
- public final boolean isArray() {
- return getNodeType() == JsonNodeType.ARRAY;
- }
-
- @Override
- public final boolean isObject() {
- return getNodeType() == JsonNodeType.OBJECT;
- }
-
- /**
- * Method for accessing value of the specified element of
- * an array node. For other nodes, null is always returned.
- *
- * For array nodes, index specifies
- * exact location within array and allows for efficient iteration
- * over child elements (underlying storage is guaranteed to
- * be efficiently indexable, i.e. has random-access to elements).
- * If index is less than 0, or equal-or-greater than
- * node.size()
, null is returned; no exception is
- * thrown for any index.
- *
- * NOTE: if the element value has been explicitly set as null
- * (which is different from removal!),
- * a {@link com.fr.third.fasterxml.jackson.databind.node.NullNode} will be returned,
- * not null.
- *
- * @return Node that represent value of the specified element,
- * if this node is an array and has specified element.
- * Null otherwise.
- */
- @Override
- public abstract JsonNode get(int index);
-
- /**
- * Method for accessing value of the specified field of
- * an object node. If this node is not an object (or it
- * does not have a value for specified field name), or
- * if there is no field with such name, null is returned.
- *
- * NOTE: if the property value has been explicitly set as null
- * (which is different from removal!),
- * a {@link com.fr.third.fasterxml.jackson.databind.node.NullNode} will be returned,
- * not null.
- *
- * @return Node that represent value of the specified field,
- * if this node is an object and has value for the specified
- * field. Null otherwise.
- */
- @Override
- public JsonNode get(String fieldName) { return null; }
- /**
- * This method is similar to {@link #get(String)}, except
- * that instead of returning null if no such value exists (due
- * to this node not being an object, or object not having value
- * for the specified field),
- * a "missing node" (node that returns true for
- * {@link #isMissingNode}) will be returned. This allows for
- * convenient and safe chained access via path calls.
- */
-
- @Override
- public abstract JsonNode path(String fieldName);
-
- /**
- * This method is similar to {@link #get(int)}, except
- * that instead of returning null if no such element exists (due
- * to index being out of range, or this node not being an array),
- * a "missing node" (node that returns true for
- * {@link #isMissingNode}) will be returned. This allows for
- * convenient and safe chained access via path calls.
- */
- @Override
- public abstract JsonNode path(int index);
-
- @Override
- public Iterator fieldNames() {
- return EmptyIterator.instance();
- }
-
- /**
- * Method for locating node specified by given JSON pointer instances.
- * Method will never return null; if no matching node exists,
- * will return a node for which {@link #isMissingNode()} returns true.
- *
- * @return Node that matches given JSON Pointer: if no match exists,
- * will return a node for which {@link #isMissingNode()} returns true.
- *
- * @since 2.3
- */
- @Override
- public final JsonNode at(JsonPointer ptr)
- {
- // Basically: value nodes only match if we have "empty" path left
- if (ptr.matches()) {
- return this;
- }
- JsonNode n = _at(ptr);
- if (n == null) {
- return MissingNode.getInstance();
- }
- return n.at(ptr.tail());
- }
-
- /**
- * Convenience method that is functionally equivalent to:
- *
- * return at(JsonPointer.valueOf(jsonPointerExpression));
- *
- *
- * Note that if the same expression is used often, it is preferable to construct
- * {@link JsonPointer} instance once and reuse it: this method will not perform
- * any caching of compiled expressions.
- *
- * @param jsonPtrExpr Expression to compile as a {@link JsonPointer}
- * instance
- *
- * @return Node that matches given JSON Pointer: if no match exists,
- * will return a node for which {@link TreeNode#isMissingNode()} returns true.
- *
- * @since 2.3
- */
- @Override
- public final JsonNode at(String jsonPtrExpr) {
- return at(JsonPointer.compile(jsonPtrExpr));
- }
-
- protected abstract JsonNode _at(JsonPointer ptr);
-
- /*
- /**********************************************************
- /* Public API, type introspection
- /**********************************************************
- */
-
- // // First high-level division between values, containers and "missing"
-
- /**
- * Return the type of this node
- *
- * @return the node type as a {@link JsonNodeType} enum value
- *
- * @since 2.2
- */
- public abstract JsonNodeType getNodeType();
-
- /**
- * Method that can be used to check if the node is a wrapper
- * for a POJO ("Plain Old Java Object" aka "bean".
- * Returns true only for
- * instances of POJONode
.
- *
- * @return True if this node wraps a POJO
- */
- public final boolean isPojo() {
- return getNodeType() == JsonNodeType.POJO;
- }
-
- /**
- * @return True if this node represents a numeric JSON value
- */
- public final boolean isNumber() {
- return getNodeType() == JsonNodeType.NUMBER;
- }
-
- /**
- *
- * @return True if this node represents an integral (integer)
- * numeric JSON value
- */
- public boolean isIntegralNumber() { return false; }
-
- /**
- * @return True if this node represents a non-integral
- * numeric JSON value
- */
- public boolean isFloatingPointNumber() { return false; }
-
- /**
- * Method that can be used to check whether contained value
- * is a number represented as Java short
.
- * Note, however, that even if this method returns false, it
- * is possible that conversion would be possible from other numeric
- * types -- to check if this is possible, use
- * {@link #canConvertToInt()} instead.
- *
- * @return True if the value contained by this node is stored as Java short
- */
- public boolean isShort() { return false; }
-
- /**
- * Method that can be used to check whether contained value
- * is a number represented as Java int
.
- * Note, however, that even if this method returns false, it
- * is possible that conversion would be possible from other numeric
- * types -- to check if this is possible, use
- * {@link #canConvertToInt()} instead.
- *
- * @return True if the value contained by this node is stored as Java int
- */
- public boolean isInt() { return false; }
-
- /**
- * Method that can be used to check whether contained value
- * is a number represented as Java long
.
- * Note, however, that even if this method returns false, it
- * is possible that conversion would be possible from other numeric
- * types -- to check if this is possible, use
- * {@link #canConvertToInt()} instead.
- *
- * @return True if the value contained by this node is stored as Java long
- */
- public boolean isLong() { return false; }
-
- /**
- * @since 2.2
- */
- public boolean isFloat() { return false; }
-
- public boolean isDouble() { return false; }
- public boolean isBigDecimal() { return false; }
- public boolean isBigInteger() { return false; }
-
- /**
- * Method that checks whether this node represents basic JSON String
- * value.
- */
- public final boolean isTextual() {
- return getNodeType() == JsonNodeType.STRING;
- }
-
- /**
- * Method that can be used to check if this node was created from
- * JSON boolean value (literals "true" and "false").
- */
- public final boolean isBoolean() {
- return getNodeType() == JsonNodeType.BOOLEAN;
- }
-
- /**
- * Method that can be used to check if this node was created from
- * JSON literal null value.
- */
- public final boolean isNull() {
- return getNodeType() == JsonNodeType.NULL;
- }
-
- /**
- * Method that can be used to check if this node represents
- * binary data (Base64 encoded). Although this will be externally
- * written as JSON String value, {@link #isTextual} will
- * return false if this method returns true.
- *
- * @return True if this node represents base64 encoded binary data
- */
- public final boolean isBinary() {
- return getNodeType() == JsonNodeType.BINARY;
- }
-
- /**
- * Method that can be used to check whether this node is a numeric
- * node ({@link #isNumber} would return true) AND its value fits
- * within Java's 32-bit signed integer type, int
.
- * Note that floating-point numbers are convertible if the integral
- * part fits without overflow (as per standard Java coercion rules)
- *
- * @since 2.0
- */
- public boolean canConvertToInt() { return false; }
-
- /**
- * Method that can be used to check whether this node is a numeric
- * node ({@link #isNumber} would return true) AND its value fits
- * within Java's 64-bit signed integer type, long
.
- * Note that floating-point numbers are convertible if the integral
- * part fits without overflow (as per standard Java coercion rules)
- *
- * @since 2.0
- */
- public boolean canConvertToLong() { return false; }
-
- /*
- /**********************************************************
- /* Public API, straight value access
- /**********************************************************
- */
-
- /**
- * Method to use for accessing String values.
- * Does NOT do any conversions for non-String value nodes;
- * for non-String values (ones for which {@link #isTextual} returns
- * false) null will be returned.
- * For String values, null is never returned (but empty Strings may be)
- *
- * @return Textual value this node contains, iff it is a textual
- * JSON node (comes from JSON String value entry)
- */
- public String textValue() { return null; }
-
- /**
- * Method to use for accessing binary content of binary nodes (nodes
- * for which {@link #isBinary} returns true); or for Text Nodes
- * (ones for which {@link #textValue} returns non-null value),
- * to read decoded base64 data.
- * For other types of nodes, returns null.
- *
- * @return Binary data this node contains, iff it is a binary
- * node; null otherwise
- */
- public byte[] binaryValue() throws IOException {
- return null;
- }
-
- /**
- * Method to use for accessing JSON boolean values (value
- * literals 'true' and 'false').
- * For other types, always returns false.
- *
- * @return Textual value this node contains, iff it is a textual
- * json node (comes from JSON String value entry)
- */
- public boolean booleanValue() { return false; }
-
- /**
- * Returns numeric value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true); otherwise
- * returns null
- *
- * @return Number value this node contains, if any (null for non-number
- * nodes).
- */
- public Number numberValue() { return null; }
-
- /**
- * Returns 16-bit short value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true). For other
- * types returns 0.
- * For floating-point numbers, value is truncated using default
- * Java coercion, similar to how cast from double to short operates.
- *
- * @return Short value this node contains, if any; 0 for non-number
- * nodes.
- */
- public short shortValue() { return 0; }
-
- /**
- * Returns integer value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true). For other
- * types returns 0.
- * For floating-point numbers, value is truncated using default
- * Java coercion, similar to how cast from double to int operates.
- *
- * @return Integer value this node contains, if any; 0 for non-number
- * nodes.
- */
- public int intValue() { return 0; }
-
- /**
- * Returns 64-bit long value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true). For other
- * types returns 0.
- * For floating-point numbers, value is truncated using default
- * Java coercion, similar to how cast from double to long operates.
- *
- * @return Long value this node contains, if any; 0 for non-number
- * nodes.
- */
- public long longValue() { return 0L; }
-
- /**
- * Returns 32-bit floating value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true). For other
- * types returns 0.0.
- * For integer values, conversion is done using coercion; this means
- * that an overflow is possible for `long` values
- *
- * @return 32-bit float value this node contains, if any; 0.0 for non-number nodes.
- *
- * @since 2.2
- */
- public float floatValue() { return 0.0f; }
-
- /**
- * Returns 64-bit floating point (double) value for this node, if and only if
- * this node is numeric ({@link #isNumber} returns true). For other
- * types returns 0.0.
- * For integer values, conversion is done using coercion; this may result
- * in overflows with {@link BigInteger} values.
- *
- * @return 64-bit double value this node contains, if any; 0.0 for non-number nodes.
- *
- * @since 2.2
- */
- public double doubleValue() { return 0.0; }
-
- public BigDecimal decimalValue() { return BigDecimal.ZERO; }
- public BigInteger bigIntegerValue() { return BigInteger.ZERO; }
-
- /*
- /**********************************************************
- /* Public API, value access with conversion(s)/coercion(s)
- /**********************************************************
- */
-
- /**
- * Method that will return a valid String representation of
- * the container value, if the node is a value node
- * (method {@link #isValueNode} returns true),
- * otherwise empty String.
- */
- public abstract String asText();
-
- /**
- * Method that will try to convert value of this node to a Java int .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * default value of 0 will be returned; no exceptions are thrown.
- */
- public int asInt() {
- return asInt(0);
- }
-
- /**
- * Method that will try to convert value of this node to a Java int .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public int asInt(int defaultValue) {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of this node to a Java long .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an long (including structured types
- * like Objects and Arrays),
- * default value of 0 will be returned; no exceptions are thrown.
- */
- public long asLong() {
- return asLong(0L);
- }
-
- /**
- * Method that will try to convert value of this node to a Java long .
- * Numbers are coerced using default Java rules; booleans convert to 0 (false)
- * and 1 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an long (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public long asLong(long defaultValue) {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of this node to a Java double .
- * Numbers are coerced using default Java rules; booleans convert to 0.0 (false)
- * and 1.0 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * default value of 0.0 will be returned; no exceptions are thrown.
- */
- public double asDouble() {
- return asDouble(0.0);
- }
-
- /**
- * Method that will try to convert value of this node to a Java double .
- * Numbers are coerced using default Java rules; booleans convert to 0.0 (false)
- * and 1.0 (true), and Strings are parsed using default Java language integer
- * parsing rules.
- *
- * If representation can not be converted to an int (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public double asDouble(double defaultValue) {
- return defaultValue;
- }
-
- /**
- * Method that will try to convert value of this node to a Java boolean .
- * JSON booleans map naturally; integer numbers other than 0 map to true, and
- * 0 maps to false
- * and Strings 'true' and 'false' map to corresponding values.
- *
- * If representation can not be converted to a boolean value (including structured types
- * like Objects and Arrays),
- * default value of false will be returned; no exceptions are thrown.
- */
- public boolean asBoolean() {
- return asBoolean(false);
- }
-
- /**
- * Method that will try to convert value of this node to a Java boolean .
- * JSON booleans map naturally; integer numbers other than 0 map to true, and
- * 0 maps to false
- * and Strings 'true' and 'false' map to corresponding values.
- *
- * If representation can not be converted to a boolean value (including structured types
- * like Objects and Arrays),
- * specified defaultValue will be returned; no exceptions are thrown.
- */
- public boolean asBoolean(boolean defaultValue) {
- return defaultValue;
- }
-
- /*
- /**********************************************************
- /* Public API, value find / existence check methods
- /**********************************************************
- */
-
- /**
- * Method that allows checking whether this node is JSON Object node
- * and contains value for specified property. If this is the case
- * (including properties with explicit null values), returns true;
- * otherwise returns false.
- *
- * This method is equivalent to:
- *
- * node.get(fieldName) != null
- *
- * (since return value of get() is node, not value node contains)
- *
- * NOTE: when explicit null
values are added, this
- * method will return true
for such properties.
- *
- * @param fieldName Name of element to check
- *
- * @return True if this node is a JSON Object node, and has a property
- * entry with specified name (with any value, including null value)
- */
- public boolean has(String fieldName) {
- return get(fieldName) != null;
- }
-
- /**
- * Method that allows checking whether this node is JSON Array node
- * and contains a value for specified index
- * If this is the case
- * (including case of specified indexing having null as value), returns true;
- * otherwise returns false.
- *
- * Note: array element indexes are 0-based.
- *
- * This method is equivalent to:
- *
- * node.get(index) != null
- *
- *
- * NOTE: this method will return true
for explicitly added
- * null values.
- *
- * @param index Index to check
- *
- * @return True if this node is a JSON Object node, and has a property
- * entry with specified name (with any value, including null value)
- */
- public boolean has(int index) {
- return get(index) != null;
- }
-
- /**
- * Method that is similar to {@link #has(String)}, but that will
- * return false
for explicitly added nulls.
- *
- * This method is functionally equivalent to:
- *
- * node.get(fieldName) != null && !node.get(fieldName).isNull()
- *
- *
- * @since 2.1
- */
- public boolean hasNonNull(String fieldName) {
- JsonNode n = get(fieldName);
- return (n != null) && !n.isNull();
- }
-
- /**
- * Method that is similar to {@link #has(int)}, but that will
- * return false
for explicitly added nulls.
- *
- * This method is equivalent to:
- *
- * node.get(index) != null && !node.get(index).isNull()
- *
- *
- * @since 2.1
- */
- public boolean hasNonNull(int index) {
- JsonNode n = get(index);
- return (n != null) && !n.isNull();
- }
-
- /*
- /**********************************************************
- /* Public API, container access
- /**********************************************************
- */
-
- /**
- * Same as calling {@link #elements}; implemented so that
- * convenience "for-each" loop can be used for looping over elements
- * of JSON Array constructs.
- */
- @Override
- public final Iterator iterator() { return elements(); }
-
- /**
- * Method for accessing all value nodes of this Node, iff
- * this node is a JSON Array or Object node. In case of Object node,
- * field names (keys) are not included, only values.
- * For other types of nodes, returns empty iterator.
- */
- public Iterator elements() {
- return EmptyIterator.instance();
- }
-
- /**
- * @return Iterator that can be used to traverse all key/value pairs for
- * object nodes; empty iterator (no contents) for other types
- */
- public Iterator> fields() {
- return EmptyIterator.instance();
- }
-
- /*
- /**********************************************************
- /* Public API, find methods
- /**********************************************************
- */
-
- /**
- * Method for finding a JSON Object field with specified name in this
- * node or its child nodes, and returning value it has.
- * If no matching field is found in this node or its descendants, returns null.
- *
- * @param fieldName Name of field to look for
- *
- * @return Value of first matching node found, if any; null if none
- */
- public abstract JsonNode findValue(String fieldName);
-
- /**
- * Method for finding JSON Object fields with specified name, and returning
- * found ones as a List. Note that sub-tree search ends if a field is found,
- * so possible children of result nodes are not included.
- * If no matching fields are found in this node or its descendants, returns
- * an empty List.
- *
- * @param fieldName Name of field to look for
- */
- public final List findValues(String fieldName)
- {
- List result = findValues(fieldName, null);
- if (result == null) {
- return Collections.emptyList();
- }
- return result;
- }
-
- /**
- * Similar to {@link #findValues}, but will additionally convert
- * values into Strings, calling {@link #asText}.
- */
- public final List findValuesAsText(String fieldName)
- {
- List result = findValuesAsText(fieldName, null);
- if (result == null) {
- return Collections.emptyList();
- }
- return result;
- }
-
- /**
- * Method similar to {@link #findValue}, but that will return a
- * "missing node" instead of null if no field is found. Missing node
- * is a specific kind of node for which {@link #isMissingNode}
- * returns true; and all value access methods return empty or
- * missing value.
- *
- * @param fieldName Name of field to look for
- *
- * @return Value of first matching node found; or if not found, a
- * "missing node" (non-null instance that has no value)
- */
- public abstract JsonNode findPath(String fieldName);
-
- /**
- * Method for finding a JSON Object that contains specified field,
- * within this node or its descendants.
- * If no matching field is found in this node or its descendants, returns null.
- *
- * @param fieldName Name of field to look for
- *
- * @return Value of first matching node found, if any; null if none
- */
- public abstract JsonNode findParent(String fieldName);
-
- /**
- * Method for finding a JSON Object that contains specified field,
- * within this node or its descendants.
- * If no matching field is found in this node or its descendants, returns null.
- *
- * @param fieldName Name of field to look for
- *
- * @return Value of first matching node found, if any; null if none
- */
- public final List findParents(String fieldName)
- {
- List result = findParents(fieldName, null);
- if (result == null) {
- return Collections.emptyList();
- }
- return result;
- }
-
- public abstract List findValues(String fieldName, List foundSoFar);
- public abstract List findValuesAsText(String fieldName, List foundSoFar);
- public abstract List findParents(String fieldName, List foundSoFar);
-
- /*
- /**********************************************************
- /* Public API, path handling
- /**********************************************************
- */
-
- /**
- * Method that can be called on Object nodes, to access a property
- * that has Object value; or if no such property exists, to create,
- * add and return such Object node.
- * If the node method is called on is not Object node,
- * or if property exists and has value that is not Object node,
- * {@link UnsupportedOperationException} is thrown
- */
- public JsonNode with(String propertyName) {
- throw new UnsupportedOperationException("JsonNode not of type ObjectNode (but "
- +getClass().getName()+"), can not call with() on it");
- }
-
- /**
- * Method that can be called on Object nodes, to access a property
- * that has Array
value; or if no such property exists, to create,
- * add and return such Array node.
- * If the node method is called on is not Object node,
- * or if property exists and has value that is not Array node,
- * {@link UnsupportedOperationException} is thrown
- */
- public JsonNode withArray(String propertyName) {
- throw new UnsupportedOperationException("JsonNode not of type ObjectNode (but "
- +getClass().getName()+"), can not call withArray() on it");
- }
-
- /*
- /**********************************************************
- /* Overridden standard methods
- /**********************************************************
- */
-
- /**
- *
- * Note: marked as abstract to ensure all implementation
- * classes define it properly.
- */
- @Override
- public abstract String toString();
-
- /**
- * Equality for node objects is defined as full (deep) value
- * equality. This means that it is possible to compare complete
- * JSON trees for equality by comparing equality of root nodes.
- *
- * Note: marked as abstract to ensure all implementation
- * classes define it properly and not rely on definition
- * from {@link java.lang.Object}.
- */
- @Override
- public abstract boolean equals(Object o);
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializable.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializable.java
deleted file mode 100644
index e1c32a5f1..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeSerializer;
-
-/**
- * Interface that can be implemented by objects that know how to
- * serialize themselves to JSON, using {@link JsonGenerator}
- * (and {@link SerializerProvider} if necessary).
- *
- * Note that implementing this interface binds implementing object
- * closely to Jackson API, and that it is often not necessary to do
- * so -- if class is a bean, it can be serialized without
- * implementing this interface.
- *
- * NOTE: Jackson 2.0 added another method (from former "JsonSerializableWithType"),
- * which is required for proper handling of case where additional type information
- * is needed.
- */
-public interface JsonSerializable
-{
- /**
- * Serialization method called when no additional type information is
- * to be included in serialization.
- */
- public void serialize(JsonGenerator jgen, SerializerProvider provider)
- throws IOException, JsonProcessingException;
-
- /**
- * Serialization method called when additional type information is
- * expected to be included in serialization, for deserialization to use.
- *
- * Usually implementation consists of a call to one of methods
- * in {@link TypeSerializer} (such as {@link TypeSerializer#writeTypePrefixForObject(Object, JsonGenerator)})
- * followed by serialization of contents,
- * followed by another call to {@link TypeSerializer}
- * (such as {@link TypeSerializer#writeTypeSuffixForObject(Object, JsonGenerator)}).
- * Exact methods to call in {@link TypeSerializer} depend on shape of JSON Object used
- * (Array, Object or scalar like String/Number/Boolean).
- *
- * Note that some types (most notably, "natural" types: String, Integer,
- * Double and Boolean) never include type information.
- */
- public void serializeWithType(JsonGenerator jgen, SerializerProvider provider,
- TypeSerializer typeSer)
- throws IOException, JsonProcessingException;
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializer.java
deleted file mode 100644
index 5c0f02e15..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/JsonSerializer.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
-import com.fr.third.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
-import com.fr.third.fasterxml.jackson.databind.jsontype.TypeSerializer;
-import com.fr.third.fasterxml.jackson.databind.util.NameTransformer;
-
-/**
- * Abstract class that defines API used by {@link ObjectMapper} (and
- * other chained {@link JsonSerializer}s too) to serialize Objects of
- * arbitrary types into JSON, using provided {@link JsonGenerator}.
- * {@link com.fr.third.fasterxml.jackson.databind.ser.std.StdSerializer} instead
- * of this class, since it will implement many of optional
- * methods of this class.
- *
- * NOTE: various serialize
methods are never (to be) called
- * with null values -- caller must handle null values, usually
- * by calling {@link SerializerProvider#findNullValueSerializer} to obtain
- * serializer to use.
- * This also means that custom serializers can not be directly used to change
- * the output to produce when serializing null values.
- *
- * If serializer is an aggregate one -- meaning it delegates handling of some
- * of its contents by using other serializer(s) -- it typically also needs
- * to implement {@link com.fr.third.fasterxml.jackson.databind.ser.ResolvableSerializer},
- * which can locate secondary serializers needed. This is important to allow dynamic
- * overrides of serializers; separate call interface is needed to separate
- * resolution of secondary serializers (which may have cyclic link back
- * to serializer itself, directly or indirectly).
- *
- * In addition, to support per-property annotations (to configure aspects
- * of serialization on per-property basis), serializers may want
- * to implement
- * {@link com.fr.third.fasterxml.jackson.databind.ser.ContextualSerializer},
- * which allows specialization of serializers: call to
- * {@link com.fr.third.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual}
- * is passed information on property, and can create a newly configured
- * serializer for handling that particular property.
- *
- * If both
- * {@link com.fr.third.fasterxml.jackson.databind.ser.ResolvableSerializer} and
- * {@link com.fr.third.fasterxml.jackson.databind.ser.ContextualSerializer}
- * are implemented, resolution of serializers occurs before
- * contextualization.
- */
-public abstract class JsonSerializer
- implements JsonFormatVisitable // since 2.1
-{
- /*
- /**********************************************************
- /* Fluent factory methods for constructing decorated versions
- /**********************************************************
- */
-
- /**
- * Method that will return serializer instance that produces
- * "unwrapped" serialization, if applicable for type being
- * serialized (which is the case for some serializers
- * that produce JSON Objects as output).
- * If no unwrapped serializer can be constructed, will simply
- * return serializer as-is.
- *
- * Default implementation just returns serializer as-is,
- * indicating that no unwrapped variant exists
- *
- * @param unwrapper Name transformation to use to convert between names
- * of unwrapper properties
- */
- public JsonSerializer unwrappingSerializer(NameTransformer unwrapper) {
- return this;
- }
-
- /**
- * Method that can be called to try to replace serializer this serializer
- * delegates calls to. If not supported (either this serializer does not
- * delegate anything; or it does not want any changes), should either
- * throw {@link UnsupportedOperationException} (if operation does not
- * make sense or is not allowed); or return this serializer as is.
- *
- * @since 2.1
- */
- public JsonSerializer replaceDelegatee(JsonSerializer> delegatee) {
- throw new UnsupportedOperationException();
- }
-
- /*
- /**********************************************************
- /* Serialization methods
- /**********************************************************
- */
-
- /**
- * Method that can be called to ask implementation to serialize
- * values of type this serializer handles.
- *
- * @param value Value to serialize; can not be null.
- * @param jgen Generator used to output resulting Json content
- * @param provider Provider that can be used to get serializers for
- * serializing Objects value contains, if any.
- */
- public abstract void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
- throws IOException, JsonProcessingException;
-
- /**
- * Method that can be called to ask implementation to serialize
- * values of type this serializer handles, using specified type serializer
- * for embedding necessary type information.
- *
- * Default implementation will throw {@link UnsupportedOperationException}
- * to indicate that proper type handling needs to be implemented.
- *
- * For simple datatypes written as a single scalar value (JSON String, Number, Boolean),
- * implementation would look like:
- *
- * // note: method to call depends on whether this type is serialized as JSON scalar, object or Array!
- * typeSer.writeTypePrefixForScalar(value, jgen);
- * serialize(value, jgen, provider);
- * typeSer.writeTypeSuffixForScalar(value, jgen);
- *
- * and implementations for type serialized as JSON Arrays or Objects would differ slightly,
- * as START-ARRAY>/END-ARRAY
and
- * START-OBJECT>/END-OBJECT
pairs
- * need to be properly handled with respect to serializing of contents.
- *
- * @param value Value to serialize; can not be null.
- * @param jgen Generator used to output resulting Json content
- * @param provider Provider that can be used to get serializers for
- * serializing Objects value contains, if any.
- * @param typeSer Type serializer to use for including type information
- */
- public void serializeWithType(T value, JsonGenerator jgen, SerializerProvider provider,
- TypeSerializer typeSer)
- throws IOException, JsonProcessingException
- {
- Class> clz = handledType();
- if (clz == null) {
- clz = value.getClass();
- }
- throw new UnsupportedOperationException("Type id handling not implemented for type "+clz.getName());
- }
-
- /*
- /**********************************************************
- /* Other accessors
- /**********************************************************
- */
-
- /**
- * Method for accessing type of Objects this serializer can handle.
- * Note that this information is not guaranteed to be exact -- it
- * may be a more generic (super-type) -- but it should not be
- * incorrect (return a non-related type).
- *
- * Default implementation will return null, which essentially means
- * same as returning Object.class
would; that is, that
- * nothing is known about handled type.
- *
- */
- public Class handledType() { return null; }
-
- /**
- * Method called to check whether given serializable value is
- * considered "empty" value (for purposes of suppressing serialization
- * of empty values).
- *
- * Default implementation will consider only null values to be empty.
- *
- * @since 2.0
- */
- public boolean isEmpty(T value) {
- return (value == null);
- }
-
- /**
- * Method that can be called to see whether this serializer instance
- * will use Object Id to handle cyclic references.
- */
- public boolean usesObjectId() {
- return false;
- }
-
- /**
- * Accessor for checking whether this serializer is an
- * "unwrapping" serializer; this is necessary to know since
- * it may also require caller to suppress writing of the
- * leading property name.
- */
- public boolean isUnwrappingSerializer() {
- return false;
- }
-
- /**
- * Accessor that can be used to determine if this serializer uses
- * another serializer for actual serialization, by delegating
- * calls. If so, will return immediate delegate (which itself may
- * delegate to further serializers); otherwise will return null.
- *
- * @return Serializer this serializer delegates calls to, if null;
- * null otherwise.
- *
- * @since 2.1
- */
- public JsonSerializer> getDelegatee() {
- return null;
- }
-
- /*
- /**********************************************************
- /* Default JsonFormatVisitable implementation
- /**********************************************************
- */
-
- /**
- * Default implementation simply calls {@link JsonFormatVisitorWrapper#expectAnyFormat(JavaType)}.
- *
- * @since 2.1
- */
- @Override
- public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType type)
- throws JsonMappingException
- {
- if (visitor != null) visitor.expectAnyFormat(type);
- }
-
- /*
- /**********************************************************
- /* Helper class(es)
- /**********************************************************
- */
-
- /**
- * This marker class is only to be used with annotations, to
- * indicate that no serializer is configured .
- *
- * Specifically, this class is to be used as the marker for
- * annotation {@link com.fr.third.fasterxml.jackson.databind.annotation.JsonSerialize}.
- */
- public abstract static class None
- extends JsonSerializer { }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/KeyDeserializer.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/KeyDeserializer.java
deleted file mode 100644
index dc54bc55d..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/KeyDeserializer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Abstract class that defines API used for deserializing JSON content
- * field names into Java Map keys. These deserializers are only used
- * if the Map key class is not String
or Object
.
- */
-public abstract class KeyDeserializer
-{
- /**
- * Method called to deserialize a {@link java.util.Map} key from JSON property name.
- */
- public abstract Object deserializeKey(String key, DeserializationContext ctxt)
- throws IOException, JsonProcessingException;
-
- /**
- * This marker class is only to be used with annotations, to
- * indicate that no deserializer is configured .
- *
- * Specifically, this class is to be used as the marker for
- * annotation {@link com.fr.third.fasterxml.jackson.databind.annotation.JsonDeserialize}.
- */
- public abstract static class None
- extends KeyDeserializer { }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MapperFeature.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MapperFeature.java
deleted file mode 100644
index 8fa10543b..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MapperFeature.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import com.fr.third.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fr.third.fasterxml.jackson.databind.cfg.ConfigFeature;
-
-/**
- * Enumeration that defines simple on/off features to set
- * for {@link ObjectMapper}, and accessible (but not changeable)
- * via {@link ObjectReader} and {@link ObjectWriter} (as well as
- * through various convenience methods through context objects).
- *
- * Note that in addition to being only mutable via {@link ObjectMapper},
- * changes only take effect when done before any serialization or
- * deserialization calls -- that is, caller must follow
- * "configure-then-use" pattern.
- */
-public enum MapperFeature implements ConfigFeature
-{
- /*
- /******************************************************
- /* Introspection features
- /******************************************************
- */
-
- /**
- * Feature that determines whether annotation introspection
- * is used for configuration; if enabled, configured
- * {@link AnnotationIntrospector} will be used: if disabled,
- * no annotations are considered.
- *
- * Feature is enabled by default.
- */
- USE_ANNOTATIONS(true),
-
- /**
- * Feature that determines whether "creator" methods are
- * automatically detected by consider public constructors,
- * and static single argument methods with name "valueOf".
- * If disabled, only methods explicitly annotated are considered
- * creator methods (except for the no-arg default constructor which
- * is always considered a factory method).
- *
- * Note that this feature has lower precedence than per-class
- * annotations, and is only used if there isn't more granular
- * configuration available.
- *
- * Feature is enabled by default.
- */
- AUTO_DETECT_CREATORS(true),
-
- /**
- * Feature that determines whether non-static fields are recognized as
- * properties.
- * If yes, then all public member fields
- * are considered as properties. If disabled, only fields explicitly
- * annotated are considered property fields.
- *
- * Note that this feature has lower precedence than per-class
- * annotations, and is only used if there isn't more granular
- * configuration available.
- *
- * Feature is enabled by default.
- */
- AUTO_DETECT_FIELDS(true),
-
- /**
- * Feature that determines whether regualr "getter" methods are
- * automatically detected based on standard Bean naming convention
- * or not. If yes, then all public zero-argument methods that
- * start with prefix "get"
- * are considered as getters.
- * If disabled, only methods explicitly annotated are considered getters.
- *
- * Note that since version 1.3, this does NOT include
- * "is getters" (see {@link #AUTO_DETECT_IS_GETTERS} for details)
- *
- * Note that this feature has lower precedence than per-class
- * annotations, and is only used if there isn't more granular
- * configuration available.
- *
- * Feature is enabled by default.
- */
- AUTO_DETECT_GETTERS(true),
-
- /**
- * Feature that determines whether "is getter" methods are
- * automatically detected based on standard Bean naming convention
- * or not. If yes, then all public zero-argument methods that
- * start with prefix "is", and whose return type is boolean
- * are considered as "is getters".
- * If disabled, only methods explicitly annotated are considered getters.
- *
- * Note that this feature has lower precedence than per-class
- * annotations, and is only used if there isn't more granular
- * configuration available.
- *
- * Feature is enabled by default.
- */
- AUTO_DETECT_IS_GETTERS(true),
-
- /**
- * Feature that determines whether "setter" methods are
- * automatically detected based on standard Bean naming convention
- * or not. If yes, then all public one-argument methods that
- * start with prefix "set"
- * are considered setters. If disabled, only methods explicitly
- * annotated are considered setters.
- *
- * Note that this feature has lower precedence than per-class
- * annotations, and is only used if there isn't more granular
- * configuration available.
- *
- * Feature is enabled by default.
- */
- AUTO_DETECT_SETTERS(true),
-
- /**
- * Feature that determines whether getters (getter methods)
- * can be auto-detected if there is no matching mutator (setter,
- * constructor parameter or field) or not: if set to true,
- * only getters that match a mutator are auto-discovered; if
- * false, all auto-detectable getters can be discovered.
- *
- * Feature is disabled by default.
- */
- REQUIRE_SETTERS_FOR_GETTERS(false),
-
- /**
- * Feature that determines whether otherwise regular "getter"
- * methods (but only ones that handle Collections and Maps,
- * not getters of other type)
- * can be used for purpose of getting a reference to a Collection
- * and Map to modify the property, without requiring a setter
- * method.
- * This is similar to how JAXB framework sets Collections and
- * Maps: no setter is involved, just setter.
- *
- * Note that such getters-as-setters methods have lower
- * precedence than setters, so they are only used if no
- * setter is found for the Map/Collection property.
- *
- * Feature is enabled by default.
- */
- USE_GETTERS_AS_SETTERS(true),
-
- /**
- * Feature that determines whether method and field access
- * modifier settings can be overridden when accessing
- * properties. If enabled, method
- * {@link java.lang.reflect.AccessibleObject#setAccessible}
- * may be called to enable access to otherwise unaccessible
- * objects.
- *
- * Feature is enabled by default.
- */
- CAN_OVERRIDE_ACCESS_MODIFIERS(true),
-
- /**
- * Feature that determines whether member mutators (fields and
- * setters) may be "pulled in" even if they are not visible,
- * as long as there is a visible accessor (getter or field) with same name.
- * For example: field "value" may be inferred as mutator,
- * if there is visible or explicitly marked getter "getValue()".
- * If enabled, inferring is enabled; otherwise (disabled) only visible and
- * explicitly annotated accessors are ever used.
- *
- * Note that 'getters' are never inferred and need to be either visible (including
- * bean-style naming) or explicitly annotated.
- *
- * Feature is enabled by default.
- *
- * @since 2.2
- */
- INFER_PROPERTY_MUTATORS(true),
-
- /**
- * Feature that determines whether member fields declared as 'final' may
- * be auto-detected to be used mutators (used to change value of the logical
- * property) or not. If enabled, 'final' access modifier has no effect, and
- * such fields may be detected according to usual visibility and inference
- * rules; if disabled, such fields are NOT used as mutators except if
- * explicitly annotated for such use.
- *
- * Feature is enabled by default, for backwards compatibility reasons.
- */
- ALLOW_FINAL_FIELDS_AS_MUTATORS(true),
-
- /*
- /******************************************************
- /* Type-handling features
- /******************************************************
- */
-
- /**
- * Feature that determines whether the type detection for
- * serialization should be using actual dynamic runtime type,
- * or declared static type.
- * Note that deserialization always uses declared static types
- * since no runtime types are available (as we are creating
- * instances after using type information).
- *
- * This global default value can be overridden at class, method
- * or field level by using {@link JsonSerialize#typing} annotation
- * property.
- *
- * Feature is disabled by default which means that dynamic runtime types
- * are used (instead of declared static types) for serialization.
- */
- USE_STATIC_TYPING(false),
-
- /*
- /******************************************************
- /* View-related features
- /******************************************************
- */
-
- /**
- * Feature that determines whether properties that have no view
- * annotations are included in JSON serialization views (see
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonView} for more
- * details on JSON Views).
- * If enabled, non-annotated properties will be included;
- * when disabled, they will be excluded. So this feature
- * changes between "opt-in" (feature disabled) and
- * "opt-out" (feature enabled) modes.
- *
- * Default value is enabled, meaning that non-annotated
- * properties are included in all views if there is no
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonView} annotation.
- *
- * Feature is enabled by default.
- */
- DEFAULT_VIEW_INCLUSION(true),
-
- /*
- /******************************************************
- /* Generic output features
- /******************************************************
- */
-
- /**
- * Feature that defines default property serialization order used
- * for POJO fields (note: does not apply to {@link java.util.Map}
- * serialization!):
- * if enabled, default ordering is alphabetic (similar to
- * how {@link com.fr.third.fasterxml.jackson.annotation.JsonPropertyOrder#alphabetic()}
- * works); if disabled, order is unspecified (based on what JDK gives
- * us, which may be declaration order, but is not guaranteed).
- *
- * Note that this is just the default behavior, and can be overridden by
- * explicit overrides in classes.
- *
- * Feature is disabled by default.
- */
- SORT_PROPERTIES_ALPHABETICALLY(false),
-
- /*
- /******************************************************
- /* Name-related features
- /******************************************************
- */
-
- /**
- * Feature that can be enabled to make property names be
- * overridden by wrapper name (usually detected with annotations
- * as defined by {@link AnnotationIntrospector#findWrapperName}.
- * If enabled, all properties that have associated non-empty Wrapper
- * name will use that wrapper name instead of property name.
- * If disabled, wrapper name is only used for wrapping (if anything).
- *
- * Feature is disabled by default.
- *
- * @since 2.1
- */
- USE_WRAPPER_NAME_AS_PROPERTY_NAME(false)
- ;
-
- private final boolean _defaultState;
-
- private MapperFeature(boolean defaultState) {
- _defaultState = defaultState;
- }
-
- @Override
- public boolean enabledByDefault() { return _defaultState; }
-
- @Override
- public int getMask() { return (1 << ordinal()); }
-}
\ No newline at end of file
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingIterator.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingIterator.java
deleted file mode 100644
index 83937ca64..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingIterator.java
+++ /dev/null
@@ -1,266 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.*;
-
-import com.fr.third.fasterxml.jackson.core.*;
-
-/**
- * Iterator exposed by {@link ObjectMapper} when binding sequence of
- * objects. Extension is done to allow more convenient exposing of
- * {@link IOException} (which basic {@link Iterator} does not expose)
- */
-public class MappingIterator implements Iterator, Closeable
-{
- protected final static MappingIterator> EMPTY_ITERATOR =
- new MappingIterator(null, null, null, null, false, null);
-
- protected final JavaType _type;
-
- protected final DeserializationContext _context;
-
- protected final JsonDeserializer _deserializer;
-
- protected JsonParser _parser;
-
- /**
- * Flag that indicates whether input {@link JsonParser} should be closed
- * when we are done or not; generally only called when caller did not
- * pass JsonParser.
- */
- protected final boolean _closeParser;
-
- /**
- * Flag that is set when we have determined what {@link #hasNextValue()}
- * should value; reset when {@link #nextValue} is called
- */
- protected boolean _hasNextChecked;
-
- /**
- * If not null, "value to update" instead of creating a new instance
- * for each call.
- */
- protected final T _updatedValue;
-
- /**
- * @deprecated Since 2.1, to be removed
- */
- @Deprecated
- protected MappingIterator(JavaType type, JsonParser jp, DeserializationContext ctxt,
- JsonDeserializer> deser)
- {
- this(type, jp, ctxt, deser, true, null);
- }
-
- /**
- * @param managedParser Whether we "own" the {@link JsonParser} passed or not:
- * if true, it was created by {@link ObjectReader} and code here needs to
- * close it; if false, it was passed by calling code and should not be
- * closed by iterator.
- */
- @SuppressWarnings("unchecked")
- protected MappingIterator(JavaType type, JsonParser jp, DeserializationContext ctxt,
- JsonDeserializer> deser,
- boolean managedParser, Object valueToUpdate)
- {
- _type = type;
- _parser = jp;
- _context = ctxt;
- _deserializer = (JsonDeserializer) deser;
- _closeParser = managedParser;
- if (valueToUpdate == null) {
- _updatedValue = null;
- } else {
- _updatedValue = (T) valueToUpdate;
- }
-
- /* Ok: one more thing; we may have to skip START_ARRAY, assuming
- * "wrapped" sequence; but this is ONLY done for 'managed' parsers
- * and never if JsonParser was directly passed by caller (if it
- * was, caller must have either positioned it over first token of
- * the first element, or cleared the START_ARRAY token explicitly).
- * Note, however, that we do not try to guess whether this could be
- * an unwrapped sequence of arrays/Lists: we just assume it is wrapped;
- * and if not, caller needs to hand us JsonParser instead, pointing to
- * the first token of the first element.
- */
- if (managedParser && jp != null && jp.getCurrentToken() == JsonToken.START_ARRAY) {
- jp.clearCurrentToken();
- }
- }
-
- @SuppressWarnings("unchecked")
- protected static MappingIterator emptyIterator() {
- return (MappingIterator) EMPTY_ITERATOR;
- }
-
- /*
- /**********************************************************
- /* Basic iterator impl
- /**********************************************************
- */
-
- @Override
- public boolean hasNext()
- {
- try {
- return hasNextValue();
- } catch (JsonMappingException e) {
- throw new RuntimeJsonMappingException(e.getMessage(), e);
- } catch (IOException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
-
- @Override
- public T next()
- {
- try {
- return nextValue();
- } catch (JsonMappingException e) {
- throw new RuntimeJsonMappingException(e.getMessage(), e);
- } catch (IOException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void close() throws IOException{
- if(_parser != null) {
- _parser.close();
- }
- }
-
- /*
- /**********************************************************
- /* Extended API, iteration
- /**********************************************************
- */
-
- /**
- * Equivalent of {@link #next} but one that may throw checked
- * exceptions from Jackson due to invalid input.
- */
- public boolean hasNextValue() throws IOException
- {
- if (_parser == null) {
- return false;
- }
- if (!_hasNextChecked) {
- JsonToken t = _parser.getCurrentToken();
- _hasNextChecked = true;
- if (t == null) { // un-initialized or cleared; find next
- t = _parser.nextToken();
- // If EOF, no more, or if we hit END_ARRAY (although we don't clear the token).
- if (t == null || t == JsonToken.END_ARRAY) {
- JsonParser jp = _parser;
- _parser = null;
- if (_closeParser) {
- jp.close();
- }
- return false;
- }
- }
- }
- return true;
- }
-
- public T nextValue() throws IOException
- {
- // caller should always call 'hasNext[Value]' first; but let's ensure:
- if (!_hasNextChecked) {
- if (!hasNextValue()) {
- throw new NoSuchElementException();
- }
- }
- if (_parser == null) {
- throw new NoSuchElementException();
- }
- _hasNextChecked = false;
- T result;
-
- if (_updatedValue == null) {
- result = _deserializer.deserialize(_parser, _context);
- } else{
- _deserializer.deserialize(_parser, _context, _updatedValue);
- result = _updatedValue;
- }
- // Need to consume the token too
- _parser.clearCurrentToken();
- return result;
- }
-
- /**
- * Convenience method for reading all entries accessible via
- * this iterator
- *
- * @return List of entries read
- *
- * @since 2.2
- */
- public List readAll() throws IOException {
- return readAll(new ArrayList());
- }
-
- /**
- * Convenience method for reading all entries accessible via
- * this iterator
- *
- * @return List of entries read (same as passed-in argument)
- *
- * @since 2.2
- */
- public List readAll(List resultList) throws IOException
- {
- while (hasNextValue()) {
- resultList.add(nextValue());
- }
- return resultList;
- }
-
- /*
- /**********************************************************
- /* Extended API, accessors
- /**********************************************************
- */
-
- /**
- * Accessor for getting underlying parser this iterator uses.
- *
- * @since 2.2
- */
- public JsonParser getParser() {
- return _parser;
- }
-
- /**
- * Accessor for accessing {@link FormatSchema} that the underlying parser
- * (as per {@link #getParser}) is using, if any; only parser of schema-aware
- * formats use schemas.
- *
- * @since 2.2
- */
- public FormatSchema getParserSchema() {
- return _parser.getSchema();
- }
-
- /**
- * Convenience method, functionally equivalent to:
- *
- * iterator.getParser().getCurrentLocation()
- *
- *
- * @return Location of the input stream of the underlying parser
- *
- * @since 2.2.1
- */
- public JsonLocation getCurrentLocation() {
- return _parser.getCurrentLocation();
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingJsonFactory.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingJsonFactory.java
deleted file mode 100644
index 407617fc3..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/MappingJsonFactory.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Jackson JSON-processor.
- *
- * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
- *
- * Licensed under the License specified in file LICENSE, included with
- * the source code and binary code bundles.
- * You may not use this file except in compliance with the License.
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.IOException;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.format.InputAccessor;
-import com.fr.third.fasterxml.jackson.core.format.MatchStrength;
-
-/**
- * Sub-class of {@link JsonFactory} that will create a proper
- * {@link ObjectCodec} to allow seam-less conversions between
- * JSON content and Java objects (POJOs).
- * The only addition to regular {@link JsonFactory} currently
- * is that {@link ObjectMapper} is constructed and passed as
- * the codec to use.
- */
-public class MappingJsonFactory
- extends JsonFactory
-{
- // generated for Jackson 2.1.0
- private static final long serialVersionUID = -6744103724013275513L;
-
- public MappingJsonFactory()
- {
- this(null);
- }
-
- public MappingJsonFactory(ObjectMapper mapper)
- {
- super(mapper);
- if (mapper == null) {
- setCodec(new ObjectMapper(this));
- }
- }
-
- /**
- * We'll override the method to return more specific type; co-variance
- * helps here
- */
- @Override
- public final ObjectMapper getCodec() { return (ObjectMapper) _objectCodec; }
-
- // @since 2.1
- @Override
- public JsonFactory copy()
- {
- _checkInvalidCopy(MappingJsonFactory.class);
- // note: as with base class, must NOT copy mapper reference
- return new MappingJsonFactory(null);
- }
-
- /*
- /**********************************************************
- /* Format detection functionality (since 1.8)
- /**********************************************************
- */
-
- /**
- * Sub-classes need to override this method (as of 1.8)
- */
- @Override
- public String getFormatName()
- {
- /* since non-JSON factories typically should not extend this class,
- * let's just always return JSON as name.
- */
- return FORMAT_NAME_JSON;
- }
-
- /**
- * Sub-classes need to override this method (as of 1.8)
- */
- @Override
- public MatchStrength hasFormat(InputAccessor acc) throws IOException
- {
- if (getClass() == MappingJsonFactory.class) {
- return hasJSONFormat(acc);
- }
- return null;
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/Module.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/Module.java
deleted file mode 100644
index 5ec7f4196..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/Module.java
+++ /dev/null
@@ -1,293 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
-import com.fr.third.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
-import com.fr.third.fasterxml.jackson.databind.deser.Deserializers;
-import com.fr.third.fasterxml.jackson.databind.deser.KeyDeserializers;
-import com.fr.third.fasterxml.jackson.databind.deser.ValueInstantiators;
-import com.fr.third.fasterxml.jackson.databind.introspect.ClassIntrospector;
-import com.fr.third.fasterxml.jackson.databind.jsontype.NamedType;
-import com.fr.third.fasterxml.jackson.databind.ser.BeanSerializerModifier;
-import com.fr.third.fasterxml.jackson.databind.ser.Serializers;
-import com.fr.third.fasterxml.jackson.databind.type.TypeFactory;
-import com.fr.third.fasterxml.jackson.databind.type.TypeModifier;
-
-/**
- * Simple interface for extensions that can be registered with {@link ObjectMapper}
- * to provide a well-defined set of extensions to default functionality; such as
- * support for new data types.
- */
-public abstract class Module
- implements Versioned
-{
- /*
- /**********************************************************
- /* Simple accessors
- /**********************************************************
- */
-
- /**
- * Method that returns identifier for module; this can be used by Jackson
- * for informational purposes, as well as in associating extensions with
- * module that provides them.
- */
- public abstract String getModuleName();
-
- /**
- * Method that returns version of this module. Can be used by Jackson for
- * informational purposes.
- */
- @Override
- public abstract Version version();
-
- /*
- /**********************************************************
- /* Life-cycle: registration
- /**********************************************************
- */
-
- /**
- * Method called by {@link ObjectMapper} when module is registered.
- * It is called to let module register functionality it provides,
- * using callback methods passed-in context object exposes.
- */
- public abstract void setupModule(SetupContext context);
-
- /*
- /**********************************************************
- /* Helper types
- /**********************************************************
- */
-
- /**
- * Interface Jackson exposes to modules for purpose of registering
- * extended functionality.
- * Usually implemented by {@link ObjectMapper}, but modules should
- * NOT rely on this -- if they do require access to mapper instance,
- * they need to call {@link SetupContext#getOwner} method.
- */
- public static interface SetupContext
- {
- /*
- /**********************************************************
- /* Simple accessors
- /**********************************************************
- */
-
- /**
- * Method that returns version information about {@link ObjectMapper}
- * that implements this context. Modules can use this to choose
- * different settings or initialization order; or even decide to fail
- * set up completely if version is compatible with module.
- */
- public Version getMapperVersion();
-
- /**
- * Fallback access method that allows modules to refer to the
- * {@link ObjectMapper} that provided this context.
- * It should NOT be needed by most modules; and ideally should
- * not be used -- however, there may be cases where this may
- * be necessary due to various design constraints.
- *
- * NOTE: use of this method is discouraged, as it allows access to
- * things Modules typically should not modify. It is included, however,
- * to allow access to new features in cases where Module API
- * has not yet been extended, or there are oversights.
- *
- * Return value is chosen to not leak dependency to {@link ObjectMapper};
- * however, instance will always be of that type.
- * This is why return value is declared generic, to allow caller to
- * specify context to often avoid casting.
- *
- * @since 2.0
- */
- public C getOwner();
-
- /**
- * Accessor for finding {@link TypeFactory} that is currently configured
- * by the context.
- *
- * NOTE: since it is possible that other modules might change or replace
- * TypeFactory, use of this method adds order-dependency for registrations.
- *
- * @since 2.0
- */
- public TypeFactory getTypeFactory();
-
- public boolean isEnabled(MapperFeature f);
-
- public boolean isEnabled(DeserializationFeature f);
-
- public boolean isEnabled(SerializationFeature f);
-
- public boolean isEnabled(JsonFactory.Feature f);
-
- public boolean isEnabled(JsonParser.Feature f);
-
- public boolean isEnabled(JsonGenerator.Feature f);
-
- /*
- /**********************************************************
- /* Handler registration; serializers/deserializers
- /**********************************************************
- */
-
- /**
- * Method that module can use to register additional deserializers to use for
- * handling types.
- *
- * @param d Object that can be called to find deserializer for types supported
- * by module (null returned for non-supported types)
- */
- public void addDeserializers(Deserializers d);
-
- /**
- * Method that module can use to register additional deserializers to use for
- * handling Map key values (which are separate from value deserializers because
- * they are always serialized from String values)
- */
- public void addKeyDeserializers(KeyDeserializers s);
-
- /**
- * Method that module can use to register additional serializers to use for
- * handling types.
- *
- * @param s Object that can be called to find serializer for types supported
- * by module (null returned for non-supported types)
- */
- public void addSerializers(Serializers s);
-
- /**
- * Method that module can use to register additional serializers to use for
- * handling Map key values (which are separate from value serializers because
- * they must write JsonToken.FIELD_NAME
instead of String value).
- */
- public void addKeySerializers(Serializers s);
-
- /*
- /**********************************************************
- /* Handler registration; other
- /**********************************************************
- */
-
- /**
- * Method that module can use to register additional modifier objects to
- * customize configuration and construction of bean deserializers.
- *
- * @param mod Modifier to register
- */
- public void addBeanDeserializerModifier(BeanDeserializerModifier mod);
-
- /**
- * Method that module can use to register additional modifier objects to
- * customize configuration and construction of bean serializers.
- *
- * @param mod Modifier to register
- */
- public void addBeanSerializerModifier(BeanSerializerModifier mod);
-
- /**
- * Method that module can use to register additional
- * {@link AbstractTypeResolver} instance, to handle resolution of
- * abstract to concrete types (either by defaulting, or by materializing).
- *
- * @param resolver Resolver to add.
- */
- public void addAbstractTypeResolver(AbstractTypeResolver resolver);
-
- /**
- * Method that module can use to register additional
- * {@link TypeModifier} instance, which can augment {@link com.fr.third.fasterxml.jackson.databind.JavaType}
- * instances constructed by {@link com.fr.third.fasterxml.jackson.databind.type.TypeFactory}.
- *
- * @param modifier to add
- */
- public void addTypeModifier(TypeModifier modifier);
-
- /**
- * Method that module can use to register additional {@link com.fr.third.fasterxml.jackson.databind.deser.ValueInstantiator}s,
- * by adding {@link ValueInstantiators} object that gets called when
- * instantatiator is needed by a deserializer.
- *
- * @param instantiators Object that can provide {@link com.fr.third.fasterxml.jackson.databind.deser.ValueInstantiator}s for
- * constructing POJO values during deserialization
- */
- public void addValueInstantiators(ValueInstantiators instantiators);
-
- /**
- * Method for replacing the default class introspector with a derived class that
- * overrides specific behavior.
- *
- * @param ci Derived class of ClassIntrospector with overriden behavior
- *
- * @since 2.2
- */
- public void setClassIntrospector(ClassIntrospector ci);
-
- /**
- * Method for registering specified {@link AnnotationIntrospector} as the highest
- * priority introspector (will be chained with existing introspector(s) which
- * will be used as fallbacks for cases this introspector does not handle)
- *
- * @param ai Annotation introspector to register.
- */
- public void insertAnnotationIntrospector(AnnotationIntrospector ai);
-
- /**
- * Method for registering specified {@link AnnotationIntrospector} as the lowest
- * priority introspector, chained with existing introspector(s) and called
- * as fallback for cases not otherwise handled.
- *
- * @param ai Annotation introspector to register.
- */
- public void appendAnnotationIntrospector(AnnotationIntrospector ai);
-
- /**
- * Method for registering specified classes as subtypes (of supertype(s)
- * they have)
- */
- public void registerSubtypes(Class>... subtypes);
-
- /**
- * Method for registering specified classes as subtypes (of supertype(s)
- * they have), using specified type names.
- */
- public void registerSubtypes(NamedType... subtypes);
-
- /**
- * Method used for defining mix-in annotations to use for augmenting
- * specified class or interface.
- * All annotations from
- * mixinSource
are taken to override annotations
- * that target
(or its supertypes) has.
- *
- * Note: mix-ins are registered both for serialization and deserialization
- * (which can be different internally).
- *
- * Note: currently only one set of mix-in annotations can be defined for
- * a single class; so if multiple modules register mix-ins, highest
- * priority one (last one registered) will have priority over other modules.
- *
- * @param target Class (or interface) whose annotations to effectively override
- * @param mixinSource Class (or interface) whose annotations are to
- * be "added" to target's annotations, overriding as necessary
- */
- public void setMixInAnnotations(Class> target, Class> mixinSource);
-
- /**
- * Add a deserialization problem handler
- *
- * @param handler The deserialization problem handler
- */
- public void addDeserializationProblemHandler(DeserializationProblemHandler handler);
-
- /**
- * Method that may be used to override naming strategy that is used
- * by {@link ObjectMapper}.
- *
- * @since 2.3
- */
- public void setNamingStrategy(PropertyNamingStrategy naming);
- }
-}
diff --git a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/ObjectMapper.java b/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/ObjectMapper.java
deleted file mode 100644
index fe59eff34..000000000
--- a/fine-ehcache/src/com/fr/third/fasterxml/jackson/databind/ObjectMapper.java
+++ /dev/null
@@ -1,3115 +0,0 @@
-package com.fr.third.fasterxml.jackson.databind;
-
-import java.io.*;
-import java.lang.reflect.Type;
-import java.net.URL;
-import java.text.DateFormat;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicReference;
-
-import com.fr.third.fasterxml.jackson.annotation.*;
-import com.fr.third.fasterxml.jackson.core.*;
-import com.fr.third.fasterxml.jackson.core.io.CharacterEscapes;
-import com.fr.third.fasterxml.jackson.core.io.SegmentedStringWriter;
-import com.fr.third.fasterxml.jackson.core.io.SerializedString;
-import com.fr.third.fasterxml.jackson.core.type.ResolvedType;
-import com.fr.third.fasterxml.jackson.core.type.TypeReference;
-import com.fr.third.fasterxml.jackson.core.util.*;
-import com.fr.third.fasterxml.jackson.databind.cfg.BaseSettings;
-import com.fr.third.fasterxml.jackson.databind.cfg.ContextAttributes;
-import com.fr.third.fasterxml.jackson.databind.cfg.HandlerInstantiator;
-import com.fr.third.fasterxml.jackson.databind.cfg.MapperConfig;
-import com.fr.third.fasterxml.jackson.databind.deser.*;
-import com.fr.third.fasterxml.jackson.databind.introspect.*;
-import com.fr.third.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
-import com.fr.third.fasterxml.jackson.databind.jsontype.*;
-import com.fr.third.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver;
-import com.fr.third.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
-import com.fr.third.fasterxml.jackson.databind.node.*;
-import com.fr.third.fasterxml.jackson.databind.ser.*;
-import com.fr.third.fasterxml.jackson.databind.type.*;
-import com.fr.third.fasterxml.jackson.databind.util.RootNameLookup;
-import com.fr.third.fasterxml.jackson.databind.util.StdDateFormat;
-import com.fr.third.fasterxml.jackson.databind.util.TokenBuffer;
-
-/**
- * This mapper (or, data binder, or codec) provides functionality for
- * converting between Java objects (instances of JDK provided core classes,
- * beans), and matching JSON constructs.
- * It will use instances of {@link JsonParser} and {@link JsonGenerator}
- * for implementing actual reading/writing of JSON.
- *
- * The main conversion API is defined in {@link ObjectCodec}, so that
- * implementation details of this class need not be exposed to
- * streaming parser and generator classes.
- *
- * Note on caching: root-level deserializers are always cached, and accessed
- * using full (generics-aware) type information. This is different from
- * caching of referenced types, which is more limited and is done only
- * for a subset of all deserializer types. The main reason for difference
- * is that at root-level there is no incoming reference (and hence no
- * referencing property, no referral information or annotations to
- * produce differing deserializers), and that the performance impact
- * greatest at root level (since it'll essentially cache the full
- * graph of deserializers involved).
- */
-public class ObjectMapper
- extends ObjectCodec
- implements Versioned,
- java.io.Serializable // as of 2.1
-{
- private static final long serialVersionUID = 1L;
-
- /*
- /**********************************************************
- /* Helper classes, enums
- /**********************************************************
- */
-
- /**
- * Enumeration used with {@link ObjectMapper#enableDefaultTyping()}
- * to specify what kind of types (classes) default typing should
- * be used for. It will only be used if no explicit type information
- * is found, but this enumeration further limits subset of those types.
- */
- public enum DefaultTyping {
- /**
- * This value means that only properties that have
- * {@link java.lang.Object} as declared type (including
- * generic types without explicit type) will use default
- * typing.
- */
- JAVA_LANG_OBJECT,
-
- /**
- * Value that means that default typing will be used for
- * properties with declared type of {@link java.lang.Object}
- * or an abstract type (abstract class or interface).
- * Note that this does not include array types.
- */
- OBJECT_AND_NON_CONCRETE,
-
- /**
- * Value that means that default typing will be used for
- * all types covered by {@link #OBJECT_AND_NON_CONCRETE}
- * plus all array types for them.
- */
- NON_CONCRETE_AND_ARRAYS,
-
- /**
- * Value that means that default typing will be used for
- * all non-final types, with exception of small number of
- * "natural" types (String, Boolean, Integer, Double), which
- * can be correctly inferred from JSON; as well as for
- * all arrays of non-final types.
- */
- NON_FINAL
- }
-
- /**
- * Customized {@link TypeResolverBuilder} that provides type resolver builders
- * used with so-called "default typing"
- * (see {@link ObjectMapper#enableDefaultTyping()} for details).
- *
- * Type resolver construction is based on configuration: implementation takes care
- * of only providing builders in cases where type information should be applied.
- * This is important since build calls may be sent for any and all types, and
- * type information should NOT be applied to all of them.
- */
- public static class DefaultTypeResolverBuilder
- extends StdTypeResolverBuilder
- implements java.io.Serializable
- {
- private static final long serialVersionUID = 1L;
-
- /**
- * Definition of what types is this default typer valid for.
- */
- protected final DefaultTyping _appliesFor;
-
- public DefaultTypeResolverBuilder(DefaultTyping t) {
- _appliesFor = t;
- }
-
- @Override
- public TypeDeserializer buildTypeDeserializer(DeserializationConfig config,
- JavaType baseType, Collection subtypes)
- {
- return useForType(baseType) ? super.buildTypeDeserializer(config, baseType, subtypes) : null;
- }
-
- @Override
- public TypeSerializer buildTypeSerializer(SerializationConfig config,
- JavaType baseType, Collection subtypes)
- {
- return useForType(baseType) ? super.buildTypeSerializer(config, baseType, subtypes) : null;
- }
-
- /**
- * Method called to check if the default type handler should be
- * used for given type.
- * Note: "natural types" (String, Boolean, Integer, Double) will never
- * use typing; that is both due to them being concrete and final,
- * and since actual serializers and deserializers will also ignore any
- * attempts to enforce typing.
- */
- public boolean useForType(JavaType t)
- {
- switch (_appliesFor) {
- case NON_CONCRETE_AND_ARRAYS:
- while (t.isArrayType()) {
- t = t.getContentType();
- }
- // fall through
- case OBJECT_AND_NON_CONCRETE:
- return (t.getRawClass() == Object.class) || !t.isConcrete();
- case NON_FINAL:
- while (t.isArrayType()) {
- t = t.getContentType();
- }
- return !t.isFinal(); // includes Object.class
- default:
- //case JAVA_LANG_OBJECT:
- return (t.getRawClass() == Object.class);
- }
- }
- }
-
- /*
- /**********************************************************
- /* Internal constants, singletons
- /**********************************************************
- */
-
- // Quick little shortcut, to avoid having to use global TypeFactory instance...
- private final static JavaType JSON_NODE_TYPE = SimpleType.constructUnsafe(JsonNode.class);
-
- /* !!! 03-Apr-2009, tatu: Should try to avoid direct reference... but not
- * sure what'd be simple and elegant way. So until then:
- */
- protected final static ClassIntrospector DEFAULT_INTROSPECTOR = BasicClassIntrospector.instance;
-
- // 16-May-2009, tatu: Ditto ^^^
- protected final static AnnotationIntrospector DEFAULT_ANNOTATION_INTROSPECTOR = new JacksonAnnotationIntrospector();
-
- protected final static VisibilityChecker> STD_VISIBILITY_CHECKER = VisibilityChecker.Std.defaultInstance();
-
- protected final static PrettyPrinter _defaultPrettyPrinter = new DefaultPrettyPrinter();
-
- /**
- * Base settings contain defaults used for all {@link ObjectMapper}
- * instances.
- */
- protected final static BaseSettings DEFAULT_BASE = new BaseSettings(DEFAULT_INTROSPECTOR,
- DEFAULT_ANNOTATION_INTROSPECTOR, STD_VISIBILITY_CHECKER, null, TypeFactory.defaultInstance(),
- null, StdDateFormat.instance, null,
- Locale.getDefault(),
-// TimeZone.getDefault()
- TimeZone.getTimeZone("GMT"),
- Base64Variants.getDefaultVariant() // 2.1
- );
-
- /*
- /**********************************************************
- /* Configuration settings, shared
- /**********************************************************
- */
-
- /**
- * Factory used to create {@link JsonParser} and {@link JsonGenerator}
- * instances as necessary.
- */
- protected final JsonFactory _jsonFactory;
-
- /**
- * Specific factory used for creating {@link JavaType} instances;
- * needed to allow modules to add more custom type handling
- * (mostly to support types of non-Java JVM languages)
- */
- protected TypeFactory _typeFactory;
-
- /**
- * Provider for values to inject in deserialized POJOs.
- */
- protected InjectableValues _injectableValues;
-
- /**
- * Thing used for registering sub-types, resolving them to
- * super/sub-types as needed.
- */
- protected SubtypeResolver _subtypeResolver;
-
- /**
- * Cache for root names used when root-wrapping is enabled.
- */
- protected final RootNameLookup _rootNames;
-
- /*
- /**********************************************************
- /* Configuration settings: mix-in annotations
- /**********************************************************
- */
-
- /**
- * Mapping that defines how to apply mix-in annotations: key is
- * the type to received additional annotations, and value is the
- * type that has annotations to "mix in".
- *
- * Annotations associated with the value classes will be used to
- * override annotations of the key class, associated with the
- * same field or method. They can be further masked by sub-classes:
- * you can think of it as injecting annotations between the target
- * class and its sub-classes (or interfaces)
- */
- protected final HashMap> _mixInAnnotations;
-
- /*
- /**********************************************************
- /* Configuration settings, serialization
- /**********************************************************
- */
-
- /**
- * Configuration object that defines basic global
- * settings for the serialization process
- */
- protected SerializationConfig _serializationConfig;
-
- /**
- * Object that manages access to serializers used for serialization,
- * including caching.
- * It is configured with {@link #_serializerFactory} to allow
- * for constructing custom serializers.
- *
- * Note: while serializers are only exposed {@link SerializerProvider},
- * mappers and readers need to access additional API defined by
- * {@link DefaultSerializerProvider}
- */
- protected DefaultSerializerProvider _serializerProvider;
-
- /**
- * Serializer factory used for constructing serializers.
- */
- protected SerializerFactory _serializerFactory;
-
- /*
- /**********************************************************
- /* Configuration settings, deserialization
- /**********************************************************
- */
-
- /**
- * Configuration object that defines basic global
- * settings for the serialization process
- */
- protected DeserializationConfig _deserializationConfig;
-
- /**
- * Blueprint context object; stored here to allow custom
- * sub-classes. Contains references to objects needed for
- * deserialization construction (cache, factory).
- */
- protected DefaultDeserializationContext _deserializationContext;
-
- /*
- /**********************************************************
- /* Caching
- /**********************************************************
- */
-
- /* Note: handling of serializers and deserializers is not symmetric;
- * and as a result, only root-level deserializers can be cached here.
- * This is mostly because typing and resolution for deserializers is
- * fully static; whereas it is quite dynamic for serialization.
- */
-
- /**
- * We will use a separate main-level Map for keeping track
- * of root-level deserializers. This is where most succesful
- * cache lookups get resolved.
- * Map will contain resolvers for all kinds of types, including
- * container types: this is different from the component cache
- * which will only cache bean deserializers.
- *
- * Given that we don't expect much concurrency for additions
- * (should very quickly converge to zero after startup), let's
- * explicitly define a low concurrency setting.
- *
- * Since version 1.5, these may are either "raw" deserializers (when
- * no type information is needed for base type), or type-wrapped
- * deserializers (if it is needed)
- */
- final protected ConcurrentHashMap> _rootDeserializers
- = new ConcurrentHashMap>(64, 0.6f, 2);
-
- /*
- /**********************************************************
- /* Life-cycle: constructing instance
- /**********************************************************
- */
-
- /**
- * Default constructor, which will construct the default
- * {@link JsonFactory} as necessary, use
- * {@link SerializerProvider} as its
- * {@link SerializerProvider}, and
- * {@link BeanSerializerFactory} as its
- * {@link SerializerFactory}.
- * This means that it
- * can serialize all standard JDK types, as well as regular
- * Java Beans (based on method names and Jackson-specific annotations),
- * but does not support JAXB annotations.
- */
- public ObjectMapper()
- {
- this(null, null, null);
- }
-
- /**
- * Constructs instance that uses specified {@link JsonFactory}
- * for constructing necessary {@link JsonParser}s and/or
- * {@link JsonGenerator}s.
- */
- public ObjectMapper(JsonFactory jf)
- {
- this(jf, null, null);
- }
-
- /**
- * Copy-constructor, mostly used to support {@link #copy}.
- *
- * @since 2.1
- */
- protected ObjectMapper(ObjectMapper src)
- {
- _jsonFactory = src._jsonFactory.copy();
- _jsonFactory.setCodec(this);
- _subtypeResolver = src._subtypeResolver;
- _rootNames = new RootNameLookup();
- _typeFactory = src._typeFactory;
- _serializationConfig = src._serializationConfig;
- HashMap> mixins = new HashMap>(src._mixInAnnotations);
- _mixInAnnotations = mixins;
- _serializationConfig = new SerializationConfig(src._serializationConfig, mixins);
- _deserializationConfig = new DeserializationConfig(src._deserializationConfig, mixins);
- _serializerProvider = src._serializerProvider;
- _deserializationContext = src._deserializationContext;
-
- // Default serializer factory is stateless, can just assign
- _serializerFactory = src._serializerFactory;
- }
-
- /**
- * Constructs instance that uses specified {@link JsonFactory}
- * for constructing necessary {@link JsonParser}s and/or
- * {@link JsonGenerator}s, and uses given providers for accessing
- * serializers and deserializers.
- *
- * @param jf JsonFactory to use: if null, a new {@link MappingJsonFactory} will be constructed
- * @param sp SerializerProvider to use: if null, a {@link SerializerProvider} will be constructed
- * @param dc Blueprint deserialization context instance to use for creating
- * actual context objects; if null, will construct standard
- * {@link DeserializationContext}
- */
- public ObjectMapper(JsonFactory jf,
- DefaultSerializerProvider sp, DefaultDeserializationContext dc)
- {
- /* 02-Mar-2009, tatu: Important: we MUST default to using
- * the mapping factory, otherwise tree serialization will
- * have problems with POJONodes.
- * 03-Jan-2010, tatu: and obviously we also must pass 'this',
- * to create actual linking.
- */
- if (jf == null) {
- _jsonFactory = new MappingJsonFactory(this);
- } else {
- _jsonFactory = jf;
- if (jf.getCodec() == null) { // as per [JACKSON-741]
- _jsonFactory.setCodec(this);
- }
- }
- _subtypeResolver = new StdSubtypeResolver();
- _rootNames = new RootNameLookup();
- // and default type factory is shared one
- _typeFactory = TypeFactory.defaultInstance();
-
- HashMap> mixins = new HashMap>();
- _mixInAnnotations = mixins;
- _serializationConfig = new SerializationConfig(DEFAULT_BASE,
- _subtypeResolver, mixins);
- _deserializationConfig = new DeserializationConfig(DEFAULT_BASE,
- _subtypeResolver, mixins);
-
- // Some overrides we may need
- final boolean needOrder = _jsonFactory.requiresPropertyOrdering();
- if (needOrder ^ _serializationConfig.isEnabled(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)) {
- configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, needOrder);
- }
-
- _serializerProvider = (sp == null) ? new DefaultSerializerProvider.Impl() : sp;
- _deserializationContext = (dc == null) ?
- new DefaultDeserializationContext.Impl(BeanDeserializerFactory.instance) : dc;
-
- // Default serializer factory is stateless, can just assign
- _serializerFactory = BeanSerializerFactory.instance;
- }
-
- /**
- * Method for creating a new {@link ObjectMapper} instance that
- * has same initial configuration as this instance. Note that this
- * also requires making a copy of the underlying {@link JsonFactory}
- * instance.
- *
- * Method is typically
- * used when multiple, differently configured mappers are needed.
- * Although configuration is shared, cached serializers and deserializers
- * are NOT shared, which means that the new instance may be re-configured
- * before use; meaning that it behaves the same way as if an instance
- * was constructed from scratch.
- *
- * @since 2.1
- */
- public ObjectMapper copy()
- {
- _checkInvalidCopy(ObjectMapper.class);
- return new ObjectMapper(this);
- }
-
- /**
- * @since 2.1
- * @param exp
- */
- protected void _checkInvalidCopy(Class> exp)
- {
- if (getClass() != exp) {
- throw new IllegalStateException("Failed copy(): "+getClass().getName()
- +" (version: "+version()+") does not override copy(); it has to");
- }
- }
-
- /*
- /**********************************************************
- /* Versioned impl
- /**********************************************************
- */
-
- /**
- * Method that will return version information stored in and read from jar
- * that contains this class.
- */
- @Override
- public Version version() {
- return com.fr.third.fasterxml.jackson.databind.cfg.PackageVersion.VERSION;
- }
-
- /*
- /**********************************************************
- /* Module registration, discovery
- /**********************************************************
- */
-
- /**
- * Method for registering a module that can extend functionality
- * provided by this mapper; for example, by adding providers for
- * custom serializers and deserializers.
- *
- * @param module Module to register
- */
- public ObjectMapper registerModule(Module module)
- {
- /* Let's ensure we have access to name and version information,
- * even if we do not have immediate use for either. This way we know
- * that they will be available from beginning
- */
- String name = module.getModuleName();
- if (name == null) {
- throw new IllegalArgumentException("Module without defined name");
- }
- Version version = module.version();
- if (version == null) {
- throw new IllegalArgumentException("Module without defined version");
- }
-
- final ObjectMapper mapper = this;
-
- // And then call registration
- module.setupModule(new Module.SetupContext()
- {
- // // // Accessors
-
- @Override
- public Version getMapperVersion() {
- return version();
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public C getOwner() {
- // why do we need the cast here?!?
- return (C) mapper;
- }
-
- @Override
- public TypeFactory getTypeFactory() {
- return _typeFactory;
- }
-
- @Override
- public boolean isEnabled(MapperFeature f) {
- return mapper.isEnabled(f);
- }
-
- @Override
- public boolean isEnabled(DeserializationFeature f) {
- return mapper.isEnabled(f);
- }
-
- @Override
- public boolean isEnabled(SerializationFeature f) {
- return mapper.isEnabled(f);
- }
-
- @Override
- public boolean isEnabled(JsonFactory.Feature f) {
- return mapper.isEnabled(f);
- }
-
- @Override
- public boolean isEnabled(JsonParser.Feature f) {
- return mapper.isEnabled(f);
- }
-
- @Override
- public boolean isEnabled(JsonGenerator.Feature f) {
- return mapper.isEnabled(f);
- }
-
- // // // Methods for registering handlers: deserializers
-
- @Override
- public void addDeserializers(Deserializers d) {
- DeserializerFactory df = mapper._deserializationContext._factory.withAdditionalDeserializers(d);
- mapper._deserializationContext = mapper._deserializationContext.with(df);
- }
-
- @Override
- public void addKeyDeserializers(KeyDeserializers d) {
- DeserializerFactory df = mapper._deserializationContext._factory.withAdditionalKeyDeserializers(d);
- mapper._deserializationContext = mapper._deserializationContext.with(df);
- }
-
- @Override
- public void addBeanDeserializerModifier(BeanDeserializerModifier modifier) {
- DeserializerFactory df = mapper._deserializationContext._factory.withDeserializerModifier(modifier);
- mapper._deserializationContext = mapper._deserializationContext.with(df);
- }
-
- // // // Methods for registering handlers: serializers
-
- @Override
- public void addSerializers(Serializers s) {
- mapper._serializerFactory = mapper._serializerFactory.withAdditionalSerializers(s);
- }
-
- @Override
- public void addKeySerializers(Serializers s) {
- mapper._serializerFactory = mapper._serializerFactory.withAdditionalKeySerializers(s);
- }
-
- @Override
- public void addBeanSerializerModifier(BeanSerializerModifier modifier) {
- mapper._serializerFactory = mapper._serializerFactory.withSerializerModifier(modifier);
- }
-
- // // // Methods for registering handlers: other
-
- @Override
- public void addAbstractTypeResolver(AbstractTypeResolver resolver) {
- DeserializerFactory df = mapper._deserializationContext._factory.withAbstractTypeResolver(resolver);
- mapper._deserializationContext = mapper._deserializationContext.with(df);
- }
-
- @Override
- public void addTypeModifier(TypeModifier modifier) {
- TypeFactory f = mapper._typeFactory;
- f = f.withModifier(modifier);
- mapper.setTypeFactory(f);
- }
-
- @Override
- public void addValueInstantiators(ValueInstantiators instantiators) {
- DeserializerFactory df = mapper._deserializationContext._factory.withValueInstantiators(instantiators);
- mapper._deserializationContext = mapper._deserializationContext.with(df);
- }
-
- @Override
- public void setClassIntrospector(ClassIntrospector ci) {
- mapper._deserializationConfig = mapper._deserializationConfig.with(ci);
- mapper._serializationConfig = mapper._serializationConfig.with(ci);
- }
-
- @Override
- public void insertAnnotationIntrospector(AnnotationIntrospector ai) {
- mapper._deserializationConfig = mapper._deserializationConfig.withInsertedAnnotationIntrospector(ai);
- mapper._serializationConfig = mapper._serializationConfig.withInsertedAnnotationIntrospector(ai);
- }
-
- @Override
- public void appendAnnotationIntrospector(AnnotationIntrospector ai) {
- mapper._deserializationConfig = mapper._deserializationConfig.withAppendedAnnotationIntrospector(ai);
- mapper._serializationConfig = mapper._serializationConfig.withAppendedAnnotationIntrospector(ai);
- }
-
- @Override
- public void registerSubtypes(Class>... subtypes) {
- mapper.registerSubtypes(subtypes);
- }
-
- @Override
- public void registerSubtypes(NamedType... subtypes) {
- mapper.registerSubtypes(subtypes);
- }
-
- @Override
- public void setMixInAnnotations(Class> target, Class> mixinSource) {
- mapper.addMixInAnnotations(target, mixinSource);
- }
-
- @Override
- public void addDeserializationProblemHandler(DeserializationProblemHandler handler) {
- mapper.addHandler(handler);
- }
-
- @Override
- public void setNamingStrategy(PropertyNamingStrategy naming) {
- mapper.setPropertyNamingStrategy(naming);
- }
- });
- return this;
- }
-
- /**
- * Convenience method for registering specified modules in order;
- * functionally equivalent to:
- *
- * for (Module module : modules) {
- * registerModule(module);
- * }
- *
- *
- * @since 2.2
- */
- public ObjectMapper registerModules(Module... modules)
- {
- for (Module module : modules) {
- registerModule(module);
- }
- return this;
- }
-
- /**
- * Convenience method for registering specified modules in order;
- * functionally equivalent to:
- *
- * for (Module module : modules) {
- * registerModule(module);
- * }
- *
- *
- * @since 2.2
- */
- public ObjectMapper registerModules(Iterable modules)
- {
- for (Module module : modules) {
- registerModule(module);
- }
- return this;
- }
-
- /**
- * Method for locating available methods, using JDK {@link ServiceLoader}
- * facility, along with module-provided SPI.
- *
- * Note that method does not do any caching, so calls should be considered
- * potentially expensive.
- *
- * @since 2.2
- */
- public static List findModules() {
- return findModules(null);
- }
-
- /**
- * Method for locating available methods, using JDK {@link ServiceLoader}
- * facility, along with module-provided SPI.
- *
- * Note that method does not do any caching, so calls should be considered
- * potentially expensive.
- *
- * @since 2.2
- */
- public static List findModules(ClassLoader classLoader)
- {
- ArrayList modules = new ArrayList();
- ServiceLoader loader = (classLoader == null) ?
- ServiceLoader.load(Module.class) : ServiceLoader.load(Module.class, classLoader);
- for (Module module : loader) {
- modules.add(module);
- }
- return modules;
- }
-
- /**
- * Convenience method that is functionally equivalent to:
- *
- * mapper.registerModules(mapper.findModules());
- *
- *
- * As with {@link #findModules()}, no caching is done for modules, so care
- * needs to be taken to either create and share a single mapper instance;
- * or to cache introspected set of modules.
- *
- * @since 2.2
- */
- public ObjectMapper findAndRegisterModules() {
- return registerModules(findModules());
- }
-
- /*
- /**********************************************************
- /* Configuration: main config object access
- /**********************************************************
- */
-
- /**
- * Method that returns the shared default {@link SerializationConfig}
- * object that defines configuration settings for serialization.
- *
- * Note that since instances are immutable, you can NOT change settings
- * by accessing an instance and calling methods: this will simply create
- * new instance of config object.
- */
- public SerializationConfig getSerializationConfig() {
- return _serializationConfig;
- }
-
- /**
- * Method that returns
- * the shared default {@link DeserializationConfig} object
- * that defines configuration settings for deserialization.
- *
- * Note that since instances are immutable, you can NOT change settings
- * by accessing an instance and calling methods: this will simply create
- * new instance of config object.
- */
- public DeserializationConfig getDeserializationConfig() {
- return _deserializationConfig;
- }
-
- /**
- * Method for getting current {@link DeserializationContext}.
- *
- * Note that since instances are immutable, you can NOT change settings
- * by accessing an instance and calling methods: this will simply create
- * new instance of context object.
- */
- public DeserializationContext getDeserializationContext() {
- return _deserializationContext;
- }
-
- /*
- /**********************************************************
- /* Configuration: ser/deser factory, provider access
- /**********************************************************
- */
-
- /**
- * Method for setting specific {@link SerializerFactory} to use
- * for constructing (bean) serializers.
- */
- public ObjectMapper setSerializerFactory(SerializerFactory f) {
- _serializerFactory = f;
- return this;
- }
-
- /**
- * Method for getting current {@link SerializerFactory}.
- *
- * Note that since instances are immutable, you can NOT change settings
- * by accessing an instance and calling methods: this will simply create
- * new instance of factory object.
- */
- public SerializerFactory getSerializerFactory() {
- return _serializerFactory;
- }
-
- /**
- * Method for setting specific {@link SerializerProvider} to use
- * for handling caching of {@link JsonSerializer} instances.
- */
- public ObjectMapper setSerializerProvider(DefaultSerializerProvider p) {
- _serializerProvider = p;
- return this;
- }
-
- public SerializerProvider getSerializerProvider() {
- return _serializerProvider;
- }
-
- /*
- /**********************************************************
- /* Configuration: mix-in annotations
- /**********************************************************
- */
-
- /**
- * Method to use for defining mix-in annotations to use for augmenting
- * annotations that processable (serializable / deserializable)
- * classes have.
- * Mixing in is done when introspecting class annotations and properties.
- * Map passed contains keys that are target classes (ones to augment
- * with new annotation overrides), and values that are source classes
- * (have annotations to use for augmentation).
- * Annotations from source classes (and their supertypes)
- * will override
- * annotations that target classes (and their super-types) have.
- */
- public final void setMixInAnnotations(Map, Class>> sourceMixins)
- {
- _mixInAnnotations.clear();
- if (sourceMixins != null && sourceMixins.size() > 0) {
- for (Map.Entry,Class>> en : sourceMixins.entrySet()) {
- _mixInAnnotations.put(new ClassKey(en.getKey()), en.getValue());
- }
- }
- }
-
- /**
- * Method to use for adding mix-in annotations to use for augmenting
- * specified class or interface. All annotations from
- * mixinSource
are taken to override annotations
- * that target
(or its supertypes) has.
- *
- * @param target Class (or interface) whose annotations to effectively override
- * @param mixinSource Class (or interface) whose annotations are to
- * be "added" to target's annotations, overriding as necessary
- */
- public final void addMixInAnnotations(Class> target, Class> mixinSource)
- {
- _mixInAnnotations.put(new ClassKey(target), mixinSource);
- }
-
- public final Class> findMixInClassFor(Class> cls) {
- return (_mixInAnnotations == null) ? null : _mixInAnnotations.get(new ClassKey(cls));
- }
-
- public final int mixInCount() {
- return (_mixInAnnotations == null) ? 0 : _mixInAnnotations.size();
- }
-
- /*
- /**********************************************************
- /* Configuration, introspection
- /**********************************************************
- */
-
- /**
- * Method for accessing currently configured visibility checker;
- * object used for determining whether given property element
- * (method, field, constructor) can be auto-detected or not.
- */
- public VisibilityChecker> getVisibilityChecker() {
- return _serializationConfig.getDefaultVisibilityChecker();
- }
-
- /**
- * Method for setting currently configured visibility checker;
- * object used for determining whether given property element
- * (method, field, constructor) can be auto-detected or not.
- * This default checker is used if no per-class overrides
- * are defined.
- */
- public void setVisibilityChecker(VisibilityChecker> vc) {
- _deserializationConfig = _deserializationConfig.with(vc);
- _serializationConfig = _serializationConfig.with(vc);
- }
-
- /**
- * Convenience method that allows changing configuration for
- * underlying {@link VisibilityChecker}s, to change details of what kinds of
- * properties are auto-detected.
- * Basically short cut for doing:
- *
- * mapper.setVisibilityChecker(
- * mapper.getVisibilityChecker().withVisibility(forMethod, visibility)
- * );
- *
- * one common use case would be to do:
- *
- * mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
- *
- * which would make all member fields serializable without further annotations,
- * instead of just public fields (default setting).
- *
- * @param forMethod Type of property descriptor affected (field, getter/isGetter,
- * setter, creator)
- * @param visibility Minimum visibility to require for the property descriptors of type
- *
- * @return Modified mapper instance (that is, "this"), to allow chaining
- * of configuration calls
- */
- public ObjectMapper setVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility)
- {
- _deserializationConfig = _deserializationConfig.withVisibility(forMethod, visibility);
- _serializationConfig = _serializationConfig.withVisibility(forMethod, visibility);
- return this;
- }
-
- /**
- * Method for accessing subtype resolver in use.
- */
- public SubtypeResolver getSubtypeResolver() {
- return _subtypeResolver;
- }
-
- /**
- * Method for setting custom subtype resolver to use.
- */
- public ObjectMapper setSubtypeResolver(SubtypeResolver str) {
- _subtypeResolver = str;
- _deserializationConfig = _deserializationConfig.with(str);
- _serializationConfig = _serializationConfig.with(str);
- return this;
- }
-
- /**
- * Method for changing {@link AnnotationIntrospector} used by this
- * mapper instance for both serialization and deserialization
- */
- public ObjectMapper setAnnotationIntrospector(AnnotationIntrospector ai) {
- _serializationConfig = _serializationConfig.with(ai);
- _deserializationConfig = _deserializationConfig.with(ai);
- return this;
- }
-
- /**
- * Method for changing {@link AnnotationIntrospector} instances used
- * by this mapper instance for serialization and deserialization,
- * specifying them separately so that different introspection can be
- * used for different aspects
- *
- * @since 2.1
- *
- * @param serializerAI {@link AnnotationIntrospector} to use for configuring
- * serialization
- * @param deserializerAI {@link AnnotationIntrospector} to use for configuring
- * deserialization
- */
- public ObjectMapper setAnnotationIntrospectors(AnnotationIntrospector serializerAI,
- AnnotationIntrospector deserializerAI) {
- _serializationConfig = _serializationConfig.with(serializerAI);
- _deserializationConfig = _deserializationConfig.with(deserializerAI);
- return this;
- }
-
- /**
- * Method for setting custom property naming strategy to use.
- */
- public ObjectMapper setPropertyNamingStrategy(PropertyNamingStrategy s) {
- _serializationConfig = _serializationConfig.with(s);
- _deserializationConfig = _deserializationConfig.with(s);
- return this;
- }
-
- /**
- * Method for setting defalt POJO property inclusion strategy for serialization.
- */
- public ObjectMapper setSerializationInclusion(JsonInclude.Include incl) {
- _serializationConfig = _serializationConfig.withSerializationInclusion(incl);
- return this;
- }
-
- /*
- /**********************************************************
- /* Type information configuration (1.5+)
- /**********************************************************
- */
-
- /**
- * Convenience method that is equivalent to calling
- *
- * enableObjectTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE);
- *
- */
- public ObjectMapper enableDefaultTyping() {
- return enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE);
- }
-
- /**
- * Convenience method that is equivalent to calling
- *
- * enableObjectTyping(dti, JsonTypeInfo.As.WRAPPER_ARRAY);
- *
- */
- public ObjectMapper enableDefaultTyping(DefaultTyping dti) {
- return enableDefaultTyping(dti, JsonTypeInfo.As.WRAPPER_ARRAY);
- }
-
- /**
- * Method for enabling automatic inclusion of type information, needed
- * for proper deserialization of polymorphic types (unless types
- * have been annotated with {@link com.fr.third.fasterxml.jackson.annotation.JsonTypeInfo}).
- *
- * @param applicability Defines kinds of types for which additional type information
- * is added; see {@link DefaultTyping} for more information.
- */
- public ObjectMapper enableDefaultTyping(DefaultTyping applicability, JsonTypeInfo.As includeAs)
- {
- TypeResolverBuilder> typer = new DefaultTypeResolverBuilder(applicability);
- // we'll always use full class name, when using defaulting
- typer = typer.init(JsonTypeInfo.Id.CLASS, null);
- typer = typer.inclusion(includeAs);
- return setDefaultTyping(typer);
- }
-
- /**
- * Method for enabling automatic inclusion of type information -- needed
- * for proper deserialization of polymorphic types (unless types
- * have been annotated with {@link com.fr.third.fasterxml.jackson.annotation.JsonTypeInfo}) --
- * using "As.PROPERTY" inclusion mechanism and specified property name
- * to use for inclusion (default being "@class" since default type information
- * always uses class name as type identifier)
- */
- public ObjectMapper enableDefaultTypingAsProperty(DefaultTyping applicability, String propertyName)
- {
- TypeResolverBuilder> typer = new DefaultTypeResolverBuilder(applicability);
- // we'll always use full class name, when using defaulting
- typer = typer.init(JsonTypeInfo.Id.CLASS, null);
- typer = typer.inclusion(JsonTypeInfo.As.PROPERTY);
- typer = typer.typeProperty(propertyName);
- return setDefaultTyping(typer);
- }
-
- /**
- * Method for disabling automatic inclusion of type information; if so, only
- * explicitly annotated types (ones with
- * {@link com.fr.third.fasterxml.jackson.annotation.JsonTypeInfo}) will have
- * additional embedded type information.
- */
- public ObjectMapper disableDefaultTyping() {
- return setDefaultTyping(null);
- }
-
- /**
- * Method for enabling automatic inclusion of type information, using
- * specified handler object for determining which types this affects,
- * as well as details of how information is embedded.
- *
- * @param typer Type information inclusion handler
- */
- public ObjectMapper setDefaultTyping(TypeResolverBuilder> typer) {
- _deserializationConfig = _deserializationConfig.with(typer);
- _serializationConfig = _serializationConfig.with(typer);
- return this;
- }
-
- /**
- * Method for registering specified class as a subtype, so that
- * typename-based resolution can link supertypes to subtypes
- * (as an alternative to using annotations).
- * Type for given class is determined from appropriate annotation;
- * or if missing, default name (unqualified class name)
- */
- public void registerSubtypes(Class>... classes) {
- getSubtypeResolver().registerSubtypes(classes);
- }
-
- /**
- * Method for registering specified class as a subtype, so that
- * typename-based resolution can link supertypes to subtypes
- * (as an alternative to using annotations).
- * Name may be provided as part of argument, but if not will
- * be based on annotations or use default name (unqualified
- * class name).
- */
- public void registerSubtypes(NamedType... types) {
- getSubtypeResolver().registerSubtypes(types);
- }
-
- /*
- /**********************************************************
- /* Configuration, basic type handling
- /**********************************************************
- */
-
- /**
- * Accessor for getting currently configured {@link TypeFactory} instance.
- */
- public TypeFactory getTypeFactory() {
- return _typeFactory;
- }
-
- /**
- * Method that can be used to override {@link TypeFactory} instance
- * used by this mapper.
- *
- * Note: will also set {@link TypeFactory} that deserialization and
- * serialization config objects use.
- */
- public ObjectMapper setTypeFactory(TypeFactory f)
- {
- _typeFactory = f;
- _deserializationConfig = _deserializationConfig.with(f);
- _serializationConfig = _serializationConfig.with(f);
- return this;
- }
-
- /**
- * Convenience method for constructing {@link JavaType} out of given
- * type (typically java.lang.Class
), but without explicit
- * context.
- */
- public JavaType constructType(Type t) {
- return _typeFactory.constructType(t);
- }
-
- /*
- /**********************************************************
- /* Configuration, deserialization
- /**********************************************************
- */
-
- /**
- * Method for specifying {@link JsonNodeFactory} to use for
- * constructing root level tree nodes (via method
- * {@link #createObjectNode}
- */
- public ObjectMapper setNodeFactory(JsonNodeFactory f) {
- _deserializationConfig = _deserializationConfig.with(f);
- return this;
- }
-
- /**
- * Method for adding specified {@link DeserializationProblemHandler}
- * to be used for handling specific problems during deserialization.
- */
- public ObjectMapper addHandler(DeserializationProblemHandler h) {
- _deserializationConfig = _deserializationConfig.withHandler(h);
- return this;
- }
-
- /**
- * Method for removing all registered {@link DeserializationProblemHandler}s
- * instances from this mapper.
- */
- public ObjectMapper clearProblemHandlers() {
- _deserializationConfig = _deserializationConfig.withNoProblemHandlers();
- return this;
- }
-
-
- /*
- /**********************************************************
- /* Configuration, serialization
- /**********************************************************
- */
-
- /**
- * Convenience method that is equivalent to:
- *
- * mapper.setFilters(mapper.getSerializationConfig().withFilters(filterProvider));
- *
- *
- * Note that usually it is better to use method {@link #writer(FilterProvider)};
- * however, sometimes
- * this method is more convenient. For example, some frameworks only allow configuring
- * of ObjectMapper instances and not ObjectWriters.
- */
- public void setFilters(FilterProvider filterProvider) {
- _serializationConfig = _serializationConfig.withFilters(filterProvider);
- }
-
- /**
- * Method that will configure default {@link Base64Variant} that
- * byte[]
serializers and deserializers will use.
- *
- * @param v Base64 variant to use
- *
- * @return This mapper, for convenience to allow chaining
- *
- * @since 2.1
- */
- public ObjectMapper setBase64Variant(Base64Variant v) {
- _serializationConfig = _serializationConfig.with(v);
- _deserializationConfig = _deserializationConfig.with(v);
- return this;
- }
-
- /*
- /**********************************************************
- /* Configuration, other
- /**********************************************************
- */
-
- /**
- * Method that can be used to get hold of {@link JsonFactory} that this
- * mapper uses if it needs to construct {@link JsonParser}s
- * and/or {@link JsonGenerator}s.
- *
- * @return {@link JsonFactory} that this mapper uses when it needs to
- * construct Json parser and generators
- */
- @Override
- public JsonFactory getFactory() { return _jsonFactory; }
-
- /**
- * @deprecated Since 2.1: Use {@link #getFactory} instead
- */
- @Deprecated
- @Override
- public JsonFactory getJsonFactory() { return _jsonFactory; }
-
- /**
- * Method for configuring the default {@link DateFormat} to use when serializing time
- * values as Strings, and deserializing from JSON Strings.
- * This is preferably to directly modifying {@link SerializationConfig} and
- * {@link DeserializationConfig} instances.
- * If you need per-request configuration, use {@link #writer(DateFormat)} to
- * create properly configured {@link ObjectWriter} and use that; this because
- * {@link ObjectWriter}s are thread-safe whereas ObjectMapper itself is only
- * thread-safe when configuring methods (such as this one) are NOT called.
- */
- public ObjectMapper setDateFormat(DateFormat dateFormat)
- {
- _deserializationConfig = _deserializationConfig.with(dateFormat);
- _serializationConfig = _serializationConfig.with(dateFormat);
- return this;
- }
-
- /**
- * Method for configuring {@link HandlerInstantiator} to use for creating
- * instances of handlers (such as serializers, deserializers, type and type
- * id resolvers), given a class.
- *
- * @param hi Instantiator to use; if null, use the default implementation
- */
- public Object setHandlerInstantiator(HandlerInstantiator hi)
- {
- _deserializationConfig = _deserializationConfig.with(hi);
- _serializationConfig = _serializationConfig.with(hi);
- return this;
- }
-
- /**
- * Method for configuring {@link InjectableValues} which used to find
- * values to inject.
- */
- public ObjectMapper setInjectableValues(InjectableValues injectableValues) {
- _injectableValues = injectableValues;
- return this;
- }
-
- /**
- * Method for overriding default locale to use for formatting.
- * Default value used is {@link Locale#getDefault()}.
- */
- public ObjectMapper setLocale(Locale l) {
- _deserializationConfig = _deserializationConfig.with(l);
- _serializationConfig = _serializationConfig.with(l);
- return this;
- }
-
- /**
- * Method for overriding default TimeZone to use for formatting.
- * Default value used is {@link TimeZone#getDefault()}.
- */
- public ObjectMapper setTimeZone(TimeZone tz) {
- _deserializationConfig = _deserializationConfig.with(tz);
- _serializationConfig = _serializationConfig.with(tz);
- return this;
- }
-
- /*
- /**********************************************************
- /* Configuration, simple features
- /**********************************************************
- */
-
- /**
- * Method for changing state of an on/off mapper feature for
- * this mapper instance.
- */
- public ObjectMapper configure(MapperFeature f, boolean state) {
- _serializationConfig = state ?
- _serializationConfig.with(f) : _serializationConfig.without(f);
- _deserializationConfig = state ?
- _deserializationConfig.with(f) : _deserializationConfig.without(f);
- return this;
- }
-
- /**
- * Method for changing state of an on/off serialization feature for
- * this object mapper.
- */
- public ObjectMapper configure(SerializationFeature f, boolean state) {
- _serializationConfig = state ?
- _serializationConfig.with(f) : _serializationConfig.without(f);
- return this;
- }
-
- /**
- * Method for changing state of an on/off deserialization feature for
- * this object mapper.
- */
- public ObjectMapper configure(DeserializationFeature f, boolean state) {
- _deserializationConfig = state ?
- _deserializationConfig.with(f) : _deserializationConfig.without(f);
- return this;
- }
-
- /**
- * Method for changing state of an on/off {@link JsonParser} feature for
- * {@link JsonFactory} instance this object mapper uses.
- *
- * This is method is basically a shortcut method for calling
- * {@link JsonFactory#enable} on the shared
- * {@link JsonFactory} this mapper uses (which is accessible
- * using {@link #getJsonFactory}).
- */
- public ObjectMapper configure(JsonParser.Feature f, boolean state) {
- _jsonFactory.configure(f, state);
- return this;
- }
-
- /**
- * Method for changing state of an on/off {@link JsonGenerator} feature for
- * {@link JsonFactory} instance this object mapper uses.
- *
- * This is method is basically a shortcut method for calling
- * {@link JsonFactory#enable} on the shared
- * {@link JsonFactory} this mapper uses (which is accessible
- * using {@link #getJsonFactory}).
- */
- public ObjectMapper configure(JsonGenerator.Feature f, boolean state) {
- _jsonFactory.configure(f, state);
- return this;
- }
-
- /**
- * Method for enabling specified {@link MapperConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper enable(MapperFeature... f) {
- _deserializationConfig = _deserializationConfig.with(f);
- _serializationConfig = _serializationConfig.with(f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper disable(MapperFeature... f) {
- _deserializationConfig = _deserializationConfig.without(f);
- _serializationConfig = _serializationConfig.without(f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper enable(DeserializationFeature feature) {
- _deserializationConfig = _deserializationConfig.with(feature);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper enable(DeserializationFeature first,
- DeserializationFeature... f) {
- _deserializationConfig = _deserializationConfig.with(first, f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper disable(DeserializationFeature feature) {
- _deserializationConfig = _deserializationConfig.without(feature);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper disable(DeserializationFeature first,
- DeserializationFeature... f) {
- _deserializationConfig = _deserializationConfig.without(first, f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} feature.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper enable(SerializationFeature f) {
- _serializationConfig = _serializationConfig.with(f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper enable(SerializationFeature first,
- SerializationFeature... f) {
- _serializationConfig = _serializationConfig.with(first, f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper disable(SerializationFeature f) {
- _serializationConfig = _serializationConfig.without(f);
- return this;
- }
-
- /**
- * Method for enabling specified {@link DeserializationConfig} features.
- * Modifies and returns this instance; no new object is created.
- */
- public ObjectMapper disable(SerializationFeature first,
- SerializationFeature... f) {
- _serializationConfig = _serializationConfig.without(first, f);
- return this;
- }
-
- /**
- * Method for checking whether given Mapper
- * feature is enabled.
- */
- public boolean isEnabled(MapperFeature f) {
- // ok to use either one, should be kept in sync
- return _serializationConfig.isEnabled(f);
- }
-
- /**
- * Method for checking whether given serialization-specific
- * feature is enabled.
- */
- public boolean isEnabled(SerializationFeature f) {
- return _serializationConfig.isEnabled(f);
- }
-
- /**
- * Method for checking whether given deserialization-specific
- * feature is enabled.
- */
- public boolean isEnabled(DeserializationFeature f) {
- return _deserializationConfig.isEnabled(f);
- }
-
- /**
- * Convenience method, equivalent to:
- *
- * getJsonFactory().isEnabled(f);
- *
- */
- public boolean isEnabled(JsonFactory.Feature f) {
- return _jsonFactory.isEnabled(f);
- }
-
- /**
- * Convenience method, equivalent to:
- *
- * getJsonFactory().isEnabled(f);
- *
- */
- public boolean isEnabled(JsonParser.Feature f) {
- return _jsonFactory.isEnabled(f);
- }
-
- /**
- * Convenience method, equivalent to:
- *
- * getJsonFactory().isEnabled(f);
- *
- */
- public boolean isEnabled(JsonGenerator.Feature f) {
- return _jsonFactory.isEnabled(f);
- }
-
- /**
- * Method that can be used to get hold of {@link JsonNodeFactory}
- * that this mapper will use when directly constructing
- * root {@link JsonNode} instances for Trees.
- *
- * Note: this is just a shortcut for calling
- *
- * getDeserializationConfig().getNodeFactory()
- *
- */
- public JsonNodeFactory getNodeFactory() {
- return _deserializationConfig.getNodeFactory();
- }
-
- /*
- /**********************************************************
- /* Public API (from ObjectCodec): deserialization
- /* (mapping from JSON to Java types);
- /* main methods
- /**********************************************************
- */
-
- /**
- * Method to deserialize JSON content into a non-container
- * type (it can be an array type, however): typically a bean, array
- * or a wrapper type (like {@link java.lang.Boolean}).
- *
- * Note: this method should NOT be used if the result type is a
- * container ({@link java.util.Collection} or {@link java.util.Map}.
- * The reason is that due to type erasure, key and value types
- * can not be introspected when using this method.
- */
- @Override
- @SuppressWarnings("unchecked")
- public T readValue(JsonParser jp, Class valueType)
- throws IOException, JsonParseException, JsonMappingException
- {
- return (T) _readValue(getDeserializationConfig(), jp, _typeFactory.constructType(valueType));
- }
-
- /**
- * Method to deserialize JSON content into a Java type, reference
- * to which is passed as argument. Type is passed using so-called
- * "super type token" (see )
- * and specifically needs to be used if the root type is a
- * parameterized (generic) container type.
- */
- @Override
- @SuppressWarnings("unchecked")
- public T readValue(JsonParser jp, TypeReference> valueTypeRef)
- throws IOException, JsonParseException, JsonMappingException
- {
- return (T) _readValue(getDeserializationConfig(), jp, _typeFactory.constructType(valueTypeRef));
- }
-
- /**
- * Method to deserialize JSON content into a Java type, reference
- * to which is passed as argument. Type is passed using
- * Jackson specific type; instance of which can be constructed using
- * {@link TypeFactory}.
- */
- @Override
- @SuppressWarnings("unchecked")
- public final T readValue(JsonParser jp, ResolvedType valueType)
- throws IOException, JsonParseException, JsonMappingException
- {
- return (T) _readValue(getDeserializationConfig(), jp, (JavaType) valueType);
- }
-
- /**
- * Type-safe overloaded method, basically alias for {@link #readValue(JsonParser, ResolvedType)}.
- */
- @SuppressWarnings("unchecked")
- public