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.fukurou.process;
017    
018    import org.opengion.fukurou.util.Argument;
019    import org.opengion.fukurou.util.HybsFileFilter;
020    import org.opengion.fukurou.util.LogWriter;
021    
022    import java.io.File;
023    import java.util.Map ;
024    import java.util.LinkedHashMap ;
025    import java.util.Stack;
026    
027    /**
028     * Process_FileSearch ã¯ã€æŒ‡å®šã?フォルãƒ?»¥ä¸‹ã?ファイルをä¸?¦§ã™ã‚‹ã€FirstProcess
029     * インターフェースã¨ã€ChainProcess インターフェースã®å®Ÿè£?‚¯ãƒ©ã‚¹ã§ã™ã?
030     *
031     * æŒ?®šã?æ¡ä»¶ã«åˆè?ã™ã‚‹ãƒ•ァイルを検索ã—ã?LineModel ã®ã‚µãƒ–クラスã§ã‚ã‚‹ã€?
032     * FileLineModel オブジェクトを作æ?ã—ã¦ã€ä¸‹æµã«æ¸¡ã—ã¾ã™ã?
033     * FileLineModel オブジェクトã«ã¯ã€ãƒ•ァイル属æ?(Level,File,Length,Modify)
034     * ãŒè¨­å®šã•れã¾ã™ã?
035     *
036     * 引数æ–?­—å?中ã«ã‚¹ãƒšã?スをå«ã‚??åˆã?ã€ãƒ€ãƒ–ルコーãƒ??ション("") ã§æ‹¬ã£ã¦ä¸‹ã•ã??
037     * 引数æ–?­—å?ã® ã€?ã€ã?å‰å¾Œã«ã¯ã€ã‚¹ãƒšã?ã‚¹ã¯æŒŸã‚ã¾ã›ã‚“。å¿?šã€?key=value ã®æ§˜ã«
038     * 繋ã’ã¦ãã ã•ã„ã€?
039     *
040     * @og.formSample
041     *  Process_FileSearch -start=d:/ -suffix=jsp
042     *
043     *     -start=開始フォルãƒ?      ?šæ¤œç´¢ã‚’é–‹å§‹ã™ã‚‹ãƒ•ォルãƒ?
044     *   [ -prefix=接頭è¾?        ]  ?šFile?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã€æŒ‡å®šã?接頭辞ã§å§‹ã¾ã‚‹ãƒ•ァイルを検索
045     *   [ -unprefix=䏿ޥ頭è¾?    ]  ?šFile?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã€æŒ‡å®šã?接頭辞ã§å§‹ã¾ã‚‰ãªã?ƒ•ァイルを検索
046     *   [ -suffix=接尾è¾?        ]  ??txt,.java,.jsp.... ãªã©ã€æŒ‡å®šã?接尾辞ã§çµ‚ã‚るファイルを検索
047     *   [ -unsuffix=䏿ޥ尾è¾?    ]  ??txt,.java,.jsp.... ãªã©ã€æŒ‡å®šã?接尾辞ã§çµ‚ã‚らãªã?ƒ•ァイルを検索
048     *   [ -instr=部åˆ?–‡å­—å?      ]  ?šãƒ•ァイルåã¨ä¸??ã™ã‚‹éƒ¨åˆ?–‡å­—å?を指å®?
049     *   [ -uninstr=ä¸éƒ¨åˆ?–‡å­—å?  ]  ?šãƒ•ァイルåã¨ä¸??ã—ãªéƒ¨åˆ?–‡å­—å?を指å®?
050     *   [ -equals=ä¸??           ]  ?šãƒ•ァイルåã¨ä¸??ã™ã‚‹æ–?­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?を指å®?
051     *   [ -notequals=ä¸ä¸??      ]  ?šãƒ•ァイルåã¨ä¸??ã—ãªã?–‡å­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?を指å®?
052     *   [ -match=æ­£è¦è¡¨ç¾        ]  ?šãƒ•ァイルåã¨ä¸??ã™ã‚‹æ­£è¦è¡¨ç¾ã‚’指å®?
053     *   [ -unmatch=æ­£è¦è¡¨ç¾      ]  ?šãƒ•ァイルåã¨ä¸??ã—ãªã?­£è¦è¡¨ç¾ã‚’指å®?
054     *   [ -modify=YYYYMMDD       ]  ?šæŒ‡å®šæ—¥ä»˜ã‘以é™ã«å¤‰æ›´ã•れãŸãƒ•ァイルを検索
055     *             YYYYMMDD   : YYYYMMDD å½¢å¼ã§ã®æŒ?®šæ—¥ã® 00:00:00 を基準時刻
056     *             TODAY      : 実行日㮠00:00:00 を基準時刻
057     *             YESTERDAY  : å®Ÿè¡Œæ—¥å‰æ—¥ã® 00:00:00 を基準時刻
058     *             LAST_WEEK  : 実行日ã®å…ˆé?(7æ—¥å‰? 00:00:00 を基準時刻
059     *             MONTH      : 実行月㮠1日 00:00:00 を基準時刻
060     *             LAST_MONTH : å®Ÿè¡Œå‰æœˆã? åŒæ—¥ 00:00:00 を基準時刻
061     *             LAST_YEAR  : 実行å‰å¹´ã® åŒæœˆåŒæ—¥ 00:00:00 を基準時刻
062     *   [ -useDIR=[false/true]   ]  ?šåˆ¤å®šã‚’ファイルã?‘ã§ãªãã?ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚‚行ã†ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)
063     *   [ -larger=サイズ(KByte)  ]  ?šãƒ•ァイルã®å¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå¤§ãã„ファイルを検索
064     *   [ -smaller=サイズ(KByte) ]  ?šãƒ•ァイルã®å¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå°ã•ã?ƒ•ァイルを検索
065     *   [ -maxLevel=æœ?¤§éšŽå±¤æ•°   ]  ?šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®éšŽå±¤ã‚’下ãŒã‚‹æœ€å¤§æ•°(åˆæœŸå€¤:256)
066     *   [ -useLineCnt=行数計ç®?  ]  ?šãƒ•ァイルã®è¡Œæ•°ã‚’カウントã™ã‚‹ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)
067     *   [ -useMD5=MD5計算å?      ]  ?šãƒ•ァイルã®MD5計算を行ã†ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)
068     *   [ -inPath=入力å?通パス   ]  ?šBIKO作æ?用ã®ãƒ•ァイルパスã‹ã‚‰å‰Šé™¤ã™ã‚‹éƒ¨åˆ?æ–?­—æ•°ã®ã¿)
069     *   [ -outPath=出力追åŠ?ƒ‘ス  ]  ?šBIKO作æ?用ã®ãƒ•ァイルパスã«è¿½åŠ?™ã‚‹éƒ¨åˆ?
070     *   [ -display=[false/true]  ]  ?štrueã¯ã€æ¤œç´¢çжæ³ã‚’表示ã—ã¾ã?åˆæœŸå€¤:false)
071     *   [ -debug=false|true        ] ?šãƒ‡ãƒãƒƒã‚°æƒ??を標準å?力ã«è¡¨ç¤ºã™ã‚‹(true)ã‹ã—ãªã?false)ã?åˆæœŸå€¤:false[表示ã—ãªã„])
072     *
073     * @version  4.0
074     * @author   Kazuhiko Hasegawa
075     * @since    JDK5.0,
076     */
077    public class Process_FileSearch extends AbstractProcess
078                                                                    implements FirstProcess , ChainProcess {
079    
080            private Stack<FileListStack>      dirs            = null;
081            private File                    file            = null;
082            private HybsFileFilter  filter          = null;
083            private FileLineModel   newData         = null;
084            private int                             level           = 1;
085    
086            private String                  startDir        = null;
087            private int                             maxLevel        = 256;
088            private int                             inCount         = 0;
089            private int                             outCount        = 0;
090            private int                             inPathLen       = 0;            // 4.2.3.0 (2008/05/26) BIKOæ¬?”¨
091            private String                  outPath         = null;         // 4.3.1.1 (2008/08/23) BIKOæ¬?”¨
092            private boolean                 display         = false;        // 表示ã—ãªã?
093            private boolean                 debug           = false;        // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
094    
095            private static final Map<String,String> mustProparty   ;          // ?»ãƒ—ロパティ?½å¿??ãƒã‚§ãƒ?‚¯ç”¨ Map
096            private static final Map<String,String> usableProparty ;          // ?»ãƒ—ロパティ?½æ•´åˆæ?ãƒã‚§ãƒ?‚¯ Map
097    
098            static {
099                    mustProparty = new LinkedHashMap<String,String>();
100                    mustProparty.put( "start",      "検索を開始ã™ã‚‹ãƒ•ォルãƒ?å¿??)" );
101    
102                    usableProparty = new LinkedHashMap<String,String>();
103                    usableProparty.put( "prefix",   "File?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã€æŒ‡å®šã?接頭辞ã§å§‹ã¾ã‚‹ãƒ•ァイルを検索" );
104                    usableProparty.put( "unprefix", "File?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã€æŒ‡å®šã?接頭辞ã§å§‹ã¾ã‚‰ãªã?ƒ•ァイルを検索" );
105                    usableProparty.put( "suffix",   ".txt,.java,.jsp.... ãªã©ã€æŒ‡å®šã?接尾辞ã§çµ‚ã‚るファイルを検索" );
106                    usableProparty.put( "unsuffix", ".txt,.java,.jsp.... ãªã©ã€æŒ‡å®šã?接尾辞ã§çµ‚ã‚らãªã?ƒ•ァイルを検索" );
107                    usableProparty.put( "instr",    "ファイルåã¨ä¸??ã™ã‚‹éƒ¨åˆ?–‡å­—å?を指å®? );
108                    usableProparty.put( "uninstr",  "ファイルåã¨ä¸??ã—ãªã?ƒ¨åˆ?–‡å­—å?を指å®? );
109                    usableProparty.put( "equals",   "ファイルåã¨ä¸??ã™ã‚‹æ–?­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?を指å®? );
110                    usableProparty.put( "notequals",        "ファイルåã¨ä¸??ã—ãªã?–‡å­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?を指å®? );
111                    usableProparty.put( "match",    "ファイルåã¨ä¸??ã™ã‚‹æ­£è¦è¡¨ç¾ã‚’指å®? );
112                    usableProparty.put( "unmatch",  "ファイルåã¨ä¸??ã—ãªã?­£è¦è¡¨ç¾ã‚’指å®? );
113                    usableProparty.put( "modify",   "æŒ?®šæ—¥ä»˜ã‘以é™ã«å¤‰æ›´ã•れãŸãƒ•ァイルを検索" +
114                                            CR + "YYYYMMDD   : YYYYMMDD å½¢å¼ã§ã®æŒ?®šæ—¥ã® 00:00:00 を基準時刻" +
115                                            CR + "TODAY      : 実行日㮠00:00:00 を基準時刻" +
116                                            CR + "YESTERDAY  : å®Ÿè¡Œæ—¥å‰æ—¥ã® 00:00:00 を基準時刻" +
117                                            CR + "LAST_WEEK  : 実行日ã®å…ˆé?(7æ—¥å‰? 00:00:00 を基準時刻" +
118                                            CR + "MONTH      : 実行月㮠1日 00:00:00 を基準時刻" +
119                                            CR + "LAST_MONTH : å®Ÿè¡Œå‰æœˆã? åŒæ—¥ 00:00:00 を基準時刻" +
120                                            CR + "LAST_YEAR  : 実行å‰å¹´ã® åŒæœˆåŒæ—¥ 00:00:00 を基準時刻"
121                    );
122                    usableProparty.put( "useDIR"    ,"判定をファイルã?‘ã§ãªãã?ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚‚行ã†ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)" );
123                    usableProparty.put( "larger"    ,"ファイルã®å¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå¤§ãã„ファイルを検索" );
124                    usableProparty.put( "smaller"   ,"ファイルã®å¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå°ã•ã?ƒ•ァイルを検索" );
125                    usableProparty.put( "maxLevel"  ,"ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã®éšŽå±¤ã‚’下ãŒã‚‹æœ€å¤§æ•°(åˆæœŸå€¤:256)" );
126                    usableProparty.put( "useLineCnt","ファイルã®è¡Œæ•°ã‚’カウントã™ã‚‹ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)" );
127                    usableProparty.put( "useMD5"    ,"ファイルã®MD5計算を行ã†ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)" );               // 5.7.2.1 (2014/01/17)
128                    usableProparty.put( "inPath"    ,"BIKO作æ?用ã®ãƒ•ァイルパスã‹ã‚‰å‰Šé™¤ã™ã‚‹éƒ¨åˆ?æ–?­—æ•°ã®ã¿)" );
129                    usableProparty.put( "outPath"   ,"BIKO作æ?用ã®ãƒ•ァイルパスã«è¿½åŠ?™ã‚‹éƒ¨åˆ? );
130                    usableProparty.put( "display"   ,"trueã¯ã€æ¤œç´¢çжæ³ã‚’表示ã—ã¾ã?åˆæœŸå€¤:false)" );
131                    usableProparty.put( "debug"             ,"ãƒ?ƒãƒ?‚°æƒ??を標準å?力ã«è¡¨ç¤ºã™ã‚‹(true)ã‹ã—ãªã?false)ã? +
132                                                                                    CR + "(åˆæœŸå€¤:false:表示ã—ãªã?" );                // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
133            }
134    
135            /**
136             * ãƒ?ƒ•ォルトコンストラクターã€?
137             * ã“ã?クラスã¯ã€å‹•çš?½œæ?ã•れã¾ã™ã?ãƒ?ƒ•ォルトコンストラクターã§ã€?
138             * super クラスã«å¯¾ã—ã¦ã€å¿?¦ãªåˆæœŸåŒ–を行ã£ã¦ãŠãã¾ã™ã?
139             *
140             */
141            public Process_FileSearch() {
142                    super( "org.opengion.fukurou.process.Process_FileSearch",mustProparty,usableProparty );
143            }
144    
145            /**
146             * プロセスã®åˆæœŸåŒ–を行ã„ã¾ã™ã?åˆã‚ã«ä¸?º¦ã?‘ã€å‘¼ã³å‡ºã•れã¾ã™ã?
147             * åˆæœŸå‡¦ç?ファイルオープンã€?¼¤?¢ã‚ªãƒ¼ãƒ—ンç­?ã«ä½¿ç”¨ã—ã¾ã™ã?
148             *
149             * @og.rev 4.2.2.0 (2008/05/10) 行数カウントã?使用有無
150             * @og.rev 4.3.1.1 (2008/08/23) BIKO æ¬?«outPath 属æ?を追åŠ?—ã¾ã™ã?
151             * @og.rev 5.1.2.0 (2010/01/01) useDIR 属æ?を追åŠ?—ã¾ã™ã?
152             * @og.rev 5.7.2.1 (2014/01/17) useMD5 属æ?を追åŠ?—ã¾ã™ã?
153             *
154             * @param   paramProcess ãƒ??タベã?ã‚¹ã®æŽ¥ç¶šå?æƒ??ãªã©ã‚’æŒã£ã¦ã?‚‹ã‚ªãƒ–ジェクãƒ?
155             */
156            public void init( final ParamProcess paramProcess ) {
157                    Argument arg = getArgument();
158    
159                    startDir                = arg.getProparty("start" );
160    
161                    String inPath   = arg.getProparty("inPath");
162                    if( inPath != null ) { inPathLen = inPath.length(); }
163    
164                    String prefix   = arg.getProparty("prefix");
165                    String unprefix = arg.getProparty("unprefix");          // 5.1.2.0 (2010/01/01) 追�
166                    String suffix   = arg.getProparty("suffix");
167                    String unsuffix = arg.getProparty("unsuffix");          // 5.1.2.0 (2010/01/01) 追�
168                    String instr    = arg.getProparty("instr");
169                    String uninstr  = arg.getProparty("uninstr");           // 5.1.2.0 (2010/01/01) 追�
170                    String equals   = arg.getProparty("equals");
171                    String notequals= arg.getProparty("notequals");         // 5.1.2.0 (2010/01/01) 追�
172                    String match    = arg.getProparty("match");
173                    String unmatch  = arg.getProparty("unmatch");
174                    String modify   = arg.getProparty("modify");
175                    String larger   = arg.getProparty("larger");
176                    String smaller  = arg.getProparty("smaller");
177                    maxLevel                = arg.getProparty("maxLevel",maxLevel);
178                    outPath                 = arg.getProparty("outPath");
179                    // 4.2.2.0 (2008/05/10) 行数カウントã?使用有無
180                    boolean useLineCnt      = arg.getProparty( "useLineCnt",false );
181                    // 5.7.2.1 (2014/01/17) ファイルã®MD5ã®è¨ˆç®—有無
182                    boolean useMD5          = arg.getProparty( "useMD5",false );
183    
184                    // 5.1.2.0 (2010/01/01) 判定をãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚‚行ã†ã‹ã©ã?‹
185                    boolean useDIR = arg.getProparty( "useDIR",false );
186    
187                    display = arg.getProparty("display",display);
188    //              if( display ) { println( startDir ); }                                                  // 4.0.0 (2005/01/31)
189                    debug   = arg.getProparty("debug",debug);                               // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
190    //              if( debug ) { println( arg.toString() ); }                      // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
191    
192                    // 5.1.2.0 (2010/01/01) å転処ç??引数追åŠ?
193                    filter = new HybsFileFilter( useDIR );  // 5.1.2.0 (2010/01/01) 判定をãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚‚行ã†ã‹ã©ã?‹
194                    filter.startsWith( prefix   , false);
195                    filter.startsWith( unprefix , true );
196                    filter.endsWith( suffix   , false);
197                    filter.endsWith( unsuffix , true );
198                    filter.instr( instr   , false);
199                    filter.instr( uninstr , true );
200                    filter.fileEquals( equals   , false);
201                    filter.fileEquals( notequals , true );
202                    filter.matches( match   , false);
203                    filter.matches( unmatch , true );
204    //              filter.unMatches( unmatch );                    // 5.1.2.0 (2010/01/01) å転処ç??ã€matches ã® å転引数ã§å¯¾å¿?
205                    filter.lastModified( modify );
206                    if( larger  != null ) { filter.isLarger( Integer.parseInt( larger ) ); }
207                    if( smaller != null ) { filter.isSmaller( Integer.parseInt( smaller ) ); }
208    
209                    File tempFile = new File( startDir );
210                    if( display ) { println( "start=[" + tempFile + "]" ); }                // 5.7.3.0 (2014/02/07)
211                    if( tempFile.isDirectory() ) {
212                            dirs = new Stack<FileListStack>();
213                            File[] fileList = tempFile.listFiles( filter );
214                            dirs.push( new FileListStack( fileList, level ) );
215                    }
216                    else {
217                            dirs = new Stack<FileListStack>();
218                            File[] fileList = new File[] { tempFile };
219                            dirs.push( new FileListStack( fileList, level ) );
220                    }
221    
222    //              newData = new FileLineModel();
223    //              newData = new FileLineModel( useLineCnt );                      // 4.2.2.0 (2008/05/10)
224                    newData = new FileLineModel( useLineCnt,useMD5 );       // 5.7.2.1 (2014/01/17)
225            }
226    
227            /**
228             * ã“ã?ãƒ??ã‚¿ã®å‡¦ç?«ãŠã„ã¦ã€æ¬¡ã®å‡¦ç?Œå‡ºæ¥ã‚‹ã‹ã©ã?‹ã‚’å•ã?ˆã‚ã›ã¾ã™ã?
229             * ã“ã?呼ã³å‡ºã—1回毎ã«ã€æ¬¡ã®ãƒ??ã‚¿ã‚’å–å¾—ã™ã‚‹æº–備を行ã„ã¾ã™ã?
230             *
231             * @og.rev 5.3.8.0 (2011/08/01) 処ç?¸­ã®çŠ¶æ…‹ã‚’è¡¨ç¤ºã™ã‚‹ãŸã‚ã® println を追åŠ?
232             *
233             * @return      処ç?§ãã‚‹:true / 処ç?§ããªã?false
234             */
235            public boolean next() {
236                    while( !dirs.empty() ) {
237                            FileListStack fStack = dirs.pop();
238    
239                            level = fStack.getLevel();
240                            if( level > maxLevel ) { continue; }
241    
242                            File[] fileList = fStack.getFileList();
243                            if( fileList == null ) { continue; }
244    
245                            int address = fStack.getAddress();
246                            for( ; address < fileList.length; address++ ) {
247                                    inCount++ ;
248                                    if( fileList[address].isDirectory() ) {
249    //                                      if( display ) { println( fileList[address].getAbsolutePath() ); }               // 5.3.8.0 (2011/08/01)
250                                            if( debug ) { println( "file Add=" + fileList[address].getAbsolutePath() ); }                   // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
251                                            File[] newList = fileList[address].listFiles( filter );
252                                            dirs.push( new FileListStack( newList,level+1) );
253                                    }
254                                    else {
255                                            file = fileList[address];
256                                            if( debug ) { println( "file=" + file ); }                      // 5.7.3.0 (2014/02/07) ãƒ?ƒãƒ?‚°æƒ??
257                                            fStack.setAddress( address+1 );
258                                            dirs.push( fStack );
259                                            return true;
260                                    }
261                            }
262                    }
263                    return false;
264            }
265    
266            /**
267             * æœ??ã«ã€?行データã§ã‚ã‚‹ LineModel を作æ?ã—ã¾ã?
268             * FirstProcess ã¯ã€æ¬¡ã€?¨å‡¦ç?‚’ãƒã‚§ã‚¤ãƒ³ã—ã¦ã?æœ??ã®è¡Œãƒ‡ãƒ¼ã‚¿ã‚?
269             * 作æ?ã—ã¦ã€å¾Œç¶šã? ChainProcess クラスã«å‡¦ç?ƒ‡ãƒ¼ã‚¿ã‚’渡ã—ã¾ã™ã?
270             *
271             * @og.rev 4.2.3.0 (2008/05/26) BIKO æ¬?«å±•開ファイルåを記述ã—ã¾ã™ã?
272             * @og.rev 4.3.1.1 (2008/08/23) BIKO æ¬?«outPath 属æ?を追åŠ?—ã¾ã™ã?
273             *
274             * @param       rowNo   処ç?¸­ã®è¡Œç•ªå·
275             *
276             * @return      処ç?¤‰æ›å¾Œã?LineModel
277             */
278            public LineModel makeLineModel( final int rowNo ) {
279                    outCount++ ;
280                    newData.setFileVals( level,file );
281    
282                    // 4.3.1.1 (2008/08/23)
283                    String biko = null;
284                    // 4.2.3.0 (2008/05/26) BIKO æ¬?¿½åŠ?
285                    if( inPathLen > 0 ) {
286                            biko = file.getAbsolutePath().substring( inPathLen );
287    //                      newData.setBiko( biko );
288                    }
289    
290                    if( outPath != null ) {
291                            if( biko == null ) {
292                                    biko = outPath + file.getName() ;
293                            }
294                            else {
295                                    biko = outPath + biko ;
296                            }
297                    }
298                    if( biko != null ) {
299                            newData.setBiko( biko );
300                    }
301    
302                    newData.setRowNo( rowNo );
303    
304    //              if( display ) { println( newData.dataLine() ); }                // 5.1.2.0 (2010/01/01) display ã®æ¡ä»¶å¤‰æ›´
305    
306                    return newData;
307            }
308    
309            /**
310             * 引数㮠LineModel ã‚’å?ç?™ã‚‹ãƒ¡ã‚½ãƒ?ƒ‰ã§ã™ã?
311             * 変æ›å‡¦ç?¾Œã? LineModel ã‚’è¿”ã—ã¾ã™ã?
312             * 後続å?ç?‚’行ã‚ãªã??å?ãƒ??ã‚¿ã®ãƒ•ィルタリングを行ã†å ´å?ã¯ã€?
313             * null ãƒ??ã‚¿ã‚’è¿”ã—ã¾ã™ã?ã¤ã¾ã‚Šã?null ãƒ??ã‚¿ã¯ã€å¾Œç¶šå?ç?‚’行ã‚ãªã?
314             * フラグã®ä»£ã‚りã«ã‚‚使用ã—ã¦ã?¾ã™ã?
315             * ãªãŠã?変æ›å‡¦ç?¾Œã? LineModel ã¨ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã® LineModel ãŒã?
316             * åŒä¸?‹ã€ã‚³ãƒ”ã?(クローン)ã‹ã?ã€å„処ç?ƒ¡ã‚½ãƒ?ƒ‰å†?§æ±ºã‚ã¦ã?¾ã™ã?
317             * ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã•れã¦ã?ªã??åˆã?ã€å‰¯ä½œç”¨ãŒå•題ã«ãªã‚‹å?åˆã?ã€?
318             * å??ç?”ã¨ã«è‡ªåˆ?§ã‚³ãƒ”ã?(クローン)ã—ã¦ä¸‹ã•ã??
319             *
320             * @param       data    オリジナルã®LineModel
321             *
322             * @return      処ç?¤‰æ›å¾Œã?LineModel
323             */
324            public LineModel action( final LineModel data ) {
325                    LineModel rtn = null;
326    
327                    final FileLineModel fileData ;
328                    if( data instanceof FileLineModel ) {
329                            fileData = (FileLineModel)data ;
330                    }
331                    else {
332                            String errMsg = "ãƒ??ã‚¿ã?FileLineModel オブジェクトã§ã¯ã‚りã¾ã›ã‚“ã€? + CR ;
333                            throw new RuntimeException( errMsg );
334                    }
335    
336                    if( debug ) { println( "Before:" + data.dataLine() ); }         // 5.1.2.0 (2010/01/01) display ã®æ¡ä»¶å¤‰æ›´
337    
338                    File inFile = fileData.getFile() ;
339                    File[] fileList = inFile.listFiles( filter );
340    
341                    if( fileList != null && fileList.length > 0 ) {
342                            rtn = data;
343                    }
344    
345                    if( display && rtn != null ) { println( rtn.dataLine() ); }             // 5.1.2.0 (2010/01/01) display ã®æ¡ä»¶å¤‰æ›´
346                    return rtn ;
347            }
348    
349            /**
350             * プロセスã®çµ‚äº?‚’行ã„ã¾ã™ã?æœ?¾Œã«ä¸?º¦ã?‘ã€å‘¼ã³å‡ºã•れã¾ã™ã?
351             * 終äº??ç?ファイルクローズã€?¼¤?¢ã‚¯ãƒ­ãƒ¼ã‚ºç­?ã«ä½¿ç”¨ã—ã¾ã™ã?
352             *
353             * @param   isOK トã?タルã§ã€OKã?£ãŸã‹ã©ã?‹[true:æˆåŠŸ/false:失敗]
354             */
355            public void end( final boolean isOK ) {
356                    dirs            = null;
357                    file            = null;
358                    filter          = null;
359                    newData         = null;
360            }
361    
362            /**
363             * プロセスã®å‡¦ç?µæžœã®ãƒ¬ãƒã?ト表ç¾ã‚’è¿”ã—ã¾ã™ã?
364             * 処ç??ログラãƒ?ã€å?力件数ã€å?力件数ãªã©ã®æƒ??ã§ã™ã?
365             * ã“ã?æ–?­—å?ã‚’ãã®ã¾ã¾ã€æ¨™æº–å?力ã«å‡ºã™ã“ã¨ã§ã€çµæžœãƒ¬ãƒã?トã¨å‡ºæ¥ã‚‹ã‚ˆã?ª
366             * å½¢å¼ã§å‡ºã—ã¦ãã ã•ã„ã€?
367             *
368             * @return   処ç?µæžœã®ãƒ¬ãƒã?ãƒ?
369             */
370            public String report() {
371                    String report = "[" + getClass().getName() + "]" + CR
372                                    + TAB + "Start Folder : " + startDir  + CR
373                                    + TAB + "Search Count : " + inCount   + CR
374                                    + TAB + "Output Count : " + outCount ;
375    
376                    return report ;
377            }
378    
379            /**
380             * ã“ã?クラスã®ä½¿ç”¨æ–¹æ³•ã‚’è¿”ã—ã¾ã™ã?
381             *
382             * @return      ã“ã?クラスã®ä½¿ç”¨æ–¹æ³?
383             */
384            public String usage() {
385                    StringBuilder buf = new StringBuilder();
386    
387                    buf.append( "Process_FileSearch ã¯ã€æŒ‡å®šã?フォルãƒ?»¥ä¸‹ã?ファイルをä¸?¦§ã™ã‚‹ã€FirstProcess"      ).append( CR );
388                    buf.append( "インターフェースã¨ã€ChainProcess インターフェースã®å®Ÿè£?‚¯ãƒ©ã‚¹ã§ã™ã?"                    ).append( CR );
389                    buf.append( CR );
390                    buf.append( "æŒ?®šã?æ¡ä»¶ã«åˆè?ã™ã‚‹ãƒ•ァイルを検索ã—ã?ファイル属æ?(Level,File,Length,Modify)"     ).append( CR );
391                    buf.append( "ã‚’å?ã«ã€LineModelを作æ?ã—ã?下æµã«æ¸¡ã—ã¾ã™ã?"                                                                      ).append( CR );
392                    buf.append( CR );
393                    buf.append( "引数æ–?­—å?中ã«ç©ºç™½ã‚’å«ã‚??åˆã?ã€ãƒ€ãƒ–ルコーãƒ??ション(\"\") ã§æ‹¬ã£ã¦ä¸‹ã•ã??" ).append( CR );
394                    buf.append( "引数æ–?­—å?ã® ã€?ã€ã?å‰å¾Œã«ã¯ã€ç©ºç™½ã¯æŒŸã‚ã¾ã›ã‚“。å¿?šã€?key=value ã®æ§˜ã«"             ).append( CR );
395                    buf.append( "繋ã’ã¦ãã ã•ã„ã€?                                                                                                                              ).append( CR );
396                    buf.append( CR );
397                    buf.append( "  -start=開始フォルãƒ?   ?šæ¤œç´¢ã‚’é–‹å§‹ã™ã‚‹ãƒ•ォルãƒ?                                                                       ).append( CR );
398                    buf.append( "[ -prefix=接頭è¾?       ]?šFile?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã®æŽ¥é ­è¾žã§å§‹ã¾ã‚‹ãƒ•ァイル"                      ).append( CR );
399                    buf.append( "[ -unprefix=䏿ޥ頭è¾?   ]?šFile?¥?¥?¥?¥,View?¥?¥?¥?¥,ãªã©ã®æŽ¥é ­è¾žã§å§‹ã¾ã‚‰ãªã?ƒ•ァイル"            ).append( CR );
400                    buf.append( "[ -suffix=接尾è¾?       ]??txt,.java,.jsp.... ãªã©ã®æŽ¥å°¾è¾žã§çµ‚ã‚るファイル"            ).append( CR );
401                    buf.append( "[ -unsuffix=䏿ޥ尾è¾?   ]??txt,.java,.jsp.... ãªã©ã®æŽ¥å°¾è¾žã§çµ‚ã‚らãªã?ƒ•ァイル"  ).append( CR );
402                    buf.append( "[ -instr=部åˆ?–‡å­—å?     ]?šãƒ•ァイルåã¨ä¸??ã™ã‚‹éƒ¨åˆ?–‡å­—å?"                                 ).append( CR );
403                    buf.append( "[ -uninstr=ä¸éƒ¨åˆ?–‡å­—å? ]?šãƒ•ァイルåã¨ä¸??ã—ãªéƒ¨åˆ?–‡å­—å?"                                                  ).append( CR );
404                    buf.append( "[ -equals=ä¸??          ]?šãƒ•ァイルåã¨ä¸??ã™ã‚‹æ–?­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?"     ).append( CR );
405                    buf.append( "[ -notequals=ä¸ä¸??     ]?šãƒ•ァイルåã¨ä¸??ã—ãªã?–‡å­—å?(大æ–?­—å°æ–‡å­—ã?区別ã—ãªã?"    ).append( CR );
406                    buf.append( "[ -match=æ­£è¦è¡¨ç¾       ]?šãƒ•ァイルåã¨ä¸??ã™ã‚‹æ­£è¦è¡¨ç¾"                                                       ).append( CR );
407                    buf.append( "[ -unmatch=æ­£è¦è¡¨ç¾     ]?šãƒ•ァイルåã¨ä¸??ã—ãªã?­£è¦è¡¨ç¾"                                                     ).append( CR );
408                    buf.append( "[ -modify=YYYYMMDD      ]?šæŒ‡å®šæ—¥ä»˜ã‘以é™ã«å¤‰æ›´ã•れãŸãƒ•ァイル"                                            ).append( CR );
409                    buf.append( "          YYYYMMDD   : YYYYMMDD å½¢å¼ã§ã®æŒ?®šæ—¥ã® 00:00:00 を基準時刻"                          ).append( CR );
410                    buf.append( "          TODAY      : 実行日㮠00:00:00 を基準時刻"                                                          ).append( CR );
411                    buf.append( "          YESTERDAY  : å®Ÿè¡Œæ—¥å‰æ—¥ã® 00:00:00 を基準時刻"                                                       ).append( CR );
412                    buf.append( "          LAST_WEEK  : 実行日ã®å…ˆé?(7æ—¥å‰? 00:00:00 を基準時刻"                                 ).append( CR );
413                    buf.append( "          MONTH      : 実行月㮠1日 00:00:00 を基準時刻"                                                      ).append( CR );
414                    buf.append( "          LAST_MONTH : å®Ÿè¡Œå‰æœˆã? åŒæ—¥ 00:00:00 を基準時刻"                                             ).append( CR );
415                    buf.append( "          LAST_YEAR  : 実行å‰å¹´ã® åŒæœˆåŒæ—¥ 00:00:00 を基準時刻"                                 ).append( CR );
416                    buf.append( "[ -useDIR=[false/true]  ]?šåˆ¤å®šã‚’ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªåã‚‚å«ã‚ã¦è¡Œã†ã‹ã©ã?‹(åˆæœŸå€¤:false)"   ).append( CR );
417                    buf.append( "[ -larger=サイズ(KByte) ]?šå¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå¤§ãã„ファイル"                             ).append( CR );
418                    buf.append( "[ -smaller=サイズ(KByte)]?šå¤§ãã•ãŒæŒ‡å®šã??«ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå°ã•ã?ƒ•ァイル"                             ).append( CR );
419                    buf.append( "[ -maxLevel=æœ?¤§éšŽå±¤æ•°  ]?šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®éšŽå±¤ã‚’下ãŒã‚‹æœ€å¤§æ•°(åˆæœŸå€¤:256)"                        ).append( CR );
420                    buf.append( "[ -useLineCnt=行数計ç®? ]?šãƒ•ァイルã®è¡Œæ•°ã‚’カウントã™ã‚‹ã‹ã©ã?‹(åˆæœŸå€¤:false)"              ).append( CR );
421                    buf.append( "[ -useMD5=MD5計算å?     ]?šãƒ•ァイルã®MD5計算を行ã†ã‹ã©ã?‹ã‚’指å®?åˆæœŸå€¤:false)"     ).append( CR );
422                    buf.append( "[ -inPath=入力å?通パス  ]?šBIKO作æ?用ã®ãƒ•ァイルパスã‹ã‚‰å‰Šé™¤ã™ã‚‹æ–?­—å?"                               ).append( CR );
423                    buf.append( "[ -outPath=出力追åŠ?ƒ‘ス ]?šBIKO作æ?用ã®ãƒ•ァイルパスã«è¿½åŠ?™ã‚‹æ–‡å­—å?"                               ).append( CR );
424                    buf.append( "[ -display=[false/true] ]?štrueã¯ã€æ¤œç´¢çжæ³ã‚’表示(åˆæœŸå€¤:false)"                                      ).append( CR );
425                    buf.append( "[ -debug=[false/true]   ]?štrueã¯ã€ãƒ‡ãƒãƒƒã‚°çжæ³ã‚’表示(åˆæœŸå€¤:false)"                            ).append( CR );
426                    buf.append( CR ).append( CR );
427                    buf.append( getArgument().usage() ).append( CR );
428    
429                    return buf.toString();
430            }
431    
432            /**
433             * ã“ã?クラスã¯ã€main メソãƒ?ƒ‰ã‹ã‚‰å®Ÿè¡Œã§ãã¾ã›ã‚“ã€?
434             *
435             * @param       args    コマンド引数é…å?
436             */
437            public static void main( final String[] args ) {
438                    LogWriter.log( new Process_FileSearch().usage() );
439            }
440    
441            /**
442             * ã“ã?クラスã¯ãƒ•ァイルをスタãƒ?‚¯ã‚’使用ã—ã¦å±•é–‹ã™ã‚‹å ´åˆã?
443             * 個ã?ã®çŠ¶æ…‹ã‚’ä¿æŒã™ã‚‹ç‚ºã®ã‚¯ãƒ©ã‚¹ã§ã™ã?
444             *
445             * @version  4.0
446             * @author   Kazuhiko Hasegawa
447             * @since    JDK5.0,
448             */
449            private static final class FileListStack {
450                    private int address ;
451                    private final File[] files;
452                    private final int level;
453    
454                    /**
455                     * コンストラクター
456                     * åˆæœŸå€¤ã‚’設定ã—ã¾ã™ã?
457                     * ファイルã®é…å?ã«ã¤ã?¦ã¯ã€ã‚³ãƒ”ã?ã›ãšãã?ã¾ã¾å†?ƒ¨é…å?ã«ã‚»ãƒ?ƒˆã—ã¦ã?¾ã™ã?
458                     *
459                     * @param files File[] ファイルã®é…å?(ファイルリスãƒ?
460                     * @param       level   レベル(æŒ?®šã?startフォルãƒ?‹ã‚‰ã?階層数)
461                     */
462                    FileListStack( final File[] files,final int level ) {
463                            this.files   = files;
464                            this.address = 0;
465                            this.level   = level;
466                    }
467    
468                    /**
469                     * ファイルリストã?アドレスを設定ã—ã¾ã™ã?
470                     * スタãƒ?‚¯ã‹ã‚‰å–り出ã—ãŸå¾Œã?é…å?ã‚’å‰å›žã?ç¶šãã‹ã‚‰ã‚µãƒ¼ãƒã™ã‚‹å?åˆã«ä½¿ç”¨ã—ã¾ã™ã?
471                     *
472                     * @param       address ファイルリストã?アドレス
473                     */
474                    void setAddress( final int address ) {
475                            this.address = address;
476                    }
477    
478                    /**
479                     * ファイルリストã?アドレスをå–りå?ã—ã¾ã™ã?
480                     *
481                     * @return      ファイルリストã?アドレス
482                     */
483                    int getAddress() {
484                            return address;
485                    }
486    
487                    /**
488                     * ファイルリストをå–り出ã—ã¾ã™ã?
489                     * ファイルã®é…å?ã«ã¤ã?¦ã¯ã€ã‚³ãƒ”ã?ã›ãšãã?ã¾ã¾å†?ƒ¨é…å?ã‚’è¿”ã—ã¦ã?¾ã™ã?
490                     *
491                     * @return File[] ファイルリス�
492                     */
493                    File[] getFileList() {
494                            return files;
495                    }
496    
497                    /**
498                     * 階層レベルをå–りå?ã—ã¾ã™ã?
499                     *
500                     * @return      レベル
501                     */
502                    int getLevel() {
503                            return level;
504                    }
505            }
506    }