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