001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import java.util.Arrays ;
019    
020    /**
021     * ToString.java は、å?通的に使用されã‚?toString() を簡ç´?Œ–するクラスですã?
022     * ãƒ?ƒ�ãƒ?‚°æƒ??をå?力する最もä¸?ˆ¬çš?�ª方法ã?、å?部æ–?­—å?の出力ですã?
023     * 通常、キーと値をã?アで記述するため、StringBuilder で append しながら作æ?するにしてã‚?
024     * コーãƒ?‚£ングçš?�«あまり見æ?えã?良ã�?½¢にはなりませんã€?
025     * ここでは、それらを簡易的に整形して出力できるように、メソãƒ?ƒ‰を用意しましたã€?
026     *
027     * @og.group ユーãƒ?‚£リãƒ?‚£
028     *
029     * @version  4.0
030     * @author       Kazuhiko Hasegawa
031     * @since    JDK5.0,
032     */
033    public final class ToString {
034    
035            /** シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã?     */
036            private static final String CR = System.getProperty("line.separator");
037    
038            /** ?”つåˆ??スペã?スですã?  */
039            private static final String SPACE = "    " ;
040            /** ?“つåˆ??カンマですã?    */
041            private static final String COMMA = " , " ;
042    
043            private final StringBuilder buf ;
044    
045            /** æœ?¾Œに改行記号をå?れたかどã�?�‹ã€?*/
046            private boolean lastCR = true ;
047    
048            /** キーæ–?­—å?のæœ?¤§長(すべてASCII換ç®?    */
049            private int maxSize = 0;
050    
051            /**
052             * タイトルを指定するコンストラクター
053             * タイトルは、å?頭にスペã?スなしで入れますã?æœ?¾Œã?改行ありですã?
054             *
055             * @param title タイトルæ–?­—å?
056             */
057            public ToString( final String title ) {
058                    buf = new StringBuilder( 200 );
059                    buf.append( "TITLE = [" ).append( title ).append( "]" ).append( CR );
060                    lastCR = true ;
061            }
062    
063            /**
064             * 簡易的にオブジェクトを構築すã‚?static メソãƒ?ƒ‰
065             * タイトルは、å?頭にスペã?スなしで入れますã?æœ?¾Œã?改行ありですã?
066             *
067             * @param       title タイトルæ–?­—å?
068             *
069             * @return      ToStringオブジェクãƒ?
070             */
071            public static ToString title( final String title ) {
072                    return new ToString( title );
073            }
074    
075            /**
076             * 改行なしã?キーと値のペアを設定しますã?
077             * 前回、改行で終わってã�?‚‹場合ã?、キーから始めますã?
078             * そうでなã�??合ã?" , " をå?力してから、書き始めますã?
079             *
080             * @param       key     キーæ–?­—å?
081             * @param       val     値æ–?­—å?
082             *
083             * @return      自åˆ??身
084             */
085            public ToString print( final String key,final Object val ) {
086                    if( lastCR ) {  buf.append( SPACE ); }
087                    else {                  buf.append( COMMA ); }
088                    lastCR = false;
089    
090                    if( key != null ) {
091                            int len = key.length();
092                            if( len > maxSize ) { maxSize = len; }
093                            buf.append( key ).append( " = [" ).append( String.valueOf( val ) ).append( "]" );
094                    }
095                    else {
096                            buf.append( "   [" ).append( String.valueOf( val ) ).append( "]" );
097                    }
098    
099                    return this ;
100            }
101    
102            /**
103             * 改行ありã?キーと値のペアを設定しますã?
104             * 前回、改行で終わってã�?‚‹場合ã?、キーから始めますã?
105             * そうでなã�??合ã?" , " をå?力してから、書き始めますã?
106             *
107             * @param       key     キーæ–?­—å?
108             * @param       val     値æ–?­—å?
109             *
110             * @return      自åˆ??身
111             */
112            public ToString println( final String key,final Object val ) {
113                    print( key,val );
114    
115                    buf.append( CR );
116                    lastCR = true;
117                    return this ;
118            }
119    
120            /**
121             * 改行なしã?キーと値配å?のペアを設定しますã?
122             * 前回、改行で終わってã�?‚‹場合ã?、キーから始めますã?
123             * そうでなã�??合ã?" , " をå?力してから、書き始めますã?
124             *
125             * @param       key     キーæ–?­—å?
126             * @param       val     値配å?
127             *
128             * @return      自åˆ??身
129             */
130            public ToString print( final String key,final Object[] val ) {
131                    String str = Arrays.toString( val );
132                    return print( key,str.substring( 1,str.length()-1 ) );
133            }
134    
135            /**
136             * 改行ありã?キーと値配å?のペアを設定しますã?
137             * 前回、改行で終わってã�?‚‹場合ã?、キーから始めますã?
138             * そうでなã�??合ã?" , " をå?力してから、書き始めますã?
139             *
140             * @param       key     キーæ–?­—å?
141             * @param       val     値配å?
142             *
143             * @return      自åˆ??身
144             */
145            public ToString println( final String key,final Object[] val ) {
146                    String str = Arrays.toString( val );
147                    return println( key,str.substring( 1,str.length()-1 ) );
148            }
149    
150            /**
151             * 改行ã?み設定しますã?
152             *
153             * @return      自åˆ??身
154             */
155            public ToString println() {
156                    buf.append( CR );
157                    lastCR = true;
158                    return this;
159            }
160    
161            /**
162             * 改行付きの値のみ設定しますã?
163             *
164             * @param       val     値
165             *
166             * @return      自åˆ??身
167             */
168            public ToString println( final Object val ) {
169                    return println( null,val );
170            }
171    
172            /**
173             * 改行付きの値のみ設定しますã?
174             *
175             * @param       val     値
176             *
177             * @return      自åˆ??身
178             */
179            public ToString println( final Object[] val ) {
180                    String str = Arrays.toString( val );
181                    return println( null,str.substring( 1,str.length()-1 ) );
182            }
183    
184            /**
185             * 先é?のキーの位置を最大値に合わせて、整形しますã?
186             *
187             * @return      自åˆ??身
188             */
189            public ToString fixForm() {
190                    String searchKey = CR + SPACE ;
191                    int    skLen = searchKey.length() ;
192    
193                    char[] ch = new char[maxSize];
194                    Arrays.fill( ch,' ' );
195                    String MAX_SPACE = new String( ch );
196    
197                    int adrs = buf.indexOf( searchKey );
198                    while( adrs >= 0 ) {
199                            int eq = buf.indexOf( "=",adrs );
200                            if( eq >= 0 && buf.charAt(adrs+skLen) != ' ' ) {
201                                    int nextAdrs  = buf.indexOf( searchKey,adrs+skLen );
202                                    if( nextAdrs < 0 || eq < nextAdrs ) {
203                                            buf.insert( eq, MAX_SPACE.substring( eq-(adrs+skLen)-1 ) );
204                                    }
205                            }
206                            adrs = buf.indexOf( searchKey,adrs+skLen );
207                    }
208    
209                    return this;
210            }
211    
212            /**
213             * å†?ƒ¨バッファを文字å?にして返しますã?
214             *
215             * @return      å†?ƒ¨バッファを文字å?にして返しますã?
216             */
217            @Override
218            public String toString() {
219                    return buf.toString() ;
220            }
221    }