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 && f2 != null で、len1 = f1.getAbsolutePath().length() と len2 = f2.getAbsolutePath().length() を比è¼?�—
407 * len1 > len2 â‡?è²?, len1 < 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 }