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