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.StringUtil;
020    import org.opengion.fukurou.util.LogWriter;
021    
022    import java.util.Map ;
023    import java.util.LinkedHashMap ;
024    
025    /**
026     * 【å»?­¢】Process_UnicodeEscape は、上流から受け取ったデータをエスケープ変換する
027     * ChainProcess インターフェースの実è£?‚¯ラスですã?
028     *
029     *  ※ 5.0.0.2 (2009/09/15) こã?クラスは、å»?­¢になりましたã€?
030     *     類似機è?に、Process_StringUtil を利用してくださいã€?
031     *     -action 引数に、getUnicodeEscape かã?getReplaceEscape を指定することでã€?
032     *     ESCAPE(変換)/REVERSE(戻ã�? のæŒ?®šと同ä¸??処ç�?‚’行いますã?
033     *
034     * 上æµ?プロセスチェインのãƒ??タは上流から下流へと渡されますã?)から受け取っã�?
035     * LineModel をå?に、指定ã?カラãƒ??UTF-8 æ–?­—コードと、HTML のエスケープ記号
036     * (&#xZZZZ;)æ–?­—との相互変換を行いますã?
037     * 入力文字を、キャラクタ(char)型にåˆ?§£しã?(&#xZZZZ;)に変換してã�?��ますã?
038     * よってã€??常に?‘文å­?Shift-JISで?’Byte,UTF-8で?“Byte)がã??˜Byteになりますã?
039     * こã?変換された文字å?をã?HTML上でそã?まま取り出すと、å?のUnicodeæ–?­—に戻る為ã€?
040     * 通常のShift-JISでは、扱えなã�?–‡å­?中国語など)でも表示可能になりますã?
041     *
042     * 引数æ–?­—å?中にスペã?スを含ã‚??合ã?、ダブルコーãƒ??ション("") で括って下さã�??
043     * 引数æ–?­—å?の ã€?』ã?前後には、スペã?スは挟めません。å¿?�šã€?key=value の様に
044     * 繋げてくださいã€?
045     *
046     * @og.formSample
047     *  Process_UnicodeEscape -action=ESC|REV [-keys=AA,BB,CC] [-all=false|true]
048     *
049     *     -action=ESC|REV        ?šESCAPE(変換)/REVERSE(戻ã�? を指定しますã?先é?æ–?­—で判定しまã�?å¿??)ã€?
050     *   [ -keys=AA,BB,CC       ] ?š変換するカラãƒ?‚’CSV形式でè¤?•°æŒ?®šできますã?
051     *   [ -all=[false/true]    ] ?šå?カラãƒ?‚’変換する場合ã?、trueを設定しまã�?初期値:false[部åˆ?Œ‡定])
052     *   [ -display=[false/true]] ?š結果を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
053     *   [ -debug=[false/true]  ] ?šデバッグæƒ??を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
054     *
055     * @og.rev 5.0.0.2 (2009/09/15) å»?­¢クラスですã?
056     * @deprecated 5.0.0.2 (2009/09/15) å»?­¢クラスですã?類似機è?に、Process_StringUtil を利用してくださいã€?
057     * @version  0.9.0  2004/02/27
058     * @author   Kazuhiko Hasegawa
059     * @since    JDK5.0,
060     */
061    @Deprecated public class Process_UnicodeEscape extends AbstractProcess implements ChainProcess {
062    
063            private boolean         isEscape        = true;         // 変換方æ³?true:Escape/false:Reverse)
064            private String          keys            = null;         // 変換するカラãƒ?��配å?のアドレス
065            private int[]           clmNos          = null;         // 変換するカラãƒ?��配å?のアドレス
066            private boolean         all                     = false;        // 部åˆ?Œ‡å®?
067            private boolean         display         = false;        // 表示しなã�?
068            private boolean         debug           = false;        // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
069    
070            private boolean         firstRow        = true;         // æœ??のä¸?¡Œ目
071            private int                     count           = 0;
072    
073            private static final Map<String,String> mustProparty   ;          // ?»プロパティ?½å¿??チェãƒ?‚¯用 Map
074            private static final Map<String,String> usableProparty ;          // ?»プロパティ?½整合æ?チェãƒ?‚¯ Map
075    
076            static {
077                    mustProparty = new LinkedHashMap<String,String>();
078                    mustProparty.put( "action",             "ESCAPE(変換)/REVERSE(戻ã�? を指定しまã�?å¿??)" );
079    
080                    usableProparty = new LinkedHashMap<String,String>();
081                    usableProparty.put( "keys",             "変換するカラãƒ?‚’CSV形式でè¤?•°æŒ?®šできますã?" );
082                    usableProparty.put( "all",              "全カラãƒ?‚’変換する場合ã?、trueを設定しますã?" + 
083                                                                                    CR + " (初期値:false:部åˆ?Œ‡å®?" );
084                    usableProparty.put( "display",  "結果を標準å?力に表示する(true)かしなã�?false)ã�? + 
085                                                                                    CR + " (初期値:false:表示しなã�?" );
086                    usableProparty.put( "debug",    "ãƒ?ƒ�ãƒ?‚°æƒ??を標準å?力に表示する(true)かしなã�?false)ã�? +
087                                                                                    CR + "(初期値:false:表示しなã�?" );                // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
088            }
089    
090            /**
091             * ãƒ?ƒ•ォルトコンストラクターã€?
092             * こã?クラスは、動çš?½œæ?されますã?ãƒ?ƒ•ォルトコンストラクターでã€?
093             * super クラスに対して、å¿?¦�な初期化を行っておきますã?
094             *
095             */
096            public Process_UnicodeEscape() {
097                    super( "org.opengion.fukurou.process.Process_UnicodeEscape",mustProparty,usableProparty );
098            }
099    
100            /**
101             * プロセスの初期化を行いますã?初めにä¸?º¦ã�?�‘、呼び出されますã?
102             * 初期処ç�?ファイルオープンã€?¼¤?¢オープンç­?に使用しますã?
103             *
104             * @param   paramProcess ãƒ??タベã?スの接続å?æƒ??などを持ってã�?‚‹オブジェクãƒ?
105             */
106            public void init( final ParamProcess paramProcess ) {
107                    Argument arg = getArgument();
108    
109                    keys            = arg.getProparty( "keys",keys );
110                    all                     = arg.getProparty( "all",all );
111                    display         = arg.getProparty( "display",display );
112                    debug           = arg.getProparty("debug",debug);                               // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
113    //              if( debug ) { println( arg.toString() ); }                      // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
114    
115                    String act              = arg.getProparty( "action" );
116    
117    
118                    if(      act.charAt( 0 ) == 'E' ) { isEscape = true;  }
119                    else if( act.charAt( 0 ) == 'R' ) { isEscape = false; }
120                    else {
121                            String errMsg = "action=[" + act + "] は、E(SCAPE) かã?R(EVERSE) を設定して下さã�??"
122                                                                    + "先é??‘文字目(大æ–?­?で判定してã�?�¾すã?";
123                            throw new RuntimeException( errMsg );
124                    }
125    
126                    if( ( keys == null || keys.length() == 0 ) && !all ) {
127                            String errMsg = "keys かã?all は設定して下さã�??"
128                                                                    + "keys=[" + keys + "], all=[" + all + "]";
129                            throw new RuntimeException( errMsg );
130                    }
131            }
132    
133            /**
134             * 引数の LineModel をå?ç�?�™るメソãƒ?ƒ‰ですã?
135             * 変換処ç�?¾Œã? LineModel を返しますã?
136             * 後続å?ç�?‚’行わなã�??å�?ãƒ??タのフィルタリングを行う場å�?はã€?
137             * null ãƒ??タを返しますã?つまりã?null ãƒ??タは、後続å?ç�?‚’行わなã�?
138             * フラグの代わりにも使用してã�?�¾すã?
139             * なおã?変換処ç�?¾Œã? LineModel と、オリジナルの LineModel がã?
140             * 同ä¸?�‹、コピã?(クローン)かã?、各処ç�?ƒ¡ソãƒ?ƒ‰å†?�§決めてã�?�¾すã?
141             * ドキュメントに明記されてã�?�ªã�??合ã?、副作用が問題になるå?合ã?ã€?
142             * å�??ç�?�”とに自åˆ?�§コピã?(クローン)して下さã�??
143             *
144             * @param   data        オリジナルのLineModel
145             *
146             * @return      処ç�?¤‰換後ã?LineModel
147             */
148            public LineModel action( final LineModel data ) {
149                    count++ ;
150                    try {
151                            if( firstRow ) {
152                                    makeColumnNos( data );
153                                    firstRow = false;
154                                    if( display ) { println( data.nameLine() ); }           // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
155                            }
156    
157                            for( int i=0; i<clmNos.length; i++ ) {
158                                    String val = (String)data.getValue( clmNos[i] ) ;
159    
160                                    if( isEscape ) {
161                                            val = StringUtil.getUnicodeEscape( val ) ;
162                                    }
163                                    else {
164                                            val = StringUtil.getReplaceEscape( val ) ;
165                                    }
166                                    data.setValue( clmNos[i],val );
167                            }
168    
169    //                      if( display ) { printKey( count,data ); }
170                            if( display ) { println( data.dataLine() ); }                   // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
171                    }
172                    catch( Throwable ex ) {
173                            String errMsg = "row=[" + count + "]" + CR +
174                                                    "    data=[" + data + "]" + CR ;
175                            throw new RuntimeException( errMsg,ex );
176                    }
177                    return data;
178            }
179    
180            /**
181             * プロセスの終äº?‚’行いますã?æœ?¾Œにä¸?º¦ã�?�‘、呼び出されますã?
182             * 終äº??ç�?ファイルクローズã€?¼¤?¢クローズç­?に使用しますã?
183             *
184             * @param   isOK トã?タルで、OKã�?�£たかどã�?�‹[true:成功/false:失敗]
185             */
186            public void end( final boolean isOK ) {
187                    keys            = null;         // 変換するカラãƒ?��配å?のアドレス
188                    clmNos          = null;         // 変換するカラãƒ?��配å?のアドレス
189            }
190    
191            /**
192             * プロセスの処ç�?µ�果のレポã?ト表現を返しますã?
193             * 処ç�??ログラãƒ?��、å?力件数、å?力件数などのæƒ??ですã?
194             * こã?æ–?­—å?をそのまま、標準å?力に出すことで、結果レポã?トと出来るよã�?�ª
195             * 形式で出してくださいã€?
196             *
197             * @return   処ç�?µ�果のレポã?ãƒ?
198             */
199            public String report() {
200                    String report = "[" + getClass().getName() + "]" + CR
201                                    + TAB + "Output Count : " + count ;
202    
203                    return report ;
204            }
205    
206            /**
207             * カラãƒ?•ª号配å?を取得しますã?
208             * 繰返し処ç�?‚’行う場合に、事前にアドレスでアクセスできるように処ç�?�™るカラãƒ?•ª号ã‚?
209             * キャãƒ?‚·ュしておきますã?
210             *
211             * @param       data  ラインモãƒ?ƒ«
212             */
213            private void makeColumnNos( final LineModel data ) {
214                    if( all ) {
215                            String[] names = data.getNames();
216                            int size = names.length;
217                            clmNos = new int[size];
218                            for( int i=0; i<size; i++ ) {
219                                    clmNos[i] = i;
220                            }
221                    }
222                    else {
223                            String[] clms = StringUtil.csv2Array( keys );
224                            int size = clms.length;
225                            clmNos = new int[size];
226                            for( int i=0; i<size; i++ ) {
227                                    clmNos[i] = data.getColumnNo( clms[i] );
228                            }
229                    }
230            }
231    
232            /**
233             * 画面出力用のフォーマットを作æ?しますã?
234             *
235             * @og.rev 5.7.3.0 (2014/02/07) 表示方法ã?変更のため、å»?­¢
236             *
237             * @param       rowNo  ãƒ??タ読み取り件数
238             * @param       data   ラインモãƒ?ƒ«
239             */
240    //      private void printKey( final int rowNo , final LineModel data ) {
241    //              StringBuilder buf = new StringBuilder();
242    //
243    //              buf.append( "row=[" ).append( rowNo ).append( "] : " );
244    //              for( int i=0; i < clmNos.length; i++ ) {
245    //                      buf.append( data.getName( clmNos[i] ) );
246    //                      buf.append( " �" );
247    //                      buf.append( data.getValue( clmNos[i] ) );
248    //                      buf.append( " , " );
249    //              }
250    //
251    //              println( buf.toString() );
252    //      }
253    
254            /**
255             * こã?クラスの使用方法を返しますã?
256             *
257             * @return      こã?クラスの使用方æ³?
258             */
259            public String usage() {
260                    StringBuilder buf = new StringBuilder();
261    
262                    buf.append( "Process_UnicodeEscape は、上流から受け取ったデータをエスケープ変換する"           ).append( CR );
263                    buf.append( "CainProcess インターフェースの実è£?‚¯ラスですã?"                                                               ).append( CR );
264                    buf.append( CR );
265                    buf.append( "上æµ?プロセスチェインのãƒ??タは上流から下流へと渡されますã?)から"                   ).append( CR );
266                    buf.append( " LineModel をå?に、指定ã?カラãƒ??UTF-8 æ–?­—コードと、HTML のエスケーãƒ?            ).append( CR );
267                    buf.append( "記号(&#xZZZZ;)æ–?­—との相互変換を行いますã?"                                                                 ).append( CR );
268                    buf.append( "入力文字を、キャラクタ(char)型にåˆ?§£しã?(&#xZZZZ;)に変換してã�?��ますã?"         ).append( CR );
269                    buf.append( "よってã€??常に?‘文å­?Shift-JISで?’Byte,UTF-8で?“Byte)がã??˜Byteになりますã?" ).append( CR );
270                    buf.append( "こã?変換された文字å?をã?HTML上でそã?まま取り出すと、å?のUnicodeæ–?­—に戻る為"    ).append( CR );
271                    buf.append( "通常のShift-JISでは、扱えなã�?–‡å­?中国語など)でも表示可能になりますã?"                    ).append( CR );
272                    buf.append( CR );
273                    buf.append( "引数æ–?­—å?中に空白を含ã‚??合ã?、ダブルコーãƒ??ション(\"\") で括って下さã�??" ).append( CR );
274                    buf.append( "引数æ–?­—å?の ã€?』ã?前後には、空白は挟めません。å¿?�šã€?key=value の様に"             ).append( CR );
275                    buf.append( "繋げてくださいã€?                                                                                                                              ).append( CR );
276                    buf.append( CR ).append( CR );
277                    buf.append( getArgument().usage() ).append( CR );
278    
279                    return buf.toString();
280            }
281    
282            /**
283             * こã?クラスは、main メソãƒ?ƒ‰から実行できませんã€?
284             *
285             * @param       args    コマンド引数配å?
286             */
287            public static void main( final String[] args ) {
288                    LogWriter.log( new Process_UnicodeEscape().usage() );
289            }
290    }