Class ParameterFormatter
- java.lang.Object
-
- org.apache.logging.log4j.message.ParameterFormatter
-
final class ParameterFormatter extends java.lang.ObjectSupports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static classParameterFormatter.MessagePatternAnalysis
-
Field Summary
Fields Modifier and Type Field Description private static java.time.format.DateTimeFormatterDATE_FORMATTERprivate static charDELIM_STARTprivate static charDELIM_STOP(package private) static java.lang.StringERROR_MSG_SEPARATORSeparator for error messages.(package private) static java.lang.StringERROR_PREFIXPrefix for errors.(package private) static java.lang.StringERROR_SEPARATORSeparator for errors.(package private) static java.lang.StringERROR_SUFFIXSuffix for errors.private static charESCAPE_CHAR(package private) static java.lang.StringRECURSION_PREFIXPrefix for recursion.(package private) static java.lang.StringRECURSION_SUFFIXSuffix for recursion.private static LoggerSTATUS_LOGGER
-
Constructor Summary
Constructors Modifier Constructor Description privateParameterFormatter()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description (package private) static ParameterFormatter.MessagePatternAnalysisanalyzePattern(java.lang.String pattern, int argCount)Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc.(package private) static voidanalyzePattern(java.lang.String pattern, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)Analyzes – finds argument placeholder (i.e., "{}") occurrences, etc.private static voidappendArray(boolean[] a, java.lang.StringBuilder str)private static voidappendArray(byte[] a, java.lang.StringBuilder str)private static voidappendArray(char[] a, java.lang.StringBuilder str)private static voidappendArray(double[] a, java.lang.StringBuilder str)private static voidappendArray(float[] a, java.lang.StringBuilder str)(package private) static voidappendArray(int[] a, java.lang.StringBuilder str)private static voidappendArray(long[] a, java.lang.StringBuilder str)private static voidappendArray(short[] a, java.lang.StringBuilder str)private static voidappendArray(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu, java.lang.Class<?> oClass)private static voidappendCollection(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)Specialized handler forCollections.private static booleanappendDate(java.lang.Object o, java.lang.StringBuilder str)private static voidappendMap(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)Specialized handler forMaps.private static voidappendPotentiallyRecursiveValue(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)private static booleanappendSpecialTypes(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 voidcopyMessagePatternContainingEscapes(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.StringdeepToString(java.lang.Object o)This method performs a deep toString of the given Object.(package private) static java.lang.Stringformat(java.lang.String pattern, java.lang.Object[] args, int argCount)Format the given pattern using provided arguments.(package private) static voidformatMessage(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 voidformatMessageContainingEscapes(java.lang.StringBuilder buffer, java.lang.String pattern, java.lang.Object[] args, int argCount, ParameterFormatter.MessagePatternAnalysis analysis)private static voidformatMessageContainingNoEscapes(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 voidhandleErrorInObjectToString(java.lang.Object o, java.lang.StringBuilder str, java.lang.Throwable t)(package private) static java.lang.StringidentityToString(java.lang.Object obj)This method returns the same as if Object.toString() would not have been overridden in obj.private static booleanisLastArgumentThrowable(java.lang.Object[] args, int argCount)private static booleanisMaybeRecursive(java.lang.Object o)Returnstrueif the specified object is an array, a Map or a Collection.(package private) static voidrecursiveDeepToString(java.lang.Object o, java.lang.StringBuilder str)This method performs a deeptoString()of the givenObject.private static voidrecursiveDeepToString(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)This method performs a deeptoString()of the givenObject.private static voidtryObjectToString(java.lang.Object o, java.lang.StringBuilder str)
-
-
-
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
-
DELIM_START
private static final char DELIM_START
- See Also:
- Constant Field Values
-
DELIM_STOP
private static final char DELIM_STOP
- See Also:
- Constant Field Values
-
ESCAPE_CHAR
private static final char ESCAPE_CHAR
- See Also:
- Constant Field Values
-
DATE_FORMATTER
private static final java.time.format.DateTimeFormatter DATE_FORMATTER
-
STATUS_LOGGER
private static final Logger STATUS_LOGGER
-
-
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 analyzedargCount- 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 analyzedargCount- 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 patternargs- 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 topattern- a formatting patternargs- 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 deeptoString()of the givenObject.Primitive arrays are converted using their respective
Arrays.toString()methods, while special handling is implemented for container types, i.e.Object[],MapandCollection, because those could contain themselves.It should be noted that neither
AbstractMap.toString()norAbstractCollection.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 respectivetoString()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-debugStackOverflowError.- Parameters:
o- theObjectto convert into aStringstr- theStringBuilderthatowill 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 deeptoString()of the givenObject.Primitive arrays are converted using their respective
Arrays.toString()methods, while special handling is implemented for container types, i.e.Object[],MapandCollection, because those could contain themselves.dejaVuis used in case of those container types to prevent an endless recursion.It should be noted that neither
AbstractMap.toString()norAbstractCollection.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 respectivetoString()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-debugStackOverflowError.- Parameters:
o- theObjectto convert into aStringstr- theStringBuilderthatowill be appended todejaVu- a set of container objects directly or transitively containingo
-
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)
Returnstrueif 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 forMaps.
-
appendCollection
private static void appendCollection(java.lang.Object o, java.lang.StringBuilder str, java.util.Set<java.lang.Object> dejaVu)Specialized handler forCollections.
-
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
Objectdoes 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[])
-
-