1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache license, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the license for the specific language governing permissions and
15 * limitations under the license.
16 */
17
18 package org.apache.logging.log4j.core.pattern;
19
20 /**
21 * Modifies the output of a pattern converter for a specified minimum and maximum width and alignment.
22 */
23 public final class FormattingInfo {
24 /**
25 * Array of spaces.
26 */
27 private static final char[] SPACES = new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
28
29 /**
30 * Default instance.
31 */
32 private static final FormattingInfo DEFAULT = new FormattingInfo(false, 0, Integer.MAX_VALUE, true);
33
34 /**
35 * Minimum length.
36 */
37 private final int minLength;
38
39 /**
40 * Maximum length.
41 */
42 private final int maxLength;
43
44 /**
45 * Alignment.
46 */
47 private final boolean leftAlign;
48
49 /**
50 * Left vs. right-hand side truncation.
51 */
52 private final boolean leftTruncate;
53
54 /**
55 * Creates new instance.
56 *
57 * @param leftAlign
58 * left align if true.
59 * @param minLength
60 * minimum length.
61 * @param maxLength
62 * maximum length.
63 */
64 public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate) {
65 this.leftAlign = leftAlign;
66 this.minLength = minLength;
67 this.maxLength = maxLength;
68 this.leftTruncate = leftTruncate;
69 }
70
71 /**
72 * Gets default instance.
73 *
74 * @return default instance.
75 */
76 public static FormattingInfo getDefault() {
77 return DEFAULT;
78 }
79
80 /**
81 * Determine if left aligned.
82 *
83 * @return true if left aligned.
84 */
85 public boolean isLeftAligned() {
86 return leftAlign;
87 }
88
89 /**
90 * Determine if left truncated.
91 *
92 * @return true if left truncated.
93 */
94 public boolean isLeftTruncate() {
95 return leftTruncate;
96 }
97
98 /**
99 * Get minimum length.
100 *
101 * @return minimum length.
102 */
103 public int getMinLength() {
104 return minLength;
105 }
106
107 /**
108 * Get maximum length.
109 *
110 * @return maximum length.
111 */
112 public int getMaxLength() {
113 return maxLength;
114 }
115
116 /**
117 * Adjust the content of the buffer based on the specified lengths and alignment.
118 *
119 * @param fieldStart
120 * start of field in buffer.
121 * @param buffer
122 * buffer to be modified.
123 */
124 public void format(final int fieldStart, final StringBuilder buffer) {
125 final int rawLength = buffer.length() - fieldStart;
126
127 if (rawLength > maxLength) {
128 if (leftTruncate) {
129 buffer.delete(fieldStart, buffer.length() - maxLength);
130 } else {
131 buffer.delete(fieldStart + maxLength, fieldStart + buffer.length());
132 }
133 } else if (rawLength < minLength) {
134 if (leftAlign) {
135 final int fieldEnd = buffer.length();
136 buffer.setLength(fieldStart + minLength);
137
138 for (int i = fieldEnd; i < buffer.length(); i++) {
139 buffer.setCharAt(i, ' ');
140 }
141 } else {
142 int padLength = minLength - rawLength;
143
144 for (; padLength > SPACES.length; padLength -= SPACES.length) {
145 buffer.insert(fieldStart, SPACES);
146 }
147
148 buffer.insert(fieldStart, SPACES, 0, padLength);
149 }
150 }
151 }
152
153 /**
154 * Returns a String suitable for debugging.
155 *
156 * @return a String suitable for debugging.
157 */
158 @Override
159 public String toString() {
160 final StringBuilder sb = new StringBuilder();
161 sb.append(super.toString());
162 sb.append("[leftAlign=");
163 sb.append(leftAlign);
164 sb.append(", maxLength=");
165 sb.append(maxLength);
166 sb.append(", minLength=");
167 sb.append(minLength);
168 sb.append(", leftTruncate=");
169 sb.append(leftTruncate);
170 sb.append(']');
171 return sb.toString();
172 }
173
174 }