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.db.DBColumn;
022    import org.opengion.hayabusa.db.Query;
023    import org.opengion.hayabusa.db.QueryFactory;
024    import org.opengion.fukurou.util.XHTMLTag;
025    import org.opengion.fukurou.util.Attributes;
026    import org.opengion.fukurou.db.Transaction;
027    import org.opengion.fukurou.db.TransactionReal;
028    
029    import static org.opengion.fukurou.util.StringUtil.nval ;
030    
031    import java.io.ObjectOutputStream;
032    import java.io.ObjectInputStream;
033    import java.io.IOException;
034    
035    /**
036     * プルãƒ?‚¦ンメニューの選択é?目をSELECTæ–??結果から作æ?するタグですã?
037     *
038     * 基本çš?�«はã€?½‘ueryタグと同じ使ã�?–¹をしますã?
039     * こã?オブジェクトにã€?queryId を与えることにより、queryId に対応しã�?Queryオブジェクãƒ?
040     * (のサブクラスのオブジェクãƒ?が作æ?されますã?
041     * ここでæŒ?®šするSELECTæ–??、ã?SELECT KEY、LABEL1、LABEL2ã€?½¥?¥?¥ FROM TABLE ?¥?¥?¥』形å¼?ã‚?
042     * してã�?‚‹å¿?¦�がありますã?特別なケースとして、ã?SELECT KEY FROM TABLE ?¥?¥?¥』形式ã?場合ã?ã€?
043     * LABEL に KEY ã�?使用されますã?
044     * SystemData の USE_SQL_INJECTION_CHECK ã�?true かã?quotCheck 属æ?ã�?true の場合ã?ã€?
045     * ?³?±?¬インジェクション対策用のクォーãƒ?‚£ションチェãƒ?‚¯を行いますã?リクエスト引数に
046     * クォーãƒ?‚£ション(')が含まれると、エラーになりますã?
047     * 同様にUSE_XSS_CHECKがtrueかã?xssCheck属æ?がtrueの場合ã?ã€?
048     * クロスサイトススクリプティング(XSS)対策ã?ためless/greater than signのチェãƒ?‚¯を行いますã?
049     *
050     * ※ こã?タグは、Transaction タグの対象ですã?
051     *
052     * @og.formSample
053     * ●形式ï¼?
054     *     <og:queryOption >
055     *          SELECTæ–?
056     *     </og:queryOption >
057     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
058     *
059     * ●Tag定義??
060     *   <og:queryOption
061     *       value              【TAG】Optionの初期値で選ばれる値を指定しまã�?
062     *       separator          【TAG】è¤?•°のラベルを合成するときに使用するé ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしまã�?初期値:スペã?ス)
063     *       defaultVal         【TAG】value値がNULLの場合に使用されるå?期å?を設定しまã�?
064     *       language           【TAG】タグå†?ƒ¨で使用するè¨?ªžコード[ja/en/zh/…]を指定しまã�?
065     *       quotCheck          【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_SQL_INJECTION_CHECK[=true])
066     *       dbid               【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
067     *       addKey             【TAG】é?目がä¸?�¤ã�?�‘の場合ã??—ベルリソ?°?½に、キーæƒ??を追åŠ?�™るかどã�?�‹を指定しまã�?初期値:false)
068     *       classUseNo         【TAG】オプションに追åŠ?�™ã‚?class 属æ?の カラãƒ?•ª号を指定しまã�?
069     *       groupUseNo         【TAG】オプションのグループ化を行うカラãƒ?•ª号を指定しまã�?
070     *       titleUseNo         【TAG】オプションに追åŠ?�™ã‚?title 属æ?の カラãƒ?•ª号を指定しまã�?
071     *       xssCheck           【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_XSS_CHECK[=true])
072     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
073     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
074     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
075     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
076     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
077     *   >   ... Body ...
078     *   </og:queryOption>
079     *
080     * ●使用ä¾?
081     *     <og:select name="CDC" >
082     *         <og:queryOption>
083     *                 select NOSYN,NOSYN,NMSYN from DB01 ORDER BY 1
084     *         </og:queryOption>
085     *     </og:select>
086     *
087     *     <og:select name="CDC" >                選択é?目のä¸?•ª上に空白をセãƒ?ƒˆしたã�?�¨きoptionタグをçµ?�ˆせることも可能ですã?
088     *         <og:option lbl="" />               初期値を設定したいときã?value属æ?を使ã�?�¾すã?
089     *         <og:queryOption value="61200" separator=":" >
090     *                 select CDBK,CDBK,NMBK from DB02 ORDER BY 1
091     *         </og:queryOption>
092     *     </og:select>
093     *
094     * @og.group 選択データ制御
095     *
096     * @version  4.0
097     * @author   Kazuhiko Hasegawa
098     * @since    JDK5.0,
099     */
100    public class QueryOptionTag extends CommonTagSupport {
101            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
102            private static final String VERSION = "5.7.1.0 (2013/12/06)" ;
103    
104            private static final long serialVersionUID = 571020131206L ;
105    
106            private transient DBTableModel  table           = null;
107            private String  selValue        = null;
108            private String  defaultVal      = null;
109            // 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
110    //      private String  dbid            = "DEFAULT";
111            private String  dbid            = null;
112            private String  sql                     = null;
113            private String  separator       = " ";          // é ?›®区åˆ?‚Šæ–?­?
114            private boolean quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 4.0.0 (2005/08/31)
115            private int             classUseNo      = -1;   // 3.8.5.2 (2006/06/09) オプションに追åŠ?�™るクラス属æ?
116            private int             groupUseNo      = -1;   // 3.8.5.2 (2006/06/09) キーブレイク時に追åŠ?�™るグループ文å­?
117            private boolean addKey          = false;                // 4.0.0 (2006/11/15) é ?›®ä¸?�¤のときに?—ベルリソ?°?½表示時にキーも付加するã€?
118            private int             titleUseNo              = -1;   // 4.3.8.0 (2009/08/01) オプションのtitle属æ?
119            private boolean xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );        // 5.0.0.2 (2009/09/15)
120            private String  rawSql          = null; // 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
121    
122            /**
123             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
124             *
125             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
126             *
127             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
128             */
129            @Override
130            public int doStartTag() {
131                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
132                    if( useTag() ) {
133                            return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
134                    }
135                    return ( SKIP_BODY );                           // Body を評価しなã�?
136            }
137    
138            /**
139             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
140             *
141             * @og.rev 3.1.1.0 (2003/03/28) ボディのå†?®¹を取得するå?ç�?‚’、CommonTagSupport で行うã€?
142             * @og.rev 3.6.0.8 (2004/11/19) エラー発生時に確実にリリースされるよã�?�« try finally 追åŠ?
143             * @og.rev 3.7.1.0 (2005/04/26) DBTableModel がすでにセãƒ?ƒˆされてã�?‚‹場合ã?、SQL処ç�?¸�要ã?
144             * @og.rev 4.0.0.0 (2005/01/31) lang â‡?ResourceManager へ変更
145             * @og.rev 4.0.0.0 (2005/08/31) useQuotCheck() による?³?±?¬インジェクション対ç­?
146             * @og.rev 3.8.6.3 (2006/11/30) SQL æ–??前後ã?スペã?スを取り除きますã?
147             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
148             * @og.rev 4.3.6.0 (2009/04/01) EventColumn対å¿?
149             * @og.rev 5.0.0.5 (2009/08/28) XSS対ç­?
150             * @og.rev 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
151             * @og.rev 5.1.9.0 (2010/08/01) TransactionTag 対応ã?上位に TransactionTag があれã?、そこからConnection をもらうã€?
152             * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
153             * @og.rev 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
154             *
155             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
156             */
157            @Override
158            public int doAfterBody() {
159                    // 3.7.1.0 (2005/04/26) DBTableModel がすでにセãƒ?ƒˆされてã�?‚‹場合ã?、SQL処ç�?¸�要ã?
160                    if( table != null ) { return(SKIP_BODY); }
161    
162                    // 4.0.0 (2005/08/31) useQuotCheck() による?³?±?¬インジェクション対ç­?
163                    useQuotCheck( quotCheck );
164                    // 5.0.0.2 (2009/09/15) XSS対ç­?
165                    useXssCheck( xssCheck );
166    
167                    sql = getBodyString().trim();
168    //              String rawsql = getBodyRawString().trim(); // 4.3.6.0 生ã?SQLを保持
169                    rawSql = getBodyRawString().trim();
170    
171                    // 4.3.6.0 (2009/04/01) セãƒ?‚·ョンへのSQLæ–?™»録
172                    // 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
173    //              String[] selectVals = getEventColumn(); // 親タグからイベントカラãƒ?¨­定を取る
174    //              if( selectVals[0] != null && selectVals[0].length() > 0 ){
175    //                      addEventColumnSQL( selectVals[1], rawsql );
176    //              }
177    
178                    Query query = QueryFactory.newInstance();               // 4.0.0 (2005/01/31)
179                    Transaction tran = null;
180                    try {
181                            // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
182    //                      final Transaction tran ;
183                            TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
184                            if( tranTag == null ) {
185    //                              tran = new TransactionReal( dbid,getApplicationInfo() );
186                                    tran = new TransactionReal( getApplicationInfo() );             // 5.3.7.0 (2011/07/01) 引数変更
187                            }
188                            else {
189                                    tran = tranTag.getTransaction();
190                            }
191                            query.setTransaction( dbid,tran );      // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
192    
193    //                      query.setConnectionID( dbid );
194                            query.setResourceManager( getResource() );      // 4.0.0 (2005/01/31)
195    
196                            query.setStatement( sql );
197    //                      query.setApplicationInfo( getApplicationInfo() );       // 3.8.7.0 (2006/12/15)
198                            query.execute();
199    
200                            table = query.getDBTableModel();
201    
202                            // 4.0.0 (2005/11/30) 検索結果の件数をã?"DB.COUNT" キーでリクエストにセãƒ?ƒˆするã€?
203                    }
204                    finally {
205    //                      if( query != null ) { query.close(); }
206                            QueryFactory.close( query );
207                            if( tran != null ) { tran.close(); }            // 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
208                    }
209                    return(SKIP_BODY);
210            }
211    
212            /**
213             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
214             *
215             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
216             * @og.rev 3.3.2.0 (2003/07/07) defaultVal 属æ?の追åŠ??
217             * @og.rev 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
218             * @og.rev 5.0.2.0 (2009/11/01) è¤?•°パラメーターの選択に対å¿?
219             * @og.rev 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
220             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
221             * @og.rev 5.7.1.0 (2013/12/06) SelectTag â‡?OptionAncestorIF に変更して、DatalistTag にも対応ã?
222             *
223             * @return      後続å?ç�??æŒ?¤º
224             */
225            @Override
226            public int doEndTag() {
227                    debugPrint();           // 4.0.0 (2005/02/28)
228                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
229                    if( useTag() ) {
230    //                      SelectTag select = (SelectTag)findAncestorWithClass( this,SelectTag.class );
231                            OptionAncestorIF select = (OptionAncestorIF)findAncestorWithClass( this,OptionAncestorIF.class );
232                            if( select == null ) {
233    //                              String errMsg = "こã?タグは、SelectTag のBODY に記述するå¿?¦�がありますã?";
234                                    String errMsg = "<b>" + getTagName() + "タグは、SelectTag またã?、DatalistTag のBODY に記述するå¿?¦�がありますã?</b>";
235                                    throw new HybsSystemException( errMsg );
236                            }
237                            String selVal = nval( select.getValue(),defaultVal );   // 3.5.4.0 (2003/11/25)
238            //              selValue = nval( selValue,selVal );                                             // 3.5.4.0 (2003/11/25)
239                            selValue = "|" + nval( selValue,selVal ) + "|";                 // 5.0.2.0 (2009/11/01)
240                            makeLabel( select );
241    
242                            // 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
243                            select.setRawParam( rawSql );
244                    }
245                    return(EVAL_PAGE);
246            }
247    
248            /**
249             * タグリブオブジェクトをリリースしますã?
250             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
251             *
252             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
253             * @og.rev 3.0.1.0 (2003/03/03) セパレーターを指定できる様に変更ã€?
254             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
255             * @og.rev 3.3.2.0 (2003/07/07) defaultVal 属æ?の追åŠ??
256             * @og.rev 3.8.5.2 (2006/06/09) classUseNo , groupUseNo 属æ?の追åŠ??
257             * @og.rev 4.0.0.0 (2005/08/31) quotCheck , addKey 属æ?の追åŠ?
258             * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
259             * @og.rev 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
260             *
261             */
262            @Override
263            protected void release2() {
264                    super.release2();
265                    table           = null;
266                    selValue        = null;
267                    defaultVal      = null;
268    //              dbid            = "DEFAULT";
269                    dbid            = null;
270                    sql                     = null;
271                    separator       = " ";
272                    classUseNo      = -1;   // 3.8.5.2 (2006/06/09) オプションに追åŠ?�™るクラス属æ?
273                    groupUseNo      = -1;   // 3.8.5.2 (2006/06/09) キーブレイク時に追åŠ?�™るグループ文å­?
274                    quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 4.0.0 (2005/08/31)
275                    addKey          = false;                // 4.0.0 (2006/11/15) é ?›®ä¸?�¤のときに?—ベルリソ?°?½表示時にキーも付加するã€?
276                    titleUseNo              = -1;
277                    xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );        // 5.0.0.2 (2009/09/15)
278                    rawSql          = null; // 5.1.7.0 (2010/06/01) 動的プルãƒ?‚¦ン実è£?¦‹直ã�?
279            }
280    
281            /**
282             * DBTableModelをセãƒ?ƒˆしますã?
283             *
284             * サブクラスより、DBTableModelをセãƒ?ƒˆするのに使ã�?�¾すã?
285             *
286             * @og.rev 3.7.1.0 (2005/04/26) 新規追åŠ?
287             *
288             * @param       table   DBTableModelオブジェクãƒ?
289             */
290            protected void setTableModel( final DBTableModel table ) {
291                    this.table = table ;
292            }
293    
294            /**
295             * オプションを作æ?しますã?
296             *
297             * DBTableModel の?‘番目の値ã‚?"value" に、それ以降をæ–?­—å?をé?結させて
298             * BODY属æ? に登録するOptionを作æ?しますã?
299             *
300             * @og.rev 3.0.1.0 (2003/03/03) 『SELECT KEY FROM TABLE ?¥?¥?¥』形式ã?場合ã?、LABEL に KEY を使用ã€?
301             * @og.rev 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
302             * @og.rev 3.8.5.2 (2006/06/09) classUseNo 属æ?と groupUseNo 属æ?を追åŠ?
303             * @og.rev 3.8.9.2 (2007/07/28) グループと、クラスの設定方法ã?バグ修正
304             * @og.rev 4.3.8.0 (2009/08/01) titleUseNo属æ?追åŠ?
305             * @og.rev 5.0.2.0 (2009/11/01) è¤?•°パラメーターの選択に対å¿?
306             * @og.rev 5.7.1.0 (2013/12/06) SelectTag â‡?OptionAncestorIF に変更して、DatalistTag にも対応ã?
307             *
308             * @param   select SelectTagオブジェクãƒ?
309             */
310    //      private void makeLabel( final SelectTag select ) {
311            private void makeLabel( final OptionAncestorIF select ) {
312                    boolean multipleAll = select.isMultipleAll();   // 3.8.0.9 (2005/10/17)
313                    int rowCnt = table.getRowCount();               // 3.5.5.7 (2004/05/10)
314    
315                    String bkGroupKey = "";
316                    String grpLabel ;
317                    for( int row=0; row<rowCnt; row++ ) {
318                            // 3.8.5.2 (2006/06/09) groupUseNo 属æ?
319                            if( groupUseNo >= 0 ) {
320                                    String groupKey = table.getValue( row,groupUseNo );
321                                    grpLabel = getRendererValue( row,groupUseNo );
322                                    if( !bkGroupKey.equals( groupKey ) ) {          // キーブレイク
323                                            // 3.8.9.2 (2007/07/28) グループと、クラスの設定方法ã?バグ修正
324    //                                      bkGroupKey = groupKey;
325    //                                      if( row != 0 ) { select.addOption( "</optgroup>" ); }
326    //                                      select.addOption( "<optgroup label=\"" + grpLabel + "\">" );
327    
328                                            if( ! "".equals( bkGroupKey ) ) {
329                                                    select.addOption( "</optgroup>" );
330                                            }
331                                            if( ! "".equals( groupKey ) ) {
332                                                    select.addOption( "<optgroup label=\"" + grpLabel + "\">" );
333                                            }
334                                            bkGroupKey = groupKey;
335                                    }
336                            }
337    
338                            Attributes attri = new Attributes();
339                            String value = table.getValue( row,0 );
340                            attri.set( "value", value );
341    
342                            // 5.0.2.0 (2009/11/01)
343    //                      if( ( selValue != null && selValue.equals( value ) ) || multipleAll ) {
344                            if( ( selValue != null && selValue.length() > 0 && selValue.indexOf( "|" + value + "|" ) >= 0 ) || multipleAll ) {
345                                    attri.set( "selected", "selected" );
346                            }
347    
348                            // 3.8.5.2 (2006/06/09) classUseNo 属æ?
349                            if( classUseNo >= 0 ) {
350                                    attri.add( "class", table.getValue( row,classUseNo ) );
351                            }
352    
353                            StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
354                            boolean titleFlg = false; // 4.3.8.0 (2009/08/01) title属æ?を付けるかどã�?�‹
355                            if( table.getColumnCount() == 1 ) {
356                                    // é ?›®がä¸?�¤の queryOption では、ラベルリソースが使用されますã?
357                                    if( addKey ) { buf.append( value ).append( ":" ); }
358                                    buf.append( getResource().getLabel( value ) );
359    
360                                    // 4.3.8.0 (2009/08/01) titleUseNo 属æ? セãƒ?ƒˆされてã�?‚‹場合かつラベルと異なるå?合ã?title属æ?に追åŠ?
361                                    if( titleUseNo >= 0 && !getResource().getLabel( value ).equals( table.getValue( row,titleUseNo ) )) {
362                                            titleFlg = true;
363                                    }
364                            }
365                            else {
366            //                      if( groupUseNo >= 0 ) {
367            //                              buf.append( grpLabel );
368            //                              buf.append( separator );
369            //                      }
370                                    String label = getRendererValue( row,1 );
371                                    buf.append( label );
372            //                      attri.set( "label", label );
373                                    for( int clm=2; clm<table.getColumnCount(); clm++ ) {
374                                            // 4.3.8.0 (2009/08/01) titleUseNo追åŠ?
375                                            // if( clm == groupUseNo || clm == classUseNo ) { continue; }
376                                            if( clm == groupUseNo || clm == classUseNo || clm==titleUseNo) { continue; }
377                                            buf.append( separator );
378                                            buf.append( getRendererValue( row,clm ) );
379                                    }
380    
381                                    // 4.3.8.0 (2009/08/01) titleUseNo 属æ? セãƒ?ƒˆされてã�?‚‹場合かつラベルと異なるå?合ã?title属æ?に追åŠ?
382                                    if( titleUseNo >= 0 && !label.equals( table.getValue( row,titleUseNo ) )) {
383                                            titleFlg = true;
384                                    }
385                            }
386    
387                            // 4.3.7.2 (2009/06/22) タイトル属æ?セãƒ?ƒˆ
388                            if( titleFlg ){
389                                    attri.add( "title", table.getValue( row,titleUseNo ) );
390                            }
391    
392                            attri.set( "body", buf.toString() );
393                            select.addOption( XHTMLTag.option( attri ) );
394                    }
395    //              if( groupUseNo >= 0 && "".equals( bkGroupKey ) ) {
396                    if( groupUseNo >= 0 && ! "".equals( bkGroupKey ) ) { // 3.8.9.2 (2007/07/28)
397                            select.addOption( "</optgroup>" );
398                    }
399            }
400    
401            /**
402             * 【TAG】Optionの初期値で選ばれる値を指定しますã?
403             *
404             * @og.tag Optionの初期値で選ばれる値を指定しますã?
405             *
406             * @param   val Optionの初期値で選ばれる値
407             */
408            public void setValue( final String val ) {
409                    selValue = getRequestParameter( val );
410            }
411    
412            /**
413             * 【TAG】value値がNULLの場合に使用されるå?期å?を設定しますã?
414             *
415             * @og.tag
416             * value値がNULLの場合に、この初期値をセãƒ?ƒˆしますã?
417             *
418             * @og.rev 3.3.2.0 (2003/07/07) defaultVal 属æ?の追åŠ??(新規作æ?)
419             *
420             * @param       val 初期値
421             */
422            public void setDefaultVal( final String val ) {
423                    defaultVal = getRequestParameter( val );
424            }
425    
426            /**
427             * 【TAG】è¤?•°のラベルを合成するときに使用するé ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしまã�?初期値:スペã?ス)ã€?
428             *
429             * @og.tag
430             * 初期値は、スペã?スですã?
431             *
432             * @og.rev 3.0.1.0 (2003/03/03) セパレーターを指定できる様に変更ã€?
433             *
434             * @param   sep é ?›®区åˆ?‚Šæ–?­?
435             */
436            public void setSeparator( final String sep ) {
437                    separator = nval( getRequestParameter( sep ),separator );
438            }
439    
440            /**
441             * 【TAG】オプションに追åŠ?�™ã‚?class 属æ?の カラãƒ?•ª号を指定しますã?
442             *
443             * @og.tag
444             * オプションは、データベã?スを検索して作æ?されますが、そのSQLæ–??カラãƒ?ƒ…報ã‚?
445             * 使用して オプションに class 属æ?を追åŠ?�—ますã?
446             * å�?‚ªプションに色をつける場合ã?、この class 属æ?に対応すã‚?CSS ファイルを用意しますã?
447             * ここでは、class 属æ?に使用する SQLæ–?? カラãƒ?•ª号( 先é?ã�?0 ) を指定しますã?
448             * 通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定しますã?
449             * 初期値は、使用しなã�?-1)ですã?
450             *
451             * @og.rev 3.8.5.2 (2006/06/09) 新規追åŠ?
452             *
453             * @param   no オプションに追åŠ?�™るクラス属æ?
454             */
455            public void setClassUseNo( final String no ) {
456                    classUseNo = nval( getRequestParameter( no ),classUseNo );
457                    if( classUseNo == 0 || classUseNo == 1 ) {
458                            String errMsg = "通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定して下さã�??";
459                            throw new HybsSystemException( errMsg );
460                    }
461            }
462    
463            /**
464             * 【TAG】オプションのグループ化を行うカラãƒ?•ª号を指定しますã?
465             *
466             * @og.tag
467             * オプションは、データベã?スを検索して作æ?されますが、そのSQLæ–??カラãƒ?ƒ…報ã‚?
468             * 使用して オプションをグループ化しますã?グループ化は optgroup要ç´?‚’ブレイク時に
469             * 出力する事で対応しますã?
470             * ここでは、グループ化に使用する SQLæ–?? カラãƒ?•ª号( 先é?ã�?0 ) を指定しますã?
471             * 通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定しますã?
472             * 初期値は、使用しなã�?-1)ですã?
473             *
474             * @og.rev 3.8.5.2 (2006/06/09) 新規追åŠ?
475             *
476             * @param   no キーブレイク時に追åŠ?�™るグループ文å­?
477             */
478            public void setGroupUseNo( final String no ) {
479                    groupUseNo = nval( getRequestParameter( no ),groupUseNo );
480                    if( groupUseNo == 0 || groupUseNo == 1 ) {
481                            String errMsg = "通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定して下さã�??";
482                            throw new HybsSystemException( errMsg );
483                    }
484            }
485    
486            /**
487             * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
488             *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
489             *
490             * @og.tag
491             * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
492             * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨­定にすれば、ある程度は防止できますã?
493             * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
494             * 数字チェãƒ?‚¯で検å?可能ですã?æ–?­—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
495             * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
496             * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
497             * (初期値:シスãƒ?ƒ 定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
498             *
499             * @og.rev 4.0.0.0 (2005/08/31) 新規追åŠ?
500             *
501             * @param   flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
502             * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
503             */
504            public void setQuotCheck( final String flag ) {
505                    quotCheck = nval( getRequestParameter( flag ),quotCheck );
506            }
507    
508            /**
509             * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
510             *
511             * @og.tag
512             * Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
513             * これは、シスãƒ?ƒ リソースで、DEFAULT_DB_URL 等でæŒ?®šしてã�?‚‹ ãƒ??タベã?ス接続å?
514             * æƒ??に、XX_DB_URL を定義することでã€?dbid="XX" とすると、この 接続å?を使用して
515             * ãƒ??タベã?スにアクセスできますã?
516             *
517             * @param       id ãƒ??タベã?ス接続ID
518             */
519            public void setDbid( final String id ) {
520                    dbid = nval( getRequestParameter( id ),dbid );
521            }
522    
523            /**
524             * 【TAG】é?目がä¸?�¤ã�?�‘の場合ã??—ベルリソ?°?½に、キーæƒ??を追åŠ?�™るかどã�?�‹を指定しまã�?初期値:false)ã€?
525             *
526             * @og.tag
527             * Queryオブジェクトã?é ?›®がä¸?�¤の場合ã??—ベル部にはã€?¾—ベルリソ?°?½を使用しますã?
528             * こã?時ã??—ベル無しã?場合ã?、キーが表示されますがã€?¾—ベルありã?場合ã?、キーは表示されã�?
529             * ?—ベルã?み表示されますã?
530             * 都合によっては、キーも表示したã�??合がありますã?で、その様なケースではã€?
531             * addKey = "true を設定する事で、キー:?—ベï¾?のセãƒ?ƒˆをラベルとして扱ã�?�¾すã?
532             * 初期値はfalse(キーは付加しなã�?ですã?
533             *
534             * @param       id ãƒ??タベã?ス接続ID
535             */
536            public void setAddKey( final String id ) {
537                    addKey = nval( getRequestParameter( id ),addKey );
538            }
539    
540            /**
541             * 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?&gt;&lt;) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
542             *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
543             *
544             * @og.tag
545             * クロスサイトスクリプティング(XSS)対策ã?ä¸?’°としてless/greater than signにつã�?�¦のチェãƒ?‚¯を行いますã?
546             * (&gt;&lt;) が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
547             * (初期値:シスãƒ?ƒ 定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
548             *
549             * @og.rev 5.0.0.2 (2009/09/15) 新規追åŠ?
550             *
551             * @param       flag    XSSチェãƒ?‚¯ [true:する/false:しない]
552             * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
553             */
554            public void setXssCheck( final String flag ) {
555                    xssCheck = nval( getRequestParameter( flag ),xssCheck );
556            }
557    
558            /**
559             * row行,columåˆ?のãƒ??タの値を返しますã?
560             *
561             * これは、データの値そã?もã?ではなくã?そã?値のラベルæ–?­—を返しますã?
562             *
563             * @param   row         行番号
564             * @param   column      カラãƒ?•ª号
565             *
566             * @return  row行,columåˆ?のãƒ??タの値
567             */
568            private String getRendererValue( final int row,final int column ) {
569                    String val = table.getValue( row,column );
570                    DBColumn clm = table.getDBColumn( column );
571                    return clm.getRendererValue( val );
572            }
573    
574            /**
575             * 【TAG】オプションに追åŠ?�™ã‚?title 属æ?の カラãƒ?•ª号を指定しますã?
576             *
577             * @og.tag
578             * オプションは、データベã?スを検索して作æ?されますが、そのSQLæ–??カラãƒ?ƒ…報ã‚?
579             * 使用して オプションに title 属æ?を追åŠ?�—ますã?
580             * title属æ?はマウスオーバã?時にãƒ??ルチップとして表示されるためã?
581             * プルãƒ?‚¦ンの横å¹?‚’短くしたい場合に有効ですã?
582             * 通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定しますã?
583             * 初期値は、使用しなã�?-1)ですã?
584             *
585             * @og.rev 4.3.8.0 (2009/08/01) 新規追åŠ?
586             *
587             * @param   no オプションに追åŠ?�™るtitle属æ?
588             */
589            public void setTitleUseNo( final String no ) {
590                    titleUseNo = nval( getRequestParameter( no ),titleUseNo );
591                    if( titleUseNo == 0 || titleUseNo == 1 ) {
592                            String errMsg = "通常、カラãƒ?•ª号=0 は キーæƒ??ã€?1 はラベルæƒ?? ですã?2 ã�?3 を指定して下さã�??";
593                            throw new HybsSystemException( errMsg );
594                    }
595            }
596    
597            /**
598             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
599             *
600             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
601             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
602             *
603             * @param       strm    ObjectOutputStreamオブジェクãƒ?
604             * @throws IOException  入出力エラーが発生したå?å�?
605             */
606            private void writeObject( final ObjectOutputStream strm ) throws IOException {
607                    strm.defaultWriteObject();
608            }
609    
610            /**
611             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
612             *
613             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
614             *
615             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
616             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
617             *
618             * @param       strm    ObjectInputStreamオブジェクãƒ?
619             * @see #release2()
620             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
621             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
622             */
623            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
624                    strm.defaultReadObject();
625            }
626    
627    //      /**
628    //       * 親のog:selectタグのnameとeventColumn設定を返しますã?
629    //       *
630    //       * @og.rev 4.3.6.0 (2009/04/01)
631    //       *
632    //       */
633    //      private String[] getEventColumn(){
634    //              SelectTag seltag = (SelectTag)findAncestorWithClass(this,SelectTag.class);
635    //              String[] selectVal = new String[2];
636    //              selectVal[0] = seltag.getEventColumn();
637    //              selectVal[1] = seltag.get("name");
638    //              return selectVal;
639    //      }
640    
641            /**
642             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
643             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
644             *
645             * @return こã?クラスのæ–?­—å?表現
646             */
647            @Override
648            public String toString() {
649                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
650                                    .println( "VERSION"             ,VERSION        )
651                                    .println( "selValue"    ,selValue       )
652                                    .println( "defaultVal"  ,defaultVal     )
653                                    .println( "dbid"                ,dbid           )
654                                    .println( "sql"                 ,sql            )
655                                    .println( "separator"   ,separator      )
656                                    .println( "quotCheck"   ,quotCheck      )
657                                    .println( "Other..."    ,getAttributes().getAttribute() )
658                                    .fixForm().toString() ;
659            }
660    }