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 */
016package org.opengion.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystemException;
019import org.opengion.fukurou.util.HybsFileFilter;
020import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
021
022import static org.opengion.fukurou.util.StringUtil.nval ;
023
024/**
025 * fileOption でファイルを検索する場合の条件を指定するタグです。
026 *
027 * @og.formSample
028 * ●形式:<og:fileWhere name="…" startsWith="…" endsWith="…" … />
029 * ●body:なし
030 *
031 * ●Tag定義:
032 *   <og:fileWhere
033 *       startsWith         【TAG】指定された接頭辞で始まる場合、スルー(選択)されます(初期値:null)
034 *       endsWith           【TAG】指定された接頭辞で終わる場合、スルー(選択)されます(初期値:null)
035 *       instr              【TAG】指定された文字列がファイル名に含まれる場合、スルー(選択)されます(初期値:null)
036 *       equals             【TAG】ファイル名が一致する場合、スルー(選択)されます(初期値:null)
037 *       matches            【TAG】ファイル名が、指定された正規表現と一致する場合、スルー(選択)されます(初期値:null)
038 *       unMatches          【TAG】ファイル名が、指定された正規表現と一致しない場合、スルー(選択)されます(初期値:null)
039 *       lastModified       【TAG】指定のタイムスタンプ以後に変更されている場合、スルー(選択)されます(初期値:null)
040 *       isLarger           【TAG】指定の大きさより大きいファイルの場合、スルー(選択)されます(初期値:null)
041 *       isSmaller          【TAG】指定の大きさより小さいファイルの場合、スルー(選択)されます(初期値:null)
042 *       isHidden           【TAG】true:HIDDENファイルのみ/false:NORMALファイルのみスルー(選択)されます(初期値:null)
043 *       useDir             【TAG】判定をファイルだけでなく、ディレクトリでも行うかどうかを指定[false:File/true:File+Dir/only:Dir](初期値:false)
044 *       ignoreCase         【TAG】大文字/小文字を区別しないかどうか[true/false]を指定します(初期値:false(区別する))
045 *       notEquals          【TAG】判定結果を反転させるかどうか[true/false]を指定します(初期値:false) 6.8.0.0 (2017/06/02)
046 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 6.8.0.0 (2017/06/02)
047 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 6.8.0.0 (2017/06/02)
048 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
049 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
050 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
051 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
052 *   />
053 *
054 * ●使用例
055 *     <og:fileOption select="NAME" from="./jsp" >
056 *         <og:fileWhere
057 *             startsWith = "File"          :指定された接頭辞で始まる場合、選択される
058 *             endsWith   = ".java"         :指定された接頭辞で終わる場合、選択される
059 *             instr      = "Tag"           :指定された文字列がファイル名に含まれる場合、選択される
060 *             equals     = "FileWhereTag.java" :ファイル名が一致する場合、選択される(大文字小文字は区別しない)
061 *             matches    = "File*Tag"      :ファイル名が、指定された正規表現と一致する場合、選択される(大文字小文字は区別しない)
062 *             unMatches  = "File*Tag"      :ファイル名が、指定された正規表現と一致しない場合、選択される(大文字小文字は区別しない)
063 *             lastModified = "20050101"    :指定のタイムスタンプ以後に変更された場合、選択される
064 *                                           日付けの指定は、YYYYMMDD 形式, TODAY , YESTERDAY が使用できます。
065 *             isLarger   = "1024"          :指定の大きさ(バイト単位)より大きいファイルの場合、選択される
066 *             isSmaller  = "1024"          :指定の大きさ(バイト単位)より小さいファイルの場合、選択される
067 *             isHidden   = "true"          :true:HIDDENファイルのみ選択される
068 *             useDir     = "false"         :フィルタによる対象の絞込みをディレクトリにも適用するかどうか
069 *         />
070 *     </og:fileOption>
071 *
072 *       ・検索条件が入力された時
073 *         条件を満足して全てのファイルを列挙します。
074 *
075 *       ・検索条件が入力されなかった時
076 *         該当ディレクトリ内の全てのファイルを列挙します。
077 *
078 * @og.rev 2.1.1.0 (2002/11/11) 新規作成
079 * @og.rev 4.0.0.0 (2005/01/31) 内部ロジックの全面見直し
080 * @og.group その他入力
081 *
082 * @version  4.0
083 * @author   Kazuhiko Hasegawa
084 * @since    JDK5.0,
085 */
086public class FileWhereTag extends CommonTagSupport {
087        /** このプログラムのVERSION文字列を設定します。   {@value} */
088        private static final String VERSION = "6.8.0.0 (2017/06/02)" ;
089        private static final long serialVersionUID = 680020170602L ;
090
091        private String  startsWith              ;               // 指定された接頭辞で始まる場合、選択される
092        private String  endsWith                ;               // 指定された接頭辞で終わる場合、選択される
093        private String  instr                   ;               // 指定された文字列がファイル名に含まれる場合、選択される
094        private String  fileEquals              ;               // ファイル名が一致する場合、選択される(大文字小文字は区別しない)
095        private String  matches                 ;               // ファイル名が、指定された正規表現と一致する場合、選択される(大文字小文字は区別しない)
096        private String  unMatches               ;               // ファイル名が、指定された正規表現と一致しない場合、選択される(大文字小文字は区別しない)
097        private String  lastModified    ;               // 指定のタイムスタンプ以後に変更された場合、選択される
098        private String  isLarger                ;               // 指定の大きさ(バイト単位)より大きいファイルの場合、選択される
099        private String  isSmaller               ;               // 指定の大きさ(バイト単位)より小さいファイルの場合、選択される
100        private String  isHidden                ;               // 5.7.5.0 (2014/04/04) true:HIDDENファイルのみ/false:NORMALファイルのみスルー(選択)されます
101        // 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
102        private String  useDir  = "false";              // 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
103        private boolean ignoreCase              ;               // 6.3.1.1 (2015/07/10) 大文字/小文字の区別なしで検索可能にするかどうか(初期値:false:区別する)
104        private boolean notEquals               ;               // 6.8.0.0 (2017/06/02) 判定結果を反転させて処理します。
105
106        /**
107         * デフォルトコンストラクター
108         *
109         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
110         */
111        public FileWhereTag() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
112
113        /**
114         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
115         *
116         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
117         * @og.rev 5.1.2.0 (2010/01/01) unMatches メソッドで反転属性の追加
118         * @og.rev 5.3.9.0 (2011/09/01) useDir属性を追加
119         * @og.rev 5.6.6.0 (2013/07/05) unMatchesの引数間違いの訂正
120         * @og.rev 5.7.5.0 (2014/04/04) isHidden属性を追加します。
121         * @og.rev 6.3.1.1 (2015/07/10) メソッドチェーン化と、大文字/小文字の区別なし(ignoreCase=true)対応
122         * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
123         * @og.rev 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
124         *
125         * @return      後続処理の指示
126         */
127        @Override
128        public int doEndTag() {
129                debugPrint();           // 4.0.0 (2005/02/28)
130
131                // 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
132                if( !useTag() ) { return EVAL_PAGE ; }
133
134                // 6.3.1.1 (2015/07/10) メソッドチェーン化と、大文字/小文字の区別なし(ignoreCase=true)対応
135                // 6.8.0.0 (2017/06/02) notEquals で、判定結果を反転させて処理します。
136                final HybsFileFilter filter = new HybsFileFilter( useDir,ignoreCase,notEquals )
137                        .startsWith(    startsWith              )
138                        .endsWith(              endsWith                )
139                        .instr(                 instr                   )
140                        .fileEquals(    fileEquals              )
141                        .matches(               matches                 )
142                        .matches(               unMatches , true )                      // 5.6.6.0 (2013/07/05) 引数間違いの訂正
143                        .lastModified(  lastModified    )
144                        .isLarger(              isLarger                )
145                        .isSmaller(             isSmaller               )
146                        .isHidden(              isHidden                );                      // 5.7.5.0 (2014/04/04) 追加
147
148                // ファイルフィルタを追加
149                final FileQueryTag fileQuery = (FileQueryTag)findAncestorWithClass( this, FileQueryTag.class );
150                if( fileQuery != null ) {
151                        fileQuery.setFileFilter( filter );
152                        return EVAL_PAGE ;
153                }
154
155                final FileOptionTag fileOption = (FileOptionTag)findAncestorWithClass( this, FileOptionTag.class );
156                if( fileOption != null ) {
157                        fileOption.setFileFilter( filter );
158                        return EVAL_PAGE ;
159                }
160
161                // どちらにも属していなかった場合は、エラーになる。
162                final String errMsg = "この、FileWhereTag タグは、FileQueryTag か、FileOption の"
163                                        + "BODY 部にのみ、配置できます。(それ以外の箇所での使用はできません。)" ;
164                throw new HybsSystemException( errMsg );
165        }
166
167        /**
168         * タグリブオブジェクトをリリースします。
169         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
170         *
171         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
172         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
173         * @og.rev 4.0.0.0 (2005/01/31) 内部ロジックの全面見直し
174         * @og.rev 5.3.9.0 (2011/09/01) useDir属性追加
175         * @og.rev 5.7.4.3 (2014/03/28) isLarger,isSmaller属性を文字列に変更
176         * @og.rev 5.7.5.0 (2014/04/04) isHidden属性を追加
177         * @og.rev 6.3.1.1 (2015/07/10) 大文字/小文字の区別なし(ignoreCase=true)対応
178         * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
179         * @og.rev 6.8.0.0 (2017/06/02) notEquals 属性追加 , useDir="false" の初期値設定
180         */
181        @Override
182        protected void release2() {
183                super.release2();
184                startsWith              = null;
185                endsWith                = null;
186                instr                   = null;
187                fileEquals              = null;
188                matches                 = null;
189                unMatches               = null;
190                lastModified    = null;
191                isLarger                = null;         // 5.7.4.3 (2014/03/28) isLarger,isSmaller属性を文字列に変更
192                isSmaller               = null;         // 5.7.4.3 (2014/03/28) isLarger,isSmaller属性を文字列に変更
193                isHidden                = null;         // 5.7.5.0 (2014/04/04) isHidden属性を追加
194                useDir                  = "false";      // 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加
195                ignoreCase              = false;        // 大文字/小文字の区別
196                notEquals               = false;        // 6.8.0.0 (2017/06/02) notEquals 属性追加
197        }
198
199        /**
200         * 【TAG】指定された接頭辞で始まる場合、スルー(選択)されます(初期値:null)。
201         * @og.tag
202         * 引数が null の場合は、追加しません。
203         *
204         * @param    prefix 接頭辞
205         * @see java.lang.String#startsWith(String)
206         */
207        public void setStartsWith( final String prefix ) {
208                startsWith = nval( getRequestParameter( prefix ),startsWith );
209        }
210
211        /**
212         * 【TAG】指定された接頭辞で終わる場合、スルー(選択)されます(初期値:null)。
213         * @og.tag
214         * 引数が null の場合は、追加しません。
215         *
216         * @param    suffix 接尾辞
217         * @see java.lang.String#endsWith(String)
218         */
219        public void setEndsWith( final String suffix ) {
220                endsWith = nval( getRequestParameter( suffix ),endsWith );
221        }
222
223        /**
224         * 【TAG】指定された文字列がファイル名に含まれる場合、スルー(選択)されます(初期値:null)。
225         * @og.tag
226         * 引数が null の場合は、追加しません。
227         *
228         * @param    str 指定の部分文字列
229         */
230        public void setInstr( final String str ) {
231                instr = nval( getRequestParameter( str ),instr );
232        }
233
234        /**
235         * 【TAG】ファイル名が一致する場合、スルー(選択)されます(初期値:null)。
236         * @og.tag
237         * 大文字小文字は区別しません。
238         * 引数が null の場合は、追加しません。
239         *
240         * @param    str ファイル名文字列
241         * @see java.lang.String#equals(Object)
242         */
243        public void setEquals( final String str ) {
244                fileEquals = nval( getRequestParameter( str ),fileEquals );
245        }
246
247        /**
248         * 【TAG】ファイル名が、指定された正規表現と一致する場合、スルー(選択)されます(初期値:null)。
249         * @og.tag
250         * 大文字小文字は区別しません。
251         * Pattern.compile( str,Pattern.CASE_INSENSITIVE ) ;
252         * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られます。
253         * 引数が null の場合は、追加しません。
254         *
255         * @param    str ファイル名文字列(正規表現)
256         * @see java.util.regex.Pattern#compile(String,int)
257         * @see java.util.regex.Matcher#find()
258         */
259        public void setMatches( final String str ) {
260                matches = nval( getRequestParameter( str ),matches );
261        }
262
263        /**
264         * 【TAG】ファイル名が、指定された正規表現と一致しない場合、スルー(選択)されます(初期値:null)。
265         * @og.tag
266         * 大文字小文字は区別しません。
267         * Pattern.compile( str,Pattern.CASE_INSENSITIVE ) ;
268         * pattern.matcher( pathname.getName() ).find() == false と同じ結果が得られます。
269         * 引数が null の場合は、追加しません。
270         *
271         * @param    str ファイル名文字列(不一致させる正規表現)
272         * @see java.util.regex.Pattern#compile(String,int)
273         * @see java.util.regex.Matcher#find()
274         */
275        public void setUnMatches( final String str ) {
276                unMatches = nval( getRequestParameter( str ),unMatches );
277        }
278
279        /**
280         * 【TAG】指定のタイムスタンプ以後に変更されている場合、スルー(選択)されます(初期値:null)。
281         * @og.tag
282         * ディレクトリは、ここの判定では無視します。(必ず true を返します)
283         * 日付けの指定に、YYYYMMDD 形式の 8文字数字文字列以外に、
284         * TODAY や YESTERDAY なども使用できます。
285         * TODAY は、実行日の 00:00:00 を基準時刻とし、YESTERDAY は、その前日になります。
286         * 引数が null の場合は、追加しません。
287         *
288         *     YYYYMMDD   YYYYMMDD形式の指定日の 00:00:00 を基準時刻
289         *     TODAY      実行日の 00:00:00 を基準時刻
290         *     YESTERDAY  実行日前日の 00:00:00 を基準時刻
291         *     LAST_WEEK  実行日の先週(7日前) 00:00:00 を基準時刻
292         *     MONTH      実行月の 1日 00:00:00 を基準時刻
293         *     LAST_MONTH 実行前月の 同日 00:00:00 を基準時刻
294         *     LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻
295         *
296         * @param    modify YYYYMMDD形式の指定日
297         */
298        public void setLastModified( final String modify ) {
299                lastModified = nval( getRequestParameter( modify ),lastModified );
300        }
301
302        /**
303         * 【TAG】指定の大きさより大きいファイルの場合、スルー(選択)されます(初期値:null)。
304         *
305         * @og.tag
306         * ファイルの大きさ(バイト単位)は同値を含みます。
307         * 未指定の場合は、スルー(選択)されます。
308         *
309         * 指定はバイト単位ですが、**KB , **MB , **GB などの単位を付ける事も可能です。
310         * 現時点では、K , KB , M , MB , G , GB のみ指定可能です。
311         *
312         * @param       len     ファイルの大きさ(バイト単位)
313         */
314        public void setIsLarger( final String len ) {
315                isLarger = nval( getRequestParameter( len ),isLarger );
316        }
317
318        /**
319         * 【TAG】指定の大きさより小さいファイルの場合、スルー(選択)されます(初期値:null)。
320         *
321         * @og.tag
322         * ファイルの大きさ(バイト単位)は同値を含みません。
323         * 未指定の場合は、スルー(選択)されます。
324         *
325         * 指定はバイト単位ですが、**KB , **MB , **GB などの単位を付ける事も可能です。
326         * 現時点では、K , KB , M , MB , G , GB のみ指定可能です。
327         *
328         * @param       len     ファイルの大きさ(バイト単位)
329         */
330        public void setIsSmaller( final String len ) {
331                isSmaller = nval( getRequestParameter( len ),isSmaller );
332        }
333
334        /**
335         * 【TAG】対象に隠しファイル(hidden)を、スルー(選択)する場合、true を指定します(初期値:null)。
336         * @og.tag
337         * trueを指定すると、隠しファイル(hidden)のみ選択します。
338         * falseを指定すると、隠しファイル(hidden)以外を選択します。
339         * 隠しファイルかどうかの定義はOSに従います。
340         * 初期値は、両方とも選択する為、null (trueでもfalseでもない)です。
341         *
342         * @og.rev 5.7.5.0 (2014/04/04) 新規作成
343         *
344         * @param    flag hidden対象 [true:する/false:しない]
345         */
346        public void setIsHidden( final String flag ) {
347                isHidden = nval( getRequestParameter( flag ), isHidden );
348        }
349
350        /**
351         * 【TAG】フィルタによる対象の絞込みをディレクトリにも適用するかどうか[false:File/true:File+Dir/only:Dir]を指定します(初期値:false:しない)。
352         *
353         * @og.tag 初期値は、false(ディレクトリはフィルタによる絞込みをしない)です。
354         *
355         * @og.rev 5.3.9.0 (2011/09/01) 新規作成
356         * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
357         *
358         * @param       flag    ディレクトリ適用 [true:する/false:しない]
359         */
360        public void setUseDir( final String flag ) {
361                useDir = nval( getRequestParameter( flag ),useDir );
362        }
363
364        /**
365         * 【TAG】大文字/小文字を区別しないかどうか[true/false]を指定します(初期値:false(区別する))。
366         *
367         * @og.tag
368         * startsWith , contains , endsWith , equalsIgnoreCase での比較時に、比較対象の
369         * 大文字/小文字を区別しないかどうかを指定します。
370         * 区別しない ("true") 場合、aaa と AAA は、一致したとみなされます。
371         * 初期値は、区別する ("false") です。
372         *
373         * @og.rev 6.3.1.1 (2015/07/10) 大文字/小文字の区別なし(ignoreCase=true)対応
374         *
375         * @param   flag 大文字/小文字を区別しないかどうか [true:しない/それ以外:する]
376         */
377        public void setIgnoreCase( final String flag ) {
378                ignoreCase = nval( getRequestParameter( flag ),ignoreCase );
379        }
380
381        /**
382         * 【TAG】判定結果を反転させるかどうか[true/false]を指定します(初期値:false)。
383         *
384         * @og.tag
385         * 通常の判定結果において、結果の正反対の処理を行います。
386         * 初期値は、通常 (false)です。
387         *
388         * @og.rev 6.8.0.0 (2017/06/02) 新規追加
389         *
390         * @param   flag 判定結果反転 [true:反転する/それ以外:通常]
391         */
392        public void setNotEquals( final String flag ) {
393                notEquals = nval( getRequestParameter( flag ),notEquals );
394        }
395
396        /**
397         * このオブジェクトの文字列表現を返します。
398         * 基本的にデバッグ目的に使用します。
399         *
400         * @return String型。このクラスの文字列表現
401         * @og.rtnNotNull
402         */
403        @Override
404        public String toString() {
405                return ToString.title( this.getClass().getName() )
406                                .println( "VERSION"                     ,VERSION                )
407                                .println( "startsWith"          ,startsWith             )
408                                .println( "endsWith"            ,endsWith               )
409                                .println( "instr"                       ,instr                  )
410                                .println( "equals"                      ,fileEquals             )
411                                .println( "matches"                     ,matches                )
412                                .println( "unMatches"           ,unMatches              )
413                                .println( "lastModified"        ,lastModified   )
414                                .println( "isLarger"            ,isLarger               )
415                                .println( "isSmaller"           ,isSmaller              )
416                                .println( "useDir"                      ,useDir                 )
417                                .println( "ignoreCase"          ,ignoreCase             )               // 6.3.1.1 (2015/07/10)
418                                .println( "Other..."            ,getAttributes().getAttribute() )
419                                .fixForm().toString() ;
420        }
421}