    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements. See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache license, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License. You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the license for the specific language governing permissions and
    015     * limitations under the license.
    016     */
    017
    018    package org.apache.logging.log4j.core.pattern;
    019
    020    /**
    021     * Modifies the output of a pattern converter for a specified minimum and maximum width and alignment.
    022     */
    023    public final class FormattingInfo {
    024        /**
    025         * Array of spaces.
    026         */
    027        private static final char[] SPACES = new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
    028
    029        /**
    030         * Default instance.
    031         */
    032        private static final FormattingInfo DEFAULT = new FormattingInfo(false, 0, Integer.MAX_VALUE, true);
    033
    034        /**
    035         * Minimum length.
    036         */
    037        private final int minLength;
    038
    039        /**
    040         * Maximum length.
    041         */
    042        private final int maxLength;
    043
    044        /**
    045         * Alignment.
    046         */
    047        private final boolean leftAlign;
    048
    049        /**
    050         * Left vs. right-hand side truncation.
    051         */
    052        private final boolean leftTruncate;
    053
    054        /**
    055         * Creates new instance.
    056         *
    057         * @param leftAlign
    058         *            left align if true.
    059         * @param minLength
    060         *            minimum length.
    061         * @param maxLength
    062         *            maximum length.
    063         */
    064        public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate) {
    065            this.leftAlign = leftAlign;
    066            this.minLength = minLength;
    067            this.maxLength = maxLength;
    068            this.leftTruncate = leftTruncate;
    069        }
    070
    071        /**
    072         * Gets default instance.
    073         *
    074         * @return default instance.
    075         */
    076        public static FormattingInfo getDefault() {
    077            return DEFAULT;
    078        }
    079
    080        /**
    081         * Determine if left aligned.
    082         *
    083         * @return true if left aligned.
    084         */
    085        public boolean isLeftAligned() {
    086            return leftAlign;
    087        }
    088
    089        /**
    090         * Determine if left truncated.
    091         *
    092         * @return true if left truncated.
    093         */
    094        public boolean isLeftTruncate() {
    095                    return leftTruncate;
    096            }
    097
    098        /**
    099         * 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    }