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 }