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 }