/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache license, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the license for the specific language governing permissions and
 * limitations under the license.
 */

package org.apache.logging.log4j.core.pattern;


/**
 * Modifies the output of a pattern converter for a specified minimum
 * and maximum width and alignment.
 */
public final class FormattingInfo {
    /**
     * Array of spaces.
     */
    private static final char[] SPACES =
        new char[]{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};

    /**
     * Default instance.
     */
    private static final FormattingInfo DEFAULT =
        new FormattingInfo(false, 0, Integer.MAX_VALUE);

    /**
     * Minimum length.
     */
    private final int minLength;

    /**
     * Maximum length.
     */
    private final int maxLength;

    /**
     * Alignment.
     */
    private final boolean leftAlign;

    /**
     * Creates new instance.
     *
     * @param leftAlign left align if true.
     * @param minLength minimum length.
     * @param maxLength maximum length.
     */
    public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength) {
        this.leftAlign = leftAlign;
        this.minLength = minLength;
        this.maxLength = maxLength;
    }

    /**
     * Gets default instance.
     *
     * @return default instance.
     */
    public static FormattingInfo getDefault() {
        return DEFAULT;
    }

    /**
     * Determine if left aligned.
     *
     * @return true if left aligned.
     */
    public boolean isLeftAligned() {
        return leftAlign;
    }

    /**
     * Get minimum length.
     *
     * @return minimum length.
     */
    public int getMinLength() {
        return minLength;
    }

    /**
     * Get maximum length.
     *
     * @return maximum length.
     */
    public int getMaxLength() {
        return maxLength;
    }

    /**
     * Adjust the content of the buffer based on the specified lengths and alignment.
     *
     * @param fieldStart start of field in buffer.
     * @param buffer     buffer to be modified.
     */
    public void format(final int fieldStart, final StringBuilder buffer) {
        final int rawLength = buffer.length() - fieldStart;

        if (rawLength > maxLength) {
            buffer.delete(fieldStart, buffer.length() - maxLength);
        } else if (rawLength < minLength) {
            if (leftAlign) {
                final int fieldEnd = buffer.length();
                buffer.setLength(fieldStart + minLength);

                for (int i = fieldEnd; i < buffer.length(); i++) {
                    buffer.setCharAt(i, ' ');
                }
            } else {
                int padLength = minLength - rawLength;

                for (; padLength > SPACES.length; padLength -= SPACES.length) {
                    buffer.insert(fieldStart, SPACES);
                }

                buffer.insert(fieldStart, SPACES, 0, padLength);
            }
        }
    }
    
    /**
     * Returns a String suitable for debugging.
     * 
     * @return a String suitable for debugging.
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(super.toString());
        sb.append("[leftAlign=");
        sb.append(leftAlign);
        sb.append(", maxLength=");
        sb.append(maxLength);
        sb.append(", minLength=");
        sb.append(minLength);
        sb.append("]");
        return sb.toString();
    }

}

@@ -843,17 +843,16 @@
 ttern;%0A%0A
-%0A
 /**%0A * M
@@ -916,19 +916,16 @@
  minimum
-%0A *
  and max
@@ -1070,24 +1070,16 @@
 SPACES =
-%0A       
  new cha
@@ -1081,17 +1081,19 @@
 w char%5B%5D
-%7B
+ %7B 
 ' ', ' '
@@ -1122,16 +1122,17 @@
 ' ', ' '
+ 
 %7D;%0A%0A    
@@ -1217,24 +1217,16 @@
 EFAULT =
-%0A       
  new For
@@ -1521,32 +1521,33 @@
 instance.%0A     *
+ 
 %0A     * @param l
@@ -1554,16 +1554,34 @@
 eftAlign
+%0A     *           
  left al
@@ -1616,16 +1616,34 @@
 inLength
+%0A     *           
  minimum
@@ -1674,16 +1674,34 @@
 axLength
+%0A     *           
  maximum
@@ -1963,32 +1963,33 @@
 instance.%0A     *
+ 
 %0A     * @return 
@@ -2133,32 +2133,33 @@
  aligned.%0A     *
+ 
 %0A     * @return 
@@ -2291,32 +2291,33 @@
 m length.%0A     *
+ 
 %0A     * @return 
@@ -2438,32 +2438,33 @@
 m length.%0A     *
+ 
 %0A     * @return 
@@ -2652,16 +2652,17 @@
 .%0A     *
+ 
 %0A     * 
@@ -2678,16 +2678,34 @@
 eldStart
+%0A     *           
  start o
@@ -2743,16 +2743,30 @@
 m buffer
+%0A     *       
      buf
@@ -3677,20 +3677,16 @@
 %7D%0A    %7D%0A
-    
 %0A    /**

Format for 120 line length and clearer Javadoc.