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    }