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.hayabusa.taglib; 017 018 import org.opengion.hayabusa.common.HybsSystem; 019 import org.opengion.hayabusa.common.HybsSystemException; 020 import org.opengion.hayabusa.db.DBTableModel; 021 import org.opengion.hayabusa.develop.JspCreateFactory; 022 import org.opengion.hayabusa.develop.JspConvertEntity; 023 import org.opengion.fukurou.util.ErrorMessage; 024 import org.opengion.fukurou.util.StringUtil; 025 import static org.opengion.fukurou.util.StringUtil.nval ; 026 import org.opengion.fukurou.xml.JspSaxParser; 027 028 import java.util.Map; 029 import java.util.HashMap; 030 import java.util.List; 031 import java.util.ArrayList; 032 import java.io.File; 033 034 import java.io.ObjectOutputStream; 035 import java.io.ObjectInputStream; 036 import java.io.IOException; 037 038 /** 039 * JspCreateTag は、画面定義??より、JSP画面を?動作?する??ルです? 040 * 041 * 画面作?するにあたり???の参??存在します? 042 * 043 * ?.画面属?の設???雛形 ?仮画面 ・・・ hpgid で??画面ID 044 * ?.仮画面修正 ??仮画面 ?仮画面 ・・・ jsp/customUserDef/画面ID 045 * ?.本環?正 ??本画面 ?本画面 ・・・ jsp/画面ID 046 * 047 * それぞれ、作?先?画面IDフォル?存在する場合?、取込?作?先に設定します? 048 * つまり??作?すると、それ以降?、作?された画面を基準に処?行います? 049 * 050 * @og.formSample 051 * ●形式?lt;og:jspCreate outdir="…" pgid="…" /> 052 * ●body?な? 053 * 054 * ●Tag定義?? 055 * <og:jspCreate 056 * pgid ○?TAG】?ログラ?Dを指定します?(??) 057 * outdir 【TAG】作?先??レクトリを指定しま? 058 * hpgid 【TAG】雛形のプログラ?Dを指定しま? 059 * useUserDef 【TAG】仮環?使用するかど?[true/false]を指定しま?初期値:true:使用する) 060 * tableId 【TAG?通常は使?せん)DBTableModel が登録されて?メモリのキーを指定しま? 061 * scope 【TAG】キャ?ュする場合?スコープ[request/page/session/applicaton]を指定しま?初期値:session) 062 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false) 063 * /> 064 * 065 * ●使用? 066 * ・先に、query タグでDBTableModel が作?済み 067 * <og:jspCreate 068 * outdir = "{@SYS.REAL_PATH}jsp/" ??力?フォル? 069 * pgid = "{@PGID}" ?作?画面ID 070 * hpgid = "{@HPGID}" ?雛形画面ID 071 * useUserDef = "true/false" ?仮環??使用可否(初期値:true 使用する) 072 * /> 073 * 074 * @og.group 開発補助 075 * @og.rev 5.1.9.0 (2010/08/01) 新規作? 076 * 077 * @version 0.9.0 2000/10/17 078 * @author Kazuhiko Hasegawa 079 * @since JDK1.6, 080 */ 081 public class JspCreateTag extends CommonTagSupport { 082 //* こ?プログラ??VERSION??を設定します? {@value} */ 083 private static final String VERSION = "5.1.9.0 (2010/08/01)" ; 084 085 private static final long serialVersionUID = 5190 ; // 5.1.9.0 (2010/08/01) 086 087 // private static final String ENCODE = "UTF-8" ; 088 089 // private static String JSP_DIR = "C:/opengion/uap/webapps/gf/jsp/"; 090 private static String JSP_DIR = HybsSystem.sys( "REAL_PATH" ) + "jsp/" ; 091 092 private static final String CUST_DEF = "customUserDef/" ; 093 094 private transient DBTableModel table = null; 095 096 private String tableId = HybsSystem.TBL_MDL_KEY; 097 private String outdir = JSP_DIR; // 出力?フォル? 098 private String pgid = null; // 作?画面ID 099 private String hpgid = null; // 雛形画面ID 100 private boolean useUserDef = true; // 仮環??使用可否(初期値:true 使用する) 101 102 // private static final String[] JCF_LIST = new String[] { "COMMENT" , "COLUMN" , "ORDER_BY" , "QUERY" , "VIEW" , "TABLE_UPDATE" }; 103 private static final String[] JCF_LIST = new String[] { "COMMENT" , "HIDEMENU" , "COLUMN" , "ORDER_BY" , "QUERY" , "VIEW" , "TABLE_UPDATE" }; // 5.6.4.4 (2013/05/31) 104 105 /** 106 * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします? 107 * 108 * @return 後続????(SKIP_BODY) 109 */ 110 @Override 111 public int doStartTag() { 112 table = (DBTableModel)getObject( tableId ); 113 114 return(SKIP_BODY); // Body を評価しな? 115 // return ( EVAL_BODY_BUFFERED ); // Body を評価する 116 } 117 118 /** 119 * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします? 120 * 121 * @return int 122 */ 123 // @Override 124 // public int doAfterBody() { 125 // body = nval( getBodyString(),body ); 126 // 127 // return(SKIP_BODY); 128 // } 129 130 /** 131 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします? 132 * 133 * @return 後続???? 134 */ 135 @Override 136 public int doEndTag() { 137 // ??時には、オブジェクト?部??を表示する? 138 if( isDebug() ) { 139 debugPrint(); 140 } 141 142 boolean okFlag = execute(); 143 144 if( okFlag ) { // 正常 145 return(EVAL_PAGE); 146 } 147 else { 148 return(SKIP_PAGE); 149 } 150 } 151 152 /** 153 * タグリブオブジェクトをリリースします? 154 * キャ?ュされて再利用される?で、フィールド?初期設定を行います? 155 * 156 */ 157 @Override 158 protected void release2() { 159 super.release2(); 160 table = null; 161 tableId = HybsSystem.TBL_MDL_KEY; 162 outdir = JSP_DIR; 163 pgid = null; 164 hpgid = null; 165 useUserDef = true; 166 } 167 168 /** 169 * DBTableModel処?実行します? 170 * 171 * @og.rev 5.2.1.0 (2010/10/01) 実行クラスのクラス名を変更します? _OG_ を削除 172 * @og.rev 5.5.2.6 (2012/05/25) findbugs対応?JspConvertEntity.DBKEY を?JspConvertEntity.getDBKEY() に変更? 173 * 174 * @return 処??実行結果 175 */ 176 public boolean execute() { 177 boolean okFlag = false; 178 179 // 出力?(セーブ?)のフォル? 180 File saveDir = (useUserDef) ? new File( outdir + CUST_DEF , pgid ) : new File( outdir , pgid ) ; 181 182 // 雛形(参??のフォル? 183 final File refDir ; 184 if( saveDir.exists() ) { // 出力?フォル?存在した場? 185 refDir = saveDir ; // 出力?フォル??形フォル?なる? 186 } 187 else { // 出力?フォル?存在しな??? 188 refDir = new File( outdir , hpgid ); // 雛形画面IDをそのまま使用します? 189 if( ! saveDir.mkdirs() ) { 190 String errMsg = "出力?のフォル?作?できませんでした?" + saveDir + "]" ; 191 throw new HybsSystemException( errMsg ); 192 } 193 } 194 195 if( ! refDir.exists() ) { // 雛形(参??フォル?存在しな??合?エラー 196 String errMsg = "雛形(参??フォル?存在しません?" + refDir + "]" ; 197 throw new HybsSystemException( errMsg ); 198 } 199 200 // PrintWriter writer = null; 201 202 // int[] clmNo = getTableColumnNo( JspConvertEntity.DBKEY ); 203 int[] clmNo = getTableColumnNo( JspConvertEntity.getDBKEY() ); // 5.5.2.6 (2012/05/25) findbugs対? 204 int rowCnt = table.getRowCount(); 205 206 int row = 0; 207 boolean unCmntSet = true; 208 String[] data = null; 209 try { 210 //JSPを書く為に?な??を設? 211 Map<String,List<JspConvertEntity>> tables = new HashMap<String,List<JspConvertEntity>>(); 212 213 for( row=0; row<rowCnt; row++ ) { 214 data = table.getValues( row ); 215 JspConvertEntity entry = JspConvertEntity.newInstance( data, clmNo ); 216 217 if( entry != null ) { 218 List<JspConvertEntity> array = tables.get( entry.getType() ); 219 if( array == null ) { array = new ArrayList<JspConvertEntity>(); } 220 array.add( entry ); 221 tables.put( entry.getType(),array ); 222 if( unCmntSet ) { 223 tables.put( "COMMENT",array ); 224 unCmntSet = false; 225 } 226 } 227 } 228 229 // 参?先フォル?ら?出力?フォル?、XMLコピ?処?行います? 230 JspSaxParser spar = new JspSaxParser(); 231 232 // 5.2.1.0 (2010/10/01) 実行クラスのクラス名を変更します? _OG_ を削除 233 // spar.addFilter( JspCreateFactory.newInstance( "COMMENT" ,tables) ); 234 // spar.addFilter( JspCreateFactory.newInstance( "COLUMN" ,tables) ); 235 // spar.addFilter( JspCreateFactory.newInstance( "SELECT" ,tables) ); 236 // spar.addFilter( JspCreateFactory.newInstance( "QUERY" ,tables) ); 237 // spar.addFilter( JspCreateFactory.newInstance( "VIEW" ,tables) ); 238 239 for( String jcf : JCF_LIST ) { 240 spar.addFilter( JspCreateFactory.newInstance( jcf ,tables) ); 241 } 242 243 spar.copyDirectry( refDir,saveDir ); 244 245 // //query.jsp作? 246 // writer = FileUtil.getPrintWriter( new File( saveDir,"query.jsp" ),ENCODE ); 247 // writer.print(writeQueryJSP( refDir , tables )); 248 // writer.println(); 249 // writer.flush(); 250 // 251 // //result.jsp作? 252 // writer = FileUtil.getPrintWriter( new File( saveDir,"result.jsp" ),ENCODE ); 253 // writer.print(writeResultJSP( refDir , tables )); 254 // writer.println(); 255 // writer.flush(); 256 257 okFlag = true; 258 } 259 catch( RuntimeException ex ) { 260 ex.printStackTrace(); 261 ErrorMessage errMessage = new ErrorMessage( "JspCreateTag Error" ); 262 errMessage.addMessage( row+1,ErrorMessage.NG,"JSPOUT",ex.getMessage() ); 263 errMessage.addMessage( row+1,ErrorMessage.NG,"JSPOUT",StringUtil.array2csv( data ) ); 264 errMessage.addMessage( row+1,ErrorMessage.NG,"JSPOUT","PRGID=[" + pgid + "]" ); 265 // BAT から呼び出す?合があるため、標準エラー出力にも情報を?しておきます? 266 System.out.println( errMessage ); 267 } 268 // finally { 269 // Closer.ioClose( writer ); 270 // } 271 272 return okFlag; 273 } 274 275 /** 276 * query.jspファイルの?を生成します? 277 * 278 * @param refDir 279 * @param tables 280 * 281 * @return 生?した? 282 */ 283 // private String writeQueryJSP( File refDir , HashMap<String , ArrayList<JspConvertEntity>> tables ) { 284 // String jsp = ""; 285 // try{ 286 // //利用する生?クラスを設? 287 // HashMap< String , JspCreate > generates = new HashMap< String , JspCreate >(); 288 // generates.put( "og:comment" , JspCreateFactory.newInstance( "OG_COMMENT",tables) ); 289 // generates.put( "table" , JspCreateFactory.newInstance( "OG_COLUMN",tables) ); 290 // generates.put( "og:select" , JspCreateFactory.newInstance( "OG_SELECT",tables) ); 291 // 292 // //JSPの作?処?実施? 293 // JspHandler handler = new JspHandler(); 294 // jsp = handler.generate( new File( refDir , "query.jsp" ), ENCODE , generates); 295 // 296 // }catch(Throwable ex){ 297 // ex.printStackTrace(); 298 // throw new RuntimeException(ex); 299 // } 300 // return jsp; 301 // } 302 303 /** 304 * result.jspファイルの?を生成します? 305 * 306 * @param refDir 307 * @param tables 308 * 309 * @return 生?した? 310 */ 311 // private String writeResultJSP(File refDir , HashMap<String , ArrayList<JspConvertEntity>> tables ) { 312 // String jsp = ""; 313 // try{ 314 // //利用する生?クラスを設? 315 // HashMap< String , JspCreate > generates = new HashMap< String , JspCreate >(); 316 // generates.put( "og:comment" , JspCreateFactory.newInstance( "OG_COMMENT",tables) ); 317 // generates.put( "og:query" , JspCreateFactory.newInstance( "OG_QUERY",tables ) ); 318 // generates.put( "og:view" , JspCreateFactory.newInstance( "OG_VIEW",tables) ); 319 // 320 // //JSPの作?処?実施? 321 // JspHandler handler = new JspHandler(); 322 // jsp = handler.generate( new File( refDir , "result.jsp" ) , ENCODE , generates); 323 // 324 // }catch(Throwable ex){ 325 // ex.printStackTrace(); 326 // throw new RuntimeException(ex); 327 // } 328 // return jsp; 329 // } 330 331 /** 332 * 【TAG?通常は使?せん)DBTableModel が登録されて?メモリのキーを指定します? 333 * 334 * @og.tag 335 * 初期値は、HybsSystem.TBL_MDL_KEY です? 336 * こ?設定?から、DBTableModel を取り?します?リクエストかセ?ョンか?? 337 * scope 属?で?します? 338 * 339 * @param id メモリから取り出す時の ID 340 */ 341 public void setTableId( final String id ) { 342 tableId = nval( getRequestParameter( id ),tableId ); 343 } 344 345 /** 346 * 【TAG】作?先??レクトリを指定します? 347 * 348 * @og.tag 349 * 作?先??レクトリを指定します? 350 * 初期値は、実際に実行して?アプリケーションの REAL_PATH + jsp フォル?下です? 351 * 作?先?フォル?、useUserDef の設定によって異なります? 352 * 353 * @param dir 出力?の?レクトリ 354 */ 355 public void setOutdir( final String dir ) { 356 outdir = nval( getRequestParameter( dir ),outdir ); 357 } 358 359 /** 360 * 【TAG】?ログラ?Dを指定します? 361 * 362 * @og.tag 363 * 作?先?プログラ?Dを指定します? 364 * ただし?作?先?実際のフォル??、useUserDef の設定によって異なります? 365 * 366 * @param id プログラ?D 367 */ 368 public void setPgid( final String id ) { 369 pgid = nval( getRequestParameter( id ),pgid ); 370 } 371 372 /** 373 * 【TAG】雛形のプログラ?Dを指定します? 374 * 375 * @og.tag 376 * 雛形のプログラ?Dをパースして、実際のプログラ?作?します? 377 * ただし?作?先?実際のフォル??、useUserDef の設定によって異なります? 378 * また?パ?スするのは、作?先?画面IDのフォル?存在しな??合?みです? 379 * すでに、存在して?場合?、?の画面IDのフォル?読み取って、パース? 380 * 行います?基本?、作?先?ソースを手で修正した場合でも?パ?スと 381 * 無関係な?の修正はそ?まま反映のこされます? 382 * 383 * @param id 雛形のプログラ?D 384 */ 385 public void setHpgid( final String id ) { 386 hpgid = nval( getRequestParameter( id ),hpgid ); 387 } 388 389 /** 390 * 【TAG】仮環?使用するかど?[true/false]を指定しま?初期値:true:使用する)? 391 * 392 * @og.tag 393 * true:使用する を設定すると?customUserDef" フォル??下に、画面IDの 394 * フォル?作?します? 395 * false:使用しな?を設定すると、実際の リアルパス(REAL_PATH/jsp)の下に? 396 * 画面IDのフォル?作?します?こちら?、実際の画面と同様に、画面リソース等を 397 * 作?してアクセスすることになります? 398 * 399 * @param flag 仮環?使用するかど? [true:使用する/false:使用しない] 400 */ 401 public void setUseUserDef( final String flag ) { 402 useUserDef = nval( getRequestParameter( flag ),useUserDef ); 403 } 404 405 /** 406 * カラ?配?(String[])より、対応するカラ?o配?(int[])を作?します? 407 * 408 * @param nameArray カラ?配? 409 * 410 * @return カラ?o配? 411 */ 412 private int[] getTableColumnNo( final String[] nameArray ) { 413 int[] clmNo = new int[ nameArray.length ]; 414 for( int i=0; i<clmNo.length; i++ ) { 415 clmNo[i] = table.getColumnNo( nameArray[i] ); 416 } 417 return clmNo; 418 } 419 420 /** 421 * シリアライズ用のカスタ?リアライズ書き込みメソ? 422 * 423 * @param strm ObjectOutputStreamオブジェク? 424 * @serialData 425 */ 426 private void writeObject( final ObjectOutputStream strm ) throws IOException { 427 strm.defaultWriteObject(); 428 } 429 430 /** 431 * シリアライズ用のカスタ?リアライズ読み込みメソ? 432 * 433 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します? 434 * 435 * @param strm ObjectInputStreamオブジェク? 436 * @see #release2() 437 * @serialData 438 */ 439 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 440 strm.defaultReadObject(); 441 } 442 443 /** 444 * こ?オブジェクト???表現を返します? 445 * 基本???目?使用します? 446 * 447 * @return こ?クラスの??表現 448 */ 449 @Override 450 public String toString() { 451 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 452 .println( "VERSION" ,VERSION ) 453 .println( "tableId" ,tableId ) 454 .println( "outdir" ,outdir ) 455 .println( "pgid" ,pgid ) 456 .println( "hpgid" ,hpgid ) 457 .println( "useUserDef" ,useUserDef ) 458 .fixForm().toString() ; 459 } 460 }