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