1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.pattern;
19
20 import org.apache.logging.log4j.util.PerformanceSensitive;
21
22
23
24
25 @PerformanceSensitive("allocation")
26 public final class FormattingInfo {
27
28
29
30 private static final char[] SPACES = new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
31
32
33
34
35 private static final char[] ZEROS = new char[] { '0', '0', '0', '0', '0', '0', '0', '0' };
36
37
38
39
40 private static final FormattingInfo DEFAULT = new FormattingInfo(false, 0, Integer.MAX_VALUE, true);
41
42
43
44
45 private final int minLength;
46
47
48
49
50 private final int maxLength;
51
52
53
54
55 private final boolean leftAlign;
56
57
58
59
60 private final boolean leftTruncate;
61
62
63
64
65 private final boolean zeroPad;
66
67
68
69
70
71
72
73
74
75
76
77
78
79 public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate) {
80 this(leftAlign, minLength, maxLength, leftTruncate, false);
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate, final boolean zeroPad) {
98 this.leftAlign = leftAlign;
99 this.minLength = minLength;
100 this.maxLength = maxLength;
101 this.leftTruncate = leftTruncate;
102 this.zeroPad = zeroPad;
103 }
104
105
106
107
108
109
110 public static FormattingInfo getDefault() {
111 return DEFAULT;
112 }
113
114
115
116
117
118
119 public boolean isLeftAligned() {
120 return leftAlign;
121 }
122
123
124
125
126
127
128 public boolean isLeftTruncate() {
129 return leftTruncate;
130 }
131
132
133
134
135
136
137 public boolean isZeroPad() {
138 return zeroPad;
139 }
140
141
142
143
144
145
146 public int getMinLength() {
147 return minLength;
148 }
149
150
151
152
153
154
155 public int getMaxLength() {
156 return maxLength;
157 }
158
159
160
161
162
163
164
165
166
167 public void format(final int fieldStart, final StringBuilder buffer) {
168 final int rawLength = buffer.length() - fieldStart;
169
170 if (rawLength > maxLength) {
171 if (leftTruncate) {
172 buffer.delete(fieldStart, buffer.length() - maxLength);
173 } else {
174 buffer.delete(fieldStart + maxLength, fieldStart + buffer.length());
175 }
176 } else if (rawLength < minLength) {
177 if (leftAlign) {
178 final int fieldEnd = buffer.length();
179 buffer.setLength(fieldStart + minLength);
180
181 for (int i = fieldEnd; i < buffer.length(); i++) {
182 buffer.setCharAt(i, ' ');
183 }
184 } else {
185 int padLength = minLength - rawLength;
186
187 final char[] paddingArray= zeroPad ? ZEROS : SPACES;
188
189 for (; padLength > paddingArray.length; padLength -= paddingArray.length) {
190 buffer.insert(fieldStart, paddingArray);
191 }
192
193 buffer.insert(fieldStart, paddingArray, 0, padLength);
194 }
195 }
196 }
197
198
199
200
201
202
203 @Override
204 public String toString() {
205 final StringBuilder sb = new StringBuilder();
206 sb.append(super.toString());
207 sb.append("[leftAlign=");
208 sb.append(leftAlign);
209 sb.append(", maxLength=");
210 sb.append(maxLength);
211 sb.append(", minLength=");
212 sb.append(minLength);
213 sb.append(", leftTruncate=");
214 sb.append(leftTruncate);
215 sb.append(", zeroPad=");
216 sb.append(zeroPad);
217 sb.append(']');
218 return sb.toString();
219 }
220
221 }