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 }