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.hayabusa.taglib; 017 018 import org.opengion.hayabusa.common.HybsSystem; 019 import org.opengion.hayabusa.common.HybsSystemException; 020 import org.opengion.hayabusa.db.DBTableModel; 021 import org.opengion.hayabusa.db.DBTableModelSorter; 022 import org.opengion.hayabusa.db.DBColumn; 023 import org.opengion.hayabusa.db.DBTableModelUtil; 024 import org.opengion.fukurou.util.StringUtil; 025 026 import static org.opengion.fukurou.util.StringUtil.nval ; 027 028 import java.util.Arrays; 029 import java.io.File; 030 import java.io.FileFilter; 031 import java.io.ObjectOutputStream; 032 import java.io.ObjectInputStream; 033 import java.io.IOException; 034 035 /** 036 * ファイルを検索し?DBTableModel にセ?するタグです? 037 * 038 * ファイルの検索結果は?LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" 039 * のカラ?持つ DBTableModel にセ? されます?こ?カラ??、固定です? 040 * 並び替えにつ?は、このタグで?しますが、ファイルの選別(where 条件)は? 041 * BODY 部に記述する fileWhere タグで?します?(??可能)) 042 * 043 * [カラ?] 検索するファイルの属?は、以下?カラ?で作?されます? 044 * LEVEL ?レクトリを展開する場合?レベル? 045 * FILE_TYPE ファイル(F)かディレクトリ(D)であるか判定? 046 * PARENT こ?抽象パス名?親のパス名文字?を返します? 047 * NAME こ?抽象パス名が示すファイルまた??レクトリの名前を返します? 048 * LASTMODIFIED ?に変更された時刻を返します? 049 * FILE_LENGTH ファイルの長さを返します? 050 * RWH 読み込み、書き込み?し属?をそれぞれ???w,h で表します? 051 * 052 * [from 属?] 検索を開始するファイルまた??レクトリの名前 053 * 054 * [multi 属?] ?レクトリを下位展開するかど??? 055 * true 下位展開する 056 * false 下位展開しな?初期値) 057 * 058 * [tableId 属?] settion に登録する時?ID 059 * [scope 属?] settion に登録する時?スコー?"request","page","session","applicaton" 060 * [maxRowCount 属?] 検索時??検索件数(初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限]) 061 * [displayMsg 属?] 検索終?に表示する メ?ージリソースのID 062 * [overflowMsg 属?] オーバ?フロー時に表示する メ?ージリソースのID 063 * [command 属?] 実行を制御するコマン?"NEW" と "RENEW" 時?み実行す?初期値:NEW) 064 * [orderBy 属?] ソートするカラ??しま??のみ) 065 * [desc 属?] ??でソートする?合に、true を指定します? 066 * [addClms 属?] 検索結果のカラ??に追?るカラ?を?カンマ区??で?します? 067 * [useUpdateClms 属?] trueをセ?すると、fileUpdateで使用する TO_PARENT、TO_NAMEカラ?追?ま?初期値:false) 068 * [fileType属?] 選択対象(FILE,DIR)を指定します?下位展開は??(multi 属?準拠)されます? 069 * [addFrom属?] from属?で?された基準ファイル/フォル??体をリストに追?るかど?(初期値:true) 070 * 071 * @og.formSample 072 * ●形式?lt;og:fileQuery from="…" multi="true/false" > 073 * <og:fileWhere … /> 074 * … 075 * </og:fileQuery> 076 * ●body?あ?EVAL_BODY_BUFFERED:BODYを評価し?{@XXXX} を解析しま? 077 * 078 * ●Tag定義?? 079 * <og:fileQuery 080 * from ○?TAG】ファイルの検索?なるディレクトリを指定します?(??) 081 * multi 【TAG】多段階展開するか??レベル展開するかど?[true/false]を指定しま?初期値:false) 082 * tableId 【TAG?通常は使?せん)結果のDBTableModelを?sessionに登録するとき?キーを指定しま? 083 * level 【TAG】多段階展開するレベルを指定しま?初期値:100) 084 * orderBy 【TAG】ソートするカラ?を指定しま??のみ) 085 * desc 【TAG】表示??するかど?[true/false]を指定しま?初期値:false) 086 * addClms 【TAG】検索結果のカラ??に追?るカラ?を?カンマ区??で?しま? 087 * useUpdateClms 【TAG】TO_PARENT、TO_NAMEカラ?追?るかど?[true/false]を指定しま?初期値:false) 088 * fileType 【TAG】ファイル名が、指定されたファイルタイプと??した場合?スルー(選?されま? 089 * addFrom 【TAG】from属?で?された基準ファイル/フォル??体をリストに追?るかど?[true/false]を指定しま?初期値:true) 090 * command 【TAG】コマン?NEW,RENEW)をセ?しま?PlsqlUpdateTag,UpdateTag の場合?、ENTRY) 091 * maxRowCount 【TAG?通常は使?せん)??タの?読み込み件数を指定しま?(初期値:DB_MAX_ROW_COUNT[=1000]) 092 * displayMsg 【TAG】検索結果を画面上に表示するメ?ージリソースIDを指定しま?(初期値:VIEW_DISPLAY_MSG[=]) 093 * notfoundMsg 【TAG】検索結果がゼロ件の場合に表示するメ?ージリソースIDを指定しま?初期値:MSG0077[対象??タはありませんでした]) 094 * scope 【TAG】キャ?ュする場合?スコープ[request/page/session/applicaton]を指定しま?初期値:session) 095 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false) 096 * > ... Body ... 097 * </og:fileQuery> 098 * 099 * ●使用? 100 * ・??属?でファイルの検索を行います? 101 * <og:fileQuery 102 * from = "d:/webapps/dbdef/jsp/" 103 * multi = "true" 104 * command = "{@command}" > 105 * <og:fileWhere endWith=".jsp" /> 106 * </og:fileQuery> 107 * 108 * ・?変更日で??ソートする?対象は?002/10/01 以降に変更されたファイル? 109 * <og:fileQuery 110 * from = "d:/webapps/dbdef/jsp/" 111 * multi = "true" 112 * orderBy = "LASTMODIFIED" 113 * desc = "true" 114 * command = "{@command}" > 115 * <og:fileWhere lastModified="20021001000000" /> 116 * </og:fileQuery> 117 * 118 * @og.rev 4.0.0.0 (2005/01/31) ?ロジ?改? 119 * @og.group そ?他?? 120 * 121 * @version 4.0 122 * @author Kazuhiko Hasegawa 123 * @since JDK5.0, 124 */ 125 public class FileQueryTag extends QueryTag { 126 //* こ?プログラ??VERSION??を設定します? {@value} */ 127 private static final String VERSION = "5.3.9.0 (2011/09/01)" ; 128 129 private static final long serialVersionUID = 539020110901L ; 130 131 private static final String[] SELECT = 132 new String[] { "LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" }; 133 134 private static final int LEVEL = 0; 135 private static final int FILE_TYPE = 1; 136 private static final int PARENT = 2; 137 private static final int NAME = 3; 138 private static final int LASTMODIFIED = 4; 139 private static final int FILE_LENGTH = 5; 140 private static final int RWH = 6; 141 142 private static final String[] USE_UPDATE_CLM = new String[] { "TO_PARENT","TO_NAME" }; // 5.3.4.0 (2011/04/01) 143 144 private transient FileFilter filter = null; // FileWhere で?したフィルター 145 146 private boolean multi = false; // 下位層展開?ラク?? 147 private int level = 100; // 展開?ベ? 148 private String from = HybsSystem.sys( "FILE_URL" ); // 検索起点?ァ??? 149 private String orderBy = null; // 5.3.4.0 (2011/04/01) ソートカラ? 150 private boolean desc = false; // 5.3.4.0 (2011/04/01) ソート?方?true:??) 151 private String[] addClms = new String[0]; // 5.3.4.0 (2011/04/01) 追?ラ??? 152 private String[] valClms = null; // 5.3.4.0 (2011/04/01) 追?ラ??列?初期値 153 private String fileType = null; // 5.3.4.0 (2011/04/01) 選択対象を指?FILE,DIR) 154 private boolean useUpdateClms = false; // 5.3.4.0 (2011/04/01) TO_PARENT、TO_NAMEカラ?追?true:追? 155 private boolean addFrom = true; // 5.3.9.0 (2011/09/01) from属?で?された基準ファイル/フォル??体をリストに追?るかど? 156 157 /** 158 * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします? 159 * 160 * @og.rev 5.3.4.0 (2011/04/01) ?カラ??ソート???追? 161 * @og.rev 5.3.5.0 (2011/05/01) ??のファイルが存在する場合?み、実行する? 162 * 163 * @return 後続????(SKIP_BODY) 164 */ 165 @Override 166 public int doAfterBody() { 167 executeCount = 0; 168 169 table = initDBTable(); 170 if( maxRowCount < 0 ) { 171 maxRowCount = sysInt( "DB_MAX_ROW_COUNT" ) ; 172 } 173 174 // execute( new File( from ),0 ) ; // 5.3.5.0 (2011/05/01) ? 175 176 // 5.3.5.0 (2011/05/01) ??のファイルが存在する場合?み、実行する? 177 File fin = new File( from ); 178 if( fin.exists() ) { 179 execute( fin,0 ) ; 180 181 // 5.3.4.0 (2011/04/01) ?カラ??ソート?? 182 if( orderBy != null ) { 183 int clmNo = table.getColumnNo( orderBy ); 184 DBTableModelSorter temp = new DBTableModelSorter(); 185 temp.setModel( table ); 186 temp.sortByColumn( clmNo,!desc ); // 注?desc の値と ソート正??、反対です? 187 table = temp; 188 } 189 } 190 191 return(SKIP_BODY); 192 } 193 194 /** 195 * タグリブオブジェクトをリリースします? 196 * キャ?ュされて再利用される?で、フィールド?初期設定を行います? 197 * 198 * @og.rev 5.3.4.0 (2011/04/01) ?カラ??ソート???、カラ???、fileType追? 199 * @og.rev 5.3.9.0 (2011/09/01) addFrom属?追? 200 */ 201 @Override 202 protected void release2() { 203 super.release2(); 204 multi = false; 205 level = 100; 206 from = HybsSystem.sys( "FILE_URL" ); 207 filter = null; 208 orderBy = null; // 5.3.4.0 (2011/04/01) ソートカラ? 209 desc = false; // 5.3.4.0 (2011/04/01) 降??ラク?? 210 addClms = new String[0]; // 5.3.4.0 (2011/04/01) 追?ラ??? 211 valClms = null; // 5.3.4.0 (2011/04/01) 追?ラ??列?初期値 212 fileType = null; // 5.3.4.0 (2011/04/01) 選択対象を指?FILE,DIR,ALL) 213 useUpdateClms = false; // 5.3.4.0 (2011/04/01) TO_PARENT、TO_NAMEカラ?追?true:追? 214 addFrom = true; // 5.3.9.0 (2011/09/01) addFrom属?追? 215 } 216 217 /** 218 * FileQuery を実行します? 219 * 220 * @og.rev 5.3.4.0 (2011/04/01) fileType の条件に合?する場合だけ???タを作?する? 221 * @og.rev 5.3.7.0 (2011/07/01) フォル?アクセスできな??合?、null となる?でそ?対? 222 * @og.rev 5.3.9.0 (2011/09/01) addFrom属?追? 223 * 224 * @param fin 検索を開始するファイル/?レクトリ 225 * @param lvl 階層展開レベル 226 */ 227 protected void execute( final File fin,final int lvl ) { 228 if( ( !multi && lvl > 1 ) || lvl > level ) { return; } // 階層展開する、しな? 229 if( executeCount > maxRowCount ) { table.setOverflow( true ); return; } 230 231 boolean isDIR = fin.isDirectory(); 232 233 if( fileType == null || 234 ( isDIR && "DIR".equalsIgnoreCase( fileType ) ) || 235 ( !isDIR && "FILE".equalsIgnoreCase( fileType ) ) ) { 236 if( addFrom || ( !addFrom && lvl > 0 ) ) { 237 addFileData( executeCount++,lvl,fin ); 238 } 239 } 240 // if( fin.isDirectory() ) { 241 if( isDIR ) { 242 File[] list = fin.listFiles( filter ); 243 // 5.3.7.0 (2011/07/01) フォル?アクセスできな??合?、null となる? 244 if( list != null ) { 245 for( int i = 0; i < list.length; i++ ) { 246 execute( list[i],lvl+1 ); 247 } 248 } 249 } 250 } 251 252 /** 253 * 初期化された DBTableModel を返します? 254 * 255 * @og.rev 5.3.4.0 (2011/04/01) ?カラ???追? 256 * 257 * @return ??ブルモ? 258 */ 259 private DBTableModel initDBTable() { 260 DBTableModel tbl = DBTableModelUtil.newDBTable(); 261 262 // TO_PARENT、TO_NAMEカラ?追? 263 int clmSize = addClms.length ; 264 if( useUpdateClms ) { 265 if( clmSize == 0 ) { 266 addClms = USE_UPDATE_CLM ; 267 } 268 else { 269 addClms = Arrays.copyOf( addClms ,clmSize + USE_UPDATE_CLM.length ); // JDK1.6 270 for( int i=0; i<USE_UPDATE_CLM.length; i++ ) { 271 addClms[clmSize+i] = USE_UPDATE_CLM[i]; 272 } 273 } 274 } 275 valClms = new String[addClms.length]; 276 277 tbl.init( SELECT.length + addClms.length ); 278 int ad=0; 279 for( int i=0; i<SELECT.length; i++ ) { 280 DBColumn dbColumn = getDBColumn( SELECT[i] ); 281 tbl.setDBColumn( ad++,dbColumn ); 282 } 283 284 for( int i=0; i<addClms.length; i++ ) { 285 DBColumn dbColumn = getDBColumn( addClms[i] ); 286 valClms[i] = dbColumn.getDefault(); // 初期値を指定しておく 287 tbl.setDBColumn( ad++,dbColumn ); 288 } 289 290 return tbl ; 291 } 292 293 /** 294 * DBTableModel に、ファイル??をセ?します? 295 * ファイル??は?LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" です? 296 * 297 * @og.rev 5.3.4.0 (2011/04/01) ?カラ???追? 298 * 299 * @param rowNo セ?する行番号 300 * @param lvl セ?するレベル 301 * @param fin ファイル??の?なるファイルオブジェク? 302 */ 303 private void addFileData( final int rowNo,final int lvl,final File fin ) { 304 try { 305 File file = fin.getCanonicalFile(); 306 307 String rwh = ((file.canRead())?"r":"-" ) + 308 ((file.canWrite())?"w":"-" ) + 309 ((file.isHidden())?"h":"-" ) ; 310 311 String lastModified = HybsSystem.getDate( file.lastModified(),"yyyyMMddHHmmss" ); 312 313 String[] data = new String[ SELECT.length + addClms.length ]; // 5.3.4.0 (2011/04/01) ?カラ??? 314 data[LEVEL ] = String.valueOf( lvl ) ; 315 data[FILE_TYPE ] = (file.isFile())?"F":"D" ; 316 data[PARENT ] = file.getParent() ; 317 data[NAME ] = file.getName() ; 318 data[LASTMODIFIED ] = lastModified ; 319 data[FILE_LENGTH ] = String.valueOf( file.length() ) ; 320 data[RWH ] = rwh ; 321 322 // これ以降? data 配?には、カラ?ブジェクト?初期値を設定しておく? 323 int ad = SELECT.length; 324 for( int i=0; i<addClms.length; i++ ) { 325 data[ad++] = valClms[i]; 326 } 327 328 table.addColumnValues( data ); 329 } 330 catch( IOException ex ) { 331 String errMsg = "正式なファイル名?取得に失敗しました?" + fin + "]" 332 + " ROW=[" + rowNo + "]" 333 + HybsSystem.CR + ex.getMessage(); 334 throw new HybsSystemException( errMsg,ex ); 335 } 336 } 337 338 /** 339 * 【TAG】ファイルの検索?なるディレクトリを指定します? 340 * 341 * @og.tag ファイルの検索?なるディレクトリを指定します? 342 * 343 * @og.rev 4.0.0.0 (2007/11/20) ?された?レクトリ名??が"\"or"/"で終わって???合に?/"を付加する? 344 * 345 * @param url ファイルの検索?なるディレクトリ 346 */ 347 public void setFrom( final String url ) { 348 String furl = nval( getRequestParameter( url ),null ); 349 if( furl != null ) { 350 char ch = furl.charAt( furl.length()-1 ); 351 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; } 352 } 353 furl = StringUtil.urlAppend( from,furl ); 354 furl = StringUtil.urlAppend( furl,"." ); 355 356 from = HybsSystem.url2dir( furl ); 357 } 358 359 /** 360 * 【TAG】多段階展開するか??レベル展開するかど?[true/false]を指定しま?初期値:false)? 361 * 362 * @og.tag 363 * 初期値は、false (?レベル) です? 364 * 365 * @param mlti 多段階展開する?[true:する/false:?レベル] 366 */ 367 public void setMulti( final String mlti ) { 368 multi = nval( getRequestParameter( mlti ),multi ); 369 } 370 371 /** 372 * 【TAG】多段階展開するレベルを指定しま?初期値:100)? 373 * 374 * @og.tag 375 * 376 * @param lvl 多段階展開するレベル 377 */ 378 public void setLevel( final String lvl ) { 379 level = nval( getRequestParameter( lvl ),level ); 380 } 381 382 /** 383 * 【TAG】ソートするカラ?を指定しま??のみ)? 384 * 385 * @og.tag 386 * ソートするカラ?を?"LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" 387 * から?選びます? 388 * これは、?カラ?のソート?できません? 389 * ??にソートする?合?、desc属??true にセ?ください? 390 * + をつけても?無効(カラ?がな??ことでエラーになります? 391 * 392 * @og.rev 5.3.4.0 (2011/04/01) 新規追? 393 * 394 * @param clm ソートするカラ?(?のみ)????、?イナスを付ける? 395 * @see #setDesc( String ) 396 */ 397 public void setOrderBy( final String clm ) { 398 orderBy = nval( getRequestParameter( clm ),orderBy ); 399 400 if( orderBy != null && ! check( orderBy, SELECT ) ) { 401 String errMsg = "?? orderBy は、指定できません? + HybsSystem.CR 402 + "orderBy=[" + orderBy + "] " + HybsSystem.CR 403 + StringUtil.array2csv( SELECT ) + HybsSystem.CR ; 404 // throw new HybsSystemException( errMsg.toString() ); 405 throw new HybsSystemException( errMsg ); 406 } 407 } 408 409 /** 410 * 【TAG】表示??するかど?[true/false]を指定しま?初期値:false)? 411 * 412 * @og.tag 413 * orderBy 属?で?した表示????するかど?を指定できます? 414 * 初期値は、false (??) です? 415 * 416 * @og.rev 5.3.4.0 (2011/04/01) 新規追? 417 * 418 * @param flag 表示??するかど? [??:true/正?false] 419 * @see #setOrderBy( String ) 420 */ 421 public void setDesc( final String flag ) { 422 desc = nval( getRequestParameter( flag ),desc ); 423 } 424 425 /** 426 * 【TAG】検索結果のカラ??に追?るカラ?を?カンマ区??で?します? 427 * 428 * @og.tag 429 * ?ォルト?カラ??LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" 430 * 以外に、指定?カラ?を追?ることが可能です? 431 * これは、ファイル検索結果以外??を追?て、データベ?スに書き込??合に、利用できます? 432 * 並び??、デフォルトカラ??後ろに、指定?カラ???で付きます? 433 * ここで追?たカラ?は、?はセ?されて?せん。よって、ソート対象のカラ?も指定できません? 434 * 435 * @og.rev 5.3.4.0 (2011/04/01) 新規追? 436 * 437 * @param clms 検索結果のカラ??に追?るカラ?を?カンマ区??で?します? 438 * @see #setUseUpdateClms( String ) 439 */ 440 public void setAddClms( final String clms ) { 441 String tmpClms = nval( getRequestParameter( clms ),null ); 442 443 if( tmpClms != null && tmpClms.length() > 0 ) { 444 addClms = StringUtil.csv2Array( tmpClms ); 445 } 446 } 447 448 /** 449 * 【TAG】TO_PARENT、TO_NAMEカラ?追?るかど?[true/false]を指定しま?初期値:false)? 450 * 451 * @og.tag 452 * fileUpdateタグでは、ファイルのCOPYやMOVEが?来ますが、そのコピ?先?移動?の 453 * ファイルを行ごとに?する?合?TO_PARENT、TO_NAMEカラ??固定名のカラ? 454 * ?です? 455 * これを?addClms 属?で?する代わりに、この属?で、true をセ?することで? 456 * 自動的に追?れます? 457 * 初期値は、false (追?な? です? 458 * 459 * @og.rev 5.3.4.0 (2011/04/01) 新規追? 460 * 461 * @param flag TO_PARENT、TO_NAMEカラ?追?るかど? [true:追??false:追?ない] 462 * @see #setAddClms( String ) 463 */ 464 public void setUseUpdateClms( final String flag ) { 465 useUpdateClms = nval( getRequestParameter( flag ),useUpdateClms ); 466 } 467 468 /** 469 * 【TAG】ファイル名が、指定されたファイルタイプと??した場合?スルー(選?されます? 470 * @og.tag 471 * 大?小文字?区別しません? 472 * ファイルタイ?は、DIR,FILE が指定できます? 473 * DIR は、ディレクトリのみ検索します?(階層下がりも行いま? 474 * FILEは、ファイルのみ検索します?(階層下がりも行いま? 475 * 引数?null の場合?、追?ません?つまり?すべてスルーされます?) 476 * 477 * @og.rev 5.3.4.0 (2011/04/01) fileType メソ?で選択対象??追? 478 * 479 * @param str ?するファイルタイ?DIR,FILE,null) 480 */ 481 public void setFileType( final String str ) { 482 String tmp = nval( getRequestParameter( str ),fileType ); 483 if( tmp == null || 484 "DIR".equalsIgnoreCase( tmp ) || 485 "FILE".equalsIgnoreCase( tmp ) ) { 486 fileType = tmp; 487 } 488 else { 489 // ファイルタイプに不正な値が設定された場合?、エラーになる? 490 String errMsg = "こ?、fileType 属?には、DIR,FILE 以外??できません?" 491 + tmp + "]"; 492 throw new HybsSystemException( errMsg ); 493 } 494 } 495 496 /** 497 * 【TAG】from属?で?された基準ファイル/フォル??体をリストに追?るかど?[true/false]を指定しま?初期値:true)? 498 * @og.tag 499 * 初期値はtrue(追??です? 500 * 501 * @og.rev 5.3.9.0 (2011/09/01) 新規作? 502 * 503 * @param flg 基準ファイル/フォル??体をリストに追?るかど? true:追??false:追?ない] 504 */ 505 public void setAddFrom( final String flg ) { 506 addFrom = nval( getRequestParameter( flg ),addFrom ); 507 } 508 509 /** 510 * FileFilterオブジェクトをセ?します? 511 * これは、BODY 部に登録した、FileWhereタグによって設定された 512 * ファイルフィルターです? 513 * 514 * @param filter オブジェク? 515 */ 516 protected void setFileFilter( final FileFilter filter ) { 517 this.filter = filter; 518 } 519 520 /** 521 * シリアライズ用のカスタ?リアライズ書き込みメソ? 522 * 523 * @og.rev 4.0.0.0 (2006/09/31) 新規追? 524 * @serialData 525 * 526 * @param strm ObjectOutputStreamオブジェク? 527 */ 528 private void writeObject( final ObjectOutputStream strm ) throws IOException { 529 strm.defaultWriteObject(); 530 } 531 532 /** 533 * シリアライズ用のカスタ?リアライズ読み込みメソ? 534 * 535 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します? 536 * 537 * @og.rev 4.0.0.0 (2006/09/31) 新規追? 538 * @serialData 539 * 540 * @param strm ObjectInputStreamオブジェク? 541 * @see #release2() 542 */ 543 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 544 strm.defaultReadObject(); 545 } 546 547 /** 548 * こ?オブジェクト???表現を返します? 549 * 基本???目?使用します? 550 * 551 * @return こ?クラスの??表現 552 */ 553 @Override 554 public String toString() { 555 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 556 .println( "VERSION" ,VERSION ) 557 .println( "multi" ,multi ) 558 .println( "level" ,level ) 559 .println( "from" ,from ) 560 .fixForm().toString() 561 + HybsSystem.CR 562 + super.toString() ; 563 } 564 }