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 * 画面IDと同じヘルプファイルがあればリンクを作成するタグです(通常は 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 *   <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 *   />
056 *
057 * ●使用例
058 *     <og:help guiInfoKey="{@GUI.KEY}" lbl="HELP" />
059 *
060 *     <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 *     />
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}