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}