    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.resource.GUIInfo;
    020import org.opengion.fukurou.util.Attributes;
    021import org.opengion.fukurou.util.XHTMLTag;
    022
    023import static org.opengion.fukurou.util.StringUtil.nval ;
    024
    025import java.io.File;
    026
    027/**
    028 * 画面ＩＤと同じヘルプファイルがあればリンクを作成するタグです(通常は query.jsp に組込み)。
    029 *
    030 * ヘルプファイルは、システムパラメータ の HELP_URL で定義されているhelpフォルダに配置します。
    031 * このフォルダに、画面IDと同じファイル(例えば、GE0001.html など)があれば、リンクを作成します。
    032 * ファイルがなければ、リンクは表示されません。
    033 * メッセージの表示の制御は、viewMsg 属性で指定します。(false でファイルが存在した場合のみ表示)
    034 * ファイルの拡張子も指定できますが、一般に、html でヘルプファイルを作成するほうが
    035 * すばやく表示できます。
    036 * また、og:topMenuタグ内にこのタグを記述することで、各画面分類に対するヘルプを表示することが
    037 * できるようになります。
    038 * (この場合も、画面分類のキーがヘルプファイルのキーになります)
    039 *
    040 * @og.formSample
    041 * ●形式：一般ユーザーが直接組み込むことはありません。
    042 * ●body：なし
    043 *
    044 * ●Tag定義：
    045 *   &lt;og:help
    046 *       guiInfoKey         【TAG】GUIInfo のキーを指定します
    047 *       extension          【TAG】拡張子を指定します(初期値:html)
    048 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    049 *       target             【TAG】TARGET 属性を指定します(初期値:_blank)
    050 *       viewMsg            【TAG】メッセージを常時表示させるかどうか[true/false]を指定します(初期値:false)
    051 *       iconURL            【TAG】ヘルプリンクをアイコンで指定する場合のアイコンURLを指定します (初期値:DEFAULT_HELP_ICON[=/image/help2.png])
    052 *       faqIconURL         【TAG】FAQリンクをアイコンで指定する場合のアイコンURLを指定します (初期値:DEFAULT_FAQ_ICON[=/image/qaicon.png])
    053 *       useFaq             【TAG】FAQ表示の機能を利用するかどうか[true/false]を指定します (初期値:USE_GUI_FAQ[=false])
    054 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    055 *   /&gt;
    056 *
    057 * ●使用例
    058 *     &lt;og:help guiInfoKey="{&#064;GUI.KEY}" lbl="HELP" /&gt;
    059 *
    060 *     &lt;og:help
    061 *        guiInfoKey    = "GUIInfo のキーを指定します(必須)。"
    062 *        extension     = "拡張子を指定します(初期値:html)。"
    063 *        lbl           = "ラベルリソースのメッセージIDを指定します。"
    064 *        target        = "TARGET 属性を指定します(初期値:_blank)。"
    065 *        viewMsg       = "メッセージを常時表示させるかどうか[true/false]を指定します(初期値:false)。"
    066 *        iconURL       = "ヘルプアイコンのURL(初期値:/image/help.png)"; // 5.3.8.0 (2011/08/01)
    067 *     /&gt;
    068 *
    069 * @og.group メニュー制御
    070 *
    071 * @version  4.0
    072 * @author       Kazuhiko Hasegawa
    073 * @since    JDK5.0,
    074 */
    075public class HelpTag extends CommonTagSupport {
    076        //* このプログラムのVERSION文字列を設定します。   {@value} */
    077        private static final String VERSION = "5.6.7.3 (2013/08/23)" ;
    078
    079        private static final long serialVersionUID = 567320130823L ;
    080
    081        private static final String     JSP = HybsSystem.sys( "JSP" );
    082
    083        private String  guiInfoKey      = null;
    084        private String  extension       = "html";
    085        private String  baseURL         = HybsSystem.sys( "HELP_URL" );
    086        private String  target          = "_blank";             // 3.6.0.7 (2004/11/06)
    087        private boolean viewMsg         = false;
    088        private String  iconURL         = HybsSystem.sys( "DEFAULT_HELP_ICON" );        // 5.4.3.6 (2012/01/19)
    089        private String  faqIconURL      = HybsSystem.sys( "DEFAULT_FAQ_ICON" );         // 5.5.0.4 (2012/03/16)
    090        private String  faqGUI          = HybsSystem.sys( "DEFAULT_FAQ_GUI" );          // 5.5.0.4 (2012/03/16)
    091
    092        private boolean  useFaq         = HybsSystem.sysBool( "USE_GUI_FAQ" );          // 5.6.7.3 (2013/08/23)
    093        private boolean  useFaqCtrl     = HybsSystem.sysBool( "USE_GUI_FAQ_CTRL" ); // 5.6.7.3 (2013/08/23)
    094
    095        /**
    096         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    097         *
    098         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    099         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
    100         * @og.rev 5.5.0.4 (2012/03/16) FAQ対応
    101         * @og.rev 5.6.4.3 (2013/05/26) FAQの画面別対応
    102         *
    103         * @return      後続処理の指示
    104         */
    105        @Override
    106        public int doEndTag() {
    107                debugPrint();           // 4.0.0 (2005/02/28)
    108
    109                TopMenuTag topMenu = (TopMenuTag)findAncestorWithClass( this,TopMenuTag.class );
    110                if( topMenu == null ) {
    111                        jspPrint( makeTag() );
    112                        if(useFaq){
    113                                jspPrint( makeTagFaq() );
    114                        }
    115                }
    116                else {
    117                        // 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
    118                        String linkFormat = getLink( baseURL + "{FILENAME}" );
    119                        String baseDir = HybsSystem.url2dir( baseURL );
    120                        topMenu.add( "helpLinkFormat",linkFormat );
    121                        topMenu.add( "helpBaseDir",baseDir );
    122                        if(useFaq){ // 5.5.0.4 (2012/03/16) FAQ対応
    123                                GUIInfo guiInfo = getGUIInfo( faqGUI );
    124                                if( guiInfo != null ) {
    125                                        String address = guiInfo.getRealAddress( get( "href" ) );
    126                                        String faqFormat = getFAQLink(getRequestParameter( address+"?command=NEW&GAMENID="+faqGUI+"&KNRNGUI={GUIKEY}" ));
    127                                        topMenu.add( "faqLinkFormat",faqFormat );
    128                                }
    129                        }
    130                }
    131
    132                return EVAL_PAGE ;
    133        }
    134
    135        /**
    136         * タグリブオブジェクトをリリースします。
    137         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    138         *
    139         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    140         * @og.rev 3.0.0.3 (2003/02/21) ターゲット属性の新規追加他
    141         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    142         * @og.rev 3.6.0.7 (2004/11/06) target 属性の初期値を _new から _blank に変更
    143         * @og.rev 5.3.8.0 (2011/08/01) iconURL追加
    144         * @og.rev 5.5.0.4 (2012/03/16) faq
    145         * @og.rev 5.6.4.3 (2013/05/24) faqCtrl
    146         * @og.rev 5.6.7.3 (2013/08/23) useFaq と useFaqCtrl のキーの後ろにスペースが入っていた。
    147         */
    148        @Override
    149        protected void release2() {
    150                super.release2();
    151                guiInfoKey      = null;
    152                extension       = "html";
    153                baseURL         = HybsSystem.sys( "HELP_URL" );
    154                target          = "_blank";             // 3.6.0.7 (2004/11/06)
    155                viewMsg         = false;
    156                iconURL         = HybsSystem.sys( "DEFAULT_HELP_ICON" );                // 5.4.3.6 (2012/01/19)
    157                faqIconURL      = HybsSystem.sys( "DEFAULT_FAQ_ICON" );                 // 5.5.0.4 (2012/03/16)
    158                faqGUI          = HybsSystem.sys( "DEFAULT_FAQ_GUI" );                  // 5.5.0.4 (2012/03/16)
    159
    160                useFaq          = HybsSystem.sysBool( "USE_GUI_FAQ" );                  // 5.6.7.3 (2013/08/23)
    161                useFaqCtrl      = HybsSystem.sysBool( "USE_GUI_FAQ_CTRL" );             // 5.6.7.3 (2013/08/23)
    162        }
    163
    164        /**
    165         * HELPリンクを作成します。
    166         *
    167         * @og.rev 3.0.0.3 (2003/02/21) ターゲット属性の新規追加
    168         * @og.rev 3.0.1.0 (2003/03/03) viewMsg フラグの制御のバグ修正
    169         * @og.rev 5.3.8.0 (2011/08/01) iconURL対応
    170         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
    171         * @og.rev 5.5.0.4 (2012/03/16) faq
    172         *
    173         * @return      リンクタグ文字列
    174         */
    175        protected String makeTag() {
    176                String rtn = "";
    177
    178                if( guiInfoKey == null ) {
    179                        guiInfoKey = getGUIInfoAttri( "KEY" );
    180                }
    181
    182                String url = baseURL + guiInfoKey + "." + extension;
    183                File  file = new File( HybsSystem.url2dir( url ) );
    184
    185                // ファイルの存在チェック
    186                if( file.exists() ) {                                           // 3.5.6.0 (2004/06/18)
    187                        // 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
    188                        rtn = getLink( url );
    189                }
    190                else if( viewMsg ) {
    191                        rtn = getLinkBody(null,getMsglbl()); // 5.5.0.4
    192                }
    193
    194                return rtn;
    195        }
    196
    197        /**
    198         * FAQリンクを作成します。
    199         *
    200         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
    201         * @og.rev 5.6.4.3 (2013/05/24) FAQ存在チェック対応
    202         *
    203         * @return      リンクタグ文字列
    204         */
    205        protected String makeTagFaq() {
    206                String rtn = "";
    207
    208                if( !useFaqCtrl && !"true".equals(getGUIInfoAttri( "FAQ" ) ) ) { return rtn; } // 5.6.4.3 (2013/05/24) 若干やっつけ
    209
    210                if( guiInfoKey == null ) {
    211                        guiInfoKey = getGUIInfoAttri( "KEY" );
    212                }
    213
    214                GUIInfo guiInfo = getGUIInfo( faqGUI );
    215                if( guiInfo == null ) { return rtn; }   // 見つからない場合は、アクセス不可
    216
    217                String address = guiInfo.getRealAddress( get( "href" ) );
    218                String url = getRequestParameter( address+"?command=NEW&GAMENID="+faqGUI+"&KNRNGUI="+guiInfoKey );
    219
    220                rtn = getFAQLink( url );
    221
    222                return rtn;
    223        }
    224
    225        /**
    226         * リンク文字列を作成します。
    227         *
    228         * @og.rev 5.3.9.0 (2011/09/01) 新規作成
    229         * @og.rev 5.5.0.4 (2012/03/16) faq
    230         *
    231         * @param       url     リンクのURL
    232         *
    233         * @return      リンク文字列
    234         */
    235        private String getLink( final String url ) {
    236                Attributes attri = new Attributes();
    237                String path = getContextPath();
    238                attri.set( "href",path + "/" + url );
    239                attri.set( "body",getLinkBody(iconURL,getMsglbl()) ); //5.5.0.4 (2012/03/16)
    240                attri.set( "target",target );
    241                attri.set( "class", "helplink" );
    242
    243                return XHTMLTag.link( attri );
    244        }
    245
    246        /**
    247         * FAQリンク文字列を作成します。
    248         *
    249         * @og.rev 5.5.0.4 (2012/03/16) 新規作成
    250         *
    251         * @param       url     リンクのURL
    252         *
    253         * @return      リンク文字列
    254         */
    255        private String getFAQLink( final String url ) {
    256                Attributes attri = new Attributes();
    257                attri.set( "href", url );
    258                attri.set( "body",getLinkBody(faqIconURL,"FAQ") );
    259                attri.set( "target",target );
    260                attri.set( "class", "faqlink" );
    261
    262                return XHTMLTag.link( attri );
    263        }
    264
    265        /**
    266         * リンクのボディー部分を作成します。
    267         *
    268         * @og.rev 5.3.8.0 (2011/08/01) 新規作成
    269         * @og.rev 5.3.9.0 (2011/09/01) 画像表示時にtitle属性を付加
    270         * @og.rev 5.5.0.4 (2012/03/16) 引数対応
    271         *
    272         * @param       icon    アイコン
    273         * @param       title   タイトル
    274         *
    275         * @return      リンクボディー文字列
    276         */
    277        private String getLinkBody(final String icon, final String title) {
    278                String rtn = null;
    279                if( icon == null || icon.length() == 0 ) {
    280                        rtn = getMsglbl();
    281                }
    282                else {
    283                        rtn = "<img src=\"" + JSP + icon + "\" title=\"" + title + "\"/>";
    284                }
    285                return rtn;
    286        }
    287
    288        /**
    289         * 【TAG】GUIInfo のキーを指定します。
    290         *
    291         * @og.tag GUIInfo のキーを指定します。
    292         *
    293         * @param       key     GUIInfo のキー
    294         */
    295        public void setGuiInfoKey( final String key ) {
    296                guiInfoKey = getRequestParameter( key );
    297        }
    298
    299        /**
    300         * 【TAG】拡張子を指定します(初期値:html)。
    301         *
    302         * @og.tag
    303         * なにも設定されていない場合は、"html" が初期値となります。
    304         * ここでは、ピリオドは、含める必要はありません。
    305         *
    306         * @param       ext 拡張子
    307         */
    308        public void setExtension( final String ext ) {
    309                extension = nval( getRequestParameter( ext ),extension );
    310        }
    311
    312        /**
    313         * 【TAG】TARGET 属性を指定します(初期値:_blank)。
    314         *
    315         * @og.tag
    316         * 初期値は、 "_blank" として、新規に画面を立ち上げます。
    317         * CONTENTS 等を指定すれば、コンテンツフレーム(メニューの右側全面)に、
    318         * RESULT を指定すれば、リザルトフレーム(メニュー右下側)に表示します。
    319         *
    320         * @og.rev 3.0.0.3 (2003/02/21) ターゲット属性の新規追加
    321         *
    322         * @param       val TARGET 属性を指定します(初期値:"_blank")
    323         */
    324        public void setTarget( final String val ) {
    325                target = nval( getRequestParameter( val ),target );
    326        }
    327
    328        /**
    329         * 【TAG】メッセージを常時表示させるかどうか[true/false]を指定します(初期値:false)。
    330         *
    331         * @og.tag
    332         * "true"の場合は、常時表示させます。
    333         * ファイルが、存在した場合は、リンクが張られ、存在しない場合は、リンクが
    334         * 張られません。
    335         * "false" の場合は、ファイルが、存在した場合は、リンクが張られ、存在しない場合は、
    336         * なにも表示されません。
    337         * 初期値は、 "false"(メッセージを常時表示しない)です。
    338         *
    339         * @og.rev 3.0.0.3 (2003/02/21) メッセージ表示属性の新規追加
    340         *
    341         * @param       flag メッセージを常時表示させるかどうかを指定 [true:常時表示/false:非表示]
    342         */
    343        public void setViewMsg( final String flag ) {
    344                viewMsg = nval( getRequestParameter( flag ),viewMsg );
    345        }
    346
    347        /**
    348         * 【TAG】ヘルプリンクをアイコンで指定する場合のアイコンURLを指定します
    349         *              (初期値:DEFAULT_HELP_ICON[={@og.value org.opengion.hayabusa.common.SystemData#DEFAULT_HELP_ICON}])。
    350         *
    351         * @og.tag
    352         * ヘルプリンクをアイコンで指定する場合、そのアイコン画像のURLを指定します。
    353         * URLは、/[CONTEXT_PATH]/jspを基準として指定します。
    354         * 例) /ge/jsp/image/help.pngに存在する画像を指定する場合、iconURL=/image/help.pngを指定します。
    355         * このURLが指定されない場合、ヘルプリンクは、msgLbl属性で指定されたテキストで表示されます。
    356         * (初期値:システム定数のDEFAULT_HELP_ICON[={@og.value org.opengion.hayabusa.common.SystemData#DEFAULT_HELP_ICON}])。
    357         *
    358         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
    359         *
    360         * @param url アイコンURL
    361         * @see         org.opengion.hayabusa.common.SystemData#DEFAULT_HELP_ICON
    362         */
    363        public void setIconURL( final String url ) {
    364                iconURL = nval( getRequestParameter( url ),iconURL );
    365        }
    366
    367        /**
    368         * 【TAG】FAQリンクをアイコンで指定する場合のアイコンURLを指定します
    369         *              (初期値:DEFAULT_FAQ_ICON[={@og.value org.opengion.hayabusa.common.SystemData#DEFAULT_FAQ_ICON}])。
    370         *
    371         * @og.tag
    372         * FAQリンクをアイコンで指定する場合、そのアイコン画像のURLを指定します。
    373         * URLは、/[CONTEXT_PATH]/jspを基準として指定します。
    374         * 例) /ge/jsp/image/help.pngに存在する画像を指定する場合、iconURL=/image/help.pngを指定します。
    375         * (初期値:システム定数のDEFAULT_FAQ_ICON[={@og.value org.opengion.hayabusa.common.SystemData#DEFAULT_FAQ_ICON}])。
    376         *
    377         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
    378         *
    379         * @param url アイコンURL
    380         * @see         org.opengion.hayabusa.common.SystemData#DEFAULT_FAQ_ICON
    381         */
    382        public void setFaqIconURL( final String url ) {
    383                faqIconURL = nval( getRequestParameter( url ),faqIconURL );
    384        }
    385
    386        /**
    387         * 【TAG】FAQ表示の機能を利用するかどうか[true/false]を指定します
    388         *              (初期値:USE_GUI_FAQ[={@og.value org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ}])。
    389         *
    390         * @og.tag
    391         * trueを指定すると、FAQ画面へのリンクが表示されます。(GE80にデータが存在するかは無関係)
    392         * リンク先はfaqGUIでセットした画面に対して画面IDを引数としてわたします。
    393         * (初期値:システム定数のUSE_GUI_FAQ[={@og.value org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ}])。
    394         *
    395         * @og.rev 5.5.0.4 (2012/03/167) 新規追加
    396         *
    397         * @param       flag FAQ表示の機能を利用するかどうか [true:利用する/false:利用しない]
    398         * @see         org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ
    399         */
    400        public void setUseFaq( final String flag ) {
    401                useFaq = nval( getRequestParameter( flag ),useFaq );
    402        }
    403
    404
    405        /**
    406         * 【TAG】FAQに関連画面機能を利用するかどうか[true/false]を指定します。
    407         *              (初期値:USE_GUI_FAQ_CTRL[={@og.value org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ_CTRL}])。
    408         *
    409         * @og.tag
    410         * trueを指定すると、GE80にデータが関連画面IDとして存在する場合のみアイコンを
    411         * リンク先はfaqGUIでセットした画面に対して画面IDを引数としてわたします。
    412         * (初期値:システム定数のUSE_GUI_FAQ[={@og.value org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ}])。
    413         *
    414         * @og.rev 5.6.4.3 (2013/05/24) 新規追加
    415         *
    416         * @param       flag FAQの存在チェック機能を利用するかどうか [true:利用する/false:利用しない]
    417         * @see         org.opengion.hayabusa.common.SystemData#USE_GUI_FAQ_CTRL
    418         */
    419        public void setUseFaqCtrl( final String flag ) {
    420                useFaqCtrl = nval( getRequestParameter( flag ),useFaqCtrl );
    421        }
    422
    423        /**
    424         * このオブジェクトの文字列表現を返します。
    425         * 基本的にデバッグ目的に使用します。
    426         *
    427         * @return このクラスの文字列表現
    428         */
    429        @Override
    430        public String toString() {
    431                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    432                                .println( "VERSION"             ,VERSION        )
    433                                .println( "guiInfoKey"  ,guiInfoKey     )
    434                                .println( "extension"   ,extension      )
    435                                .println( "baseURL"             ,baseURL        )
    436                                .println( "target"              ,target         )
    437                                .println( "viewMsg"             ,viewMsg        )
    438                                .println( "iconURL"             ,iconURL        )
    439                                .println( "Other..."    ,getAttributes().getAttribute() )
    440                                .fixForm().toString() ;
    441        }
    442}