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を?sessionに登録するとき?キーを指定しま? 342 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])? 343 * 344 * @og.tag 345 * 検索結果より、DBTableModelオブジェクトを作?します?これを?下流?viewタグ等に 346 * 渡す?合に??常は、session を利用します?そ?場合?登録キーです? 347 * query タグを同時に実行して、結果を求める?合?同?モリに配置される為? 348 * こ? tableId 属?を利用して、メモリ空間を?ます? 349 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])? 350 * 351 * @param id sessionに登録する時? ID 352 */ 353 public void setTableId( final String id ) { 354 tableId = nval( getRequestParameter( id ),tableId ); 355 } 356 357 /** 358 * 【TAG】作?先??レクトリを指定します? 359 * 360 * @og.tag 361 * 作?先??レクトリを指定します? 362 * 初期値は、実際に実行して?アプリケーションの REAL_PATH + jsp フォル?下です? 363 * 作?先?フォル?、useUserDef の設定によって異なります? 364 * 365 * @param dir 出力?の?レクトリ 366 */ 367 public void setOutdir( final String dir ) { 368 outdir = nval( getRequestParameter( dir ),outdir ); 369 } 370 371 /** 372 * 【TAG】?ログラ?Dを指定します? 373 * 374 * @og.tag 375 * 作?先?プログラ?Dを指定します? 376 * ただし?作?先?実際のフォル??、useUserDef の設定によって異なります? 377 * 378 * @param id プログラ?D 379 */ 380 public void setPgid( final String id ) { 381 pgid = nval( getRequestParameter( id ),pgid ); 382 } 383 384 /** 385 * 【TAG】雛形のプログラ?Dを指定します? 386 * 387 * @og.tag 388 * 雛形のプログラ?Dをパースして、実際のプログラ?作?します? 389 * ただし?作?先?実際のフォル??、useUserDef の設定によって異なります? 390 * また?パ?スするのは、作?先?画面IDのフォル?存在しな??合?みです? 391 * すでに、存在して?場合?、?の画面IDのフォル?読み取って、パース? 392 * 行います?基本?、作?先?ソースを手で修正した場合でも?パ?スと 393 * 無関係な?の修正はそ?まま反映のこされます? 394 * 395 * @param id 雛形のプログラ?D 396 */ 397 public void setHpgid( final String id ) { 398 hpgid = nval( getRequestParameter( id ),hpgid ); 399 } 400 401 /** 402 * 【TAG】仮環?使用するかど?[true/false]を指定しま?初期値:true:使用する)? 403 * 404 * @og.tag 405 * true:使用する を設定すると?customUserDef" フォル??下に、画面IDの 406 * フォル?作?します? 407 * false:使用しな?を設定すると、実際の リアルパス(REAL_PATH/jsp)の下に? 408 * 画面IDのフォル?作?します?こちら?、実際の画面と同様に、画面リソース等を 409 * 作?してアクセスすることになります? 410 * 411 * @param flag 仮環?使用するかど? [true:使用する/false:使用しない] 412 */ 413 public void setUseUserDef( final String flag ) { 414 useUserDef = nval( getRequestParameter( flag ),useUserDef ); 415 } 416 417 /** 418 * 【TAG】??行うタグを部?定しま?初期値:?登録タグすべて)? 419 * 420 * @og.tag 421 * 処?行うタグは、?部?、COMMENT,HIDEMENU,COLUMN,ORDER_BY,QUERY,VIEW,TABLE_UPDATE ? 422 * 予?れており、?期?は、すべてのタグを??ます? 423 * ここでは、その?のみ実行できるように、カンマ区??で?できるようにします? 424 * 実行不可のタグ名を?すると、エラーになります? 425 * 426 * @og.rev 5.6.8.0 (2013/09/06) 新規追? 427 * 428 * @param tags 処?行うタグを部?定する? 429 */ 430 public void setTagNames( final String tags ) { 431 String tagNms = nval( getRequestParameter( tags ),null ); 432 433 if( tagNms != null ) { 434 tagNames = tagNms.split( "," ); 435 436 for( int i=0; i<tagNames.length; i++ ) { 437 String tag = tagNames[i].trim().toUpperCase(Locale.JAPAN); 438 if( ! check( tag, JCF_LIST ) ) { 439 String errMsg = "?? tagNames は、下記??で?してください? 440 + "tagNames=" + tagNms + " (NG=" + tag + ") : " 441 + JCF_LIST.toString(); 442 throw new HybsSystemException( errMsg ); 443 } 444 tagNames[i] = tag ; // 大?に変換した値を戻す? 445 } 446 } 447 } 448 449 /** 450 * カラ?配?(String[])より、対応するカラ?o配?(int[])を作?します? 451 * 452 * @param nameArray カラ?配? 453 * 454 * @return カラ?o配? 455 */ 456 private int[] getTableColumnNo( final String[] nameArray ) { 457 int[] clmNo = new int[ nameArray.length ]; 458 for( int i=0; i<clmNo.length; i++ ) { 459 clmNo[i] = table.getColumnNo( nameArray[i] ); 460 } 461 return clmNo; 462 } 463 464 /** 465 * シリアライズ用のカスタ?リアライズ書き込みメソ? 466 * 467 * @param strm ObjectOutputStreamオブジェク? 468 * @serialData ?のオブジェクト?、シリアライズされません? 469 * 470 * @throws IOException 入出力エラーが発生した?? 471 */ 472 private void writeObject( final ObjectOutputStream strm ) throws IOException { 473 strm.defaultWriteObject(); 474 } 475 476 /** 477 * シリアライズ用のカスタ?リアライズ読み込みメソ? 478 * 479 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します? 480 * 481 * @param strm ObjectInputStreamオブジェク? 482 * @see #release2() 483 * @serialData ?のオブジェクト?、シリアライズされません? 484 * 485 * @throws IOException シリアライズに関する入出力エラーが発生した?? 486 * @throws ClassNotFoundException クラスを見つけることができなかった?? 487 */ 488 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 489 strm.defaultReadObject(); 490 } 491 492 /** 493 * こ?オブジェクト???表現を返します? 494 * 基本???目?使用します? 495 * 496 * @return こ?クラスの??表現 497 */ 498 @Override 499 public String toString() { 500 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 501 .println( "VERSION" ,VERSION ) 502 .println( "tableId" ,tableId ) 503 .println( "outdir" ,outdir ) 504 .println( "pgid" ,pgid ) 505 .println( "hpgid" ,hpgid ) 506 .println( "useUserDef" ,useUserDef ) 507 .fixForm().toString() ; 508 } 509 }