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