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