Class ParameterFormatter


  • final class ParameterFormatter
    extends java.lang.Object
    Supports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private ParameterFormatter()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      (package private) static ParameterFormatter.MessagePatternAnalysis analyzePattern​(java.lang.String pattern, int argCount)
      Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc.
      (package private) static void analyzePattern​(java.lang.String pattern, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)
      Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc.
      private static void appendArray​(boolean[] a, java.lang.StringBuilder str)  
      private static void appendArray​(byte[] a, java.lang.StringBuilder str)  
      private static void appendArray​(char[] a, java.lang.StringBuilder str)  
      private static void appendArray​(double[] a, java.lang.StringBuilder str)  
      private static void appendArray​(float[] a, java.lang.StringBuilder str)  
      (package private) static void appendArray​(int[] a, java.lang.StringBuilder str)  
      private static void appendArray​(long[] a, java.lang.StringBuilder str)  
      private static void appendArray​(short[] a, java.lang.StringBuilder str)  
      private static void appendArray​(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu, java.lang.Class<?> oClass)  
      private static void appendCollection​(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)
      Specialized handler for Collections.
      private static boolean appendDate​(java.lang.Object o, java.lang.StringBuilder str)  
      private static void appendMap​(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)
      Specialized handler for Maps.
      private static void appendPotentiallyRecursiveValue​(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)  
      private static boolean appendSpecialTypes​(java.lang.Object o, java.lang.StringBuilder str)  
      private static java.util.Set<java.lang.Object> cloneDejaVu​(java.util.Set<java.lang.Object> dejaVu)  
      private static void copyMessagePatternContainingEscapes​(java.lang.StringBuilder buffer, java.lang.String pattern, int startIndex, int endIndex)  
      private static java.util.Set<java.lang.Object> createDejaVu()  
      (package private) static java.lang.String deepToString​(java.lang.Object o)
      This method performs a deep toString of the given Object.
      (package private) static java.lang.String format​(java.lang.String pattern, java.lang.Object[] args, int argCount)
      Format the given pattern using provided arguments.
      (package private) static void formatMessage​(java.lang.StringBuilder buffer, java.lang.String pattern, java.lang.Object[] args, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)
      Format the given pattern using provided arguments into the buffer pointed.
      private static void formatMessageContainingEscapes​(java.lang.StringBuilder buffer, java.lang.String pattern, java.lang.Object[] args, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)  
      private static void formatMessageContainingNoEscapes​(java.lang.StringBuilder buffer, java.lang.String pattern, java.lang.Object[] args, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)  
      private static java.util.Set<java.lang.Object> getOrCreateDejaVu​(java.util.Set<java.lang.Object> dejaVu)  
      private static void handleErrorInObjectToString​(java.lang.Object o, java.lang.StringBuilder str, java.lang.Throwable t)  
      (package private) static java.lang.String identityToString​(java.lang.Object obj)
      This method returns the same as if Object.toString() would not have been overridden in obj.
      private static boolean isLastArgumentThrowable​(java.lang.Object[] args, int argCount)  
      private static boolean isMaybeRecursive​(java.lang.Object o)
      Returns true if the specified object is an array, a Map or a Collection.
      (package private) static void recursiveDeepToString​(java.lang.Object o, java.lang.StringBuilder str)
      This method performs a deep toString() of the given Object.
      private static void recursiveDeepToString​(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)
      This method performs a deep toString() of the given Object.
      private static void tryObjectToString​(java.lang.Object o, java.lang.StringBuilder str)  
      • Methods inherited from class java.lang.Object

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

      • RECURSION_PREFIX

        static final java.lang.String RECURSION_PREFIX
        Prefix for recursion.
        See Also:
        Constant Field Values
      • RECURSION_SUFFIX

        static final java.lang.String RECURSION_SUFFIX
        Suffix for recursion.
        See Also:
        Constant Field Values
      • ERROR_PREFIX

        static final java.lang.String ERROR_PREFIX
        Prefix for errors.
        See Also:
        Constant Field Values
      • ERROR_SEPARATOR

        static final java.lang.String ERROR_SEPARATOR
        Separator for errors.
        See Also:
        Constant Field Values
      • ERROR_MSG_SEPARATOR

        static final java.lang.String ERROR_MSG_SEPARATOR
        Separator for error messages.
        See Also:
        Constant Field Values
      • ERROR_SUFFIX

        static final java.lang.String ERROR_SUFFIX
        Suffix for errors.
        See Also:
        Constant Field Values
      • DATE_FORMATTER

        private static final java.time.format.DateTimeFormatter DATE_FORMATTER
      • STATUS_LOGGER

        private static final Logger STATUS_LOGGER
    • Constructor Detail

      • ParameterFormatter

        private ParameterFormatter()
    • Method Detail

      • analyzePattern

        static ParameterFormatter.MessagePatternAnalysis analyzePattern​(java.lang.String pattern,
                                                                        int argCount)
        Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc. – the given message pattern.

        Only "{}" strings are treated as argument placeholders. Escaped or incomplete argument placeholders will be ignored. Some invalid argument placeholder examples:

         { }
         foo\{}
         {bar
         {buzz}
         
        Parameters:
        pattern - a message pattern to be analyzed
        argCount - The number of arguments to be formatted. For instance, for a parametrized message containing 7 placeholders in the pattern and 4 arguments for formatting, analysis will only need to store the index of the first 4 placeholder characters. A negative value indicates no limit.
        Returns:
        the analysis result
      • analyzePattern

        static void analyzePattern​(java.lang.String pattern,
                                   int argCount,
                                   ParameterFormatter.MessagePatternAnalysis analysis)
        Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc. – the given message pattern.

        Only "{}" strings are treated as argument placeholders. Escaped or incomplete argument placeholders will be ignored. Some invalid argument placeholder examples:

         { }
         foo\{}
         {bar
         {buzz}
         
        Parameters:
        pattern - a message pattern to be analyzed
        argCount - The number of arguments to be formatted. For instance, for a parametrized message containing 7 placeholders in the pattern and 4 arguments for formatting, analysis will only need to store the index of the first 4 placeholder characters. A negative value indicates no limit.
        analysis - an object to store the results
      • format

        static java.lang.String format​(java.lang.String pattern,
                                       java.lang.Object[] args,
                                       int argCount)
        Format the given pattern using provided arguments.
        Parameters:
        pattern - a formatting pattern
        args - arguments to be formatted
        Returns:
        the formatted message
        Throws:
        java.lang.IllegalArgumentException - on invalid input
      • formatMessage

        static void formatMessage​(java.lang.StringBuilder buffer,
                                  java.lang.String pattern,
                                  java.lang.Object[] args,
                                  int argCount,
                                  ParameterFormatter.MessagePatternAnalysis analysis)
        Format the given pattern using provided arguments into the buffer pointed.
        Parameters:
        buffer - a buffer the formatted output will be written to
        pattern - a formatting pattern
        args - arguments to be formatted
        Throws:
        java.lang.IllegalArgumentException - on invalid input
      • isLastArgumentThrowable

        private static boolean isLastArgumentThrowable​(java.lang.Object[] args,
                                                       int argCount)
      • formatMessageContainingNoEscapes

        private static void formatMessageContainingNoEscapes​(java.lang.StringBuilder buffer,
                                                             java.lang.String pattern,
                                                             java.lang.Object[] args,
                                                             int argCount,
                                                             ParameterFormatter.MessagePatternAnalysis analysis)
      • formatMessageContainingEscapes

        private static void formatMessageContainingEscapes​(java.lang.StringBuilder buffer,
                                                           java.lang.String pattern,
                                                           java.lang.Object[] args,
                                                           int argCount,
                                                           ParameterFormatter.MessagePatternAnalysis analysis)
      • copyMessagePatternContainingEscapes

        private static void copyMessagePatternContainingEscapes​(java.lang.StringBuilder buffer,
                                                                java.lang.String pattern,
                                                                int startIndex,
                                                                int endIndex)
      • deepToString

        static java.lang.String deepToString​(java.lang.Object o)
        This method performs a deep toString of the given Object. Primitive arrays are converted using their respective Arrays.toString methods while special handling is implemented for "container types", i.e. Object[], Map and Collection because those could contain themselves.

        It should be noted that neither AbstractMap.toString() nor AbstractCollection.toString() implement such a behavior. They only check if the container is directly contained in itself, but not if a contained container contains the original one. Because of that, Arrays.toString(Object[]) isn't safe either. Confusing? Just read the last paragraph again and check the respective toString() implementation.

        This means, in effect, that logging would produce a usable output even if an ordinary System.out.println(o) would produce a relatively hard-to-debug StackOverflowError.

        Parameters:
        o - The object.
        Returns:
        The String representation.
      • recursiveDeepToString

        static void recursiveDeepToString​(java.lang.Object o,
                                          java.lang.StringBuilder str)
        This method performs a deep toString() of the given Object.

        Primitive arrays are converted using their respective Arrays.toString() methods, while special handling is implemented for container types, i.e. Object[], Map and Collection, because those could contain themselves.

        It should be noted that neither AbstractMap.toString() nor AbstractCollection.toString() implement such a behavior. They only check if the container is directly contained in itself, but not if a contained container contains the original one. Because of that, Arrays.toString(Object[]) isn't safe either. Confusing? Just read the last paragraph again and check the respective toString() implementation.

        This means, in effect, that logging would produce a usable output even if an ordinary System.out.println(o) would produce a relatively hard-to-debug StackOverflowError.

        Parameters:
        o - the Object to convert into a String
        str - the StringBuilder that o will be appended to
      • recursiveDeepToString

        private static void recursiveDeepToString​(java.lang.Object o,
                                                  java.lang.StringBuilder str,
                                                  java.util.Set<java.lang.Object> dejaVu)
        This method performs a deep toString() of the given Object.

        Primitive arrays are converted using their respective Arrays.toString() methods, while special handling is implemented for container types, i.e. Object[], Map and Collection, because those could contain themselves.

        dejaVu is used in case of those container types to prevent an endless recursion.

        It should be noted that neither AbstractMap.toString() nor AbstractCollection.toString() implement such a behavior. They only check if the container is directly contained in itself, but not if a contained container contains the original one. Because of that, Arrays.toString(Object[]) isn't safe either. Confusing? Just read the last paragraph again and check the respective toString() implementation.

        This means, in effect, that logging would produce a usable output even if an ordinary System.out.println(o) would produce a relatively hard-to-debug StackOverflowError.

        Parameters:
        o - the Object to convert into a String
        str - the StringBuilder that o will be appended to
        dejaVu - a set of container objects directly or transitively containing o
      • appendSpecialTypes

        private static boolean appendSpecialTypes​(java.lang.Object o,
                                                  java.lang.StringBuilder str)
      • appendDate

        private static boolean appendDate​(java.lang.Object o,
                                          java.lang.StringBuilder str)
      • isMaybeRecursive

        private static boolean isMaybeRecursive​(java.lang.Object o)
        Returns true if the specified object is an array, a Map or a Collection.
      • appendPotentiallyRecursiveValue

        private static void appendPotentiallyRecursiveValue​(java.lang.Object o,
                                                            java.lang.StringBuilder str,
                                                            java.util.Set<java.lang.Object> dejaVu)
      • appendArray

        private static void appendArray​(java.lang.Object o,
                                        java.lang.StringBuilder str,
                                        java.util.Set<java.lang.Object> dejaVu,
                                        java.lang.Class<?> oClass)
      • appendMap

        private static void appendMap​(java.lang.Object o,
                                      java.lang.StringBuilder str,
                                      java.util.Set<java.lang.Object> dejaVu)
        Specialized handler for Maps.
      • appendCollection

        private static void appendCollection​(java.lang.Object o,
                                             java.lang.StringBuilder str,
                                             java.util.Set<java.lang.Object> dejaVu)
        Specialized handler for Collections.
      • getOrCreateDejaVu

        private static java.util.Set<java.lang.Object> getOrCreateDejaVu​(java.util.Set<java.lang.Object> dejaVu)
      • createDejaVu

        private static java.util.Set<java.lang.Object> createDejaVu()
      • cloneDejaVu

        private static java.util.Set<java.lang.Object> cloneDejaVu​(java.util.Set<java.lang.Object> dejaVu)
      • tryObjectToString

        private static void tryObjectToString​(java.lang.Object o,
                                              java.lang.StringBuilder str)
      • handleErrorInObjectToString

        private static void handleErrorInObjectToString​(java.lang.Object o,
                                                        java.lang.StringBuilder str,
                                                        java.lang.Throwable t)
      • identityToString

        static java.lang.String identityToString​(java.lang.Object obj)
        This method returns the same as if Object.toString() would not have been overridden in obj.

        Note that this isn't 100% secure as collisions can always happen with hash codes.

        Copied from Object.hashCode():

        As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.)
        Parameters:
        obj - the Object that is to be converted into an identity string.
        Returns:
        the identity string as also defined in Object.toString()
      • appendArray

        private static void appendArray​(byte[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(byte[])
      • appendArray

        private static void appendArray​(short[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(short[])
      • appendArray

        static void appendArray​(int[] a,
                                java.lang.StringBuilder str)
        See Also:
        Arrays.toString(int[])
      • appendArray

        private static void appendArray​(long[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(long[])
      • appendArray

        private static void appendArray​(float[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(float[])
      • appendArray

        private static void appendArray​(double[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(double[])
      • appendArray

        private static void appendArray​(boolean[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(boolean[])
      • appendArray

        private static void appendArray​(char[] a,
                                        java.lang.StringBuilder str)
        See Also:
        Arrays.toString(char[])