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