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 }