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.resource.GUIInfo;
022    import org.opengion.fukurou.util.XHTMLTag;
023    import org.opengion.fukurou.util.StringUtil;
024    
025    import static org.opengion.fukurou.util.StringUtil.nval ;
026    
027    import java.io.ObjectOutputStream;
028    import java.io.ObjectInputStream;
029    import java.io.IOException;
030    
031    /**
032     * フレーãƒ?‚’作æ?するHTML拡張タグで、引数の受け渡しが可能ですã?
033     *
034     * @og.formSample
035     * ●形式ï¼?lt;og:frame src="…" name="…" />
036     * ●body?šなã�?
037     *
038     * ●Tag定義??
039     *   <og:frame
040     *       src              ○ã?HTML】フレーãƒ?�«表示するソースファイルを指定しまã�?å¿??)ã€?
041     *       name             ○ã?HTML】フレーãƒ?��を指定しまã�?例:QUERY,RESULT,CONTENTS など)(å¿??)ã€?
042     *       changeGamen        【TAG】ソースæŒ?®šã?画面を変更しまã�?
043     *       keys               【TAG】引数を指定しまã�?
044     *       dbTable            【TAG】前ペã?ジで選択したデータ列ã?æƒ??を次のペã?ジに渡すかどã�?�‹[true/false]を指定しまã�?初期値:false)
045     *       longdesc           【HTML】フレーãƒ?�«関する詳しい説明ã?あるURL(lobgdesc)を指定しまã�?
046     *       marginwidth        【HTML】フレーãƒ??左右余白サイズ(marginwidth)を指定しまã�?
047     *       marginheight       【HTML】フレーãƒ??上下余白サイズ(marginheight)を指定しまã�?
048     *       noresize           【HTML】フレーãƒ?‚µイズを変更できなã�?‚ˆã�?noresize)にæŒ?®šしまã�?
049     *       scrolling          【HTML】スクロールバã?(scrolling)の表示/非表示[auto/yes/no]を指定しまã�?初期値:auto)
050     *       frameborder        【HTML】フレーãƒ??å¢?•Œç·?frameborder)の[0:非表示/1:表示]を指定しまã�?初期値:1)
051     *       id                 【HTML】要ç´?�«対して固有ã?名前(id)をつける場合に設定しまã�?
052     *       clazz              【HTML】要ç´?�«対して class 属æ?を設定しまã�?
053     *       title              【HTML】要ç´?�«対する補足çš?ƒ…報(title)を設定しまã�?
054     *       style              【HTML】この要ç´?�«対して適用させるスタイルシーãƒ?style)を設定しまã�?
055     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
056     *   />
057     *
058     * ●使用例ï¼?
059     *    ・ä¸?ˆ¬çš?�ª例:フレーãƒ??割する構文は、HTML準拠。リクエスト変数はå�?ƒ•レーãƒ?�¾で転送されますã?
060     *    <frameset>
061     *        <og:frame marginheight="2" marginwidth="2" src="query.jsp"   name="QUERY"  />
062     *        <og:frame marginheight="2" marginwidth="2" src="forward.jsp" name="RESULT" />
063     *    </frameset>
064     *
065     *    ・DBTableModel の値(例ではPN)をã?取り出して、リクエスト変数として利用しますã?
066     *      現状では、commonForward タグ の useTableData="true" dbkeys="{@dbkeys}" 属æ?を利用しますã?
067     *    <frameset>
068     *        <og:frame marginheight="2" marginwidth="2" src="query.jsp"   name="QUERY"  keys="PN" dbTable="true" />
069     *        <og:frame marginheight="2" marginwidth="2" src="forward.jsp" name="RESULT" keys="PN" dbTable="true" />
070     *    </frameset>
071     *
072     *    ・changeGamen 属æ?を利用して、ソースæŒ?®šã?画面をå?り替えますã?
073     *      たとえã?、jsp/index.jsp では、GAMENID属æ?がURLに存在する場合ã?直接そã?画面ã‚?
074     *      表示させることができますã?
075     *    <frameset cols="160,*,0" frameborder="1" framespacing="1">
076     *        <og:frame marginheight="2" marginwidth="2" src="menu/menu.jsp"    name="MENU" />
077     *        <og:frame marginheight="2" marginwidth="2" src="GE0000/index.jsp" name="CONTENTS"
078     *                                                    changeGamen="{@GAMENID}" />
079     *    </frameset>
080     *
081     * @og.group 画面部å“?
082     *
083     * @version  4.0
084     * @author       Kazuhiko Hasegawa
085     * @since    JDK5.0,
086     */
087    public class FrameTag extends HTMLTagSupport {
088            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
089            private static final String VERSION = "4.2.1.1 (2008/04/30)" ;
090    
091            private static final long serialVersionUID = 421120080430L ;
092    
093            private String                  tableId         = HybsSystem.TBL_MDL_KEY;
094            private String                  changeGmn       = null;
095            private String                  keys            = null;
096            private transient DBTableModel  table           = null;
097            private boolean                 dbTable         = false;
098    
099            // 3.5.2.0 (2003/10/20) シスãƒ?ƒ パラメータ の FRAME_UNDER_BAR_REQUEST_KEY_USED を使用ã€?
100            private final boolean UNDER_BAR_KEY_USED = HybsSystem.sysBool( "FRAME_UNDER_BAR_REQUEST_KEY_USED" );
101    
102    //      /**
103    //       * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
104    //       *
105    //       * @og.rev 5.0.0.2 (2009/09/15) XSS対å¿?⇒チェãƒ?‚¯するので削除
106    //       * @return  int
107    //       */
108    //
109    //      public int doStartTag() {
110    //              useXssCheck( false );
111    //              return super.doStartTag();
112    //      }
113    
114            /**
115             * タグリブオブジェクトをリリースしますã?
116             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
117             *
118             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
119             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
120             *
121             */
122            @Override
123            protected void release2() {
124                    super.release2();
125                    tableId         = HybsSystem.TBL_MDL_KEY;
126                    changeGmn       = null;         // 4.0.0 (2005/02/28)
127                    keys            = null;
128                    table           = null;
129                    dbTable         = false;
130            }
131    
132            /**
133             * リンクを作æ?しますã?
134             *
135             * @og.rev 3.5.4.0 (2003/11/25) comand="RENEW" 時には、dbTable 属æ?は、強制çš?�« false としますã?
136             *
137             * @return      リンクタグæ–?­—å?
138             */
139            @Override
140            protected String makeTag() {
141                    if( changeGmn != null ) { set( "src",changeGmn ); }
142    
143                    String cmd = getRequest().getParameter( "command" );
144                    if( "RENEW".equals( cmd ) ) { dbTable = false; }
145    
146                    setIdName();
147                    String urlEnc = getUrlEncode();
148                    return XHTMLTag.frame( getAttributes(),urlEnc );
149            }
150    
151            /**
152             * id 属æ? / name 属æ? セãƒ?ƒˆ
153             *
154             * フレーãƒ?��は id 属æ?で登録する(XHTML) 互換性のためã€?
155             * id 属æ?と name 属æ?には同じ値をセãƒ?ƒˆしておくã€?
156             *
157             */
158            private void setIdName() {
159                    String idno     = get( "id" );
160                    String name = get( "name" );
161                    if( idno == null || idno.length() == 0 ) {
162                            if( name != null && name.length() > 0 ) {
163                                    set( "id", name );
164                            }
165                            else {
166                                    String errMsg = "id 属æ?ã�?name 属æ?のどちらかは登録してくださいã€?;
167                                    throw new HybsSystemException( errMsg );
168                            }
169                    }
170                    else {
171                            set( "name", idno );
172                    }
173            }
174    
175            /**
176             * keys 属æ? をå?に、requestæƒ??より values の値を取り込ã‚??
177             *
178             * keys属æ?は キーæƒ??がカンマ区åˆ?‚Šになってã�?‚‹為,ばらして
179             * values属æ?の配å?にä¸?�¤づつ設定してã�?��ますã?
180             *
181             * @og.rev 2.0.0.2 (2002/09/24) 検索結果の値を取り込めてã�?�ªかったバグを修正ã€?
182             * @og.rev 2.1.1.1 (2002/11/15) 選択行情報を取り込めてã�?�ªかったバグを修正ã€?
183             * @og.rev 3.4.0.3 (2003/09/10) DBTableModelへのリクエスト情報をURLに連結しなã�?‚ˆã�?�«変更ã€?
184             * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
185             *
186             * @return      URLエンコードされたæ–?­—å?
187             */
188            private String getUrlEncode() {
189                    int[] rowNo = getParameterRows();               // 4.0.0 (2005/01/31)
190                    int selcount = rowNo.length;    // 4.0.0 (2005/01/31)
191    
192                    String[] key = (String[])StringUtil.enume2Array( getParameterNames(), new String[0] );
193                    String[] dbkey = null;
194    
195                    int dbcount = 0;
196    
197                    int recount = 0;
198                    for( int i=0; i<key.length; i++ ) {
199                            if( isNormalRequestKey( key[i] ) ) {    // 3.4.0.3 (2003/09/10)
200                                    recount++;
201                            }
202                    }
203    
204                    if( keys != null && dbTable && selcount > 0 ) {
205                            dbkey = StringUtil.csv2Array( keys );
206                            dbcount = dbkey.length;
207                    }
208    
209                    String[] val  = new String[ recount + dbcount + selcount ];
210                    String[] keyt = new String[ recount + dbcount + selcount ];
211    
212                    int j = 0;
213                    for( int i=0; i<key.length; i++ ) {
214                            if( isNormalRequestKey( key[i] ) ) {    // 3.4.0.3 (2003/09/10)
215                                    keyt[j] = key[i];
216                                    val[j]  = getRequestValue( key[i] );
217                                    j++;
218                            }
219                    }
220    
221                    if( dbTable && dbcount > 0 ) {
222                            table = (DBTableModel)getSessionAttribute( tableId );
223                            if( table != null ) {
224                                    for( int i=0; i<dbcount; i++ ) {
225                                            keyt[recount + i] = dbkey[i];
226                                            val[recount +i]  = table.getValue(rowNo[0],table.getColumnNo( dbkey[i] ));
227                                    }
228                            }
229                    }
230    
231                    // 4.0.0 (2005/01/31) selectedæ–?­—é?列をrowNo数字é?列に変更
232                    for( int i=0; i<selcount; i++ ) {
233                            keyt[recount + dbcount + i] = HybsSystem.ROW_SEL_KEY;
234                            val[recount + dbcount + i]      = String.valueOf( rowNo[i] );
235                    }
236    
237                    return XHTMLTag.urlEncode( keyt,val );
238            }
239    
240            /**
241             * 【HTML】フレーãƒ?�«表示するソースファイルを指定しますã?
242             *
243             * @og.tag フレーãƒ?�«表示するソースファイルを指定しますã?
244             *
245             * @param       src ソースファイル
246             */
247            public void setSrc( final String src ) {
248                    set( "src",getRequestParameter( src ) );
249            }
250    
251            /**
252             * 【HTML】フレーãƒ?��を指定しまã�?例:QUERY,RESULT,CONTENTS など)ã€?
253             *
254             * @og.tag フレーãƒ?��を指定しますã?
255             *
256             * @param       name フレーãƒ?��
257             */
258            public void setName( final String name ) {
259                    set( "name",getRequestParameter( name ) );
260            }
261    
262            /**
263             * 【HTML】フレーãƒ?�«関する詳しい説明ã?あるURL(lobgdesc)を指定しますã?
264             *
265             * @og.tag lobgdescを指定しますã?
266             *
267             * @param       longdesc 詳しい説明ã?あるURL
268             */
269            public void setLongdesc( final String longdesc ) {
270                    set( "longdesc",getRequestParameter( longdesc ) );
271            }
272    
273            /**
274             * 【HTML】フレーãƒ??左右余白サイズ(marginwidth)を指定しますã?
275             *
276             * @og.tag フレーãƒ??左右余白サイズを指定しますã?
277             *
278             * @param       marginwidth 左右余白サイズ
279             */
280            public void setMarginwidth( final String marginwidth ) {
281                    set( "marginwidth",getRequestParameter( marginwidth ) );
282            }
283    
284            /**
285             * 【HTML】フレーãƒ??上下余白サイズ(marginheight)を指定しますã?
286             *
287             * @og.tag フレーãƒ??上下余白サイズを指定しますã?
288             *
289             * @param       marginheight 上下余白サイズ
290             */
291            public void setMarginheight( final String marginheight ) {
292                    set( "marginheight",getRequestParameter( marginheight ) );
293            }
294    
295            /**
296             * 【HTML】フレーãƒ?‚µイズを変更できなã�?‚ˆã�?noresize)にæŒ?®šしますã?
297             *
298             * @og.tag フレーãƒ?‚µイズを変更できなã�?‚ˆã�?�«æŒ?®šしますã?
299             *
300             * @param       noresize フレーãƒ?‚µイズを変更させなã�??合ã?ã€?noresize" を指定しますã?
301             */
302            public void setNoresize( final String noresize ) {
303                    String ns = getRequestParameter( noresize );
304                    if( ns != null ) { set( "noresize", "noresize" ); }
305            }
306    
307            /**
308             * 【HTML】スクロールバã?(scrolling)の表示/非表示[auto/yes/no]を指定しまã�?初期値:auto)ã€?
309             *
310             * @og.tag
311             * auto:å¿?¦�に応じてスクロールバã?を表示(初期値)
312             * yes:常にスクロールバã?を表示
313             * no:常にスクロールバã?を表示しなã�?
314             *
315             * @param       scrolling  スクロールバã?の表示/非表示[auto:自å‹?yes:常時表示/no:非表示]
316             */
317            public void setScrolling( final String scrolling ) {
318                    set( "scrolling",getRequestParameter( scrolling ) );
319            }
320    
321            /**
322             * 【HTML】フレーãƒ??å¢?•Œç·?frameborder)の[0:非表示/1:表示]を指定しまã�?初期値:1)ã€?
323             *
324             * @og.tag
325             * 0:æž?‚’表示しなã�?
326             * 1:æž?‚’表示するã€?
327             * 初期値はã€?:æž?‚’表示する ですã?
328             *
329             * @param       frameborder     フレーãƒ??å¢?•Œ線[0:æž?�ž表示/1:æž?¡¨示]
330             */
331            public void setFrameborder( final String frameborder ) {
332                    set( "frameborder",getRequestParameter( frameborder ) );
333            }
334    
335            /**
336             * 【TAG】ソースæŒ?®šã?画面を変更しますã?
337             *
338             * @og.tag
339             * src æŒ?®šがãƒ?ƒ•ォルト設定で、changeGamen属æ?が設定されてã�?‚‹
340             * 場合には、この値が優先されますã?
341             * changeGamen は、画面IDのみæŒ?®šしてください。src には、このID??/index.jsp" ã�?
342             * 追åŠ?�•れますã?つまりã?changeGamen="{&#064;GAMENID}" とã�?�†æŒ?®šをしておけばã€?
343             * FavoriteLinkTag 等で引数に GAMENID が指定された場合ã?み、この属æ?が有効になりã?
344             * src="実画面ID/index.jsp" が指定されたことと同じ結果になりますã?
345             *
346             * @og.rev 3.1.2.0 (2003/04/07) 画面IDと実画面ãƒ?‚£レクトリとの関連見直ã�?DIRの代りにGAMENIDを推奨)
347             * @og.rev 4.2.1.1 (2008/04/30) 画面åˆ?‚Š替えをするのは、アドレスが設定されいるå?合に限る
348             * @param       src     置換えソース
349             */
350            public void setChangeGamen( final String src ) {
351                    String sc = nval( getRequestParameter( src ),changeGmn );
352                    if( sc != null ) {
353                            GUIInfo guiInfo = getGUIInfo( sc );
354    //                      if( guiInfo != null ) {         // 見つからなã�??合ã?、アクセス不可
355                            if( guiInfo != null && guiInfo.getAddress() != null && guiInfo.getAddress().length() > 0 ) { // 見つからなã�??合ã?、アクセス不可
356                                    changeGmn = guiInfo.getRealAddress( "index.jsp" );
357                            }
358                    }
359            }
360    
361            /**
362             * 【TAG】引数を指定しますã?
363             *
364             * @og.tag
365             * URL の引数にセãƒ?ƒˆするキーã‚?カンマ区åˆ?‚Šでセãƒ?ƒˆしますã?
366             *
367             * @param       key 引数
368             */
369            public void setKeys( final String key ) {
370                    keys = getRequestParameter( key ) ;
371            }
372    
373            /**
374             * 【TAG】前ペã?ジで選択したデータ列ã?æƒ??を次のペã?ジに渡すかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
375             *
376             * @og.tag
377             * ただしã??‘行å?のãƒ??タのみですã?(è¤?•°選択時は、最初ã??‘件目)
378             * true:渡ã�?
379             * false:渡さなã�??
380             * 初期値は、false:渡さなã�?ですã?
381             *
382             * @param       db 選択データを次のペã?ジに渡すかどã�?�‹[true:渡ã�?false:渡さない]
383             */
384            public void setDbTable( final String db ) {
385                    dbTable = nval( getRequestParameter( db ),dbTable );
386            }
387    
388            /**
389             * 標準的な リクエスト情報かどã�?�‹を判断しますã?
390             *
391             * これは、引数のキーがã?HybsSystem.ROW_SEL_KEY かã?
392             * DBTableModel で送信されたキー( キー__番号)形式ã?場合ã?
393             * false を返しますã?
394             * 通常のリクエストキーとして扱ã�?�Ÿくなã�??合ã?判定に使用しますã?
395             *
396             * @og.rev 3.4.0.3 (2003/09/10) 新規追åŠ?
397             * @og.rev 3.5.2.0 (2003/10/20) シスãƒ?ƒ パラメータ の FRAME_UNDER_BAR_REQUEST_KEY_USED を使用ã€?
398             * @og.rev 3.5.5.0 (2004/03/12) 名前と行番号の区åˆ?‚Š記号("__")をã?HybsSystem.JOINT_STRING  に変更ã€?
399             *
400             * @param key 判定するキー
401             *
402             * @return 標準的な リクエスト情報かどã�?�‹ [true:標準的/false:それ以外]
403             */
404            private boolean isNormalRequestKey( final String key ) {
405                    return  key != null &&
406                                    ! key.equals( HybsSystem.ROW_SEL_KEY ) &&
407                                    ( key.indexOf( HybsSystem.JOINT_STRING ) < 0 || UNDER_BAR_KEY_USED );
408            }
409    
410            /**
411             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
412             *
413             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
414             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
415             *
416             * @param       strm    ObjectOutputStreamオブジェクãƒ?
417             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
418             */
419            private void writeObject( final ObjectOutputStream strm ) throws IOException {
420                    strm.defaultWriteObject();
421            }
422    
423            /**
424             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
425             *
426             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
427             *
428             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
429             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
430             *
431             * @param       strm    ObjectInputStreamオブジェクãƒ?
432             * @see #release2()
433             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
434             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
435             */
436            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
437                    strm.defaultReadObject();
438            }
439    
440            /**
441             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
442             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
443             *
444             * @return こã?クラスのæ–?­—å?表現
445             */
446            @Override
447            public String toString() {
448                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
449                                    .println( "VERSION"             ,VERSION        )
450                                    .println( "tableId"             ,tableId        )
451                                    .println( "changeGmn"   ,changeGmn      )
452                                    .println( "keys"                ,keys           )
453                                    .println( "dbTable"     ,dbTable        )
454                                    .println( "Other..."    ,getAttributes().getAttribute() )
455                                    .fixForm().toString() ;
456            }
457    }