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 */
016package org.opengion.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.hayabusa.resource.GUIInfo;
021import org.opengion.fukurou.util.XHTMLTag;
022import org.opengion.fukurou.util.TagBuffer;
023import org.opengion.fukurou.util.StringUtil ;
024
025import static org.opengion.fukurou.util.StringUtil.nval ;
026import org.opengion.fukurou.util.EnumType ;
027
028import java.util.Locale ;
029
030/**
031 * 戻るボタン/戻るリンクを表示するHTML拡張タグです(通常はcustom/query_info.jspに組込み)。
032 *
033 * custom/query_info.jsp に組み込むことで、全てのquery.jspに組込む事ができます。
034 * 戻るボタン/リンクを表示するかどうかの条件判定は、
035 *  条件1:自分自身へ戻る機能はサポートできません。
036 *  条件2:BACK_GAMENID が存在するか、または、gamenId で指示された場合のみ表示。
037 *  条件3:command="NEW" で、キャッシュに設定しておく必要がある。
038 *
039 * @og.formSample
040 * ●形式:<og:backGamen keys="・・・" vals="・・・" > ・・Body・・ </og:backGamen>
041 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
042 *
043 * ●Tag定義:
044 *   <og:backGamen
045 *       type               【TAG】ボタンのタイプ[link/button/relLink/relButton/historyBack]を指定します(初期値:link)
046 *       command            【TAG】(通常使いません)戻る時に指定する command を設定できます(初期値:RENEW)
047 *       gamenId            【TAG】(通常使いません)戻り先の画面をセットします(初期値:BACK_GAMENID)
048 *       keys               【TAG】リンク先に渡すキーをCSV形式で複数指定します
049 *       vals               【TAG】keys属性に対応する値をCSV形式で複数指定します
050 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
051 *       href               【HTML】リンク先のURLを指定します
052 *       target             【HTML】リンク先の表示ターゲットを指定します(初期値:CONTENTS)
053 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
054 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
055 *       dir                【HTML】文字表記の方向(dir)を指定します
056 *       title              【HTML】要素に対する補足的情報(title)を設定します
057 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
058 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 〜 32767)
059 *       accesskey          【HTML】アクセスキー(alt+キーで直接指定)を割り当てます
060 *       clazz              【HTML】要素に対して class 属性を設定します
061 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
062 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
063 *       onBlur             【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")
064 *       onFocus            【HTML】JavaScriptのイベント onFocus を設定します
065 *       ondblClick         【HTML】JavaScriptのイベント ondblClick を設定します
066 *       onMouseDown        【HTML】JavaScriptのイベント onMouseDown を設定します
067 *       onMouseUp          【HTML】JavaScriptのイベント onMouseUp を設定します
068 *       onMouseMove        【HTML】JavaScriptのイベント onMouseMove を設定します
069 *       onMouseOut         【HTML】JavaScriptのイベント onMouseOut を設定します
070 *       onMouseOver        【HTML】JavaScriptのイベント onMouseOver を設定します
071 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
072 *   >   ... Body ...
073 *   </og:backGamen>
074 *
075 * ●使用例
076 *   <og:backGamen keys="displayMsg,clear" vals="MSG0065,true" >
077 *       <img src="{@SYS.JSP}/image/back.gif" alt="{@BACK_GAMENID}" />
078 *       <og:message lbl="MSG0049" />
079 *   </og:backGamen>
080 *
081 * @og.rev 3.1.8.0 (2003/05/16) 新規作成
082 * @og.group 画面制御
083 *
084 * @version  4.0
085 * @author   Kazuhiko Hasegawa
086 * @since    JDK5.0,
087 */
088public class BackGamenTag extends HTMLTagSupport {
089        //* このプログラムのVERSION文字列を設定します。   {@value} */
090        private static final String VERSION = "5.7.1.2 (2013/12/20)" ;
091
092        private static final long serialVersionUID = 571220131220L ;
093
094        // 4.0.0 (2005/05/31) JDK5.0 enum 対応
095        /**
096         * type 属性として指定できる選択肢を定義します。
097         */
098        private static final EnumType<String> CHECK_TYPE =
099                                new EnumType<String>( "ボタンのタイプ","link" )
100                                        .append( "link"   ,"戻るリンクを作成します。" )
101                                        .append( "relLink","戻るリンク(相対パス)を作成します。" )
102                                        .append( "button" ,"戻るボタンを作成します。" )
103                                        .append( "relButton","戻るボタン(相対パス)を作成します。" )
104                                        .append( "historyBack","通常のヒストリバックボタンを作成します。" ) ;
105
106        private String          type            = CHECK_TYPE.getDefault() ;
107        private String          command         = "RENEW" ;
108        private String          gamenId         = null;
109        private String          target          = "CONTENTS";
110        private String          accesskey       = "R";
111        private String[]        keys            = null;
112        private String[]        vals            = null;
113        private String          body            = null;
114        private String          backAddress     = null; // 4.0.1.0 (2007/12/18)
115
116        /**
117         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
118         *
119         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
120         */
121        @Override
122        public int doStartTag() {
123                return( EVAL_BODY_BUFFERED );   // Body を評価する。( extends BodyTagSupport 時)
124        }
125
126        /**
127         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
128         *
129         * @return      後続処理の指示(SKIP_BODY)
130         */
131        @Override
132        public int doAfterBody() {
133                body = getBodyString();
134
135                return(SKIP_BODY);
136        }
137
138        /**
139         * タグリブオブジェクトをリリースします。
140         *
141         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
142         *
143         */
144        @Override
145        protected void release2() {
146                super.release2();
147                type            = CHECK_TYPE.getDefault() ;
148                command         = "RENEW" ;
149                gamenId         = null;
150                target          = "CONTENTS";
151                accesskey       = "R";
152                keys            = null;
153                vals            = null;
154                body            = null;
155                backAddress     = null;
156        }
157
158        /**
159         * 戻るボタン/戻るリンクを作成します。
160         *
161         * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャッシュの取り出し先を変更する。
162         * @og.rev 3.5.4.0 (2003/11/25) 履歴(history)オブジェクトのback() メソッドを利用した戻る機能を追加します。
163         * @og.rev 4.0.1.0 (2007/12/17) BackAddress対応
164         * @og.rev 5.0.2.0 (2009/11/01) 相対パスでの戻るリンク対応
165         *
166         * @return  戻るボタン/戻るリンク
167         */
168        @Override
169        protected String makeTag() {
170                String rtn = "" ;
171
172                if( gamenId == null ) {
173                        gamenId = getBackGamenId() ;
174                }
175                if( backAddress == null) { // 4.0.1.0 (2007/12/17)
176                        backAddress = getBackAddress();
177                }
178
179                // 4.0.0 (2005/05/31)
180                if( "historyBack".equalsIgnoreCase( type ) ) {
181                        String hb = getRequest().getParameter( "historyBack" );
182                        if( "1".equals( hb ) ) {
183                                rtn = makeHistoryBackTag();
184                        }
185                }
186                else {
187                        if( checkCondition( gamenId ) ) {
188                                set( "target" ,nval( get( "target" ), target ) );
189
190                                // 5.0.2.0 (2009/11/01) 相対パスでの戻る対応
191                                if( "link".equalsIgnoreCase( type ) || "relLink".equalsIgnoreCase( type ) ) {
192                                        rtn = makeLinkTag();
193                                }
194                                else if( "button".equalsIgnoreCase( type ) || "relButton".equalsIgnoreCase( type ) ) {
195                                        rtn = makeButtonTag();  // 3.8.1.2 (2005/12/19)
196                                }
197                                else {
198                                        String errMsg = "指定の type は、下記の範囲で指定してください。"
199                                                                        + "type=" + type + " : "
200                                                                        + CHECK_TYPE.toString();
201                                        throw new HybsSystemException( errMsg );
202                                }
203                        }
204                }
205
206                return rtn ;
207        }
208
209        /**
210         * 戻るリンクを作成します。
211         *
212         * @og.rev 3.5.5.0 (2004/03/12) 戻るアドレスを、GUIInfoより取得するように変更。
213         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
214         * @og.rev 3.7.0.3 (2005/03/01) 戻る行番号を、BACK_ROW_KEYより取得し、SEL_ROW で渡す。
215         * @og.rev 4.0.1.0 (2007/12/17) 戻るアドレスをbackAddressを使うように変更
216         * @og.rev 4.0.2.1 (2007/12/27) リクエスト部からGAMENIDを外していたが、二段階戻る場合に不具合が出たため元に戻す
217         * @og.rev 5.0.2.0 (2009/11/01) 相対パスでの戻るリンク対応
218         *
219         * @return  戻るリンク
220         */
221        private String makeLinkTag() {
222                set( "body",getMsglbl( gamenId ) );
223                String href = get( "href" );
224                if( href == null) {
225                        // 3.5.5.0 (2004/03/12)
226                        // 5.0.2.0 (2009/11/01) 相対パスでの戻る対応
227                        if( backAddress == null || "relLink".equalsIgnoreCase( type ) ) {// 4.0.1.0 (2007/12/17) if文追加
228                                GUIInfo guiInfo = getGUIInfo( gamenId ); // 4.0.0 (2005/01/31)
229                                if( guiInfo == null ) { return ""; } // 見つからない場合は、アクセス不可
230                                String address = guiInfo.getRealAddress( "index.jsp" );
231                                href = getRequestParameter( address );
232                        }
233                        else { // 4.0.1.0 (2007/12/17)
234                                href = backAddress;
235                        }
236                }
237
238                // 3.7.0.3 (2005/03/01) 戻る行番号を、BACK_ROW_KEYより取得し、SEL_ROW で渡す。
239                String rowkey = HybsSystem.BACK_ROW_KEY + getGUIInfoAttri( "KEY" );
240                String rowVal = (String)getSessionAttribute( rowkey );
241
242                String[] keys2 = new String[] { "command","GAMENID","SEL_ROW" };
243                String[] vals2 = new String[] {  command , gamenId , rowVal   };
244//              String[] keys2 = new String[] { "command", "SEL_ROW" }; // 4.0.1.0 (2007/12/18)→4.0.2.1(2007/12/27)GAMENIDを付けるように戻す
245//              String[] vals2 = new String[] {  command , rowVal   }; // 4.0.1.0 (2007/12/18)→上と同様
246                String urlEnc2 = XHTMLTag.urlEncode( keys2,vals2 );
247                href = XHTMLTag.addUrlEncode( href,urlEnc2 );
248
249                String urlEnc = XHTMLTag.urlEncode( keys,vals );
250                href = XHTMLTag.addUrlEncode( href,urlEnc );
251
252                set( "href",href );
253
254                return XHTMLTag.link( getAttributes() ) ;
255        }
256
257        /**
258         * 戻るボタンのフォームを作成します。
259         *
260         * @og.rev 3.5.5.0 (2004/03/12) 戻るアドレスを、GUIInfoより取得するように変更。
261         * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。
262         * @og.rev 3.8.1.2 (2005/12/19) メソッド名変更、inputタグ⇒buttonタグ変更
263         * @og.rev 4.0.1.0 (2007/12/17) BACK_ADDRESS対応
264         * @og.rev 5.0.2.0 (2009/11/01) 相対パスでの戻るリンク対応
265         *
266         * @return  戻るボタンのフォーム
267         */
268        private String makeButtonTag() {
269
270                String href = get( "href" );
271                if( href == null ) {
272                        // 3.5.5.0 (2004/03/12)
273                        // 5.0.2.0 (2009/11/01) 相対パスでの戻る対応
274                        if( backAddress == null || "relButton".equalsIgnoreCase( type ) ) { // 4.0.1.0 (2007/12/18) if文化
275                                GUIInfo guiInfo = getGUIInfo( gamenId );
276                                String address = guiInfo.getRealAddress();
277                                set( "action", address + "index.jsp" );
278                        }
279                        else {
280                                set( "action", backAddress ); // 4.0.1.0 (2007/12/18)
281                        }
282                }
283                else {
284                        set( "action",href ) ;
285                }
286
287                StringBuilder body = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
288
289                // 3.8.1.2 (2005/12/19) inputタグ⇒buttonタグへ変更。
290                TagBuffer tag = new TagBuffer( "button" );
291                tag.add( "type","submit" );
292                tag.add( "accesskey",get( "accesskey" ) );
293                tag.setBody( getMsglbl( gamenId ) );
294                body.append( tag.makeTag() );
295                body.append( HybsSystem.CR );
296
297                // command を hidden で作成します。
298                body.append( XHTMLTag.hidden( "command",command ) );    // hidden(name,value);
299                body.append( HybsSystem.CR );
300
301                // GAMENID を hidden で作成します。
302                body.append( XHTMLTag.hidden( "GAMENID",gamenId ) );    // hidden(name,value);
303                body.append( HybsSystem.CR );
304
305                // keys,vals を hidden で作成します。
306                if( keys != null ) {
307                        if( keys.length != vals.length ) {
308                                String errMsg = "キーとバリューの個数が異なります。"
309                                                        + HybsSystem.CR
310                                                        + " keys.length=[" + keys.length + "]  vals.length=[" + vals.length + "]"
311                                                        + " keys=" + StringUtil.array2csv( keys ) + HybsSystem.CR
312                                                        + " vals=" + StringUtil.array2csv( vals )  ;    // 5.1.8.0 (2010/07/01) errMsg 修正
313                                throw new HybsSystemException( errMsg );
314                        }
315
316                        for( int i=0; i<keys.length; i++ ) {
317                                body.append( XHTMLTag.hidden( keys[i],vals[i] ) );      // hidden(name,value);
318                                body.append( HybsSystem.CR );
319                        }
320                }
321
322                // 3.7.0.3 (2005/03/01) 戻る行番号を、BACK_ROW_KEYより取得し、SEL_ROW で渡す。
323                String rowkey = HybsSystem.BACK_ROW_KEY + getGUIInfo( "GUI.KEY" );
324                String rowVal = (String)getSessionAttribute( rowkey );
325                // 3.7.0.5 (2005/04/11) null の時は、返さないように変更
326                if( rowVal != null ) {
327                        body.append( XHTMLTag.hidden( "SEL_ROW",rowVal ) );     // hidden(name,value);
328                        body.append( HybsSystem.CR );
329                }
330
331                set( "body",body.toString() );
332
333                return XHTMLTag.form( getAttributes() ) ;
334        }
335
336        /**
337         * 戻るリンク(historyBack)を作成します。
338         *
339         * @og.rev 3.5.4.0 (2003/11/25) 履歴(history)オブジェクトのback() メソッドを利用した戻る機能を追加します。
340         *
341         * @return  戻るリンク
342         */
343        private String makeHistoryBackTag() {
344                StringBuilder link = new StringBuilder();
345
346                link.append( "<a onClick=\"history.back()\">" );
347                link.append( getMsglbl( gamenId ) );
348                link.append( "</a>" );
349
350                return link.toString() ;
351        }
352
353        /**
354         * BACK_GAMENID の値を取り出します。
355         *
356         * 値は、キャッシュではなく、session より HybsSystem.BACK_GAMENID_KEY をキーに
357         * 取り出します。
358         *
359         * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャッシュの取り出し先を変更する。
360         *
361         * @return  BACK_GAMENID の値
362         */
363        private String getBackGamenId() {
364                String key = HybsSystem.BACK_GAMENID_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
365                return (String)getSessionAttribute( key );
366        }
367
368        /**
369         * BACK_ADDRESS の値を取り出します。
370         *
371         * 値は、キャッシュではなく、session より HybsSystem.BACK_ADDRESS_KEY をキーに
372         * 取り出します。
373         *
374         * @og.rev 4.0.1.0 (2007/12/17) メソッド追加
375         *
376         * @return  BACK_GAMENID の値
377         */
378        private String getBackAddress() {
379                String key = HybsSystem.BACK_ADDRESS_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
380                return (String)getSessionAttribute( key );
381        }
382
383        /**
384         * 【TAG】ボタンのタイプ[link/button/relLink/relButton/historyBack]を指定します(初期値:link)。
385         *
386         * @og.tag
387         * button と設定すると、戻るボタンに、link と設定すると、戻るリンクになります。
388         * historyBack は、IE等の戻る操作と同じで、JavaScriptのヒストリーバックを行います。
389         * また、relButton、relLinkとすると、それぞれ相対パス(画面IDから飛び先のアドレスを元に生成)
390         * で戻り先のアドレスが生成されます。
391         * 初期値は、戻るリンク(link)です。
392         *
393         * <table border="1" frame="box" rules="all" >
394         *   <caption>ボタンのタイプ説明</caption>
395         *   <tr><th>タイプ            </th><th>説明                                         </th></tr>
396         *   <tr><td>link           </td><td>戻るリンク                                      </td></tr>
397         *   <tr><td>button         </td><td>戻るボタン                                      </td></tr>
398         *   <tr><td>relLink        </td><td>戻るリンク(相対パス)                </td></tr>
399         *   <tr><td>relButton      </td><td>戻るボタン(相対パス)                </td></tr>
400         *   <tr><td>historyBack</td><td>通常のヒストリバックボタン  </td></tr>
401         * </table>
402         *
403         * @og.rev 5.0.2.0 (2009/11/01) 相対パスでの戻るリンク対応
404         *
405         * @param   tp ボタンのタイプ[link/button/relLink/relButton/historyBack]
406         */
407        public void setType( final String tp ) {
408                type = CHECK_TYPE.nval( tp );
409        }
410
411        /**
412         * 【TAG】(通常使いません)戻る時に指定する command を設定できます(初期値:RENEW)。
413         *
414         * @og.tag
415         * 通常は、RENEW で戻ります。
416         * (初期値は、RENEW なので設定不要です。)
417         *
418         * @param       cmd コマンド
419         */
420        public void setCommand( final String cmd ) {
421                command = nval( getRequestParameter( cmd ),command );
422                if( command != null ) { command = command.toUpperCase(Locale.JAPAN); }
423        }
424
425        /**
426         * 【TAG】(通常使いません)戻り先の画面をセットします(初期値:BACK_GAMENID)。
427         *
428         * @og.tag
429         * 通常は、自動的に、BACK_GAMENID の値がセットされますが、
430         * 先祖に戻る(画面A⇒画面B⇒画面C のときに、画面Aに戻る)場合や、
431         * 別の画面に、進む場合に、直接指定します。
432         * (初期値は、来た画面:BACK_GAMENID ですので、設定不要です。)
433         * 値は、キャッシュではなく、session より HybsSystem.BACK_GAMENID_KEY をキーに
434         * 取り出します。
435         * これは、command="NEW" で、BACK_GAMENID リクエストが存在し、BACK_GAMENID と
436         * 自分自身の画面IDが異なる場合のみ、RequestCacheTag#backGamenIdSet メソッドで
437         * session に登録されます。
438         *
439         * @param   id 戻り先の画面ID
440         */
441        public void setGamenId( final String id ) {
442                gamenId = nval( getRequestParameter( id ),gamenId );
443        }
444
445        /**
446         * 【TAG】リンク先に渡すキーをCSV形式で複数指定します。
447         *
448         * @og.tag
449         * 戻る時に、検索時のキャッシュに指定した引数以外に指定したり、別の値に置き換えたり
450         * する場合のキーを設定できます。カンマ区切りで複数指定できます。
451         * vals 属性には、キーに対応する値を、設定してください。
452         * 例:<b>keys="displayMsg,clear"</b> vals="MSG0065,true"
453         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
454         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
455         *
456         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
457         *
458         * @param       key リンク先に渡すキー(例:keys="displayMsg,clear")
459         * @see         #setVals( String )
460         */
461        public void setKeys( final String key ) {
462                keys = getCSVParameter( key );
463        }
464
465        /**
466         * 【TAG】keys属性に対応する値をCSV形式で複数指定します。
467         *
468         * @og.tag
469         * キーに設定した値を、カンマ区切り文字で複数して出来ます。
470         * 指定順序は、キーと同じにしておいて下さい。
471         * 例:keys="displayMsg,clear" <b>vals="MSG0065,true"</b>
472         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
473         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
474         *
475         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
476         *
477         * @param       val keys属性に対応する値(例:vals="MSG0065,true")
478         * @see         #setKeys( String )
479         */
480        public void setVals( final String val ) {
481                vals = getCSVParameter( val );
482        }
483
484        /**
485         * 【HTML】リンク先の表示ターゲットを指定します(初期値:CONTENTS)。
486         *
487         * @og.tag
488         * リンク先の文書を表示させるフレーム、またはウィンドウの名前を指定します。
489         *
490         * @param       tgt リンク先の表示ターゲット
491         */
492        public void setTarget( final String tgt ) {
493                set( "target",getRequestParameter( tgt ) );
494        }
495
496        /**
497         * 【HTML】リンク先のURLを指定します。
498         *
499         * @og.tag リンク先のURLを指定します。
500         *
501         * @param       href リンク先のURL
502         */
503        public void setHref( final String href ) {
504                set( "href",getRequestParameter( href ) );
505        }
506
507        /**
508         * メッセージラベル(msglbl)をセットします。
509         *
510         * メッセージラベルは、meg属性か、lbl属性で登録された値を、
511         * それぞれのリソースに応じて各言語に変換した結果を格納しています。
512         * meg属性 と lbl属性は、同時登録できません。
513         *
514         * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更
515         *
516         * @param        gamenId 画面ID
517         *
518         * @return   メッセージラベル
519         */
520        private String getMsglbl( final String gamenId ) {
521                StringBuilder rtn = new StringBuilder();
522//              String msg = getMsglbl();
523                String msglbl = getMsglbl();    // 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更
524
525//              if( msg != null ) {
526//                      rtn.append( msg );
527                if( msglbl != null ) {
528                        rtn.append( msglbl );
529                        set( "accesskey",nval( get( "accesskey" ),accesskey ) );
530                        rtn.append( "(" ).append( get( "accesskey" ) ).append( ")" ) ;
531                }
532                else if( body != null && body.length() > 0 ) {
533                        rtn.append( body );
534                }
535                else {
536                        GUIInfo guiInfo = getGUIInfo( gamenId );                // 4.0.0 (2005/01/31)
537                        if( guiInfo == null ) { return ""; }    // 見つからない場合は、アクセス不可
538
539                        rtn.append( guiInfo.getLongName() );
540                }
541
542                return rtn.toString() ;
543        }
544
545        /**
546         * 画面に戻るボタン/リンクを表示するかどうかを条件判定します。
547         * 引数の gamenId は、BACK_GAMENID の事で、このタグの属性定義で設定されて
548         * いない場合は、session より、BACK_GAMENID を取り出します。つまり、取り出す為には、
549         * command="NEW" で、キャッシュに設定しておく必要があります。
550         *
551         * 随時、条件を追加していきます。
552         *
553         * 条件1:自分自身へ戻る機能はサポートできません。
554         * 条件2:command="NEW" で、キャッシュに設定しておく必要がある。
555         *
556         * @og.rev 3.5.5.0 (2004/03/12) デバッグ情報を出力するように機能追加
557         *
558         * @param        gmnId 画面ID(BACK_GAMENID)
559         *
560         * @return   判定結果
561         */
562        private boolean checkCondition( final String gmnId ) {
563
564                String thisGamen = getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
565                boolean rtn = ( gmnId != null ) &&
566                                                ( gmnId.length() > 0 ) &&
567                                                ( ! gmnId.equals( thisGamen ) ) ;
568
569                // 3.5.5.0 (2004/03/12)
570                if( isDebug() ) {
571                        String cmd =pageContext.getRequest().getParameter( "command" );
572
573                        StringBuilder buf = new StringBuilder();
574                        buf.append( getDocumentLink() );                // 4.0.0 (2005/02/28)
575                        buf.append( "<pre>" );
576                        buf.append( "command  =[" ).append( cmd       ).append( "]" ).append( HybsSystem.CR );
577                        buf.append( "type     =[" ).append( type      ).append( "]" ).append( HybsSystem.CR );
578                        buf.append( "gamenId  =[" ).append( gmnId     ).append( "]" ).append( HybsSystem.CR );
579                        buf.append( "thisGamen=[" ).append( thisGamen ).append( "]" ).append( HybsSystem.CR );
580                        buf.append( "checkCondition=[" ).append( rtn  ).append( "]" );
581                        buf.append( "</pre>" );
582                        jspPrint( buf.toString() );
583                }
584
585                return rtn ;
586        }
587}