mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Valery Kharseko
04.28.2025 85f154c8a02f37bada929ad6b9ece67f2f138887
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2008 Sun Microsystems, Inc.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package com.forgerock.opendj.cli;
 
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
 
/**
 * An interface for creating a tab-separated formatted table.
 * <p>
 * This table printer will replace any tab, line-feeds, or carriage return control characters encountered in a cell with
 * a single space.
 */
public final class TabSeparatedTablePrinter extends TablePrinter {
    /** Table serializer implementation. */
    private final class Serializer extends TableSerializer {
        /**
         * Counts the number of separators that should be output the next time a non-empty cell is displayed. The tab
         * separators are not displayed immediately so that we can avoid displaying unnecessary trailing separators.
         */
        private int requiredSeparators;
 
        /** Private constructor. */
        private Serializer() {
            // No implementation required.
        }
 
        @Override
        public void addCell(String s) {
            // Avoid printing tab separators for trailing empty cells.
            if (s.length() == 0) {
                requiredSeparators++;
            } else {
                for (int i = 0; i < requiredSeparators; i++) {
                    writer.print('\t');
                }
                requiredSeparators = 1;
            }
 
            // Replace all new-lines and tabs with a single space.
            writer.print(s.replaceAll("[\\t\\n\\r]", " "));
        }
 
        @Override
        public void addHeading(String s) {
            if (displayHeadings) {
                addCell(s);
            }
        }
 
        @Override
        public void endHeader() {
            if (displayHeadings) {
                writer.println();
            }
        }
 
        @Override
        public void endRow() {
            writer.println();
        }
 
        @Override
        public void endTable() {
            writer.flush();
        }
 
        @Override
        public void startHeader() {
            requiredSeparators = 0;
        }
 
        @Override
        public void startRow() {
            requiredSeparators = 0;
        }
    }
 
    /** Indicates whether the headings should be output. */
    private boolean displayHeadings;
 
    /** The output destination. */
    private PrintWriter writer;
 
    /**
     * Creates a new tab separated table printer for the specified output stream. Headings will not be displayed by
     * default.
     *
     * @param stream
     *            The stream to output tables to.
     */
    public TabSeparatedTablePrinter(OutputStream stream) {
        this(new BufferedWriter(new OutputStreamWriter(stream)));
    }
 
    /**
     * Creates a new tab separated table printer for the specified writer. Headings will not be displayed by default.
     *
     * @param writer
     *            The writer to output tables to.
     */
    public TabSeparatedTablePrinter(Writer writer) {
        this.writer = new PrintWriter(writer);
    }
 
    /**
     * Specify whether table headings should be displayed.
     *
     * @param displayHeadings
     *            <code>true</code> if table headings should be displayed.
     */
    public void setDisplayHeadings(boolean displayHeadings) {
        this.displayHeadings = displayHeadings;
    }
 
    @Override
    protected TableSerializer getSerializer() {
        return new Serializer();
    }
}