    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 */
    016package org.opengion.fukurou.util;
    017
    018import 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 */
    033public 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}