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.fukurou.util.ErrorMessage;
022    import org.opengion.fukurou.util.FileUtil;
023    
024    import org.opengion.fukurou.util.StringUtil ;
025    import static org.opengion.fukurou.util.StringUtil.nval ;
026    
027    import java.util.Locale ;
028    import java.util.Set ;
029    import java.util.TreeSet ;
030    import java.util.Comparator ;
031    import java.io.File ;
032    import java.io.ObjectOutputStream;
033    import java.io.ObjectInputStream;
034    import java.io.IOException;
035    import java.io.Serializable;
036    
037    /**
038     * ファイル検索リストをå…?�«、action に基づã�?�Ÿ処ç�?‚’行うタグですã?
039     * command="ENTRY" 時ã?み処ç�?‚’行いますã?
040     *
041     * fileQuery などで検索したファイルä¸?¦§のDBTableModel をå?に、ファイルの
042     * コピã?(COPY)、移å‹?MOVE,MODIFY)、削除(DELETE)などの処ç�?‚’行いますã?
043     * 処ç�?‚’行うオリジナルファイルは、PARENT,NAME とã�?�†カラãƒ?�§なければなりませんã€?
044     * こã?カラãƒ?��は、fileQuery の検索時には、å¿?�š作æ?されるカラãƒ?�§すã?
045     * またã?å�?‚¢クションに対応するターゲãƒ?ƒˆファイルは、TO_PARENT,TO_NAME とã�?�†
046     * カラãƒ?�§æŒ?®šするか、targetDir 属æ?を利用してフォルãƒ?‚’æŒ?®šしますã?
047     * TO_PARENT(先フォルãƒ?と、TO_NAME(先ファイルå�?は、å?ç�?�«応じて、å¿?¦�なカラãƒ?�Œ
048     * あれば、è?動的に処ç�?�—ますã?
049     * つまりã?TO_PARENT のみの場合ã?、ファイル名ã?オリジナルのまま、フォルãƒ??み変更しますã?
050     * é€?�«、TO_NAME の場合ã?、フォルãƒ??そã?ままで、ファイル名ã?みæŒ?®šしますã?
051     * 両方同時にæŒ?®šすることも可能ですã?
052     * targetDir 属æ?でæŒ?®šするå?合ã?、TO_PARENT のみに同じ値を設定したå?合と同じになりますã?
053     * こã?属æ?を指定すると、TO_PARENT は無視されますã?(TO_NAME は有効ですã?)
054     * COPY、MOVE(,MODIFY) の場合ã?、指定ã?フォルãƒ?�«ä¸?‹¬処ç�?�¯能ですã?
055     * COPY、MOVE(,MODIFY) などの処ç�?�§、ターゲãƒ?ƒˆフォルãƒ?�Œ存在しなã�?�¨きに、作æ?するかã?エラーにするかã?
056     * createDir属æ? でæŒ?®šできますã?初期値はã€?true:作æ?する) ですã?
057     * これは、COPY先やMOVE(,MODIFY)先が存在してã�?‚‹前提のシスãƒ?ƒ で、不要なç®?‰€に間違ってフォルãƒ?‚’
058     * 自動作æ?されると困るå?合にã€?false:作æ?しなã�? とすればã€?–“違いに気づく確çŽ?�Œ上がりますã?
059     *
060     * ※ こã?タグは、Transaction タグの対象ではありませんã€?
061     *
062     * @og.formSample
063     * ●body?šなã�?
064     * ●形式ï¼?
065     *      ・<og:fileUpdate
066     *          action      = "COPY|MOVE|MODIFY|DELETE" アクション属æ?(å¿??)
067     *          command     = "[ENTRY]"                 ENTRY 時ã?み実行しまã�?初期値:ENTRY)
068     *          targetDir   = "[æŒ?®šフォルãƒ?"          ターゲãƒ?ƒˆとなるフォルãƒ?
069     *          createDir   = "[true/false]"            ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ作æ?する(true)かどã�?�‹(初期値:true)
070     *          tableId     = [HybsSystem.TBL_MDL_KEY]  DBTableModel を取りå?すキー
071     *          outMessage  = "[true/false]"            検索結果のメãƒ?‚»ージを表示する(true)かどã�?�‹を指å®?初期値:true)
072     *          displayMsg  = "MSG0040";                処ç�?µ�果を表示しまã�?初期値:?¢ã€?»¶登録しました。」)
073     *          selectedAll = "[false/true]"            ãƒ??タをå?件選択済みとして処ç�?�™ã‚?true)かどã�?�‹æŒ?®?初期値:false)
074     *          keepTimeStamp = "[false/true]"          COPY,親違いMOVE(,MODIFY)の時にオリジナルのタイãƒ?‚¹タンプを使用するかどã�?�‹(初期値:false)
075     *      />
076     *
077     *    [action属æ?(å¿??)]
078     *      COPY   オリジナルファイルをã?ターゲãƒ?ƒˆ(TO_PARENT,TO_NAMEでæŒ?®?にコピã?しますã?
079     *      MOVE   オリジナルファイルをã?ターゲãƒ?ƒˆに移å‹?COPY+DELETE)/名称変更(RENAME)しますã?
080     *      MODIFY (MOVE と同じ。エンジンの command を利用するための簡易action)
081     *      DELETE オリジナルファイルを削除しまã�?ターゲãƒ?ƒˆ(TO_PARENT,TO_NAME)はã€?–¢係しません)ã€?
082     *
083     * ●Tag定義??
084     *   <og:fileUpdate
085     *       action           ○ã?TAG】アクション[COPY|MOVE|MODIFY|DELETE]をセãƒ?ƒˆしまã�?å¿??)ã€?
086     *       command            【TAG】コマンド[ENTRY]をセãƒ?ƒˆしまã�?
087     *       targetDir          【TAG】ターゲãƒ?ƒˆとなるフォルãƒ?‚’æŒ?®šしまã�?
088     *       createDir          【TAG】ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹を指定しまã�?初期値:true)
089     *       tableId            【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
090     *       outMessage         【TAG】検索結果のメãƒ?‚»ージを表示する/しない[true/false]を指定しまã�?初期値:true)
091     *       displayMsg         【TAG】å?ç�?µ�果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0040[ã€?»¶登録しました])
092     *       selectedAll        【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)
093     *       keepTimeStamp      【TAG】オリジナルのタイãƒ?‚¹タンプを利用するかどã�?�‹を指定しまã�?初期値:false)
094     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
095     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
096     *       scope              【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)
097     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
098     *   />
099     *
100     * ●使用ä¾?
101     *       ・<og:fileUpdate command="{@command}" action="COPY" />
102     *             TO_PARENT またã?ã€?TO_NAME(両方æŒ?®šも可)による行単ä½?COPY 処ç�?
103     *             fileQuery の useUpdateClm="true" を設定し、検索結果に、TO_PARENTã€?TO_NAMEカラãƒ?‚’追åŠ?�—ますã?
104     *             TO_PARENT またã?ã€?TO_NAME は、columnSet などで値をセãƒ?ƒˆしておきますã?
105     *
106     *       ・<og:fileUpdate command="{@command}" action="MODIFY" targetDir="AAA_DIR"  />
107     *             fileQuery の検索結果をã?AAA_DIR フォルãƒ?�«移動しますã?
108     *             ファイル名ã?、そのままオリジナルの値が使用されますã?
109     *
110     * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
111     * @og.group ファイル出åŠ?
112     *
113     * @version  4.0
114     * @author       Kazuhiko Hasegawa
115     * @since    JDK5.0,
116     */
117    public class FileUpdateTag extends CommonTagSupport {
118            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
119            private static final String VERSION = "5.6.5.2 (2013/06/21)" ;
120    
121            private static final long serialVersionUID = 565220130621L ;
122    
123            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? 登録{@value} */
124            public static final String CMD_ENTRY  = "ENTRY" ;
125            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?リスãƒ? */
126            private static  final String COMMAND_LIST = CMD_ENTRY;
127    
128            /** エラーメãƒ?‚»ージID {@value} */
129            private static final String errMsgId     = HybsSystem.ERR_MSG_KEY;
130    
131            /** action 引数に渡す事ã?出来ã‚?アクションコマンãƒ? COPY {@value} */
132            public static final String ACT_COPY             = "COPY" ;
133            /** action 引数に渡す事ã?出来ã‚?アクションコマンãƒ? MOVE {@value} */
134            public static final String ACT_MOVE             = "MOVE" ;
135            /** action 引数に渡す事ã?出来ã‚?アクションコマンãƒ? MODIFY {@value} */
136            public static final String ACT_MODIFY           = "MODIFY" ;
137            /** action 引数に渡す事ã?出来ã‚?アクションコマンãƒ? DELETE {@value} */
138            public static final String ACT_DELETE   = "DELETE" ;
139    
140            private static final String[] ACTION_LIST = new String[] { ACT_COPY , ACT_MOVE , ACT_MODIFY , ACT_DELETE };
141    
142            private String  action          = null;
143            private String  targetDir       = null;         // ターゲãƒ?ƒˆとなるフォルãƒ?
144            private boolean createDir       = true;         // ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹(true:作æ?する)
145    
146            private String  tableId         = HybsSystem.TBL_MDL_KEY;
147            private String  command         = CMD_ENTRY;
148            private boolean outMessage      = true;
149            private String  displayMsg      = "MSG0040";    // ã€?»¶登録しましたã€?
150            private boolean selectedAll = false;
151            private boolean keepTimeStamp = false;          // オリジナルのタイãƒ?‚¹タンプを利用する場合ã?true
152    
153            private transient DBTableModel  table           = null;
154            private transient ErrorMessage  errMessage      = null;
155            private int             executeCount    = -1;                   // 処ç�?»¶数
156            private int             errCode                 = ErrorMessage.OK;
157            private long    dyStart                 = 0;
158    
159            /**
160             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
161             *
162             * @return      後続å?ç�??æŒ?¤º
163             */
164            @Override
165            public int doEndTag() {
166                    debugPrint();
167                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
168                    if( !useTag() ) { return(EVAL_PAGE); }
169    
170                    dyStart = System.currentTimeMillis();
171    
172                    table = (DBTableModel)getObject( tableId );
173    
174                    String label  = "";                             // 4.0.0 (2005/11/30) 検索しなかったå?合ã?
175                    if( table != null && table.getRowCount() > 0 && check( command, COMMAND_LIST ) ) {
176                            startQueryTransaction( tableId );
177    
178                            execute();      // 実際の処ç�?‚’実行しますã?
179    
180                            StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
181    
182                            setRequestAttribute( "DB.COUNT"   , String.valueOf( executeCount ) );
183                            setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
184    
185                            String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
186                            if( err != null && err.length() > 0 ) {
187                                    buf.append( err );
188                                    setSessionAttribute( errMsgId,errMessage );
189                            }
190                            label = buf.toString();
191    
192                            if( table != null && ! commitTableObject( tableId, table ) ) {
193                                    jspPrint( "FileUpdateTag Query処ç�?�Œ割り込まれましたã€?BTableModel は登録しませんã€? );
194                                    return (SKIP_PAGE);
195                            }
196                    }
197    
198                    jspPrint( label );
199    
200                    // 実行件数の表示
201                    // 4.0.0 (2005/11/30) 出力é?の変更。ä¸?•ªæœ??に出力しますã?
202                    if( displayMsg != null && displayMsg.length() > 0 ) {
203                            String status = executeCount + getResource().getLabel( displayMsg ) ;
204                            jspPrint( status + HybsSystem.BR );
205                    }
206    
207                    // 3.5.4.7 (2004/02/06)
208                    long dyTime = System.currentTimeMillis()-dyStart;
209                    jspPrint( "<div id=\"queryTime\" value=\"" + (dyTime) + "\"></div>" );      // 3.5.6.3 (2004/07/12)
210    
211                    return( EVAL_PAGE );
212            }
213    
214            /**
215             * タグリブオブジェクトをリリースしますã?
216             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
217             *
218             */
219            @Override
220            protected void release2() {
221                    super.release2();
222                    tableId         = HybsSystem.TBL_MDL_KEY;
223                    command         = CMD_ENTRY;
224                    action          = null;
225                    targetDir       = null;         // ターゲãƒ?ƒˆとなるフォルãƒ?
226                    createDir       = true;         // ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹(true:作æ?する)
227                    outMessage      = true;
228                    displayMsg      = "MSG0040";    // ã€?»¶登録しましたã€?
229                    selectedAll = false;
230                    keepTimeStamp = false;          // オリジナルのタイãƒ?‚¹タンプを利用する場合ã?true
231                    table           = null;
232                    errMessage      = null;
233                    executeCount= -1;               // 処ç�?»¶数
234                    errCode         = ErrorMessage.OK;
235                    dyStart         = 0;            // 処ç�?™‚é–?
236            }
237    
238            /**
239             * 処ç�?‚’実行しますã?
240             *
241             */
242            private void execute() {
243                    int[] rowNo = getParameterRows();
244                    if( rowNo.length > 0 ) {
245    
246                            FromToFiles fromToFiles = new FromToFiles( table , targetDir , createDir );
247    
248                            if( ACT_COPY.equalsIgnoreCase( action ) ) {
249                                    actionCOPY( rowNo,fromToFiles );
250                            }
251                            // ACT_MODIFY は、エンジンの command で使ã�?�Ÿめã?便利
252                            else if( ACT_MOVE.equalsIgnoreCase( action ) || ACT_MODIFY.equalsIgnoreCase( action ) ) {
253                                    actionMOVE( rowNo,fromToFiles );
254                            }
255                            else if( ACT_DELETE.equalsIgnoreCase( action ) ) {
256                                    actionDELETE( rowNo,fromToFiles );
257                            }
258                    }
259            }
260    
261            /**
262             * COPY アクションを実行しますã?
263             *
264             * @og.rev 5.6.5.2 (2013/06/21) From側がファイルの場合ã?み処ç�?�—ますã?
265             *
266             * @param       rowNo           処ç�?‚’実施する行番号
267             * @param       fromToFiles     FromFile,ToFile をまとめた補助クラス
268             * @throws      HybsSystemException     処ç�?¸­に何らかã?エラーが発生したå?å�?
269             */
270            private void actionCOPY( final int[] rowNo , final FromToFiles fromToFiles ) {
271                    File fromFile = null ;
272                    File toFile   = null ;
273    
274                    executeCount = 0 ;      // 開始前に初期化しておくã€?
275                    int rowCount = rowNo.length ;
276                    for( int i=0; i<rowCount; i++ ) {
277                            File[] files = fromToFiles.makeFromToFile( rowNo[i] );  // FromFile,ToFile
278                            fromFile = files[0];
279                            toFile   = files[1];
280    
281                            // 5.6.5.2 (2013/06/21) From側がファイルの場合ã?み処ç�?�—ますã?
282    //                      if( !FileUtil.copy( fromFile,toFile,keepTimeStamp ) ) {
283                            if( fromFile.isFile() && !FileUtil.copy( fromFile,toFile,keepTimeStamp ) ) {
284                                    String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
285                                                                            + "From=[" + fromFile + "],To=[" + toFile + "]" + HybsSystem.CR;
286                                    throw new HybsSystemException( errMsg );
287                            }
288                            executeCount++ ;
289                    }
290            }
291    
292            /**
293             * MOVE アクションを実行しますã?
294             *
295             * @og.rev 5.5.2.4 (2012/05/16) メソãƒ?ƒ‰の戻りå?の設å®?
296             * @og.rev 5.6.5.2 (2013/06/21) From側がファイルの場合ã?み処ç�?�—ますã?
297             *
298             * @param       rowNo           処ç�?‚’実施する行番号
299             * @param       fromToFiles     FromFile,ToFile をまとめた補助クラス
300             * @throws      HybsSystemException     処ç�?¸­に何らかã?エラーが発生したå?å�?
301             */
302            private void actionMOVE( final int[] rowNo , final FromToFiles fromToFiles ) {
303                    File fromFile = null ;
304                    File toFile   = null ;
305    
306                    executeCount = 0 ;      // 開始前に初期化しておくã€?
307                    int rowCount = rowNo.length ;
308                    for( int i=0; i<rowCount; i++ ) {
309                            File[] files = fromToFiles.makeFromToFile( rowNo[i] );  // FromFile,ToFile
310                            fromFile = files[0];
311                            toFile   = files[1];
312    
313                            if( fromToFiles.lastParentEquals() ) {  // FromDirとToDirが同じなので、RENAMEできるã€?
314                                    if( !fromFile.renameTo( toFile ) ) {
315                                            String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
316                                                                                    + "同ä¸?¦ªフォルãƒ??ため、RENAME処ç�?‚’行ってã�?�¾すã?" + HybsSystem.CR
317                                                                                    + "From=[" + fromFile + "],To=[" + toFile + "]" + HybsSystem.CR;
318                                            throw new HybsSystemException( errMsg );
319                                    }
320                            }
321                            // 5.6.5.2 (2013/06/21) From側がファイルの場合ã?み処ç�?�—ますã?
322    //                      else {                  // FromDirとToDirが異なるã?で、COPY ??DELETE するã€?
323                            else if( fromFile.isFile() ) {                  // FromDirとToDirが異なるã?で、COPY ??DELETE するã€?
324                                    if( !FileUtil.copy( fromFile,toFile,keepTimeStamp ) ) {
325                                            String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
326                                                                                    + "移動前のCOPY処ç�?‚’行ってã�?�¾したã€? + HybsSystem.CR
327                                                                                    + "From=[" + fromFile + "],To=[" + toFile + "]" + HybsSystem.CR;
328                                            throw new HybsSystemException( errMsg );
329                                    }
330    
331                                    if( !fromFile.delete() ) {
332    //                                      toFile.delete();        // 移動ã?際ã? COPY は正常なので、まずã?、そのファイルを削除しておくã€?
333                                            String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
334                                                                                    + "移動後ã?オリジナルファイルの削除処ç�?‚’行ってã�?�¾したã€? + HybsSystem.CR
335                                                                                    + "From=[" + fromFile + "],To=[" + toFile + "]" + HybsSystem.CR;
336                                            // 5.5.2.4 (2012/05/16) メソãƒ?ƒ‰の戻りå?の設å®?
337                                            if(! toFile.delete() ) {
338                                                    errMsg = errMsg + "toFile も削除に失敗しましたã€? + HybsSystem.CR;
339                                            }
340    
341                                            throw new HybsSystemException( errMsg );
342                                    }
343                            }
344                            executeCount++ ;
345                    }
346            }
347    
348            /**
349             * DELETE アクションを実行しますã?
350             *
351             * こã?処ç�?�§は、リストにフォルãƒ?�Œ含まれてã�?‚‹場合も削除しますã?
352             * 通常、フォルãƒ??削除は、その要ç´?¼ˆå?部?‰にファイル等が存在しなã�??合ã?み
353             * 行いますが、検索リストから削除するé ?•ªによっては、フォルãƒ?‚‚ファイルã‚?
354             * 削除対象になるå?合がありますã?そこで、まずã?ファイルã�?�‘削除しã?フォルãƒ??ã€?
355             * あとで削除するように処ç�?‚’行いますã?
356             *
357             * @og.rev 5.6.5.2 (2013/06/21) フォルãƒ?‚‚削除対象にしますã?
358             *
359             * @param       rowNo           処ç�?‚’実施する行番号
360             * @param       fromToFiles     FromFile,ToFile をまとめた補助クラス
361             * @throws      HybsSystemException     処ç�?¸­に何らかã?エラーが発生したå?å�?
362             */
363            private void actionDELETE( final int[] rowNo , final FromToFiles fromToFiles ) {
364                    File fromFile = null;
365    
366                    // 5.6.5.2 (2013/06/21) フォルãƒ?‚’削除する為のã€??避
367                    Set<File> dirSet = new TreeSet<File>( new FileNameLengthComparator() );             // ファイルのæ–?­—数é ?�«並べたSet
368    
369                    executeCount = 0 ;      // 開始前に初期化しておくã€?
370                    int rowCount = rowNo.length ;
371                    for( int i=0; i<rowCount; i++ ) {
372                            fromFile = fromToFiles.makeFromOnly( rowNo[i] );        // FromFile
373    
374                            // 5.6.5.2 (2013/06/21) まずã?ファイルを削除しますã?
375    //                      if( !fromFile.delete() ) {
376                            if( fromFile.isFile() ) {
377                                    if( !fromFile.delete() ) {
378                                            String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
379                                                                                    + "From=[" + fromFile + "]" + HybsSystem.CR;
380                                            throw new HybsSystemException( errMsg );
381                                    }
382                            }
383                            else {
384                                    // 5.6.5.2 (2013/06/21) フォルãƒ??場合ã?、アドレスの桁数をキーにソートしておきますã?
385                                    int len = fromFile.getAbsolutePath().length();
386                                    dirSet.add( fromFile );
387                            }
388                            executeCount++ ;
389                    }
390    
391                    // 5.6.5.2 (2013/06/21) フォルãƒ??削除は、アドレスの桁数の大きいé ?¼ˆ階層の深ã�???‰に削除しますã?
392                    for( File file : dirSet ) {
393                            if( !file.delete() ) {
394                                    String errMsg = "アクション=[" + action + "]中にエラーが発生しましたã€? + HybsSystem.CR
395                                                                            + "From(Dir)=[" + file + "]" + HybsSystem.CR;
396                                    throw new HybsSystemException( errMsg );
397                            }
398                    }
399            }
400    
401            /**
402             * ファイルの名称の長さé??ˆ長ã�???‰に比è¼?�™るã?Comparator インターフェースの実è£?‚¯ラス
403             *
404             * ここでの大小比è¼??、ファイル名ã?æ–?­—数がã?大きい方がã?小さã�?�¨みなされますã?
405             * つまり階層が深ã�??で、å?に処ç�?�™るå¿?¦�があるとã�?�†事を意味しますã?
406             * 処ç�?�¨しては、f1 != null &amp;&amp; f2 != null で、len1 = f1.getAbsolutePath().length() と len2 = f2.getAbsolutePath().length() を比è¼?�—
407             * len1 &gt; len2 â‡?è²?, len1 &lt; len2 â‡?正 , len1 == len2 â‡?0 を返しますã?
408             * 具体的には、return ( len2 - len1 ); ですã?
409             * 
410             * 注: こã?コンパレータは equals とä¸?²«性のなã�??序付けを課しますã?
411             * 
412             * @og.rev 5.6.5.2 (2013/06/21) 新規追åŠ?
413             * 
414             */
415            private static final class FileNameLengthComparator implements Comparator<File> , Serializable {
416                    private static final long serialVersionUID = 5652 ;             // 5.6.5.2 (2013/06/21)
417                    /**
418                     * é ?º�付けのために 2 つの引数を比è¼?�—ますã?
419                     *
420                     * ここでの大小比è¼??、ファイル名ã?æ–?­—数がã?大きい方がã?小さã�?�¨みなされますã?
421                     * 具体的には、return ( len2 - len1 ); ですã?
422                     * 
423                     * @param       比è¼?¯¾象のæœ??のオブジェクãƒ?
424                     * @param       比è¼?¯¾象の 2 番目のオブジェクãƒ?
425                     * @return      æœ??の引数ã�?2 番目の引数より小さã�??合ã?è²??整数、両方が等しã�??合ã? 0、最初ã?引数ã�?2 番目の引数より大きい場合ã?正の整数
426                     */
427                    public int compare( final File f1 , final File f2 ) {
428                            if( f1 == null || f2 == null ) {
429                                    String errMsg = "引数のFileにnullが含まれてã�?�¾すã?file1=[" + f1 + "] , file2=[" + f2 + "]" ;
430                                    throw new IllegalArgumentException( errMsg );
431                            }
432    
433                            int len1 = f1.getAbsolutePath().length();
434                            int len2 = f2.getAbsolutePath().length();
435    
436                            return ( len2 - len1 );
437                    }
438            }
439    
440            /**
441             * 表示ãƒ??タの HybsSystem.ROW_SEL_KEY をå?にã€?�¸ばれた 行を処ç�??対象としますã?
442             *
443             * @return      選択行ã?配å?
444             */
445            @Override
446            protected int[] getParameterRows() {
447                    final int[] rowNo ;
448                    if( selectedAll ) {
449                            int rowCnt = table.getRowCount();
450                            rowNo = new int[ rowCnt ];
451                            for( int i=0; i<rowCnt; i++ ) {
452                                    rowNo[i] = i;
453                            }
454                    } else {
455                            rowNo = super.getParameterRows();
456                    }
457                    return rowNo ;
458            }
459    
460            /**
461             * 【TAG】アクション[COPY|MOVE|MODIFY|DELETE]をセãƒ?ƒˆしまã�?å¿??)ã€?
462             *
463             * @og.tag
464             * アクションは、ファイルをコピã?(COPY)したりã?移å‹?MOVE,MODIFY)したりã?削除(DELETE)する
465             * などの操作をæŒ?®šするå¿??属æ?ですã?
466             *
467             * <table border="1" frame="box" rules="all" >
468             *   <caption>action属æ?(å¿??)のキーワーãƒ?/caption>
469             *   <tr><th>action</th><th>名称</th><th>機è?</th></tr>
470             *   <tr><td>COPY  </td><td>コピã?</td><td>オリジナルファイルをã?ターゲãƒ?ƒˆ(TO_PARENT,TO_NAMEでæŒ?®?にコピã?しますã?</td></tr>
471             *   <tr><td>MOVE  </td><td>移å‹? </td><td>オリジナルファイルをã?ターゲãƒ?ƒˆに移å‹?COPY+DELETE)/名称変更(RENAME)しますã?</td></tr>
472             *   <tr><td>MODIFY</td><td>移å‹? </td><td>(MOVE と同じ。エンジンの command を利用するための簡易action)</td></tr>
473             *   <tr><td>DELETE</td><td>削除  </td><td>オリジナルファイルをã?削除しますã?(フォルãƒ??ファイルに関わらã�?</td></tr>
474             * </table>
475             *
476             * @param       act アクション(public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
477             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.FileUpdateTag.ACT_COPY">アクション定数</a>
478             */
479            public void setAction( final String act ) {
480                    action = nval( getRequestParameter( act ),action );
481    
482                    if( action != null && !check( action, ACTION_LIST ) ) {
483                            String errMsg = "æŒ?®šã?アクションは実行できません。アクションエラー" + HybsSystem.CR
484                                                            + "action=[" + action + "] "                                            + HybsSystem.CR
485                                                            + StringUtil.array2csv( ACTION_LIST ) ;
486                            throw new HybsSystemException( errMsg );
487                    }
488            }
489    
490            /**
491             * 【TAG】ターゲãƒ?ƒˆとなるフォルãƒ?‚’æŒ?®šしますã?
492             *
493             * @og.tag
494             * targetDir 属æ?を利用する場合ã?、引数のファイル、またã?フォルãƒ?�ŒæŒ?®šされたことに
495             * なりますã?COPY、MOVE(,MODIFY) の場合ã?、targetDir 属æ?にフォルãƒ?‚’æŒ?®šすることでä¸?‹¬処ç�?�¯能ですã?
496             * æŒ?®šå?のフォルãƒ?�Œ存在しなã�??合ã?、createDir属æ?の値により処ç�?�Œ異なりますã?
497             * createDir="true"(初期値)で、ターゲãƒ?ƒˆフォルãƒ?�Œ存在しなã�??合ã?、è?動作æ?しますã?
498             *
499             * @param  dir ターゲãƒ?ƒˆとなるフォルãƒ?
500             * @see         #setCreateDir( String )
501             */
502            public void setTargetDir( final String dir ) {
503                    targetDir = nval( getRequestParameter( dir ),targetDir );
504            }
505    
506            /**
507             * 【TAG】ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹を指定しまã�?初期値:true)ã€?
508             *
509             * @og.tag
510             * COPY,MOVE(,MODIFY) などの処ç�?�§、ターゲãƒ?ƒˆフォルãƒ?�Œ存在しなã�?�¨きに、作æ?するかã?エラーにするかを
511             * createDir属æ? でæŒ?®šできますã?
512             * これは、COPY先やMOVE(,MODIFY)先が存在してã�?‚‹前提のシスãƒ?ƒ で、不要なç®?‰€に間違ってフォルãƒ?‚’
513             * 自動作æ?されると困るå?合に、false:作æ?しなã�?とすればã€?–“違いに気づく確çŽ?�Œ上がりますã?
514             * 初期値は true:作æ?する ですã?
515             *
516             * @param  flag ターゲãƒ?ƒˆとなるフォルãƒ?‚’自動作æ?する(true)かã?しなã�?false) 初期値は、true:作æ?する
517             */
518            public void setCreateDir( final String flag ) {
519                    createDir = nval( getRequestParameter( flag ),createDir );
520            }
521    
522            /**
523             * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
524             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
525             *
526             * @og.tag
527             * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
528             * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
529             * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
530             * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
531             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
532             *
533             * @param       id sessionに登録する時ã? ID
534             */
535            public void setTableId( final String id ) {
536                    tableId = nval( getRequestParameter( id ),tableId );
537            }
538    
539            /**
540             * 【TAG】コマンãƒ?ENTRY)をセãƒ?ƒˆしますã?
541             *
542             * @og.tag
543             * こã?タグは、command="ENTRY" でのみ実行されますã?
544             * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,CMD_xxx で設定される
545             * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
546             * 初期値は、ENTRY なので、何もæŒ?®šしなければ、実行されますã?
547             *
548             * @param       cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
549             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.FileUpdateTag.CMD_ENTRY">コマンド定数</a>
550             */
551            public void setCommand( final String cmd ) {
552                    String cmd2 = getRequestParameter( cmd );
553                    if( cmd2 != null && cmd2.length() >= 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
554            }
555    
556            /**
557             * 【TAG】検索結果のメãƒ?‚»ージを表示する/しない[true/false]を指定しまã�?初期値:true)ã€?
558             *
559             * @og.tag
560             * 初期値は、表示する?štrue ですã?
561             *
562             * @param       flag  [true:表示する/それ以å¤?含めない]
563             */
564            public void setOutMessage( final String flag ) {
565                    outMessage = nval( getRequestParameter( flag ),outMessage );
566            }
567    
568            /**
569             * 【TAG】å?ç�?µ�果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0040[ã€?»¶登録しました])ã€?
570             *
571             * @og.tag
572             * ここでは、検索結果の件数ã‚?™»録された件数をまずå?力しã€?
573             * そã?次に、ここでæŒ?®šしたメãƒ?‚»ージをリソースから取得して表示しますã?
574             * 表示させたくなã�??合ã?, displayMsg = "" をセãƒ?ƒˆしてくださいã€?
575             * displayMsg の初期値は、MSG0040[ã€?»¶登録しました]ですã?
576             *
577             * @param       id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
578             */
579            public void setDisplayMsg( final String id ) {
580                    String ids = getRequestParameter( id );
581                    if( ids != null ) { displayMsg = ids; }
582            }
583    
584            /**
585             * 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
586             *
587             * @og.tag
588             * 全てのãƒ??タを選択済みãƒ??タとして扱って処ç�?�—ますã?
589             * 全件処ç�?�™るå?合にã€?true/false)を指定しますã?
590             * 初期値は false ですã?
591             *
592             * @param  all ãƒ??タをå?件選択済み [true:全件選択済み/false:通常]
593             */
594            public void setSelectedAll( final String all ) {
595                    selectedAll = nval( getRequestParameter( all ),selectedAll );
596            }
597    
598            /**
599             * 【TAG】オリジナルのタイãƒ?‚¹タンプを利用するかどã�?�‹を指定しまã�?初期値:false)ã€?
600             *
601             * @og.tag
602             * COPYã‚?¦ª違いMOVE(,MODIFY)の時に、オリジナルのタイãƒ?‚¹タンプをそã?ままコピã?先ã?ファイルにã‚?
603             * 適用するかどã�?�‹を指定しますã?
604             * タイãƒ?‚¹タンプを初期化されたくなã�??合に、true に設定しますã?
605             * 初期値は 利用しなã�?false ですã?
606             *
607             * @param  flag タイãƒ?‚¹タンプを利用するかどã�?初期値:利用しなã�?ã€?
608             */
609            public void setKeepTimeStamp( final String flag ) {
610                    keepTimeStamp = nval( getRequestParameter( flag ),keepTimeStamp );
611            }
612    
613            /**
614             * DBTableModel から、FromFile,ToFile を作æ?するための処ç�?‚’まとめた補助クラスですã?
615             *
616             * ここでは、オリジナルファイルã‚?‚¿ーゲãƒ?ƒˆファイルを作æ?するための処ç�??みを集めてã�?�¾すã?
617             * メソãƒ?ƒ‰にすると、ローカル変数を多く管ç�?�™るか、多数の引数渡しを繰り返すことになるためã?
618             * こã?ローカルクラスに処ç�?�¨、å?をæ?納しますã?
619             *
620             */
621            private static final class FromToFiles {
622    //              private static final String[] CLMS_LIST   = new String[] { "PARENT","NAME","TO_PARENT","TO_NAME" };
623    
624                    private final DBTableModel      table ;
625    
626                    private final int PARENT        ;
627                    private final int NAME          ;
628                    private final int TO_PARENT     ;
629                    private final int TO_NAME       ;
630    
631                    private final File    toDir     ;
632                    private final boolean createDir;        // ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹(true:作æ?する)
633    
634                    private boolean equalParent = false;    // æœ?¾Œに実行された処ç�?�§、親フォルãƒ?�Œ同ä¸??場合ã?、true
635    
636                    /**
637                     *  引数æŒ?®šã?コンストラクター
638                     *
639                     * å¿?¦�なパラメータを渡して、オブジェクトを構築しますã?
640                     *
641                     * @param       table     DBTableModel  ä¸?¦§がæ?納されてã�?‚‹DBTableModel
642                     * @param       targetDir       ターゲãƒ?ƒˆとなるフォルãƒ?
643                     * @param       createDir       ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹(true:作æ?する)
644                     */
645                    public FromToFiles( final DBTableModel table , final String targetDir , final boolean createDir ) {
646                            this.table              = table;
647                            this.createDir  = createDir ;
648                            toDir = mkDirs( targetDir,createDir );  // targetDir が指定されてã�?�ªã�??合ã?、null
649    
650                            // "PARENT","NAME","TO_PARENT","TO_NAME" のカラãƒ?��のDBTableModelのカラãƒ?•ª号。存在しなã�??合ã?ã€?1
651                            PARENT          = table.getColumnNo( "PARENT"   , false );
652                            NAME            = table.getColumnNo( "NAME"             , false );
653                            TO_PARENT       = table.getColumnNo( "TO_PARENT", false );
654                            TO_NAME         = table.getColumnNo( "TO_NAME"  , false );
655                    }
656    
657                    /**
658                     * 行番号より、対応するオリジナルファイル(FromFile)を返しますã?
659                     *
660                     * ここでは、TO_PARENT ã‚?TO_NAME は、判定するå¿?¦�がなã�?�Ÿめã?makeFromToFile( int ) の
661                     * ä¸?ƒ¨のみで処ç�?�Œ終äº?�§きますã?
662                     * ?‘.FromDir は、PARENT 列ã?値から作æ?するã€?
663                     * ?’.FromFileは、FromDir ??NAME列ã?値から作æ?するã€?
664                     *
665                     * 配å?返しの関係で、メソãƒ?ƒ‰(およびå†?ƒ¨処ç�?をå?けてã�?�¾すã?
666                     *
667                     * @param       rowNo   カラãƒ?o
668                     * @return      File オリジナルファイル(FromFile)
669                     * @see         #makeFromToFile( int )
670                     */
671                    public File makeFromOnly( final int rowNo ) {
672                            String[] value = table.getValues( rowNo );
673                            File fromDir  = mkDirs( value[PARENT],createDir );
674    
675                            return new File( fromDir, value[NAME] ) ;
676                    }
677    
678                    /**
679                     * 行番号より、対応するオリジナルファイル(FromFile)とターゲãƒ?ƒˆファイル(ToFile)をé?列に格納して返しますã?
680                     *
681                     * ここでは、TO_PARENT ã‚?TO_NAME は、存在するかどã�?�‹不æ?なので、以下ã?手é?で作æ?しますã?
682                     * ?‘.FromDir は、PARENT 列ã?値から作æ?するã€?
683                     * ?’.FromFileは、FromDir ??NAME列ã?値から作æ?するã€?
684                     * ?“.toDir はã€?
685                     *       ?¡?ŽtargetDir が有れã?、それを使ã�??
686                     *       ?¢?Žなければ、TO_PARENT 列ã?値から作æ?するã€?
687                     *       ?£?ŽTO_PARENT 列がなã�?�‹、å?が未設定ã?場合ã?、FromDir をそのまま使ã�??
688                     * ?”.toFile はã€?
689                     *       ?¡?ŽtoDir ??TO_NAME 列ã?値から作æ?するã€?
690                     *       ?¢?ŽTO_NAME 列がなã�?�‹、å?が未設定ã?場合ã?、toDir ??NAME列ã?値から作æ?するã€?
691                     * 返り値は、new File[] { formFile , toFile }; とするã€?
692                     *
693                     * @param       rowNo   カラãƒ?o
694                     * @return      File[] ファイル配å?(0:オリジナルファイル 1:ターゲãƒ?ƒˆファイル)
695                     */
696                    public File[] makeFromToFile( final int rowNo ) {
697    
698                            String[] value = table.getValues( rowNo );
699                            File fromDir  = mkDirs( value[PARENT],createDir );
700                            File formFile = new File( fromDir, value[NAME] );
701                            File tempToDir = toDir;
702    
703                            equalParent = false;    // æœ?¾Œに実行された処ç�?�§、親フォルãƒ?�Œ同ä¸?�‹どã�?�‹のフラグをリセãƒ?ƒˆするã€?
704                            if( tempToDir == null ) {
705                                    if( TO_PARENT >= 0 && nval(value[TO_PARENT],null) != null ) {
706                                            tempToDir = mkDirs( value[TO_PARENT],createDir );
707                                    }
708                                    else  {
709                                            tempToDir = fromDir;
710                                            equalParent = true;             // æœ?¾Œに実行された処ç�?�§、親フォルãƒ?�Œ同ä¸??場合ã?、true
711                                    }
712                            }
713    
714                            File toFile = null;
715                            if( TO_NAME >= 0 && nval(value[TO_NAME],null) != null  ) {
716                                    toFile = new File( tempToDir, value[TO_NAME] );
717                            }
718                            else {
719                                    toFile = new File( tempToDir, value[NAME] );
720                            }
721    
722                            return new File[] { formFile , toFile };
723                    }
724    
725                    /**
726                     * æœ?¾Œに実行された処ç�?�§、親フォルãƒ?�Œ同ä¸?�‹どã�?�‹を返しまã�?同ä¸??場合ã?、true)ã€?
727                     *
728                     * makeFromToFile( int ) がå?ç�?�•れたときã?、FromDir と toDir が同ä¸?�§あれば、true をã?
729                     * 異なるå?合ã?、false を返しますã?
730                     * ここでの結果は、厳å¯?�ª同ä¸?ˆ¤定ではなくã?処ç�?š„に、同ä¸?�‹どã�?�‹を判定してã�?�¾すã?
731                     * つまりã?toDir に FromDir をセãƒ?ƒˆする(?“.Cのケース)場合に、true をå?部変数にセãƒ?ƒˆしますã?
732                     * こã?判定å?は、ファイルの移動å?ç�?�§、異なる親フォルãƒ??場合ã?、COPY ??DELETE しなければ
733                     * なりませんがã?同ä¸?¦ªフォルãƒ??場合ã?、RENAME で済ã? とã�?�†処ç�?²?�·の軽減が目çš?�§すã?
734                     * よって、結果çš?�«、PARENT と TO_PARENT が同じとかã?PARENT と targetDir が同じでã‚?
735                     * ここでのフラグは、false が返されますã?
736                     *
737                     * @return      æœ?¾Œに実行された処ç�?�§、親フォルãƒ?�Œ同ä¸??場合ã?、true
738                     * @see         #makeFromToFile( int )
739                     */
740                    public boolean lastParentEquals() {
741                            return equalParent ;
742                    }
743    
744                    /**
745                     *  カラãƒ?��配å?(String[])より、対応するカラãƒ?o配å?(int[])を作æ?しますã?
746                     *
747                     * ここでは、TO_PARENT ã‚?TO_NAME は、存在するかどã�?�‹不æ?なのでã€?
748                     * EXCEPTION にせずã€??列番号にã€?1 を返すようにしてã�?�¾すã?
749                     *
750                     * @param       table     DBTableModel  ä¸?¦§がæ?納されてã�?‚‹DBTableModel
751                     * @param       nameArray       カラãƒ?��配å?
752                     * @return      カラãƒ?o配å?(カラãƒ?��が存在しなã�??合ã?ã€?1)
753                     */
754            //      private int[] getTableColumnNo( final DBTableModel table ,final String[] nameArray ) {
755            //              int[] clmNo = new int[ nameArray.length ];
756            //              for( int i=0; i<clmNo.length; i++ ) {
757            //                      clmNo[i] = table.getColumnNo( nameArray[i] , false );   // カラãƒ?��が存在しなã�??合ã?ã€?1 を返すã€?
758            //              }
759            //              return clmNo;
760            //      }
761    
762                    /**
763                     * フォルãƒ?‚’作æ?しますã?
764                     *
765                     * フォルãƒ?�Œ存在しなã�??合ã?ã€??中階層をすべて作æ?しますã?
766                     *
767                     * @param       fname   フォルãƒ?��
768                     * @param       createDir       ターゲãƒ?ƒˆとなるフォルãƒ?�Œなければ、作æ?するかどã�?�‹(true:作æ?する)
769                     * @return File フォルãƒ?‚’表すファイルオブジェクトã?引数ã�?null の場合ã?、null を返しますã?
770                     * @throws      HybsSystemException             ファイルかã?存在しなã�??合に、createDir=false かã?mkdirs() ã�?false の場å�?
771                     */
772                    private File mkDirs( final String fname , final boolean createDir ) {
773                            File target = null;
774                            if( fname != null ) {
775                                    target = new File( fname );
776                                    if( target.exists() ) {                 // 存在する
777                                            if( target.isFile() ) {
778                                                    String errMsg = "ターゲãƒ?ƒˆに、ファイル名ã?æŒ?®šできませんã€? + HybsSystem.CR
779                                                                                            + "ターゲãƒ?ƒˆ=[" + fname + "]"  + HybsSystem.CR;
780                                                    throw new HybsSystemException( errMsg );
781                                            }
782                                    }
783                                    else {                                                  // 存在しなã�?
784                                            // 存在しなã�??に、作æ?しなã�?
785                                            if( !createDir ) {
786                                                    String errMsg = "ターゲãƒ?ƒˆが存在しませんã€?" + HybsSystem.CR
787                                                                                            + "ターゲãƒ?ƒˆ=[" + fname + "]"  + HybsSystem.CR;
788                                                    throw new HybsSystemException( errMsg );
789                                            }
790                                            // 作æ?できなã�?
791                                            if( !target.mkdirs() ) {
792                                                    String errMsg = "ターゲãƒ?ƒˆをè?動作æ?使用としましたがã?作æ?できませんでしたã€? + HybsSystem.CR
793                                                                                            + "ターゲãƒ?ƒˆ=[" + fname + "]"  + HybsSystem.CR;
794                                                    throw new HybsSystemException( errMsg );
795                                            }
796                                    }
797                            }
798                            return target;
799                    }
800            }
801    
802            /**
803             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
804             *
805             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
806             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
807             *
808             * @param       strm    ObjectOutputStreamオブジェクãƒ?
809             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
810             */
811            private void writeObject( final ObjectOutputStream strm ) throws IOException {
812                    strm.defaultWriteObject();
813            }
814    
815            /**
816             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
817             *
818             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
819             *
820             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
821             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
822             *
823             * @param       strm    ObjectInputStreamオブジェクãƒ?
824             * @see #release2()
825             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
826             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
827             */
828            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
829                    strm.defaultReadObject();
830            }
831    
832            /**
833             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
834             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
835             *
836             * @return こã?クラスのæ–?­—å?表現
837             */
838            @Override
839            public String toString() {
840                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
841                                    .println( "VERSION"                     ,VERSION                )
842                                    .println( "action"                      ,action                 )
843                                    .println( "command"                     ,command                )
844                                    .println( "targetDir"           ,targetDir              )
845                                    .println( "createDir"           ,createDir              )
846                                    .println( "tableId"                     ,tableId                )
847                                    .println( "outMessage"          ,outMessage     )
848                                    .println( "displayMsg"          ,displayMsg     )
849                                    .println( "selectedAll"         ,selectedAll    )
850                                    .println( "keepTimeStamp"       ,keepTimeStamp  )
851                                    .fixForm().toString() ;
852            }
853    }