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.security.HybsCryptography;
019 import org.opengion.fukurou.util.Argument;
020 import org.opengion.fukurou.util.StringUtil;
021 import org.opengion.fukurou.util.LogWriter;
022
023 import java.util.Map ;
024 import java.util.LinkedHashMap ;
025
026 /**
027 * Process_StringUtil は、上流から受け取ったデータをStringUtilクラスの特定ã?
028 * メソãƒ?ƒ‰でãƒ??タ変換する、CainProcess インターフェースの実è£?‚¯ラスですã?
029 *
030 * 上æµ?プロセスチェインのãƒ??タは上流から下流へと渡されますã?)から
031 * LineModel をå?に、指定ã?カラãƒ??æ–?—を、変換しますã?
032 *
033 * 現時点で利用できるStringUtil のメソãƒ?ƒ‰は、下記ã?通りですã?
034 * urlEncode : UTF-8 で、URLエンコードを行うã€?
035 * rTrim : æ–?—å?の後ろのスペã?スを削除
036 * htmlFilter : HTML上ã?エスケープ文字を変換
037 * code39 : CODE39 の æ–?—å?を作æ?(チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆ付き)
038 * getUnicodeEscape : HTML のエスケープ記号(&#xZZZZ;)に変換
039 * getReplaceEscape : HTML のエスケープ記号(&#xZZZZ;)を戻ã�?
040 * spanCut : 引数からspanタグを取り除ã�?
041 *
042 * HybsCryptography のメソãƒ?ƒ‰も呼び出せますã?
043 * getMD5 : MessageDigestにより、MD5 でハッシュしたæ–?—に変換
044 * encrypt : Hybs独自の暗号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)
045 * decrypt : Hybs独自の復号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)
046 *
047 * 引数æ–?—å?中にスペã?スを含ã‚??合ã?、ダブルコーãƒ??ション("") で括って下さã�??
048 * 引数æ–?—å?の ã€?』ã?前後には、スペã?スは挟めません。å¿?�šã€?key=value の様に
049 * 繋げてくださいã€?
050 *
051 * @og.formSample
052 * Process_StringUtil -action=getMD5|encrypt|decrypt|code39|getUnicodeEscape|getReplaceEscape|?¥?¥?¥ -keys=AA,BB,CC
053 *
054 * -action=ESC|REV ?šStringUtilクラスの特定ã?メソãƒ?ƒ‰名をæŒ?®šしまã�?å¿??)ã€?
055 * urlEncode|rTrim|htmlFilter|getMD5|code39|getUnicodeEscape|getReplaceEscape|spanCut
056 * -keys=AA,BB,CC ?š変換するカラãƒ?‚’CSV形式でè¤?•°æŒ?®šできまã�?å¿??)ã€?
057 * [ -display=[false/true]] ?š結果を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
058 * [ -debug=[false/true] ] ?šデバッグæƒ??を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
059 *
060 * @og.rev 5.0.0.2 (2009/09/15) 新規クラス作æ?
061 *
062 * @version 0.9.0 2004/02/27
063 * @author Kazuhiko Hasegawa
064 * @since JDK5.0,
065 */
066 public class Process_StringUtil extends AbstractProcess implements ChainProcess {
067
068 private static final String STR_ACTION_BASE = "org.opengion.fukurou.process.Process_StringUtil$SU_" ;
069
070 private String keys = null; // 変換するカラãƒ?��配å?のアドレス
071 private int[] clmNos = null; // 変換するカラãƒ?��配å?のアドレス
072 private boolean display = false; // 表示しなã�?
073 private boolean debug = false; // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
074
075 private boolean firstRow = true; // æœ??のä¸?¡Œ目
076 private int count = 0;
077 private StrAction stAction = null; // Ver 5.0.0.2 (2009/09/15)
078
079 private static final Map<String,String> mustProparty ; // ?»プロパティ?½å¿??チェãƒ?‚¯用 Map
080 private static final Map<String,String> usableProparty ; // ?»プロパティ?½整合æ?チェãƒ?‚¯ Map
081
082 static {
083 mustProparty = new LinkedHashMap<String,String>();
084 mustProparty.put( "action", "StringUtilの特定ã?メソãƒ?ƒ‰を指定しまã�?å¿??)" +
085 CR + "urlEncode , rTrim , htmlFilter , getMD5 , encrypt , decrypt , code39 , getUnicodeEscape , getReplaceEscape , spanCut" );
086
087 mustProparty.put( "keys", "変換するカラãƒ?‚’CSV形式でè¤?•°æŒ?®šできまã�?å¿??)ã€? );
088
089 usableProparty = new LinkedHashMap<String,String>();
090 usableProparty.put( "display", "結果を標準å?力に表示する(true)かしなã�?false)ã�? +
091 CR + " (初期値:false[表示しない])" );
092 usableProparty.put( "debug", "ãƒ?ƒ�ãƒ?‚°æƒ??を標準å?力に表示する(true)かしなã�?false)ã�? +
093 CR + "(初期値:false:表示しなã�?" ); // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
094 }
095
096 /**
097 * ãƒ?ƒ•ォルトコンストラクターã€?
098 * こã?クラスは、動çš?½œæ?されますã?ãƒ?ƒ•ォルトコンストラクターでã€?
099 * super クラスに対して、å¿?¦�な初期化を行っておきますã?
100 *
101 */
102 public Process_StringUtil() {
103 super( "org.opengion.fukurou.process.Process_StringUtil",mustProparty,usableProparty );
104 }
105
106 /**
107 * プロセスの初期化を行いますã?初めにä¸?º¦ã�?�‘、呼び出されますã?
108 * 初期処ç�?ファイルオープンã€?¼¤?¢オープンç?に使用しますã?
109 *
110 * @param paramProcess ãƒ??タベã?スの接続å?æƒ??などを持ってã�?‚‹オブジェクãƒ?
111 */
112 public void init( final ParamProcess paramProcess ) {
113 Argument arg = getArgument();
114
115 keys = arg.getProparty( "keys",keys );
116 display = arg.getProparty( "display",display );
117 debug = arg.getProparty("debug",debug); // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
118 // if( debug ) { println( arg.toString() ); } // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
119
120 String act = arg.getProparty( "action" );
121
122 stAction = (StrAction)StringUtil.newInstance( STR_ACTION_BASE + act );
123 }
124
125 /**
126 * 引数の LineModel をå?ç�?�™るメソãƒ?ƒ‰ですã?
127 * 変換処ç�?¾Œã? LineModel を返しますã?
128 * 後続å?ç�?‚’行わなã�??å�?ãƒ??タのフィルタリングを行う場å�?はã€?
129 * null ãƒ??タを返しますã?つまりã?null ãƒ??タは、後続å?ç�?‚’行わなã�?
130 * フラグの代わりにも使用してã�?�¾すã?
131 * なおã?変換処ç�?¾Œã? LineModel と、オリジナルの LineModel がã?
132 * 同ä¸?�‹、コピã?(クローン)かã?、各処ç�?ƒ¡ソãƒ?ƒ‰å†?�§決めてã�?�¾すã?
133 * ドキュメントに明記されてã�?�ªã�??合ã?、副作用が問題になるå?合ã?ã€?
134 * å�??ç�?�”とに自åˆ?�§コピã?(クローン)して下さã�??
135 *
136 * @param data オリジナルのLineModel
137 *
138 * @return 処ç�?¤‰換後ã?LineModel
139 */
140 public LineModel action( final LineModel data ) {
141 count++ ;
142 try {
143 if( firstRow ) {
144 makeColumnNos( data );
145 firstRow = false;
146 if( display ) { println( data.nameLine() ); } // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
147 }
148
149 if( debug ) { println( "Before:" + data.dataLine() ); } // 5.1.2.0 (2010/01/01) display の条件変更
150 for( int i=0; i<clmNos.length; i++ ) {
151 String val = (String)data.getValue( clmNos[i] ) ;
152 data.setValue( clmNos[i],stAction.change( val ) );
153 }
154
155 // if( display ) { printKey( count,data ); }
156 if( debug ) { println( "After :" + data.dataLine() ); } // 5.1.2.0 (2010/01/01) display の条件変更
157 else if( display ) { println( data.dataLine() ); } // 5.1.2.0 (2010/01/01) display の条件変更
158 }
159 catch( Throwable ex ) {
160 String errMsg = "row=[" + count + "]" + CR +
161 " data=[" + data + "]" + CR ;
162 throw new RuntimeException( errMsg,ex );
163 }
164 return data;
165 }
166
167 /**
168 * プロセスの終äº?‚’行いますã?æœ?¾Œにä¸?º¦ã�?�‘、呼び出されますã?
169 * 終äº??ç�?ファイルクローズã€?¼¤?¢クローズç?に使用しますã?
170 *
171 * @param isOK トã?タルで、OKã�?�£たかどã�?�‹[true:成功/false:失敗]
172 */
173 public void end( final boolean isOK ) {
174 keys = null; // 変換するカラãƒ?��配å?のアドレス
175 clmNos = null; // 変換するカラãƒ?��配å?のアドレス
176 }
177
178 /**
179 * プロセスの処ç�?µ�果のレポã?ト表現を返しますã?
180 * 処ç�??ログラãƒ?��、å?力件数、å?力件数などのæƒ??ですã?
181 * こã?æ–?—å?をそのまま、標準å?力に出すことで、結果レポã?トと出来るよã�?�ª
182 * 形式で出してくださいã€?
183 *
184 * @return 処ç�?µ�果のレポã?ãƒ?
185 */
186 public String report() {
187 String report = "[" + getClass().getName() + "]" + CR
188 + TAB + "Output Count : " + count ;
189
190 return report ;
191 }
192
193 /**
194 * カラãƒ?•ª号配å?を取得しますã?
195 * 繰返し処ç�?‚’行う場合に、事前にアドレスでアクセスできるように処ç�?�™るカラãƒ?•ª号ã‚?
196 * キャãƒ?‚·ュしておきますã?
197 *
198 * @param data LineModelオブジェクãƒ?
199 */
200 private void makeColumnNos( final LineModel data ) {
201 String[] clms = StringUtil.csv2Array( keys );
202 int size = clms.length;
203 clmNos = new int[size];
204 for( int i=0; i<size; i++ ) {
205 clmNos[i] = data.getColumnNo( clms[i] );
206 }
207 }
208
209 /**
210 * 画面出力用のフォーマットを作æ?しますã?
211 *
212 * @og.rev 5.7.3.0 (2014/02/07) 表示方法ã?変更のため、å»?¢
213 *
214 * @param rowNo ãƒ??タ読み取り件数
215 * @param data LineModelオブジェクãƒ?
216 */
217 // private void printKey( final int rowNo , final LineModel data ) {
218 // StringBuilder buf = new StringBuilder();
219 //
220 // buf.append( "row=[" ).append( rowNo ).append( "] : " );
221 // for( int i=0; i < clmNos.length; i++ ) {
222 // buf.append( data.getName( clmNos[i] ) );
223 // buf.append( " �" );
224 // buf.append( data.getValue( clmNos[i] ) );
225 // buf.append( " , " );
226 // }
227 //
228 // println( buf.toString() );
229 // }
230
231 /**
232 * こã?クラスの使用方法を返しますã?
233 *
234 * @return こã?クラスの使用方æ³?
235 */
236 public String usage() {
237 StringBuilder buf = new StringBuilder();
238
239 buf.append( "Process_StringUtil は、上流から受け取ったデータをStringUtilクラスの特定ã?" ).append( CR );
240 buf.append( "メソãƒ?ƒ‰でãƒ??タ変換する、CainProcess インターフェースの実è£?‚¯ラスですã?" ).append( CR );
241 buf.append( CR );
242 buf.append( "上æµ?プロセスチェインのãƒ??タは上流から下流へと渡されますã?)から" ).append( CR );
243 buf.append( " LineModel をå?に、指定ã?カラãƒ??æ–?—を、変換しますã?" ).append( CR );
244 buf.append( CR );
245 buf.append( "現時点で利用できるStringUtil のメソãƒ?ƒ‰は、下記ã?通りですã?" ).append( CR );
246 buf.append( " urlEncode : UTF-8 で、URLエンコードを行うã€? ).append( CR );
247 buf.append( " rTrim : æ–?—å?の後ろのスペã?スを削除" ).append( CR );
248 buf.append( " htmlFilter : HTML上ã?エスケープ文字を変換" ).append( CR );
249 buf.append( " code39 : CODE39 の æ–?—å?を作æ?(チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆ付き)" ).append( CR );
250 buf.append( " getUnicodeEscape : HTML のエスケープ記号(&#xZZZZ;)に変換" ).append( CR );
251 buf.append( " getReplaceEscape : HTML のエスケープ記号(&#xZZZZ;)を戻ã�? ).append( CR );
252 buf.append( " spanCut : 引数からspanタグを取り除ã�? ).append( CR );
253 buf.append( CR );
254 buf.append( "HybsCryptography のメソãƒ?ƒ‰も呼び出せますã?" ).append( CR );
255 buf.append( " getMD5 : MessageDigestにより、MD5 でハッシュしたæ–?—に変換" ).append( CR );
256 buf.append( " encrypt : Hybs独自の暗号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)" ).append( CR );
257 buf.append( " decrypt : Hybs独自の復号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)" ).append( CR );
258 buf.append( CR );
259 buf.append( "引数æ–?—å?中に空白を含ã‚??合ã?、ダブルコーãƒ??ション(\"\") で括って下さã�??" ).append( CR );
260 buf.append( "引数æ–?—å?の ã€?』ã?前後には、空白は挟めません。å¿?�šã€?key=value の様に" ).append( CR );
261 buf.append( "繋げてくださいã€? ).append( CR );
262 buf.append( CR ).append( CR );
263 buf.append( getArgument().usage() ).append( CR );
264
265 return buf.toString();
266 }
267
268 /**
269 * こã?クラスは、main メソãƒ?ƒ‰から実行できませんã€?
270 *
271 * @param args コマンド引数配å?
272 */
273 public static void main( final String[] args ) {
274 LogWriter.log( new Process_StringUtil().usage() );
275 }
276
277 /**
278 * インナã?クラスとして、å?通メソãƒ?ƒ‰を定義しまã�?I/Fの代わり)ã€?
279 */
280 public static class StrAction {
281 /**
282 * 引数を変換しますã?
283 *
284 * @param val 引数
285 * @return 変換された文字å?
286 */
287 public String change( final String val ) {
288 return val;
289 }
290 }
291
292 /**
293 * UTF-8 で、URLエンコードを行いますã?
294 */
295 public static class SU_urlEncode extends StrAction {
296 /**
297 * 引数を変換しますã?
298 *
299 * @param val 引数
300 * @return 変換された文字å?
301 */
302 @Override
303 public String change( final String val ) {
304 return StringUtil.urlEncode( val );
305 }
306 }
307
308 /**
309 * æ–?—å?の後ろのスペã?スを削除しますã?
310 * 注意ï¼?\u0020' (スペã?スæ–?? より小さã�?–‡字をåˆ?‚Š取りますã?
311 */
312 public static class SU_rTrim extends StrAction {
313 /**
314 * 引数を変換しますã?
315 *
316 * @param val 引数
317 * @return 変換された文字å?
318 */
319 @Override
320 public String change( final String val ) {
321 return StringUtil.rTrim( val );
322 }
323 }
324
325 /**
326 * HTML上ã?エスケープ文字を変換しますã?
327 */
328 public static class SU_htmlFilter extends StrAction {
329 /**
330 * 引数を変換しますã?
331 *
332 * @param val 引数
333 * @return 変換された文字å?
334 */
335 @Override
336 public String change( final String val ) {
337 return StringUtil.htmlFilter( val );
338 }
339 }
340
341 /**
342 * CODE39 の æ–?—å?を作æ?しますã?(チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆ付き)
343 */
344 public static class SU_code39 extends StrAction {
345 /**
346 * 引数を変換しますã?
347 *
348 * @param val 引数
349 * @return 変換された文字å?
350 */
351 @Override
352 public String change( final String val ) {
353 return StringUtil.code39( val,true );
354 }
355 }
356
357 /**
358 * Unicodeæ–?—å?の値ã‚?HTML のエスケープ記号(&#xZZZZ;)に変換しますã?
359 */
360 public static class SU_getUnicodeEscape extends StrAction {
361 /**
362 * 引数を変換しますã?
363 *
364 * @param val 引数
365 * @return 変換された文字å?
366 */
367 @Override
368 public String change( final String val ) {
369 return StringUtil.getUnicodeEscape( val );
370 }
371 }
372
373 /**
374 * HTML のエスケープ記号(&#xZZZZ;)をUnicodeæ–?—å?に戻しますã?
375 */
376 public static class SU_getReplaceEscape extends StrAction {
377 /**
378 * 引数を変換しますã?
379 *
380 * @param val 引数
381 * @return 変換された文字å?
382 */
383 @Override
384 public String change( final String val ) {
385 return StringUtil.getReplaceEscape( val );
386 }
387 }
388
389 /**
390 * 引数からspanタグを取り除ã�?�¦返しますã?
391 */
392 public static class SU_spanCut extends StrAction {
393 /**
394 * 引数を変換しますã?
395 *
396 * @param val 引数
397 * @return 変換された文字å?
398 */
399 @Override
400 public String change( final String val ) {
401 return StringUtil.spanCut( val );
402 }
403 }
404
405 /**
406 * MessageDigestにより、MD5 でハッシュしたæ–?—に変換しますã?
407 *
408 * @og.rev 5.2.2.0 (2010/11/01) util.StringUtil から security.HybsCryptography へ移å‹?
409 *
410 */
411 public static class SU_getMD5 extends StrAction {
412 /**
413 * 引数を変換しますã?
414 *
415 * @param val 引数
416 * @return 変換された文字å?
417 */
418 @Override
419 public String change( final String val ) {
420 return HybsCryptography.getMD5( val );
421 }
422 }
423
424 /**
425 * Hybs独自の暗号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)
426 *
427 * @og.rev 5.2.2.0 (2010/11/01) 新規追åŠ?
428 */
429 public static class SU_encrypt extends StrAction {
430 private HybsCryptography crpt = null;
431
432 /**
433 * 引数を変換しますã?
434 *
435 * @param val 引数
436 * @return 変換された文字å?
437 */
438 @Override
439 public String change( final String val ) {
440 if( crpt == null ) {
441 crpt = new HybsCryptography();
442 }
443 return crpt.encrypt( val );
444 }
445 }
446
447 /**
448 * Hybs独自の復号化を行いまã�?Hybså†?ƒ¨設定ã?秘å¯?�µ)
449 *
450 * @og.rev 5.2.2.0 (2010/11/01) 新規追åŠ?
451 */
452 public static class SU_decrypt extends StrAction {
453 private HybsCryptography crpt = null;
454
455 /**
456 * 引数を変換しますã?
457 *
458 * @param val 引数
459 * @return 変換された文字å?
460 */
461 @Override
462 public String change( final String val ) {
463 if( crpt == null ) {
464 crpt = new HybsCryptography();
465 }
466 return crpt.decrypt( val );
467 }
468 }
469 }