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    }