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    }