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.plugin.table;
017
018 import java.io.File;
019 import java.io.PrintWriter;
020 import java.util.Map;
021
022 import org.opengion.fukurou.util.ErrorMessage;
023 import org.opengion.fukurou.util.FileUtil;
024 import org.opengion.fukurou.util.FixLengthData;
025 import org.opengion.fukurou.util.StringUtil;
026 import org.opengion.hayabusa.common.HybsSystem;
027 import org.opengion.hayabusa.common.HybsSystemException;
028 import org.opengion.hayabusa.db.AbstractTableFilter;
029 import org.opengion.hayabusa.db.DBTableModel;
030 import org.opengion.hayabusa.resource.ResourceFactory;
031 import org.opengion.hayabusa.resource.ResourceManager;
032
033 /**
034 * TableFilter_DBARG_OUT は、TableFilter インターフェースを継承した、DBTableModel 処ç�?”¨の
035 * 実è£?‚¯ラスですã?
036 *
037 * ここでは、テーブルä¸?¦§の検索結果より、GF81 のARG変数チェãƒ?‚¯ãƒ??ブルから
038 * å¿?¦�なæƒ??を取得し、ARG変数作æ?スクリプトを作æ?しますã?
039 * 出力ファイルは、オブジェクト名??.sql" とã�?�†命名規則で作æ?しますã?
040 * 検索ではã€?SYSTEM_ID,TBLSYU,OBJ_NAME,SEQNO,CLM,CLM_NAME,CLS_NAME,USE_LENGTH,MAX_LENGTH,TABLE_NAME)
041 * のé ?›®を取得するå¿?¦�がありますã?
042 *
043 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するかã?BODY 部にCSS形式で記述しますã?
044 * 【パラメータã€?
045 * {
046 * DIR : {@BASE_DIR}/sql/07_ARG ; 出力ファイルの基準フォルãƒ?å¿??)
047 * XML : false ; XML出力を行うかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
048 * }
049 *
050 * @og.formSample
051 * ●形式ï¼?
052 * select SYSTEM_ID,TBLSYU,OBJ_NAME,SEQNO,CLM,CLM_NAME,CLS_NAME,USE_LENGTH,MAX_LENGTH,TABLE_NAME from GF81
053 * â‘?<og:tableFilter classId="DBARG_OUT" keys="DIR" vals="{@BASE_DIR}/sql/07_ARG" />
054 *
055 * ② <og:tableFilter classId="DBARG_OUT" >
056 * {
057 * DIR : {@BASE_DIR}/sql/07_ARG ;
058 * XML : false ;
059 * }
060 * </og:tableFilter>
061 *
062 * @og.rev 5.6.6.0 (2013/07/05) keys の整合æ?チェãƒ?‚¯を追åŠ?
063 *
064 * @version 0.9.0 2000/10/17
065 * @author Kazuhiko Hasegawa
066 * @since JDK1.1,
067 */
068 public class TableFilter_DBARG_OUT extends AbstractTableFilter {
069 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
070 private static final String VERSION = "5.6.7.0 (2013/07/27)" ;
071
072 /**
073 * keys の整合æ?チェãƒ?‚¯を行うための初期設定を行いますã?
074 *
075 * @og.rev 5.6.6.1 (2013/07/12) keys の整合æ?チェãƒ?‚¯対å¿?
076 *
077 * @param keysMap keys の整合æ?チェãƒ?‚¯を行うための Map
078 */
079 @Override
080 protected void init( final Map<String,String> keysMap ) {
081 keysMap.put( "DIR" , "出力ファイルの基準フォルãƒ?å¿??)" );
082 keysMap.put( "XML" , "XML出力を行うかどã�?�‹[true/false]を指å®?初期値:false)" ); // 5.6.7.0 (2013/07/27) xml対å¿?
083 }
084
085 // 5.6.6.0 (2013/07/05) 検索é ?›®を増やしておきますã?
086 // private static final String[] KEYS = new String[] { "OBJ_NAME","CLM","CLS_NAME","USE_LENGTH","CLM_NAME" };
087 private static final String[] KEYS = new String[] { "SYSTEM_ID","TBLSYU","OBJ_NAME","SEQNO","CLM","CLM_NAME","CLS_NAME","USE_LENGTH","MAX_LENGTH","TABLE_NAME" };
088
089 private static final int SYSTEM_ID = 0;
090 private static final int TBLSYU = 1;
091 private static final int OBJ_NAME = 2;
092 private static final int SEQNO = 3;
093 private static final int CLM = 4;
094 private static final int CLM_NAME = 5;
095 private static final int CLS_NAME = 6;
096 private static final int USE_LENGTH = 7;
097 private static final int MAX_LENGTH = 8;
098 private static final int TABLE_NAME = 9;
099
100 // private static final String ENCODE = "Windows-31J" ;
101 private static final String ENCODE = "UTF-8" ; // 5.6.7.0 (2013/07/27) sqlã‚?UTF-8 で出åŠ?
102 // private static final String CR = HybsSystem.CR ; // 5.1.1.0 (2009/12/01) CR 定義をAbstractTableFilterで行うã€?
103
104 // 5.6.6.0 (2013/07/05) ヘッãƒ??部作æ?用
105 private static final String CMNT = "************************************************************************" ;
106
107 private static final int X = FixLengthData.X ; // type 定数
108 private static final int S = FixLengthData.S ; // type 定数
109 private static final int K = FixLengthData.K ; // type 定数
110 private static final int T = FixLengthData.T ; // addLen 定数
111 private static final int T3= FixLengthData.T3 ; // addLen 定数
112
113 /** 5.6.7.0 (2013/07/27) å�?¨®定数 */
114 protected static final String XML_START_TAG = "<?xml version='1.0' encoding='UTF-8'?>" + CR + "<ROWSET tableName='xxx'>";
115 protected static final String XML_END_TAG = "</ROWSET>";
116 protected static final String EXEC_START_TAG= "<EXEC_SQL>";
117 protected static final String EXEC_END_TAG = "</EXEC_SQL>";
118
119 /** XML形式かどã�?�‹ */
120 protected boolean isXml = false; // 5.6.7.0 (2013/07/27)
121
122 private ResourceManager resource = null; // 5.6.6.0 (2013/07/05) ヘッãƒ??用のリソース
123
124 /**
125 * DBTableModel処ç�?‚’実行しますã?
126 *
127 * @og.rev 4.0.0.0 (2007/11/28) メソãƒ?ƒ‰の戻りå?をチェãƒ?‚¯しますã?
128 * @og.rev 5.5.2.6 (2012/05/25) protected変数をã?private化したためã?getterメソãƒ?ƒ‰で取得するよã�?�«変更
129 * @og.rev 5.6.7.0 (2013/07/27) xml 出力対å¿?
130 *
131 * @return 処ç�?µ�果のDBTableModel
132 */
133 public DBTableModel execute() {
134 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソãƒ?ƒ‰追åŠ?
135
136 isXml = StringUtil.nval( getValue( "XML" ), false ); // 5.6.7.0 (2013/07/27) xml 出力対å¿?
137
138 int[] clmNo = getTableColumnNo( KEYS );
139
140 File dir = new File( getValue( "DIR" ) );
141 if( ! dir.exists() && !dir.mkdirs() ) {
142 String errMsg = "æ‰?®šã?フォルãƒ?�Œ作æ?できませんでしたã€?" + dir + "]" ;
143 // 4.3.4.4 (2009/01/01)
144 throw new HybsSystemException( errMsg );
145 }
146
147 // カンãƒ?カラãƒ?クラス,(,桁数,),記号(--),表示é ?名称
148 // 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用
149 // FixLengthData fixData = new FixLengthData(6);
150
151 // 5.6.6.0 (2013/07/05) カラãƒ??表示é ?‚‚出力しますã?
152 // int[] addLen = new int[] { 1,5,5,1 }; // å�?ƒ‡ータ間ã?スペã?ス
153 // int[] type = new int[] { X,X,X,K }; // å�?ƒ‡ータの種別 X:半è§?S:空白前埋ã‚?K:全角混在
154 // カンãƒ?カラãƒ?クラス,(,桁数,),記号(--),表示é ?名称
155 int[] addLen = new int[] { 0,T,0,0,0,T3,0,1,0 }; // å�?ƒ‡ータ間ã?スペã?ス
156 int[] type = new int[] { X,X,X,X,S,X, X,S,K }; // å�?ƒ‡ータの種別 X:半è§?S:空白前埋ã‚?K:全角混在
157 // fixData.setAddLength( addLen );
158 // fixData.setType( type );
159 FixLengthData fixData = new FixLengthData( addLen,type );
160
161 String[] data = null;
162 String oldObjName = null;
163
164 int rowCnt = table.getRowCount();
165 for( int row=0; row<rowCnt; row++ ) {
166 String objName = null;
167 try {
168 data = table.getValues( row );
169 objName = data[clmNo[OBJ_NAME]];
170
171 // 5.6.6.0 (2013/07/05) 初めにä¸?º¦ã�?�‘作æ?しておきますã?
172 if( resource == null ) {
173 String systemId = data[clmNo[SYSTEM_ID]];
174 resource = ResourceFactory.newInstance( systemId,"ja",false );
175 }
176
177 boolean blk = ! objName.equals( oldObjName ) ;
178 if( row > 0 && blk ) {
179 // 5.6.7.0 (2013/07/27) xml 出力対å¿?
180 // PrintWriter writer = FileUtil.getPrintWriter( new File( dir,oldObjName + ".sql" ),ENCODE );
181 PrintWriter writer = FileUtil.getPrintWriter( new File( dir,oldObjName + ( isXml ? ".xml" : ".sql" ) ),ENCODE );
182 if( isXml ) { writer.println( XML_START_TAG ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
183 writer.print( makeHeadLine( oldObjName ) );
184 writer.print( fixData.getAllFixData() );
185 writer.println( makeEndLine( oldObjName ) );
186 if( isXml ) { writer.println( XML_END_TAG ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
187 writer.close();
188 fixData.clear();
189 }
190
191 String[] outData = makeLineList( clmNo,data,blk );
192 fixData.addListData( outData );
193
194 oldObjName = objName ;
195 }
196 catch( RuntimeException ex ) {
197 ErrorMessage errMessage = makeErrorMessage( "TableFilter_DBARG_OUT Error",ErrorMessage.NG );
198 errMessage.addMessage( row+1,ErrorMessage.NG,"ARG",ex.getMessage() );
199 errMessage.addMessage( row+1,ErrorMessage.NG,"ARG",StringUtil.array2csv( data ) );
200 errMessage.addMessage( row+1,ErrorMessage.NG,"ARG","OBJ_NAME=[" + objName + "]" );
201 }
202 }
203
204 // 常に、ä¸?›žり遅れてãƒ??タ出力してã�?‚‹為、最後ã?ãƒ??タをå?力しておくå¿?¦�があるã€?
205 // 5.6.7.0 (2013/07/27) xml 出力対å¿?
206 // PrintWriter writer = FileUtil.getPrintWriter( new File( dir,oldObjName + ".sql" ),ENCODE );
207 PrintWriter writer = FileUtil.getPrintWriter( new File( dir,oldObjName + ( isXml ? ".xml" : ".sql" ) ),ENCODE );
208 if( isXml ) { writer.println( XML_START_TAG ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
209 writer.print( makeHeadLine( oldObjName ) );
210 writer.print( fixData.getAllFixData() );
211 writer.println( makeEndLine( oldObjName ) );
212 if( isXml ) { writer.println( XML_END_TAG ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
213 writer.close();
214 fixData.clear();
215
216 return table;
217 }
218
219 /**
220 * ヘッãƒ??として使用するæ–?—å?を作æ?しますã?
221 *
222 * @og.rev 5.6.6.0 (2013/07/05) ヘッãƒ??としてå�?¨®æƒ??をセãƒ?ƒˆしますã?
223 * @og.rev 5.6.7.0 (2013/07/27) xml 出力対å¿?
224 *
225 * @param objName オブジェクト名
226 *
227 * @return ヘッãƒ??として使用するæ–?—å?
228 */
229 private String makeHeadLine( final String objName ) {
230 // objName から、ARG を取り除ã�?�Ÿæ–?—å?がã?画面IDになるã?ずã?リソースから検索
231 String gamenId = objName.substring( 0,objName.length()-3 ); // 3æ–?—ã?ã€?ARG" åˆ?
232 String gamenNm = resource.getLabel( gamenId ) ;
233
234 String LINE1 = objName ;
235 String LINE2 = gamenId + " ( " + gamenNm + " )" ;
236 String LINE3 = "Created : " + HybsSystem.getDate() ;
237
238 int[] addLen = new int[] { 0,0,0 }; // å�?ƒ‡ータ間ã?スペã?ス
239 int[] type = new int[] { X,K,X }; // å�?ƒ‡ータの種別 X:半è§?S:空白前埋ã‚?K:全角混在
240 FixLengthData fixData = new FixLengthData( addLen,type );
241
242 String[][] outData = new String[][] {
243 { "/**", CMNT , "**/" },
244 { "/* ", LINE1, " */" },
245 { "/* ", LINE2, " */" },
246 { "/* ", LINE3, " */" },
247 { "/**", CMNT , "**/" },
248 };
249
250 // 5.6.6.0 (2013/07/05) 簡易メソãƒ?ƒ‰を利用
251 fixData.addAllListData( outData );
252
253 // for( int i=0; i<outData.length; i++ ) {
254 // fixData.addListData( outData[i] );
255 // }
256
257 // StringBuilder buf = new StringBuilder();
258 // for( int i=0; i<outData.length; i++ ) {
259 // buf.append( fixData.getFixData( i ) ).append( CR );
260 // }
261
262 StringBuilder buf = new StringBuilder();
263 fixData.getAllFixData( buf );
264
265 // buf.append( "DROP TYPE " ).append( objName ).append( "_ARRAY;" ).append( CR );
266
267 if( isXml ) { buf.append( EXEC_START_TAG ).append( CR ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
268 buf.append( "DROP TYPE " ).append( objName ).append( "_ARRAY" );
269 if( isXml ) { buf.append( CR ).append( EXEC_END_TAG ).append( CR ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
270 else { buf.append( ";" ).append( CR ); }
271
272 if( isXml ) { buf.append( EXEC_START_TAG ).append( CR ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
273 buf.append( "CREATE OR REPLACE TYPE " ).append( objName ).append( " AS OBJECT" ).append( CR );
274 buf.append( " (" ).append( CR );
275
276 return buf.toString() ;
277 }
278
279 /**
280 * å�?¡Œに相当する文字å?の配å?を作æ?しますã?
281 * カンãƒ?カラãƒ?クラス,(,桁数,),記号(--),表示é ?名称
282 *
283 * @og.rev 5.5.1.9 (2012/04/18) useLen.length=0対å¿?
284 * @og.rev 5.6.6.0 (2013/07/05) カラãƒ??表示é ?‚‚出力しますã?
285 *
286 * @param clmNo カラãƒ?•ª号配å?
287 * @param data ?‘行å?の入力データ配å?
288 * @param first æœ??の行かどã�?�‹[true:æœ??/false:それ以降]
289 *
290 * @return ?‘行å?に相当する結果配å?(カンãƒ?カラãƒ?クラス(桁数),コメント記号,表示é ?名称)
291 */
292 private String[] makeLineList( final int[] clmNo,final String[] data,final boolean first ) {
293 // カンãƒ?カラãƒ?クラス(桁数),記号(--),表示é ?名称
294 // String[] outData = new String[4];
295 String[] outData = new String[9]; // 5.6.6.0 (2013/07/05) カラãƒ??表示é ?¿½åŠ?
296
297 outData[0] = ( first ) ? " " : " , " ; // 0:カンãƒ?
298 outData[1] = data[clmNo[CLM]] ; // 1:カラãƒ?
299
300 String clsName = data[clmNo[CLS_NAME]];
301 if( clsName.startsWith( "CLOB" ) || clsName.startsWith( "DATE" ) ) {
302 data[clmNo[USE_LENGTH]] = null;
303 }
304 String useLen = data[clmNo[USE_LENGTH]];
305 // if( useLen != null && ! useLen.equals( "0" ) ) {
306 if( useLen != null && ! useLen.equals( "0" ) && useLen.length() > 0 ) { // 5.5.1.9 (2012/04/19)
307 // outData[2] = clsName + "(" + useLen + ")" ; // 2:クラス(桁数)
308 outData[2] = clsName ; // 2:クラス
309 outData[3] = " ( " ; // 3:(
310 outData[4] = useLen ; // 4:桁数
311 outData[5] = " )" ; // 5:)
312 }
313 else {
314 outData[2] = clsName ; // NUMBER型桁数オープン対応ã?ARGで使えるか不æ?ã€?
315 }
316
317 String seqno = data[clmNo[SEQNO]] ; // 表示é ?
318 String nameJA = data[clmNo[CLM_NAME]] ; // 名称
319 if( nameJA != null ) {
320 outData[6] = "-- " ; // 3:コメント記号
321 outData[7] = seqno ; // 4:表示é ?
322 outData[8] = nameJA ; // 5:名称
323 }
324
325 return outData ;
326 }
327
328 /**
329 * æœ?¾Œã?行に相当する文字å?を作æ?しますã?
330 *
331 * @og.rev 5.6.7.0 (2013/07/27) xml 出力対å¿?
332 *
333 * @param objName オブジェクト名
334 *
335 * @return æœ?¾Œã?行に相当する文字å?
336 */
337 private String makeEndLine( final String objName ) {
338
339 StringBuilder buf = new StringBuilder();
340 // buf.append( " ) ;" ).append( CR );
341 buf.append( " )" );
342
343 if( isXml ) { buf.append( CR ).append( EXEC_END_TAG ).append( CR ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
344 else { buf.append( ";" ).append( CR ).append( "/" ).append( CR ); }
345 // buf.append( "/" ).append( CR );
346 buf.append( CR );
347
348 if( isXml ) { buf.append( EXEC_START_TAG ).append( CR ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
349 buf.append( "CREATE OR REPLACE TYPE " ).append( objName ).append( "_ARRAY" );
350 buf.append( " AS VARRAY(1000) OF " ).append( objName );
351 // buf..append( ";" ).append( CR );
352 if( isXml ) { buf.append( CR ).append( EXEC_END_TAG ); } // 5.6.7.0 (2013/07/27) xml 出力対å¿?
353 else { buf.append( ";" ).append( CR ).append( "/" ); }
354 // buf.append( "/" );
355
356 return buf.toString() ;
357 }
358 }