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.model; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 022 /** 023 * [PN],[OYA] ãªã©ã® [] ã§æŒ?®šã•れãŸã‚«ãƒ©ãƒ?§è¡¨ã•れãŸãƒ•ォーマットデータã«å¯¾ã—ã¦ã€? 024 * DataModel オブジェクトをé©ç”¨ã—㦠å?‚«ãƒ©ãƒ?«å®Ÿãƒ‡ãƒ¼ã‚¿ã‚’割り当ã¦ã‚‹ã‚ªãƒ–ジェクトã§ã™ã? 025 * 026 * カラãƒ?ã«ã¯ã€ç‰¹æ®Šã‚«ãƒ©ãƒ?ãŒä½¿ç”¨ã§ãã¾ã™ã?ã“れã¯ã€DataModel ã«å˜åœ¨ã—ãªã?‚«ãƒ©ãƒ? 027 * ã§ã™ãŒã€å?ã‚’è¿”ã™ã“ã¨ãŒå?æ¥ã¾ã™ã? 028 * <pre> 029 * [KEY.カラãƒ?] : 行番å·ä»˜ãカラãƒ? 030 * [I] : è¡Œç•ªå· 031 * [ROW.ID] : 行毎ã?ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã®ID 032 * [ROW.JSON] : 行毎ã?å…¨ãƒ??ã‚¿ã®JavaScriptオブジェクト形å¼?{ key:val,key:val,... } 033 * カラãƒ??å‰ã«ä¿®é£¾è¨˜å·(#,$,!)を付ã‘ã‚‹ã¨ãƒ•ォーマットを変更ã§ãã¾ã™ã? 034 * ãŸã ã—ã?FormatTextField ç³» 㨠FormatTable ç³»ã§ã€å?力ã•れる形å¼ãŒç•°ãªã‚Šã¾ã™ã? 035 * FormatTextField ç³» FormatTable ç³» 036 * [#カラãƒ?] : TDãªã—ã?ラベルã¨å…¥åŠ›ãƒ•ã‚£ãƒ¼ãƒ«ãƒ? ラベルをå?åŠ? 037 * [$カラãƒ?] : TDãªã—ã?入力フィールドã?㿠レンãƒ?ƒ©ãƒ¼ã‚’å?åŠ? 038 * [!カラãƒ?] : TDãªã—ã?値ã®ã¿ 値をå?åŠ? 039 * 040 * </pre> 041 * @og.group ç”»é¢è¡¨ç¤º 042 * 043 * @version 4.0 044 * @author Kazuhiko Hasegawa 045 * @since JDK5.0, 046 */ 047 public class Formatter { 048 /** カラãƒ?D(é€£çµæ–‡å—å?)行番å·ã®é€£çµæ–‡å—å?を定義 {@value} */ 049 public static final String JOINT_STRING = "__" ; 050 051 /** ãƒ??ブル表示ã®ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’特定ã™ã‚?id ã® åç§°( id ã¯ã€ã“ã®åç§°?‹è¡Œç•ªå·) {@value} */ 052 public static final String ROW_ID_KEY = "cb"; // 3.6.0.0 (2004/09/17) 053 054 /** 特殊カラãƒ?ã®å®šç¾©: è¡Œç•ªå· [I] */ 055 public static final int SYS_ROWNUM = -1; // [KEY.カラãƒ?],[I],[ROW.ID] 056 /** 特殊カラãƒ?ã®å®šç¾©: [ROW.JSON] */ 057 public static final int SYS_JSON = -2; // [ROW.JSON] 058 059 private final DataModel<?> model ; // 4.3.3.6 (2008/11/15) Genericsè¦å‘Šå¯¾å¿? 060 private int[] clmNos = null; // フォーマットã?カラãƒ?•ªå·é…å? 061 private String[] format = null; 062 private String[] clmKeys = null; // フォーマットã?カラãƒ?é…å? 063 private char[] type = null; // '#':ラベルã®ã¿ '$':レンãƒ?ƒ©ãƒ¼ '!':値ã®ã¿ ãã?ä»?通常 064 065 /** 066 * ãƒ??タモãƒ?ƒ«ã‚’指定ã—ã¦ãƒ•ォーマッターを構築ã—ã¾ã™ã? 067 * 068 * @param model ãƒ??タモãƒ?ƒ« 069 */ 070 public Formatter( final DataModel<?> model ) { // 4.3.3.6 (2008/11/15) Genericsè¦å‘Šå¯¾å¿? 071 this.model = model; 072 } 073 074 /** 075 * フォーマットをセãƒ?ƒˆã—ã¾ã™ã? 076 * 077 * @param fmt [カラãƒ?] å½¢å¼ã?フォーマットデータ 078 */ 079 public void setFormat( final String fmt ) { 080 makeFormatList( fmt ); 081 advanceFormat(); 082 } 083 084 /** 085 * フォーマットをセãƒ?ƒˆã—ã¾ã™ã? 086 * 087 * @param fmt [カラãƒ?] å½¢å¼ã?フォーマットデータ 088 */ 089 private void makeFormatList( final String fmt ) { 090 int start = 0; 091 int index = fmt.indexOf( '[' ); 092 List<String> clmKeyList = new ArrayList<String>(); 093 List<String> formatList = new ArrayList<String>(); 094 while( index >= 0 ) { 095 int end = fmt.indexOf( ']',index ); 096 if( end < 0 ) { 097 String errMsg = "[ 㨠] ã¨ã®å¯¾å¿œé–¢ä¿‚ãŒãšã‚Œã¦ã?¾ã™ã?" 098 + "format=[" + fmt + "] : index=" + index ; 099 throw new RuntimeException( errMsg ); 100 } 101 102 // [ ã‚ˆã‚Šå‰æ–¹ã®æ–?—å?ã¯ã€formatList 㸠103 if( index > 0 ) { formatList.add( fmt.substring( start,index ) ); } 104 else { formatList.add( "" ); } // ][ ã¨é€£ç¶šã—ã¦ã?‚‹ã‚±ãƒ¼ã‚¹ 105 106 // [XXXX] ã® XXXX部åˆ?‚’処ç? 107 clmKeyList.add( fmt.substring( index+1,end ) ); 108 109 start = end+1 ; 110 index = fmt.indexOf( '[',start ); 111 } 112 // ] ã®å¾Œæ–¹éƒ¨åˆ??ã€formatList 㸠113 formatList.add( fmt.substring( start ) ); 114 115 format = formatList.toArray( new String[formatList.size()] ); 116 clmKeys = clmKeyList.toArray( new String[clmKeyList.size()] ); 117 } 118 119 /** 120 * 追åŠ?©Ÿè?フォーマットを作æ?ã—ã¾ã™ã? 121 * 122 */ 123 private void advanceFormat() { 124 125 int size = clmKeys.length ; 126 clmNos = new int[size]; 127 type = new char[size]; 128 129 // カラãƒ?•ªå·ã®è¨å®šã¨ã€ç‰¹æ®Šã‚«ãƒ©ãƒ?処ç? 130 String clm ; 131 for( int i=0; i<size; i++ ) { 132 clm = clmKeys[i]; 133 char ch = clm.charAt(0); 134 if( ch == '#' || ch == '$' || ch == '!' ) { 135 type[i] = ch; 136 clm = clm.substring(1); 137 clmKeys[i] = clm; 138 clmNos[i] = model.getColumnNo( clm ); 139 } 140 // [KEY.カラãƒ?] 機è?追åŠ? 141 else if( clm.startsWith( "KEY." ) ) { 142 clmNos[i] = SYS_ROWNUM; 143 format[i] = format[i] + clm.substring(4) + JOINT_STRING ; 144 } 145 // [I] 機è?追åŠ? 146 else if( "I".equals( clm ) ) { 147 clmNos[i] = SYS_ROWNUM; 148 } 149 // [ROW.ID] 機è?追åŠ? 150 else if( "ROW.ID".equals( clm ) ) { 151 clmNos[i] = SYS_ROWNUM; 152 format[i] = format[i] + ROW_ID_KEY ; 153 } 154 // [ROW.JSON] 機è?追åŠ? 155 else if( "ROW.JSON".equals( clm ) ) { 156 clmNos[i] = SYS_JSON; 157 } 158 else { 159 clmNos[i] = model.getColumnNo( clm ); 160 } 161 } 162 } 163 164 /** 165 * column ã«ã‚るセルã®å±žæ?値をStringã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã? 166 * 167 * @param row 処ç?¸ã®è¡Œç•ªå· 168 * @param clm 値ãŒå‚ç…§ã•れるカラãƒ?•ªå· 169 * 170 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®å€¤ 171 * 172 */ 173 public String getValue( final int row,final int clm ) { 174 final String rtn ; 175 if( clm >= 0 ) { 176 rtn = String.valueOf( model.getValue( row,clm ) ); 177 } 178 else if( clm == SYS_ROWNUM ) { 179 rtn = String.valueOf( row ); 180 } 181 else if( clm == SYS_JSON ) { 182 rtn = getJson( row ); 183 } 184 else { 185 String errMsg = "æŒ?®šã?カラãƒ?•ªå·ã«è©²å½“ã™ã‚‹å?ç?Œè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€? 186 + "clm=[" + clm + "]" ; 187 throw new RuntimeException( errMsg ); 188 } 189 190 return rtn ; 191 } 192 193 /** 194 * æŒ?®šã? 行番å·ã«å¯¾ã™ã‚‹ã€DataModel ã‚’å?ã«ä½œæ?ã—ãŸãƒ•ォーマット文å—å?ã‚’è¿”ã—ã¾ã™ã? 195 * 196 * @param row 行番å·( [I]フォーマットå?ç?”¨ ) 197 * 198 * @return æŒ?®šã?Objecté…å?ã‚’å?ã«ä½œæ?ã—ãŸãƒ•ォーマット文å—å? 199 */ 200 public String getFormatString( final int row ) { 201 // StringBuilder rtnStr = new StringBuilder( 200 ); 202 // 203 // int count = clmNos.length; 204 // for( int i=0; i<count; i++ ) { 205 // rtnStr.append( format[i] ); 206 // if( clmNos[i] == SYS_ROWNUM ) { 207 // rtnStr.append( row ); 208 // } 209 // else if( clmNos[i] == SYS_JSON ) { 210 // rtnStr.append( getJson( row ) ); 211 // } 212 // else { 213 // rtnStr.append( model.getValue( row,clmNos[i] ) ); 214 // } 215 // } 216 // rtnStr.append( format[count] ); 217 // 218 // return rtnStr.toString(); 219 return getFormatString( row, null ); 220 } 221 222 /** 223 * æŒ?®šã? 行番å·ã«å¯¾ã™ã‚‹ã€DataModel ã‚’å?ã«ä½œæ?ã—ãŸãƒ•ォーマット文å—å?ã‚’è¿”ã—ã¾ã™ã? 224 * ãƒ??ã‚¿ã¯separatorã§æŒ?®šã•れãŸåŒºåˆ?‚Šæ–?—ã§å›²ã¾ã‚Œã¦è¿”ã•れã¾ã™ã? 225 * 226 * @og.rev 4.3.1.1 (2008/08/23) switch ã«ã€default label ãŒå˜åœ¨ã—ãªã?Ÿã‚ã?追åŠ? 227 * 228 * @param row 行番å·( [I]フォーマットå?ç?”¨ ) 229 * @param separator セパレーター 230 * 231 * @return æŒ?®šã?Objecté…å?ã‚’å?ã«ä½œæ?ã—ãŸãƒ•ォーマット文å—å? 232 */ 233 public String getFormatString( final int row, final String separator ) { 234 StringBuilder rtnStr = new StringBuilder( 200 ); 235 236 int count = clmNos.length; 237 for( int i=0; i<count; i++ ) { 238 rtnStr.append( format[i] ); 239 if( clmNos[i] == SYS_ROWNUM ) { 240 rtnStr.append( row ); 241 } 242 else if( clmNos[i] == SYS_JSON ) { 243 rtnStr.append( getJson( row ) ); 244 } 245 else { 246 if( separator == null || separator.length() == 0 ) { 247 rtnStr.append( model.getValue( row,clmNos[i] ) ); 248 } 249 else { 250 // 4.3.1.1 (2008/08/23) default label ãŒå˜åœ¨ã—ãªã?Ÿã‚ã?追åŠ? 251 switch( model.getNativeType( clmNos[i] ) ) { 252 case INT: 253 case LONG: 254 case DOUBLE: 255 rtnStr.append( model.getValue( row,clmNos[i] ) ); 256 break; 257 case STRING: 258 case CALENDAR: 259 rtnStr.append( separator ).append( model.getValue( row,clmNos[i] ) ).append( separator ); 260 break; 261 default: 262 throw new AssertionError( "Unexpected enumrated value! " + model.getNativeType( clmNos[i] ) ); 263 } 264 } 265 } 266 } 267 rtnStr.append( format[count] ); 268 269 return rtnStr.toString(); 270 } 271 272 /** 273 * å…ˆã?ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæƒ…å ±ã®[カラãƒ?]ã‚’ã?? ã«ç½®ãæ›ãˆãŸãƒ•ォーマットを返ã—ã¾ã™ã? 274 * ã“れã¯ã€java.sql.PreparedStatement å½¢å¼ã?Queryæ–?—å?ã‚’åˆæˆã™ã‚‹å?åˆã«ä½¿ç”¨ã—ã¾ã™ã? 275 * 276 * @return PreparedStatementå½¢å¼ã?Queryæ–?—å? 277 */ 278 public String getQueryFormatString() { 279 StringBuilder rtnStr = new StringBuilder( 200 ); 280 281 int count = clmKeys.length; 282 for( int i=0; i<count; i++ ) { 283 rtnStr.append( format[i] ).append( '?' ); 284 } 285 rtnStr.append( format[count] ); 286 287 return rtnStr.toString(); 288 } 289 290 /** 291 * フォーマットã?カラãƒ?é…å?ã‚’è¿”ã—ã¾ã™ã? 292 * 293 * @return フォーマットã?カラãƒ?é…å? 294 */ 295 public String[] getClmKeys() { 296 return clmKeys.clone(); 297 } 298 299 /** 300 * フォーマットã?カラãƒ?•ªå·é…å?ã‚’è¿”ã—ã¾ã™ã? 301 * 302 * @return フォーマットã?カラãƒ?•ªå·é…å? 303 */ 304 public int[] getClmNos() { 305 return clmNos.clone(); 306 } 307 308 /** 309 * フォーマットé?列を返ã—ã¾ã™ã? 310 * 311 * @return フォーマットé?åˆ? 312 */ 313 public String[] getFormat() { 314 return format.clone(); 315 } 316 317 /** 318 * タイプ文å—å?é…å?ã‚’è¿”ã—ã¾ã™ã? 319 * タイプã¨ã¯ã€[XXX] ã®è¨˜è¿°ã§ã€[#XXX] ã¯ã€XXXカラãƒ??ラベルをã?[$XXX]ã¯ã€XXXカラãƒ?? 320 * レンãƒ?ƒ©ãƒ¼ã‚’ã?[!XXX} ã¯ã€å?ã®ã¿å–ã‚Šå‡ºã™æŒ‡å®šã‚’行ã„ã¾ã™ã? 321 * 主ã«ã€TextFieldç³»ã®ãƒ•ォーマットã¨Tableç³»ã§ã¯ã€æ„味åˆã„ãŒç•°ãªã‚Šã¾ã™ã?ã§ã€? 322 * ã”æ³¨æ„ãã?•ã?? 323 * 324 * @return タイプ文å—å?é…å? '#':ラベルã®ã¿ '$':レンãƒ?ƒ©ãƒ¼ '!':値ã®ã¿ ãã?ä»?通常 325 */ 326 public char[] getType() { 327 return type.clone(); 328 } 329 330 /** 331 * 行毎ã?å…¨ãƒ??ã‚¿ã®JavaScriptオブジェクト形å¼?ã‚’è¿”ã—ã¾ã™ã? 332 * 333 * JavaScriptオブジェクト形å¼ã¨ã¯ã€{ key:val,key:val,... }ã®å½¢å¼ã§ã€? 334 * ã“ã“ã§ã¯ã€å?部è¨å®šã•れ㟠DataModel ã®ã™ã¹ã¦ã®ã‚«ãƒ©ãƒ?ã‚’ã‚ーã«ã€? 335 * å¼•æ•°ã§æ¸¡ã•れã?é…å?ã‚?値ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã? 336 * 337 * @param row (DataModelã®)è¡Œç•ªå· 338 * 339 * @return æŒ?®šã?行番å·ã«å¯¾å¿œã™ã‚‹å?ãƒ??ã‚¿ã®JSONå½¢å¼ãƒ‡ãƒ¼ã‚¿ 340 */ 341 public String getJson( final int row ) { 342 String[] names = model.getNames(); 343 Object[] vals = model.getValues( row ); 344 345 StringBuilder rtnStr = new StringBuilder( 200 ); 346 347 rtnStr.append( "{'I':'" ).append( row ).append( "'" ); // è¡Œç•ªå· 348 349 for( int i=0; i<names.length; i++ ) { 350 rtnStr.append( ",'" ).append( names[i] ).append( "':'" ); 351 rtnStr.append( vals[i] ).append( "'" ); 352 } 353 rtnStr.append( "}" ); 354 355 return rtnStr.toString(); 356 } 357 }