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 }