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 のエスケープ記号(&amp;#xZZZZ;)に変換"                          ).append( CR );
239                    buf.append( "  getReplaceEscape : HTML のエスケープ記号(&amp;#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 のエスケープ記号(&amp;#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 のエスケープ記号(&amp;#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    }