Class StringSubstitutorReader

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

    public class StringSubstitutorReader
    extends java.io.FilterReader
    A Reader that performs string substitution on a source Reader using a StringSubstitutor.

    Using this Reader avoids reading a whole file into memory as a String to perform string substitution, for example, when a Servlet filters a file to a client.

    This class is not thread-safe.

    Since:
    1.9
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private int buffer​(int requestReadCount)
      Buffers the requested number of characters if available.
      private int bufferOrDrainOnEos​(int requestReadCount, char[] target, int targetIndex, int targetLength)
      Reads a requested number of chars from the underlying reader into the buffer.
      private int drain​(char[] target, int targetIndex, int targetLength)
      Drains characters from our buffer to the given target.
      private int drainOnEos​(int readCountOrEos, char[] target, int targetIndex, int targetLength)
      Drains from the buffer to the target only if we are at EOS per the input count.
      private boolean isBufferMatchAt​(StringMatcher stringMatcher, int pos)
      Tests if our buffer matches the given string matcher at the given position in the buffer.
      private boolean isDraining()
      Tests if we are draining.
      int read()
      Reads a single character.
      int read​(char[] target, int targetIndexIn, int targetLengthIn)
      Reads characters into a portion of an array.
      private int readCount​(int count, int pos)
      Returns how many chars to attempt reading to have room in the buffer for count chars starting at position pos.
      • Methods inherited from class java.io.FilterReader

        close, mark, markSupported, ready, reset, skip
      • Methods inherited from class java.io.Reader

        nullReader, read, read, transferTo
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • eos

        private boolean eos
        End-of-Stream flag.
      • prefixEscapeMatcher

        private final StringMatcher prefixEscapeMatcher
        Matches escaped variable starts.
      • read1CharBuffer

        private final char[] read1CharBuffer
        Internal buffer for read() method.
      • stringSubstitutor

        private final StringSubstitutor stringSubstitutor
        The underlying StringSubstitutor.
      • toDrain

        private int toDrain
        We don't always want to drain the whole buffer.
    • Constructor Detail

      • StringSubstitutorReader

        public StringSubstitutorReader​(java.io.Reader reader,
                                       StringSubstitutor stringSubstitutor)
        Constructs a new instance.
        Parameters:
        reader - the underlying reader containing the template text known to the given StringSubstitutor.
        stringSubstitutor - How to replace as we read.
        Throws:
        java.lang.NullPointerException - if reader is null.
        java.lang.NullPointerException - if stringSubstitutor is null.
    • Method Detail

      • buffer

        private int buffer​(int requestReadCount)
                    throws java.io.IOException
        Buffers the requested number of characters if available.
        Throws:
        java.io.IOException
      • bufferOrDrainOnEos

        private int bufferOrDrainOnEos​(int requestReadCount,
                                       char[] target,
                                       int targetIndex,
                                       int targetLength)
                                throws java.io.IOException
        Reads a requested number of chars from the underlying reader into the buffer. On EOS, set the state is DRAINING, drain, and return a drain count, otherwise, returns the actual read count.
        Throws:
        java.io.IOException
      • drain

        private int drain​(char[] target,
                          int targetIndex,
                          int targetLength)
        Drains characters from our buffer to the given target.
      • drainOnEos

        private int drainOnEos​(int readCountOrEos,
                               char[] target,
                               int targetIndex,
                               int targetLength)
        Drains from the buffer to the target only if we are at EOS per the input count. If input count is EOS, drain and returns the drain count, otherwise return the input count. If draining, the state is set to DRAINING.
      • isBufferMatchAt

        private boolean isBufferMatchAt​(StringMatcher stringMatcher,
                                        int pos)
        Tests if our buffer matches the given string matcher at the given position in the buffer.
      • isDraining

        private boolean isDraining()
        Tests if we are draining.
      • read

        public int read()
                 throws java.io.IOException
        Reads a single character.
        Overrides:
        read in class java.io.FilterReader
        Returns:
        a character as an int or -1 for end-of-stream.
        Throws:
        java.io.IOException - If an I/O error occurs
      • read

        public int read​(char[] target,
                        int targetIndexIn,
                        int targetLengthIn)
                 throws java.io.IOException
        Reads characters into a portion of an array.
        Overrides:
        read in class java.io.FilterReader
        Parameters:
        target - Target buffer.
        targetIndexIn - Index in the target at which to start storing characters.
        targetLengthIn - Maximum number of characters to read.
        Returns:
        The number of characters read, or -1 on end of stream.
        Throws:
        java.io.IOException - If an I/O error occurs
      • readCount

        private int readCount​(int count,
                              int pos)
        Returns how many chars to attempt reading to have room in the buffer for count chars starting at position pos.