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    }