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 031 /** 032 * TableFilter_SEQUENCE は、TableUpda インターフェースを継承した、DBTableModel 処?の 033 * 実?ラスです? 034 * 035 * ここでは、シーケンス?の検索結果より、GF09 のシーケンス定義??ブルから 036 * ?な??を取得し、シーケンス作?スクリプトを作?します? 037 * 038 * こ?処?実行するには、DBTableModelのカラ?して? 039 * SYSTEM_ID,TBLSYU,SEQNAME,INCREBY,STARTVAL,MINVAL,MAXVAL,FGCYCLE,SUCACHE 040 * が?です? 041 * 042 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか?BODY 部にCSS形式で記述します? 043 * 【パラメータ? 044 * { 045 * DIR : {@BASE_DIR}/sql/install/03_SEQ ; 出力ファイルの基準フォル???) 046 * XML : false ; XML出力を行うかど?[true/false]を指定しま?初期値:false)? 047 * } 048 * 049 * @og.formSample 050 * ●形式? 051 * select SYSTEM_ID,TBLSYU,SEQNAME,INCREBY,STARTVAL,MINVAL,MAXVAL,FGCYCLE,SUCACHE from GF09 052 * 053 * ?<og:tableFilter classId="SEQUENCE" keys="DIR,XML" vals='"{@BASE_DIR}/sql/install/03_SEQ,"' /> 054 * 055 * ② <og:tableFilter classId="SEQUENCE" > 056 * { 057 * DIR : {@BASE_DIR}/sql/install/03_SEQ ; 058 * XML : false ; 059 * } 060 * </og:tableFilter> 061 * 062 * @og.rev 5.1.9.0 (2010/08/01) DB定義DB・シーケンス定義追? 063 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を追? 064 * 065 * @version 0.9.0 2010/08/01 066 * @author Hiroki Nakamura 067 * @since JDK1.1, 068 */ 069 public class TableFilter_SEQUENCE extends AbstractTableFilter { 070 //* こ?プログラ??VERSION??を設定します? {@value} */ 071 private static final String VERSION = "5.6.6.1 (2013/07/12)" ; 072 073 /** 074 * keys の整合?チェ?を行うための初期設定を行います? 075 * 076 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対? 077 * 078 * @param keysMap keys の整合?チェ?を行うための Map 079 */ 080 @Override 081 protected void init( final Map<String,String> keysMap ) { 082 keysMap.put( "DIR" , "出力ファイルの基準フォル???)" ); 083 keysMap.put( "XML" , "XML出力を行うかど?[true/false]を指?初期値:false)" ); 084 } 085 086 private static final String[] DBKEY = {"SYSTEM_ID","TBLSYU","SEQNAME","INCREBY","STARTVAL","MINVAL","MAXVAL","FGCYCLE","SUCACHE" }; 087 088 /** ??タのアクセス用の配?番号 {@value} */ 089 protected static final int SYSTEM_ID = 0; 090 /** ??タのアクセス用の配?番号 {@value} */ 091 protected static final int TBLSYU = 1; 092 /** ??タのアクセス用の配?番号 {@value} */ 093 protected static final int SEQNAME = 2; 094 /** ??タのアクセス用の配?番号 {@value} */ 095 protected static final int INCREBY = 3; 096 /** ??タのアクセス用の配?番号 {@value} */ 097 protected static final int STARTVAL = 4; 098 /** ??タのアクセス用の配?番号 {@value} */ 099 protected static final int MINVAL = 5; 100 /** ??タのアクセス用の配?番号 {@value} */ 101 protected static final int MAXVAL = 6; 102 /** ??タのアクセス用の配?番号 {@value} */ 103 protected static final int FGCYCLE = 7; 104 /** ??タのアクセス用の配?番号 {@value} */ 105 protected static final int SUCACHE = 8; 106 107 private static final String ENCODE = "UTF-8" ; // 4.3.6.6 (2009/05/15) 108 109 private static final String CMNT = "************************************************************************" ; 110 111 private static final int X = FixLengthData.X ; 112 private static final int K = FixLengthData.K ; 113 114 /** ?定数 */ 115 protected static final String XML_START_TAG = "<?xml version='1.0' encoding='UTF-8'?>" + CR + "<ROWSET tableName='xxx'>"; 116 protected static final String XML_END_TAG = "</ROWSET>"; 117 protected static final String EXEC_START_TAG= "<EXEC_SQL>"; 118 protected static final String EXEC_END_TAG = "</EXEC_SQL>"; 119 120 /** XML形式かど? */ 121 protected boolean isXml = false; // 4.3.7.0 (2009/06/01) 122 123 /** 124 * DBTableModel処?実行します? 125 * 126 * @og.rev 5.5.2.6 (2012/05/25) protected変数を?private化したため?getterメソ?で取得するよ?変更 127 * 128 * @return 実行結果の??ブルモ? 129 */ 130 public DBTableModel execute() { 131 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 132 133 isXml = StringUtil.nval( getValue( "XML" ), false ); 134 135 int[] clmNo = getTableColumnNo( DBKEY ); 136 int rowCnt = table.getRowCount(); 137 138 File dir = new File( getValue( "DIR" ) ); 139 if( ! dir.exists() && ! dir.mkdirs() ) { 140 String errMsg = "??フォル?作?できませんでした?" + dir + "]" ; 141 // 4.3.4.4 (2009/01/01) 142 throw new HybsSystemException( errMsg ); 143 } 144 145 String[] data = null; 146 PrintWriter writer = null; 147 for( int row=0; row<rowCnt; row++ ) { 148 data = table.getValues( row ); 149 String seqName = data[clmNo[SEQNAME]]; 150 try { 151 writer = FileUtil.getPrintWriter( new File( dir,seqName + ( isXml ? ".xml" : ".sql" ) ),ENCODE ); 152 if( isXml ) { writer.println( XML_START_TAG ); } 153 writer.print( makeHeadLine( clmNo,data ) ); 154 writer.println( makeLineList( clmNo,data ) ); 155 } 156 catch( RuntimeException ex ) { 157 ErrorMessage errMessage = makeErrorMessage( "TableFilter_SEQNENCE Error",ErrorMessage.NG ); 158 errMessage.addMessage( row+1,ErrorMessage.NG,"SEQUENCE",ex.getMessage() ); 159 errMessage.addMessage( row+1,ErrorMessage.NG,"SEQUENCE",StringUtil.array2csv( data ) ); 160 errMessage.addMessage( row+1,ErrorMessage.NG,"SEQUENCE","SEQ=[" + seqName + "]" ); 161 System.out.println( errMessage ); 162 } 163 if( isXml ) { writer.println( XML_END_TAG ); } 164 if( writer != null ) { writer.close(); } 165 } 166 167 return table; 168 } 169 170 /** 171 * ヘッ??部??処?実行します? 172 * 173 * @og.rev 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用 174 * 175 * @param clmNo カラ?号配? 176 * @param data ?行?の??タ配? 177 * 178 * @return ヘッ??部???? 179 */ 180 protected String makeHeadLine( final int[] clmNo,final String[] data ) { 181 String seqName = data[clmNo[SEQNAME]]; 182 String LINE1 = seqName; 183 String LINE2 = "Created : " + HybsSystem.getDate() ; 184 185 // 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用 186 int[] addLen = new int[] { 0,0,0 }; // ?ータ間?スペ?ス 187 int[] type = new int[] { X,K,X }; // ?ータの種別 X:半?S:空白前埋?K:全角混在 188 FixLengthData fixData = new FixLengthData( addLen,type ); 189 190 String[][] outData = new String[][] { 191 { "/**", CMNT , "**/" }, 192 { "/* ", LINE1, " */" }, 193 { "/* ", LINE2, " */" }, 194 { "/**", CMNT , "**/" }, 195 }; 196 197 fixData.addAllListData( outData ); 198 199 return fixData.getAllFixData(); 200 } 201 202 /** 203 * シーケンス作?の処?実行します? 204 * 205 * @param clmNo カラ?号配? 206 * @param data ?行?の??タ配? 207 * 208 * @return シーケンス作? 209 */ 210 protected String makeLineList( final int[] clmNo,final String[] data ) { 211 StringBuilder buf = new StringBuilder(); 212 213 if( isXml ) { buf.append( EXEC_START_TAG ).append( CR ); } 214 215 buf.append( "CREATE SEQUENCE " ).append( data[clmNo[SEQNAME]] ).append( CR ); 216 buf.append( " START WITH " ).append( data[clmNo[STARTVAL]] ); 217 buf.append( " INCREMENT BY " ).append( data[clmNo[INCREBY]] ); 218 buf.append( " MINVALUE " ).append( data[clmNo[MINVAL]] ); 219 buf.append( " MAXVALUE " ).append( data[clmNo[MAXVAL]] ); 220 221 if( "1".equals( data[clmNo[FGCYCLE]] ) ) { 222 buf.append( " CYCLE" ); 223 } 224 else { 225 buf.append( " NOCYCLE" ); 226 } 227 228 if( Integer.valueOf( data[clmNo[SUCACHE]] ) > 0 ) { 229 buf.append( " CACHE " ).append( data[clmNo[SUCACHE]] ); 230 } 231 else { 232 buf.append( " NOCACHE" ); 233 } 234 235 if( isXml ) { buf.append( CR ).append( EXEC_END_TAG ); } 236 else { buf.append( " ;" ); } 237 238 return buf.toString(); 239 } 240 }