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.HybsEntry ; 020 import org.opengion.fukurou.util.LogWriter; 021 022 import java.util.Map ; 023 import java.util.LinkedHashMap ; 024 025 /** 026 * Process_TableFilter は、上流から受け取ったデータをフィルタする? 027 * ChainProcess インターフェースの実?ラスです? 028 * 029 * 上?プロセスチェインの??タは上流から下流へと渡されます?)から 030 * 受け取ったLineModel を?に??目のフィルタリングを行います? 031 * 条件が?立した?合?、下流に流します??の条件を指定できますが? 032 * すべて AND で判定されます? 033 * (設定条件すべてを?す?合?み、下流に??タを流します?) 034 * 035 * 引数??中にスペ?スを含??合?、ダブルコー??ション("") で括って下さ?? 036 * 引数??の ?』?前後には、スペ?スは挟めません。??key=value の様に 037 * 繋げてください? 038 * 039 * @og.formSample 040 * Process_TableFilter 041 * 042 * [ -prefix_XXXX=接頭? ] ??目?XXXX)が???接頭辞で始まる?合?条件成立? 043 * [ -suffix_XXXX=接尾? ] ??目?XXXX)が???接尾辞で終わる?合?条件成立? 044 * [ -instr_XXXX=部?字? ] ??目?XXXX)が???部?字?と??する場合?条件成立? 045 * [ -equals_XXXX=?? ] ??目?XXXX)が???と??する場合?条件成立?" 046 + CR + "??は、大?小文字?区別しません?equalsIgnoreCase)"; 047 * [ -match_XXXX=正規表現 ] ??目?XXXX)が?正規表現と??する場合?条件成立? 048 * [ -unmatch_XXXX=正規表現 ] ??目?XXXX)が?正規表現と??しな??合?条件成立? 049 * [ -const_XXXX=固定? ] ??const_FGJ=1 050 * ??XXXX)に、固定?を設定します? 051 * [ -replace_XXXX=固定? ] ??replace_BIKO="YYYY⇒ZZZZ" (????、で区?ます?) 052 * ??XXXX)の??から、YYYY と??を ZZZZ に置換します? 053 * [ -display=false|true ] ?結果を標準?力に表示する(true)かしな?false)?初期値:false[表示しない]) 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059 public class Process_TableFilter extends AbstractProcess implements ChainProcess { 060 /** replace_ で使用する区?記号 {@value} */ 061 public static final char REP_SEP = '? ; // 4.3.1.1 (2008/08/24) 062 063 private static final String PREFIX_KEY = "prefix_" ; 064 private static final String SUFFIX_KEY = "suffix_" ; 065 private static final String INSTR_KEY = "instr_" ; 066 private static final String EQUALS_KEY = "equals_" ; 067 private static final String MATCH_KEY = "match_" ; 068 private static final String UNMATCH_KEY = "unmatch_"; 069 private static final String CONST_KEY = "const_" ; 070 private static final String REPLACE_KEY = "replace_" ; // 4.3.1.1 (2008/08/24) 071 072 private final LineModelFilter filter = new LineModelFilter(); 073 074 private boolean display = false; // 表示しな? 075 076 private String[] cnstClm = null; // 固定?を設定するカラ? 077 private int[] cnstClmNos = null; // 固定?を設定するカラ?号 078 private String[] constVal = null; // カラ?号に対応した固定? 079 080 // 4.3.1.1 (2008/08/24) 置換関係に?な??タ 081 private String[] repClm = null; // 置換を設定するカラ? 082 private int[] repClmNos = null; // 置換を設定するカラ?号 083 private String[] repValFrom = null; // カラ?号に対応した置換??? 084 private String[] repValTo = null; // カラ?号に対応した置換後文字? 085 086 private boolean firstRow = true; // ??の?目 087 private int count = 0; 088 089 private static final Map<String,String> mustProparty ; // ?プロパティ???チェ?用 Map 090 private static final Map<String,String> usableProparty ; // ?プロパティ?整合?チェ? Map 091 092 static { 093 mustProparty = new LinkedHashMap<String,String>(); 094 095 usableProparty = new LinkedHashMap<String,String>(); 096 usableProparty.put( PREFIX_KEY , "??XXXX)が???接頭辞で始まる?合?条件成立?" ); 097 usableProparty.put( SUFFIX_KEY , "??XXXX)が???接尾辞で終わる?合?条件成立?" ); 098 usableProparty.put( INSTR_KEY , "??XXXX)が???部?字?と??する場合?条件成立?" ); 099 usableProparty.put( EQUALS_KEY , "??XXXX)が???と??する場合?条件成立?" + 100 CR + "(大?小文字?区別しな?" ); 101 usableProparty.put( MATCH_KEY , "??XXXX)が?正規表現と??する場合?条件成立?" ); 102 usableProparty.put( UNMATCH_KEY, "??XXXX)が?正規表現と??しな??合?条件成立?" ); 103 usableProparty.put( CONST_KEY , "??XXXX)に、固定?を設定します?" ); 104 // 4.3.1.1 (2008/08/24) 置換関? 105 usableProparty.put( REPLACE_KEY , "??XXXX)の??から、YYYY と??を ZZZZ に置換します?" ); 106 usableProparty.put( "display" , "結果を標準?力に表示する(true)かしな?false)? + 107 CR + "(初期値:false:表示しな?" ); 108 } 109 110 /** 111 * ?ォルトコンストラクター? 112 * こ?クラスは、動??されます??ォルトコンストラクターで? 113 * super クラスに対して、?な初期化を行っておきます? 114 * 115 */ 116 public Process_TableFilter() { 117 super( "org.opengion.fukurou.process.Process_TableFilter",mustProparty,usableProparty ); 118 } 119 120 /** 121 * プロセスの初期化を行います?初めに??、呼び出されます? 122 * 初期処?ファイルオープン??オープン?に使用します? 123 * 124 * @og.rev 4.3.1.1 (2008/08/24) 置換関係対? 125 * 126 * @param paramProcess ??タベ?スの接続???などを持って?オブジェク? 127 */ 128 public void init( final ParamProcess paramProcess ) { 129 Argument arg = getArgument(); 130 131 display = arg.getProparty( "display",display ); 132 133 HybsEntry[] entry = arg.getEntrys( PREFIX_KEY ); 134 for( int i=0; i<entry.length; i++ ) { 135 filter.add( FilterOperation.PREFIX, entry[i].getKey(), entry[i].getValue() ); 136 } 137 138 entry = arg.getEntrys( SUFFIX_KEY ); 139 for( int i=0; i<entry.length; i++ ) { 140 filter.add( FilterOperation.SUFFIX, entry[i].getKey(), entry[i].getValue() ); 141 } 142 143 entry = arg.getEntrys( INSTR_KEY ); 144 for( int i=0; i<entry.length; i++ ) { 145 filter.add( FilterOperation.INSTR, entry[i].getKey(), entry[i].getValue() ); 146 } 147 148 entry = arg.getEntrys( EQUALS_KEY ); 149 for( int i=0; i<entry.length; i++ ) { 150 filter.add( FilterOperation.EQUALS, entry[i].getKey(), entry[i].getValue() ); 151 } 152 153 entry = arg.getEntrys( MATCH_KEY ); 154 for( int i=0; i<entry.length; i++ ) { 155 filter.add( FilterOperation.MATCH, entry[i].getKey(), entry[i].getValue() ); 156 } 157 158 entry = arg.getEntrys( UNMATCH_KEY ); 159 for( int i=0; i<entry.length; i++ ) { 160 filter.add( FilterOperation.UNMATCH, entry[i].getKey(), entry[i].getValue() ); 161 } 162 163 HybsEntry[] cnstKey = arg.getEntrys( CONST_KEY ); 164 int csize = cnstKey.length; 165 cnstClm = new String[csize]; 166 constVal = new String[csize]; 167 for( int i=0; i<csize; i++ ) { 168 cnstClm[i] = cnstKey[i].getKey(); 169 constVal[i] = cnstKey[i].getValue(); 170 } 171 172 // 4.3.1.1 (2008/08/24) 置換関? 173 HybsEntry[] repKey = arg.getEntrys( REPLACE_KEY ); 174 int rsize = repKey.length; 175 repClm = new String[rsize]; 176 repValFrom = new String[rsize]; 177 repValTo = new String[rsize]; 178 for( int i=0; i<rsize; i++ ) { 179 repClm[i] = repKey[i].getKey(); 180 String val = repKey[i].getValue(); 181 if( val != null ) { 182 int ad = val.indexOf( REP_SEP ); 183 if( ad >= 0 ) { 184 repValFrom[i] = val.substring( 0,ad ); 185 repValTo[i] = val.substring( ad+1 ); 186 } 187 else { 188 repValFrom[i] = val; 189 repValTo[i] = ""; 190 } 191 } 192 } 193 } 194 195 /** 196 * 引数の LineModel を??るメソ?です? 197 * 変換処?? LineModel を返します? 198 * 後続??行わな?????タのフィルタリングを行う場?は? 199 * null ??タを返します?つまり?null ??タは、後続??行わな? 200 * フラグの代わりにも使用して?す? 201 * なお?変換処?? LineModel と、オリジナルの LineModel が? 202 * 同?、コピ?(クローン)か?、各処?ソ??決めて?す? 203 * ドキュメントに明記されて???合?、副作用が問題になる?合?? 204 * ???とに自?コピ?(クローン)して下さ?? 205 * 206 * @og.rev 4.3.1.1 (2008/08/24) 置換関係対? 207 * 208 * @param data オリジナルのLineModel 209 * 210 * @return 処?換後?LineModel 211 */ 212 public LineModel action( final LineModel data ) { 213 count++ ; 214 215 // if( display ) { println( data.dataLine() ); } 216 217 if( !filter.filter( data ) ) { 218 return null; // 不?? 219 } 220 221 if( firstRow ) { 222 int csize = cnstClm.length; 223 cnstClmNos = new int[csize]; 224 for( int i=0; i<csize; i++ ) { 225 cnstClmNos[i] = data.getColumnNo( cnstClm[i] ); 226 } 227 228 // 4.3.1.1 (2008/08/24) 置換関係対? 229 int rsize = repClm.length; 230 repClmNos = new int[rsize]; 231 for( int i=0; i<rsize; i++ ) { 232 repClmNos[i] = data.getColumnNo( repClm[i] ); 233 } 234 235 firstRow = false; 236 } 237 238 for( int i=0; i<cnstClm.length; i++ ) { 239 data.setValue( cnstClmNos[i],constVal[i] ); 240 } 241 242 // 4.3.1.1 (2008/08/24) 置換関係対? 243 for( int i=0; i<repClm.length; i++ ) { 244 String val = String.valueOf( data.getValue( repClmNos[i] ) ); 245 if( val != null ) { 246 val = val.replaceAll( repValFrom[i],repValTo[i] ); 247 data.setValue( repClmNos[i],val ); 248 } 249 } 250 251 if( display ) { println( data.dataLine() ); } // 5.1.2.0 (2010/01/01) display の条件変更 252 return data; 253 } 254 255 /** 256 * プロセスの終?行います??に??、呼び出されます? 257 * 終???ファイルクローズ??クローズ?に使用します? 258 * 259 * @og.rev 4.3.1.1 (2008/08/24) 置換関係対? 260 * 261 * @param isOK ト?タルで、OK?たかど?[true:成功/false:失敗] 262 */ 263 public void end( final boolean isOK ) { 264 cnstClm = null; // 固定?を設定するカラ? 265 cnstClmNos = null; // 固定?を設定するカラ?号 266 constVal = null; // カラ?号に対応した固定? 267 268 repClm = null; // 置換を設定するカラ? 269 repClmNos = null; // 置換を設定するカラ?号 270 repValFrom = null; // カラ?号に対応した置換??? 271 repValTo = null; // カラ?号に対応した置換後文字? 272 } 273 274 /** 275 * プロセスの処?果のレポ?ト表現を返します? 276 * 処??ログラ?、?力件数、?力件数などの??です? 277 * こ???をそのまま、標準?力に出すことで、結果レポ?トと出来るよ? 278 * 形式で出してください? 279 * 280 * @return 処?果のレポ?? 281 */ 282 public String report() { 283 String report = "[" + getClass().getName() + "]" + CR 284 + TAB + "Model Filter : " + filter + CR 285 + TAB + "Output Count : " + count ; 286 287 return report ; 288 } 289 290 /** 291 * こ?クラスの使用方法を返します? 292 * 293 * @return こ?クラスの使用方? 294 */ 295 public String usage() { 296 StringBuilder buf = new StringBuilder(); 297 298 buf.append( "Process_TableFilter は、上流から受け取ったデータをフィルタする? ).append( CR ); 299 buf.append( "ChainProcess インターフェースの実?ラスです?" ).append( CR ); 300 buf.append( CR ); 301 buf.append( "上?プロセスチェインの??タは上流から下流へと渡されます?)から" ).append( CR ); 302 buf.append( "受け取ったLineModel を?に??目のフィルタリングを行います?" ).append( CR ); 303 buf.append( "条件が?立した?合?、下流に流します??の条件を指定できますが? ).append( CR ); 304 buf.append( "すべて AND で判定されます?" ).append( CR ); 305 buf.append( "(設定条件すべてを?す?合?み、下流に??タを流します?)" ).append( CR ); 306 buf.append( CR ); 307 buf.append( "引数??中に空白を含??合?、ダブルコー??ション(\"\") で括って下さ??" ).append( CR ); 308 buf.append( "引数??の ?』?前後には、空白は挟めません。??key=value の様に" ).append( CR ); 309 buf.append( "繋げてください? ).append( CR ); 310 buf.append( CR ).append( CR ); 311 buf.append( getArgument().usage() ).append( CR ); 312 313 return buf.toString(); 314 } 315 316 /** 317 * こ?クラスは、main メソ?から実行できません? 318 * 319 * @param args コマンド引数配? 320 */ 321 public static void main( final String[] args ) { 322 LogWriter.log( new Process_TableFilter().usage() ); 323 } 324 }