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 }