001/*
002// $Id: ParseTreeWriter.java 482 2012-01-05 23:27:27Z jhyde $
003//
004// Licensed to Julian Hyde under one or more contributor license
005// agreements. See the NOTICE file distributed with this work for
006// additional information regarding copyright ownership.
007//
008// Julian Hyde licenses this file to you under the Apache License,
009// Version 2.0 (the "License"); you may not use this file except in
010// compliance with the License. You may obtain a copy of the License at:
011//
012// http://www.apache.org/licenses/LICENSE-2.0
013//
014// Unless required by applicable law or agreed to in writing, software
015// distributed under the License is distributed on an "AS IS" BASIS,
016// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017// See the License for the specific language governing permissions and
018// limitations under the License.
019*/
020package org.olap4j.mdx;
021
022import java.io.PrintWriter;
023import java.io.Writer;
024
025/**
026 * Writer for MDX parse tree.
027 *
028 * <p>Typical use is with the {@link ParseTreeNode#unparse(ParseTreeWriter)}
029 * method as follows:
030 *
031 * <blockquote>
032 * <pre>
033 * ParseTreeNode node;
034 * StringWriter sw = new StringWriter();
035 * PrintWriter pw = new PrintWriter(sw);
036 * ParseTreeWriter mdxWriter = new ParseTreeWriter(pw);
037 * node.unparse(mdxWriter);
038 * pw.flush();
039 * String mdx = sw.toString();
040 * </pre>
041 * </blockquote>
042 *
043 *
044 * @see org.olap4j.mdx.ParseTreeNode#unparse(ParseTreeWriter)
045 *
046 * @author jhyde
047 * @version $Id: ParseTreeWriter.java 482 2012-01-05 23:27:27Z jhyde $
048 * @since Jun 4, 2007
049 */
050public class ParseTreeWriter {
051    private final PrintWriter pw;
052    private int linePrefixLength;
053    private String linePrefix;
054
055    private static final int INDENT = 4;
056    private static String bigString = "                ";
057
058    /**
059     * Creates a ParseTreeWriter.
060     *
061     * @param pw Underlying writer
062     */
063    public ParseTreeWriter(PrintWriter pw) {
064        this((Writer)pw);
065    }
066
067    /**
068     * Creates a ParseTreeWriter.
069     *
070     * @param w Underlying writer
071     */
072    public ParseTreeWriter(Writer w) {
073        this.pw = new PrintWriter(w) {
074            @Override
075            public void println() {
076                super.println();
077                print(linePrefix);
078            }
079        };
080        this.linePrefixLength = 0;
081        setPrefix();
082    }
083
084    /**
085     * Returns the print writer.
086     *
087     * @return print writer
088     */
089    public PrintWriter getPrintWriter() {
090        return pw;
091    }
092
093    /**
094     * Increases the indentation level.
095     */
096    public void indent() {
097        linePrefixLength += INDENT;
098        setPrefix();
099    }
100
101    private void setPrefix() {
102        linePrefix = spaces(linePrefixLength);
103    }
104
105    /**
106     * Decreases the indentation level.
107     */
108    public void outdent() {
109        linePrefixLength -= INDENT;
110        setPrefix();
111    }
112
113    /**
114     * Returns a string of N spaces.
115     * @param n Number of spaces
116     * @return String of N spaces
117     */
118    private static synchronized String spaces(int n)
119    {
120        while (n > bigString.length()) {
121            bigString = bigString + bigString;
122        }
123        return bigString.substring(0, n);
124    }
125}
126
127// End ParseTreeWriter.java