Class SmileParser

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, Versioned

    public class SmileParser
    extends JsonParserBase
    • Field Detail

      • _objectCodec

        protected ObjectCodec _objectCodec
        Codec used for data binding when (if) requested.
      • _mayContainRawBinary

        protected boolean _mayContainRawBinary
        Flag that indicates whether content can legally have raw (unquoted) binary data. Since this information is included both in header and in actual binary data blocks there is redundancy, and we want to ensure settings are compliant. Using application may also want to know this setting in case it does some direct (random) access.
      • _smileBufferRecycler

        protected final SmileBufferRecycler<java.lang.String> _smileBufferRecycler
        Helper object used for low-level recycling of Smile-generator specific buffers.
        Since:
        1.7
      • _inputStream

        protected java.io.InputStream _inputStream
        Input stream that can be used for reading more content, if one in use. May be null, if input comes just as a full buffer, or if the stream has been closed.
      • _inputBuffer

        protected byte[] _inputBuffer
        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.
      • _bufferRecyclable

        protected boolean _bufferRecyclable
        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.

      • _tokenIncomplete

        protected boolean _tokenIncomplete
        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)
      • _typeByte

        protected int _typeByte
        Type byte of the current token
      • _got32BitFloat

        protected boolean _got32BitFloat
        Specific flag that is set when we encountered a 32-bit floating point value; needed since numeric super classes do not track distinction between float and double, but Smile format does, and we want to retain that separation.
      • _quadBuffer

        protected int[] _quadBuffer
        Temporary buffer used for name parsing.
      • _quad1

        protected int _quad1
        Quads used for hash calculation
      • _quad2

        protected int _quad2
        Quads used for hash calculation
      • _seenNames

        protected java.lang.String[] _seenNames
        Array of recently seen field names, which may be back referenced by later fields. Defaults set to enable handling even if no header found.
      • _seenNameCount

        protected int _seenNameCount
      • _seenStringValues

        protected java.lang.String[] _seenStringValues
        Array of recently seen field names, which may be back referenced by later fields Defaults set to disable handling if no header found.
      • _seenStringValueCount

        protected int _seenStringValueCount
      • _smileRecyclerRef

        protected static final java.lang.ThreadLocal<java.lang.ref.SoftReference<SmileBufferRecycler<java.lang.String>>> _smileRecyclerRef
        ThreadLocal contains a SoftReference to a buffer recycler used to provide a low-cost buffer recycling for Smile-specific buffers.
    • Constructor Detail

      • SmileParser

        public SmileParser​(IOContext ctxt,
                           int parserFeatures,
                           int smileFeatures,
                           ObjectCodec codec,
                           BytesToNameCanonicalizer sym,
                           java.io.InputStream in,
                           byte[] inputBuffer,
                           int start,
                           int end,
                           boolean bufferRecyclable)
    • Method Detail

      • handleSignature

        protected boolean handleSignature​(boolean consumeFirstByte,
                                          boolean throwException)
                                   throws java.io.IOException,
                                          JsonParseException
        Helper method called when it looks like input might contain the signature; and it is necessary to detect and handle signature to get configuration information it might have.
        Returns:
        True if valid signature was found and handled; false if not
        Throws:
        java.io.IOException
        JsonParseException
      • _smileBufferRecycler

        protected static final SmileBufferRecycler<java.lang.String> _smileBufferRecycler()
        Since:
        1.7
      • releaseBuffered

        public int releaseBuffered​(java.io.OutputStream out)
                            throws java.io.IOException
        Description copied from class: JsonParser
        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.
        Overrides:
        releaseBuffered in class JsonParser
        Returns:
        -1 if the underlying content source is not byte based (that is, input can not be sent to OutputStream; otherwise number of bytes released (0 if there was nothing to release)
        Throws:
        java.io.IOException - if write to stream threw exception
      • getInputSource

        public java.lang.Object getInputSource()
        Description copied from class: JsonParser
        Method that can be used to get access to object that is used to access input being parsed; this is usually either InputStream or 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.

        Overrides:
        getInputSource in class JsonParser
      • getTokenLocation

        public JsonLocation getTokenLocation()
        Overridden since we do not really have character-based locations, but we do have byte offset to specify.
        Overrides:
        getTokenLocation in class JsonParserBase
      • getCurrentLocation

        public JsonLocation getCurrentLocation()
        Overridden since we do not really have character-based locations, but we do have byte offset to specify.
        Overrides:
        getCurrentLocation in class JsonParserBase
      • loadMore

        protected final boolean loadMore()
                                  throws java.io.IOException
        Specified by:
        loadMore in class JsonParserBase
        Throws:
        java.io.IOException
      • _loadToHaveAtLeast

        protected final boolean _loadToHaveAtLeast​(int minAvailable)
                                            throws java.io.IOException
        Helper method that will try to load at least specified number bytes in input buffer, possible moving existing data around if necessary
        Throws:
        java.io.IOException
        Since:
        1.6
      • _closeInput

        protected void _closeInput()
                            throws java.io.IOException
        Specified by:
        _closeInput in class JsonParserBase
        Throws:
        java.io.IOException
      • close

        public void close()
                   throws java.io.IOException
        Description copied from class: JsonParser
        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 JsonParser.Feature.AUTO_CLOSE_SOURCE is enabled. Whether parser owns the input source depends on factory method that was used to construct instance (so check JsonFactory for details, but the general idea is that if caller passes in closable resource (such as InputStream or Reader) parser does NOT own the source; but if it passes a reference (such as File or URL and creates stream or reader it does own them.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class JsonParserBase
        Throws:
        java.io.IOException
      • hasTextCharacters

        public boolean hasTextCharacters()
        Description copied from class: JsonParser
        Method that can be used to determine whether calling of JsonParser.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.

        Overrides:
        hasTextCharacters in class JsonParserBase
        Returns:
        True if parser currently has character array that can be efficiently returned via JsonParser.getTextCharacters(); false means that it may or may not exist
      • _releaseBuffers

        protected void _releaseBuffers()
                                throws java.io.IOException
        Method called to release internal buffers owned by the base reader. This may be called along with _closeInput() (for example, when explicitly closing this reader instance), or separately (if need be).
        Overrides:
        _releaseBuffers in class JsonParserBase
        Throws:
        java.io.IOException
      • mayContainRawBinary

        public boolean mayContainRawBinary()
      • nextToken

        public JsonToken nextToken()
                            throws java.io.IOException,
                                   JsonParseException
        Description copied from class: JsonParser
        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.
        Specified by:
        nextToken in class JsonParserMinimalBase
        Returns:
        Next token from the stream, if any found, or null to indicate end-of-input
        Throws:
        java.io.IOException
        JsonParseException
      • nextFieldName

        public boolean nextFieldName​(SerializableString str)
                              throws java.io.IOException,
                                     JsonParseException
        Description copied from class: JsonParser
        Method that fetches next token (as if calling JsonParser.nextToken()) and verifies whether it is 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.
        Overrides:
        nextFieldName in class JsonParser
        Parameters:
        str - Property name to compare next token to (if next token is JsonToken.FIELD_NAME)
        Throws:
        java.io.IOException
        JsonParseException
      • nextTextValue

        public java.lang.String nextTextValue()
                                       throws java.io.IOException,
                                              JsonParseException
        Description copied from class: JsonParser
        Method that fetches next token (as if calling JsonParser.nextToken()) and if it is 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.
        Overrides:
        nextTextValue in class JsonParser
        Throws:
        java.io.IOException
        JsonParseException
      • nextIntValue

        public int nextIntValue​(int defaultValue)
                         throws java.io.IOException,
                                JsonParseException
        Description copied from class: JsonParser
        Method that fetches next token (as if calling JsonParser.nextToken()) and if it is 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.
        Overrides:
        nextIntValue in class JsonParser
        Throws:
        java.io.IOException
        JsonParseException
      • nextLongValue

        public long nextLongValue​(long defaultValue)
                           throws java.io.IOException,
                                  JsonParseException
        Description copied from class: JsonParser
        Method that fetches next token (as if calling JsonParser.nextToken()) and if it is 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.
        Overrides:
        nextLongValue in class JsonParser
        Throws:
        java.io.IOException
        JsonParseException
      • nextBooleanValue

        public java.lang.Boolean nextBooleanValue()
                                           throws java.io.IOException,
                                                  JsonParseException
        Description copied from class: JsonParser
        Method that fetches next token (as if calling JsonParser.nextToken()) and if it is JsonToken.VALUE_TRUE or 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.
        Overrides:
        nextBooleanValue in class JsonParser
        Throws:
        java.io.IOException
        JsonParseException
      • getText

        public java.lang.String getText()
                                 throws java.io.IOException,
                                        JsonParseException
        Method for accessing textual representation of the current event; if no current event (before first call to nextToken(), or after encountering end-of-input), returns null. Method can be called for any event.
        Specified by:
        getText in class JsonParserMinimalBase
        Throws:
        java.io.IOException
        JsonParseException
      • getTextCharacters

        public char[] getTextCharacters()
                                 throws java.io.IOException,
                                        JsonParseException
        Description copied from class: JsonParser
        Method similar to JsonParser.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 JsonParser.getTextOffset()) to know the actual offset
        • Length of textual contents may be less than the length of returned buffer: call JsonParser.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 JsonParser.getText()) is to avoid construction of a String object (which will make a copy of contents).

        Specified by:
        getTextCharacters in class JsonParserMinimalBase
        Throws:
        java.io.IOException
        JsonParseException
      • getBinaryValue

        public byte[] getBinaryValue​(Base64Variant b64variant)
                              throws java.io.IOException,
                                     JsonParseException
        Description copied from class: JsonParser
        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 JsonParser.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.

        Specified by:
        getBinaryValue in class JsonParserMinimalBase
        Parameters:
        b64variant - Expected variant of base64 encoded content (see Base64Variants for definitions of "standard" variants).
        Returns:
        Decoded binary data
        Throws:
        java.io.IOException
        JsonParseException
      • getEmbeddedObject

        public java.lang.Object getEmbeddedObject()
                                           throws java.io.IOException,
                                                  JsonParseException
        Description copied from class: JsonParser
        Accessor that can be called if (and only if) the current token is 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).

        Overrides:
        getEmbeddedObject in class JsonParser
        Throws:
        java.io.IOException
        JsonParseException
      • _handleFieldName

        protected final JsonToken _handleFieldName()
                                            throws java.io.IOException,
                                                   JsonParseException
        Method that handles initial token type recognition for token that has to be either FIELD_NAME or END_OBJECT.
        Throws:
        java.io.IOException
        JsonParseException
      • _parseNumericValue

        protected void _parseNumericValue​(int expType)
                                   throws java.io.IOException,
                                          JsonParseException
        Description copied from class: JsonParserBase
        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.
        Overrides:
        _parseNumericValue in class JsonParserBase
        Parameters:
        expType - Numeric type that we will immediately need, if any; mostly necessary to optimize handling of floating point numbers
        Throws:
        java.io.IOException
        JsonParseException
      • _finishToken

        protected void _finishToken()
                             throws java.io.IOException,
                                    JsonParseException
        Method called to finish parsing of a token so that token contents are retriable
        Throws:
        java.io.IOException
        JsonParseException
      • _decodeShortUnicodeValue

        protected final void _decodeShortUnicodeValue​(int len)
                                               throws java.io.IOException,
                                                      JsonParseException
        Throws:
        java.io.IOException
        JsonParseException
      • _skipIncomplete

        protected void _skipIncomplete()
                                throws java.io.IOException,
                                       JsonParseException
        Method called to skip remainders of an incomplete token, when contents themselves will not be needed any more
        Throws:
        java.io.IOException
        JsonParseException
      • _skip7BitBinary

        protected void _skip7BitBinary()
                                throws java.io.IOException,
                                       JsonParseException
        Helper method for skipping length-prefixed binary data section
        Throws:
        java.io.IOException
        JsonParseException
      • _reportInvalidSharedName

        protected void _reportInvalidSharedName​(int index)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • _reportInvalidSharedStringValue

        protected void _reportInvalidSharedStringValue​(int index)
                                                throws java.io.IOException
        Throws:
        java.io.IOException