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}