Class SmileGenerator

java.lang.Object
com.fasterxml.jackson.core.JsonGenerator
com.fasterxml.jackson.core.base.GeneratorBase
com.fasterxml.jackson.dataformat.smile.SmileGenerator
All Implemented Interfaces:
com.fasterxml.jackson.core.Versioned, Closeable, Flushable, AutoCloseable

public class SmileGenerator extends com.fasterxml.jackson.core.base.GeneratorBase
JsonGenerator implementation for Smile-encoded content (see Smile Format Specification)
  • Field Details

    • DEFAULT_NAME_BUFFER_LENGTH

      protected static final int DEFAULT_NAME_BUFFER_LENGTH
      See Also:
    • DEFAULT_STRING_VALUE_BUFFER_LENGTH

      protected static final int DEFAULT_STRING_VALUE_BUFFER_LENGTH
      See Also:
    • MIN_BUFFER_LENGTH

      private static final int MIN_BUFFER_LENGTH
      To simplify certain operations, we require output buffer length to allow outputting of contiguous 256 character UTF-8 encoded String value. Length of the longest UTF-8 code point (from Java char) is 3 bytes, and we need both initial token byte and single-byte end marker so we get following value.

      Note: actually we could live with shorter one; absolute minimum would be for encoding 64-character Strings.

      See Also:
    • TOKEN_BYTE_LONG_STRING_ASCII

      protected static final byte TOKEN_BYTE_LONG_STRING_ASCII
      See Also:
    • TOKEN_BYTE_INT_32

      protected static final byte TOKEN_BYTE_INT_32
      See Also:
    • TOKEN_BYTE_INT_64

      protected static final byte TOKEN_BYTE_INT_64
      See Also:
    • TOKEN_BYTE_BIG_INTEGER

      protected static final byte TOKEN_BYTE_BIG_INTEGER
      See Also:
    • TOKEN_BYTE_FLOAT_32

      protected static final byte TOKEN_BYTE_FLOAT_32
      See Also:
    • TOKEN_BYTE_FLOAT_64

      protected static final byte TOKEN_BYTE_FLOAT_64
      See Also:
    • TOKEN_BYTE_BIG_DECIMAL

      protected static final byte TOKEN_BYTE_BIG_DECIMAL
      See Also:
    • MIN_INT_AS_LONG

      protected static final long MIN_INT_AS_LONG
      See Also:
    • MAX_INT_AS_LONG

      protected static final long MAX_INT_AS_LONG
      See Also:
    • REPLACEMENT_CHAR

      protected static final int REPLACEMENT_CHAR
      The replacement character to use to fix invalid Unicode sequences (mismatched surrogate pair).
      Since:
      2.13
      See Also:
    • _streamWriteConstraints

      protected final com.fasterxml.jackson.core.StreamWriteConstraints _streamWriteConstraints
      Since:
      2.16
    • _out

      protected final OutputStream _out
    • _formatFeatures

      protected int _formatFeatures
      Bit flag composed of bits that indicate which SmileGenerator.Features are enabled.
    • _streamWriteContext

      protected SmileWriteContext _streamWriteContext
    • _outputBuffer

      protected byte[] _outputBuffer
      Intermediate buffer in which contents are buffered before being written using _out.
    • _outputTail

      protected int _outputTail
      Pointer to the next available byte in _outputBuffer
    • _outputEnd

      protected final int _outputEnd
      Offset to index after the last valid index in _outputBuffer. Typically same as length of the buffer.
    • _bytesWritten

      protected int _bytesWritten
      Let's keep track of how many bytes have been output, may prove useful when debugging. This does not include bytes buffered in the output buffer, just bytes that have been written using underlying stream writer.
    • _seenNames

      protected SmileGenerator.SharedStringNode[] _seenNames
      Raw data structure used for checking whether field name to write can be output using back reference or not.
    • _seenNameCount

      protected int _seenNameCount
      Number of entries in _seenNames; -1 if no shared name detection is enabled
    • _seenStringValues

      protected SmileGenerator.SharedStringNode[] _seenStringValues
      Raw data structure used for checking whether String value to write can be output using back reference or not.
    • _seenStringValueCount

      protected int _seenStringValueCount
      Number of entries in _seenStringValues; -1 if no shared text value detection is enabled
    • _bufferRecyclable

      protected boolean _bufferRecyclable
      Flag that indicates whether the output buffer is recyclable (and needs to be returned to recycler once we are done) or not.
  • Constructor Details

    • SmileGenerator

      public SmileGenerator(com.fasterxml.jackson.core.io.IOContext ioCtxt, int stdFeatures, int smileFeatures, com.fasterxml.jackson.core.ObjectCodec codec, OutputStream out)
      Since:
      2.16
    • SmileGenerator

      public SmileGenerator(com.fasterxml.jackson.core.io.IOContext ioCtxt, int stdFeatures, int smileFeatures, com.fasterxml.jackson.core.ObjectCodec codec, OutputStream out, byte[] outputBuffer, int offset, boolean bufferRecyclable)
      Since:
      2.16
  • Method Details

    • writeHeader

      public void writeHeader() throws IOException
      Method that can be called to explicitly write Smile document header. Note that usually you do not need to call this for first document to output, but rather only if you intend to write multiple root-level documents with same generator (and even in that case this is optional thing to do). As a result usually only SmileFactory calls this method.
      Throws:
      IOException
    • version

      public com.fasterxml.jackson.core.Version version()
      Specified by:
      version in interface com.fasterxml.jackson.core.Versioned
      Overrides:
      version in class com.fasterxml.jackson.core.base.GeneratorBase
    • canWriteBinaryNatively

      public boolean canWriteBinaryNatively()
      Overrides:
      canWriteBinaryNatively in class com.fasterxml.jackson.core.JsonGenerator
    • getWriteCapabilities

      public com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamWriteCapability> getWriteCapabilities()
      Overrides:
      getWriteCapabilities in class com.fasterxml.jackson.core.JsonGenerator
    • useDefaultPrettyPrinter

      public com.fasterxml.jackson.core.JsonGenerator useDefaultPrettyPrinter()
      No way (or need) to indent anything, so let's block any attempts. (should we throw an exception instead?)
      Overrides:
      useDefaultPrettyPrinter in class com.fasterxml.jackson.core.base.GeneratorBase
    • setPrettyPrinter

      public com.fasterxml.jackson.core.JsonGenerator setPrettyPrinter(com.fasterxml.jackson.core.PrettyPrinter pp)
      No way (or need) to indent anything, so let's block any attempts. (should we throw an exception instead?)
      Overrides:
      setPrettyPrinter in class com.fasterxml.jackson.core.JsonGenerator
    • getOutputTarget

      public Object getOutputTarget()
      Overrides:
      getOutputTarget in class com.fasterxml.jackson.core.JsonGenerator
    • getOutputBuffered

      public int getOutputBuffered()
      Overrides:
      getOutputBuffered in class com.fasterxml.jackson.core.JsonGenerator
    • getFormatFeatures

      public int getFormatFeatures()
      Overrides:
      getFormatFeatures in class com.fasterxml.jackson.core.JsonGenerator
    • overrideFormatFeatures

      public com.fasterxml.jackson.core.JsonGenerator overrideFormatFeatures(int values, int mask)
      Overrides:
      overrideFormatFeatures in class com.fasterxml.jackson.core.JsonGenerator
    • getOutputContext

      public com.fasterxml.jackson.core.JsonStreamContext getOutputContext()
      Overrides:
      getOutputContext in class com.fasterxml.jackson.core.base.GeneratorBase
    • currentValue

      public Object currentValue()
      Overrides:
      currentValue in class com.fasterxml.jackson.core.base.GeneratorBase
    • assignCurrentValue

      public void assignCurrentValue(Object v)
      Overrides:
      assignCurrentValue in class com.fasterxml.jackson.core.base.GeneratorBase
    • getCurrentValue

      @Deprecated public Object getCurrentValue()
      Deprecated.
      Overrides:
      getCurrentValue in class com.fasterxml.jackson.core.JsonGenerator
    • setCurrentValue

      @Deprecated public void setCurrentValue(Object v)
      Deprecated.
      Overrides:
      setCurrentValue in class com.fasterxml.jackson.core.JsonGenerator
    • writeFieldName

      public final void writeFieldName(String name) throws IOException
      Specified by:
      writeFieldName in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeFieldName

      public final void writeFieldName(com.fasterxml.jackson.core.SerializableString name) throws IOException
      Overrides:
      writeFieldName in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • enable

    • disable

    • isEnabled

      public final boolean isEnabled(SmileGenerator.Feature f)
    • configure

      public SmileGenerator configure(SmileGenerator.Feature f, boolean state)
    • streamWriteConstraints

      public com.fasterxml.jackson.core.StreamWriteConstraints streamWriteConstraints()
      Overrides:
      streamWriteConstraints in class com.fasterxml.jackson.core.JsonGenerator
    • writeRaw

      public void writeRaw(byte b) throws IOException
      Method for directly inserting specified byte in output at current position.

      NOTE: only use this method if you really know what you are doing.

      Throws:
      IOException
    • writeBytes

      public void writeBytes(byte[] data, int offset, int len) throws IOException
      Method for directly inserting specified bytes in output at current position.

      NOTE: only use this method if you really know what you are doing.

      Throws:
      IOException
    • writeStartArray

      public final void writeStartArray() throws IOException
      Specified by:
      writeStartArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeStartArray

      public final void writeStartArray(Object forValue) throws IOException
      Overrides:
      writeStartArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeStartArray

      public final void writeStartArray(Object forValue, int elementsToWrite) throws IOException
      Overrides:
      writeStartArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeStartArray

      @Deprecated public final void writeStartArray(int size) throws IOException
      Deprecated.
      Overrides:
      writeStartArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeEndArray

      public final void writeEndArray() throws IOException
      Specified by:
      writeEndArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeStartObject

      public final void writeStartObject() throws IOException
      Specified by:
      writeStartObject in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeStartObject

      public final void writeStartObject(Object forValue) throws IOException
      Overrides:
      writeStartObject in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeStartObject

      public void writeStartObject(Object forValue, int elementsToWrite) throws IOException
      Overrides:
      writeStartObject in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeEndObject

      public final void writeEndObject() throws IOException
      Specified by:
      writeEndObject in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeArray

      public void writeArray(int[] array, int offset, int length) throws IOException
      Overrides:
      writeArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeArray

      public void writeArray(long[] array, int offset, int length) throws IOException
      Overrides:
      writeArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeArray

      public void writeArray(double[] array, int offset, int length) throws IOException
      Overrides:
      writeArray in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeFieldName

      private final void _writeFieldName(String name) throws IOException
      Throws:
      IOException
    • _writeNonShortFieldName

      private final void _writeNonShortFieldName(String name, int len) throws IOException
      Throws:
      IOException
    • _writeFieldName

      protected final void _writeFieldName(com.fasterxml.jackson.core.SerializableString name) throws IOException
      Throws:
      IOException
    • _writeLongAsciiFieldName

      private final void _writeLongAsciiFieldName(byte[] bytes) throws IOException
      Throws:
      IOException
    • _writeFieldNameUnicode

      protected final void _writeFieldNameUnicode(com.fasterxml.jackson.core.SerializableString name, byte[] bytes) throws IOException
      Throws:
      IOException
    • _writeSharedNameReference

      private final void _writeSharedNameReference(int ix) throws IOException
      Throws:
      IOException
    • writeString

      public void writeString(String text) throws IOException
      Specified by:
      writeString in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeSharedStringValueReference

      private final void _writeSharedStringValueReference(int ix) throws IOException
      Throws:
      IOException
    • _writeNonSharedString

      private final void _writeNonSharedString(String text, int len) throws IOException
      Helper method called to handle cases where String value to write is known to be long enough not to be shareable.
      Throws:
      IOException
    • writeString

      public void writeString(char[] text, int offset, int len) throws IOException
      Specified by:
      writeString in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeString

      public final void writeString(com.fasterxml.jackson.core.SerializableString sstr) throws IOException
      Overrides:
      writeString in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeRawUTF8String

      public void writeRawUTF8String(byte[] text, int offset, int len) throws IOException
      Specified by:
      writeRawUTF8String in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeUTF8String

      public final void writeUTF8String(byte[] text, int offset, int len) throws IOException
      Specified by:
      writeUTF8String in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeRaw

      public void writeRaw(String text) throws IOException
      Specified by:
      writeRaw in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeRaw

      public void writeRaw(String text, int offset, int len) throws IOException
      Specified by:
      writeRaw in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeRaw

      public void writeRaw(char[] text, int offset, int len) throws IOException
      Specified by:
      writeRaw in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeRaw

      public void writeRaw(char c) throws IOException
      Specified by:
      writeRaw in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeRawValue

      public void writeRawValue(String text) throws IOException
      Overrides:
      writeRawValue in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeRawValue

      public void writeRawValue(String text, int offset, int len) throws IOException
      Overrides:
      writeRawValue in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeRawValue

      public void writeRawValue(char[] text, int offset, int len) throws IOException
      Overrides:
      writeRawValue in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeBinary

      public void writeBinary(com.fasterxml.jackson.core.Base64Variant b64variant, byte[] data, int offset, int len) throws IOException
      Specified by:
      writeBinary in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeBinary

      public int writeBinary(InputStream data, int dataLength) throws IOException
      Overrides:
      writeBinary in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeBinary

      public int writeBinary(com.fasterxml.jackson.core.Base64Variant b64variant, InputStream data, int dataLength) throws IOException
      Overrides:
      writeBinary in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • writeBoolean

      public void writeBoolean(boolean state) throws IOException
      Specified by:
      writeBoolean in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeNull

      public void writeNull() throws IOException
      Specified by:
      writeNull in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeNumber

      public void writeNumber(int i) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeNumberNoChecks

      private final int _writeNumberNoChecks(int ptr, int i) throws IOException
      Throws:
      IOException
    • writeNumber

      public void writeNumber(long l) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeNumberNoChecks

      private final int _writeNumberNoChecks(int ptr, long l) throws IOException
      Throws:
      IOException
    • writeNumber

      public void writeNumber(BigInteger v) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeNumber

      public void writeNumber(double d) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeNumberNoChecks

      private final int _writeNumberNoChecks(int ptr, double d) throws IOException
      Throws:
      IOException
    • writeNumber

      public void writeNumber(float f) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeNumber

      public void writeNumber(BigDecimal dec) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • writeNumber

      public void writeNumber(String encodedValue) throws IOException
      Specified by:
      writeNumber in class com.fasterxml.jackson.core.JsonGenerator
      Throws:
      IOException
    • _writeIntegralNumber

      protected void _writeIntegralNumber(String enc, boolean neg) throws IOException
      Throws:
      IOException
    • _writeDecimalNumber

      protected void _writeDecimalNumber(String enc) throws IOException
      Throws:
      IOException
    • _verifyValueWrite

      protected final void _verifyValueWrite(String typeMsg) throws IOException
      Specified by:
      _verifyValueWrite in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • flush

      public final void flush() throws IOException
      Specified by:
      flush in interface Flushable
      Specified by:
      flush in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class com.fasterxml.jackson.core.base.GeneratorBase
      Throws:
      IOException
    • _shortUTF8Encode

      private final int _shortUTF8Encode(char[] str, int i, int end) throws IOException
      Helper method called when the whole character sequence is known to fit in the output buffer regardless of UTF-8 expansion.
      Throws:
      IOException
    • _shortUTF8Encode2

      private final int _shortUTF8Encode2(char[] str, int i, int end, int outputPtr) throws IOException
      Helper method called when the whole character sequence is known to fit in the output buffer, but not all characters are single-byte (ASCII) characters.
      Throws:
      IOException
    • _shortUTF8Encode

      private final int _shortUTF8Encode(String str, int i, int end) throws IOException
      Throws:
      IOException
    • _shortUTF8Encode2

      private final int _shortUTF8Encode2(String str, int i, int end, int outputPtr) throws IOException
      Throws:
      IOException
    • _mediumUTF8Encode

      private void _mediumUTF8Encode(char[] str, int inputPtr, int inputEnd) throws IOException
      Throws:
      IOException
    • _mediumUTF8Encode

      private void _mediumUTF8Encode(String str, int inputPtr, int inputEnd) throws IOException
      Throws:
      IOException
    • _invalidSurrogateStart

      private int _invalidSurrogateStart(int code, byte[] outBuf, int outputPtr) throws IOException
      Throws:
      IOException
    • _invalidSurrogateEnd

      private int _invalidSurrogateEnd(int surr1, int surr2, byte[] outBuf, int outputPtr) throws IOException
      Throws:
      IOException
    • _appendReplacementChar

      private int _appendReplacementChar(byte[] outBuf, int outputPtr)
    • _decodeAndWriteSurrogate

      private int _decodeAndWriteSurrogate(int surr1, int surr2, byte[] outBuf, int outputPtr)
    • _ensureRoomForOutput

      private final void _ensureRoomForOutput(int needed) throws IOException
      Throws:
      IOException
    • _writeByte

      private final void _writeByte(byte b) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte b1, byte b2) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte b1, byte b2, byte b3) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte b1, byte b2, byte b3, byte b4) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte b1, byte b2, byte b3, byte b4, byte b5) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final void _writeBytes(byte[] data, int offset, int len) throws IOException
      Throws:
      IOException
    • _writeBytes

      private final int _writeBytes(InputStream in, int bytesLeft) throws IOException
      Throws:
      IOException
    • _writeBytesLong

      private final void _writeBytesLong(byte[] data, int offset, int len) throws IOException
      Throws:
      IOException
    • _writePositiveVInt

      private void _writePositiveVInt(int i) throws IOException
      Helper method for writing a 32-bit positive (really 31-bit then) value. Value is NOT zigzag encoded (since there is no sign bit to worry about)
      Throws:
      IOException
    • _writeSignedVInt

      private void _writeSignedVInt(int input) throws IOException
      Helper method for writing 32-bit signed value, using "zig zag encoding" (see protocol buffers for explanation -- basically, sign bit is moved as LSB, rest of value shifted left by one) coupled with basic variable length encoding
      Throws:
      IOException
    • _write7BitBinaryWithLength

      protected void _write7BitBinaryWithLength(byte[] data, int offset, int len) throws IOException
      Throws:
      IOException
    • _write7BitBinaryWithLength

      protected int _write7BitBinaryWithLength(InputStream in, int bytesLeft, byte[] buffer) throws IOException
      Throws:
      IOException
    • _readMore

      private int _readMore(InputStream in, byte[] readBuffer, int inputPtr, int inputEnd, int maxRead) throws IOException
      Throws:
      IOException
    • _releaseBuffers

      protected void _releaseBuffers()
      Specified by:
      _releaseBuffers in class com.fasterxml.jackson.core.base.GeneratorBase
    • _flushBuffer

      protected final void _flushBuffer() throws IOException
      Throws:
      IOException
    • _findSeenName

      private final int _findSeenName(String name)
    • _addSeenName

      private final void _addSeenName(String name)
    • _findSeenStringValue

      private final int _findSeenStringValue(String text)
    • _addSeenStringValue

      private final void _addSeenStringValue(String text)
    • _validBackRef

      private static final boolean _validBackRef(int index)
      Helper method used to ensure that we do not use back-reference values that would produce illegal byte sequences (ones with byte 0xFE or 0xFF). Note that we do not try to avoid null byte (0x00) by default, although it would be technically possible as well.
    • outputOffset

      protected long outputOffset()
      Method for accessing offset of the next byte within the whole output stream that this generator has produced.
    • _notSupported

      protected UnsupportedOperationException _notSupported()
    • _streamReadConstraints

      protected com.fasterxml.jackson.core.StreamReadConstraints _streamReadConstraints()
      We need access to some reader-side constraints for safety-check within number decoding for : for now we need to rely on global defaults; should be ok for basic safeguarding.
      Since:
      2.17