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 }