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    
021    import org.opengion.fukurou.util.StringUtil;
022    import static org.opengion.fukurou.util.StringUtil.nval ;
023    
024    /**
025     * Where句を作æ?するための条件を指定しますã?
026     *
027     * こã?タグのvalue 値に、{@XXXX} 変数が含まれてã�?‚‹場合ã?そã?リクエストå?ã�?
028     * なã�??合ã?、このタグそã?もã?がなにもå?力しませんã€?つまり条件から消えますã?)
029     * startKeyは、value をé?結するå?合ã?頭に置かれる文字å?で、where句のæœ??には表示されずã?
030     * それ以降につã�?�¦、表示されますã?(つまりã?where VALUE1 and VALUE2 and VALUE3 … ですã?)
031     * startKey の初期値はã€?and" ですã?
032     * multi は、{@XXXX} 変数に、å?がè¤?•°含まれてã�?‚‹場合ã?処ç�?‚’規定しますã?
033     * è¤?•°の値とは、同ä¸?ameでチェãƒ?‚¯ボックスæŒ?®šや、メニューでのè¤?•°æŒ?®šしたå?合ã?
034     * リクエストが配å?で送られますã?multi="true" とするとã€?xx1','xx2','xx3', ?¥?¥?¥ とã�?�†
035     * 形式に変換されますã?
036     * 具体的にはã€?where PN in ( {@PN} )" とã�?�†æ–?­—å?に対してã€?
037     * "where PN in ( 'xx1','xx2','xx3' )" を作æ?することができますã?
038     * multi の初期値はã€?false" ですã?
039     * SystemData の USE_SQL_INJECTION_CHECK ã�?true かã?quotCheck 属æ?ã�?true の場合ã?ã€?
040     * ?³?±?¬インジェクション対策用のクォーãƒ?‚£ションチェãƒ?‚¯を行いますã?リクエスト引数に
041     * クォーãƒ?‚£ション(')が含まれると、エラーになりますã?
042     * 同様にUSE_XSS_CHECKがtrueかã?xssCheck属æ?がtrueの場合ã?ã€?
043     * クロスサイトススクリプティング(XSS)対策ã?ためless/greater than signのチェãƒ?‚¯を行いますã?
044     *
045     * å�?±žæ?は、{@XXXX} 変数が使用できますã?
046     * これは、ServletRequest から、XXXX をキーに値を取りå?ã�?こã?変数に割り当てますã?
047     * つまりã?こã?XXXXをキーにリクエストすれã?、この変数に値をセãƒ?ƒˆすることができますã?
048     *
049     * @og.formSample
050     * ●形式ï¼?lt;og:and startKey="[and|or|…]" value="…" multi="[false|true]" />
051     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
052     *
053     * ●Tag定義??
054     *   <og:and
055     *       startKey           【TAG】SQL条件句のæœ??の演算子をæŒ?®šしまã�?初期値:and)
056     *       value              【TAG】条件の値ã‚?セãƒ?ƒˆしまã�?
057     *       multi              【TAG】è¤?•°の引数に対して処ç�?�™るかどã�?�‹[true/false]を設定しまã�?初期値:false)
058     *       separator          【TAG】multi アクション時ã?æ–?­—å?をå?割するé ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしまã�?
059     *       quotCheck          【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_SQL_INJECTION_CHECK[=true])
060     *       instrVals          【TAG】スペã?スで区åˆ?‚‰れたè¤?•°の値すべてを含ã‚?�¡件を作æ?しまã�?
061     *       instrType          【TAG】instrValsでè¤?•°の値を条件にする際ã?方法をæŒ?®šしまã�?初期値:and)
062     *       xssCheck           【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_XSS_CHECK[=true])
063     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
064     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
065     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
066     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
067     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
068     *   >   ... Body ...
069     *   </og:and>
070     *
071     * ●使用ä¾?
072     *     <og:query command="NEW">
073     *             select PN,YOBI,NMEN,HINM from XX01
074     *         <og:where>
075     *             <og:and value="PN   =    '{@PN}'"    />
076     *             <og:and value="YOBI like '{@YOBI}%'" />
077     *         </og:where>
078     *             order by PN
079     *     </og:query>
080     *
081     *          ・検索条件がå?力されたæ™?PN=AAA , YOBI=BBB)
082     *            作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 where PN = 'AAA' and YOBI like 'BBB%' order by PN
083     *
084     *          ・検索条件が片方入力されなかった時(PNがNULLのとã�? YOBI=BBB)
085     *            作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 where YOBI like 'BBB%' order by PN
086     *
087     *          ・検索条件がå?力されなかった時(PNがNULL, YOBIがNULL) WHERE句がなくなるã?
088     *            作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 order by PN
089     *
090     *        注æ„?WhereTagを使わなã�??合に、検索条件がå?力されなかったå?合ã?、下記ã?ようになりますã?
091     *            select PN,YOBI,NMEN,HINM from XX01 where PN = '' and YOBI like '%' order by PN
092     *
093     *    --------------------------------------------------------------------------------------------------------------
094     *
095     *     <og:query command="NEW">
096     *             select PN,YOBI,NMEN,HINM from XX01 where PN="11111"
097     *         <og:where startKey="and">
098     *             <og:and value="YOBI in   ({@YOBI})" multi="true" />
099     *             <og:and value="HINM like '{@HINM}%'"             />
100     *         </og:where>
101     *             order by PN
102     *     </og:query>
103     *
104     *          ・YOBI をè¤?•°選択し、in で検索するæ™?YOBI=AA,BB,CC を選æŠ?
105     *            作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 where PN = '11111'
106     *                             and YOBI in ( 'AA','BB','CC' ) and HINM like 'BBB%' order by PN
107     *
108     * @og.group 画面部å“?
109     *
110     * @version  4.0
111     * @author       Kazuhiko Hasegawa
112     * @since    JDK5.0,
113     */
114    public class SqlAndTag extends CommonTagSupport {
115            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
116            private static final String VERSION = "5.5.1.1 (2012/04/06)" ;
117    
118            private static final long serialVersionUID = 551120120406L ;
119    
120            private String  startKey        = "and";
121            private String  value           = "";
122            private String  instrVals       = null;         // 3.8.8.1 (2007/01/06)
123            private String  instrType       = "and";        // 5.4.1.0 (2011/11/01)
124            private boolean multi           = false;
125            private boolean quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 4.0.0 (2005/08/31)
126            private boolean xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );        // 5.0.0.2 (2009/09/15)
127    
128            private boolean allNull         = false;        // 5.0.0.2 (2009/09/15)
129    
130    //      private String  matchKey        = null;         // 5.1.9.0 (2010/08/01) â‡?5.2.2.0 (2010/11/01) å»?­¢(caseKey,caseVal属æ?を使用してくださいã€?
131    
132    //      private String  matchVal        = null;         // 5.1.9.0 (2010/08/01) â‡?5.2.2.0 (2010/11/01) å»?­¢(caseKey,caseVal属æ?を使用してくださいã€?
133    
134            private String  separator       = null;         // 5.2.2.0 (2010/11/01) é ?›®区åˆ?‚Šæ–?­?
135    
136            /**
137             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
138             *
139             * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値ã‚?value に使用する機è?追åŠ?
140             * @og.rev 4.0.0.0 (2005/08/31) useQuotCheck() による?³?±?¬インジェクション対ç­?
141             * @og.rev 5.0.0.2 (2009/09/15) XSS対ç­?
142             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
143             *
144             * @return      後続å?ç�??æŒ?¤º
145             */
146            @Override
147            public int doStartTag() {
148                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
149                    if( useTag() ) {
150                            useQuotCheck( quotCheck );
151                            // 5.0.0.2 (2009/09/15) XSS対ç­?
152                            useXssCheck( xssCheck );
153    
154                            value = getRequestParameter( value );
155    
156                            if( value == null || value.isEmpty() ) {
157                                    return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
158                            }
159    
160            //              if( value != null && value.length() > 0 ) {
161            //                      return( SKIP_BODY );                    // Body を評価しなã�?
162            //              }
163            //              else {
164            //                      return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
165            //              }
166                    }
167                    return( SKIP_BODY );                    // Body を評価しなã�?
168            }
169    
170            /**
171             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
172             *
173             * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値ã‚?value に使用する機è?追åŠ?
174             *
175             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
176             */
177            @Override
178            public int doAfterBody() {
179                    value = getBodyString();
180                    return(SKIP_BODY);
181            }
182    
183            /**
184             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
185             *
186             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
187             * @og.rev 3.8.8.1 (2007/01/06) makeInstrVals を加味するã€?
188             * @og.rev 5.0.0.2 (2009/09/15) multi時ã?allNull対å¿?
189             * @og.rev 5.1.9.0 (2010/08/01) matchKey 、matchVal 対å¿?â‡?5.2.2.0 (2010/11/01) å»?­¢
190             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
191             *
192             * @return      後続å?ç�??æŒ?¤º
193             */
194            @Override
195            public int doEndTag() {
196                    debugPrint();           // 4.0.0 (2005/02/28)
197                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
198                    if( useTag() ) {
199                            SqlWhereTag where = (SqlWhereTag)findAncestorWithClass( this,SqlWhereTag.class );
200                            if( where == null ) {
201    //                              String errMsg = "<b>こã?タグは、where タグのå†?ƒ¨におくå¿?¦�がありますã?</b>";
202                                    String errMsg = "<b>" + getTagName() + "タグは、where タグのå†?ƒ¨におくå¿?¦�がありますã?</b>";
203                                    throw new HybsSystemException( errMsg );
204                            }
205    
206                            // 5.1.9.0 (2010/08/01) matchKey 、matchVal 対å¿?â‡?5.2.2.0 (2010/11/01) å»?­¢
207            //              boolean flag = (matchKey == null) || (matchVal == null) || matchKey.matches( matchVal ) ;
208    
209                            // if( ! isNull() ) {
210            //              if( ! isNull() && ! allNull ) {                 // 5.0.0.2 (2009/09/15)
211            //              if( ! isNull() && ! allNull && flag ) { // 5.1.9.0 (2010/08/01)
212                            if( ! isNull() && ! allNull ) {                 // 5.2.2.0 (2010/11/01)
213    //                              value = makeInstrVals( instrVals,value );       // 3.8.8.1 (2007/01/06)
214                                    value = makeInstrVals( instrVals,instrType,value );     // 5.4.1.0 (2011/11/01)
215                                    if( value != null ) {
216                                            set( "keyWord", startKey );
217                                            set( "value"  , value );
218                                            where.setAttributes( getAttributes() );
219                                    }
220                            }
221                    }
222                    return(EVAL_PAGE);
223            }
224    
225            /**
226             * タグリブオブジェクトをリリースしますã?
227             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
228             *
229             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
230             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
231             * @og.rev 3.8.8.1 (2007/01/06) instrVals 属æ?追åŠ?
232             * @og.rev 4.0.0.0 (2005/08/31) quotCheck 属æ?の追åŠ?
233             * @og.rev 5.0.0.2 (2009/09/15) XSS対å¿?
234             * @og.rev 5.0.0.2 (2009/09/15) multi時ã?allNull対å¿?
235             * @og.rev 5.1.9.0 (2010/08/01) matchKey、matchVal 属æ?の追åŠ?
236             * @og.rev 5.2.2.0 (2010/11/01) separator , isMatch 属æ?の追åŠ?
237             * @og.rev 5.2.2.0 (2010/11/01) matchKey、matchVal 属æ?å»?­¢(caseKey,caseVal属æ?を使用してくださいã€?
238             * @og.rev 5.4.1.0 (2011/11/01) instrType属æ?追åŠ?
239             */
240            @Override
241            protected void release2() {
242                    super.release2();
243                    startKey        = "and";
244                    value           = "";
245                    instrVals       = null;         // 3.8.8.1 (2007/01/06)
246                    instrType       = "and";        // 5.4.1.0 (2011/11/01)
247                    multi           = false;
248                    quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 4.0.0 (2005/08/31)
249                    xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );        // 5.0.0.2 (2009/09/15)
250                    allNull         = false;        // 5.0.0.2 (2009/09/15)
251    //              matchKey        = null;         // 5.1.9.0 (2010/08/01) 新規追åŠ?
252    //              matchVal        = null;         // 5.1.9.0 (2010/08/01) 新規追åŠ?
253                    separator       = null;         // 5.2.2.0 (2010/11/01) é ?›®区åˆ?‚Šæ–?­?
254            }
255    
256            /**
257             * リクエスト情報のæ–?­—å?を取得しますã?
258             *
259             * これはã€??常のgetRequestParameter 処ç�??中で呼ばれる getRequestValue ã‚?
260             * オーバã?ライトしてã�?�¾すã?
261             *
262             * @og.rev 5.0.0.2 (2009/09/15) valuesの全NULL/空æ–?­—をisNull扱ã�?�«する
263             * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。ã?対応時の特殊å?ç�?
264             *
265             * @param    key キー
266             *
267             * @return   リクエスト情報のæ–?­—å?
268             */
269            @Override
270            protected String getRequestValue( final String key ) {
271                    String rtn = "";
272    
273                    if( multi ) {
274                            // 5.3.8.0 (2011/08/01) getRequestValues の中で、getRequestValue を呼び出すためこのままでは
275                            // 再帰呼び出しが永é�?�«続くのでã€?¼’回目以降ã?、å?帰しなã�?‚ˆã�?�«、強制çš?�« multi の値を書き換えますã?
276                            multi = false;  // 5.3.8.0 (2011/08/01) 再帰しなã�?‚ˆã�?�«、強制çš?�«値を書き換ã�?
277                            String[] array = getRequestValues( key );
278                            allNull = true; // 5.0.0.2 (2009/09/15) arrayのå†?®¹がå?てnull/空æ–?­—か
279                            if( ! isNull() ) {
280                                    // 5.0.0.2 (2009/09/15) 全てnull/空æ–?­—ã?場合ã?nullと扱ã�?
281                                    for( int i = 0; i < array.length; i++ ) {
282                                            if( array[i] != null && array[i].length() > 0 ) {
283                                                    allNull = false;
284                                                    break;
285                                            }
286                                    }
287                                    if( ! allNull ){
288                                            rtn = makeCSVvalue( array );
289                                    }
290                            }
291                            multi = true;   // 5.3.8.0 (2011/08/01) 強制çš?�«書き換えた値をå?に戻すã?
292                    }
293                    else {
294                            rtn = super.getRequestValue( key );
295                    }
296                    return rtn ;
297            }
298    
299            /**
300             * è¤?•°の値ã‚?'xx1','xx2','xx3', ?¥?¥?¥ とã�?�†形式に変換しますã?
301             *
302             * こã?処ç�??、in などで使用するためのリクエストを配å?で受け取って処ç�?
303             * する場合ã?æ–?­—å?を加工しますã?
304             *
305             * @og.rev 5.2.2.0 (2010/11/01) separator 対å¿?
306             *
307             * @param       array   å…??配å?æ–?­—å?
308             *
309             * @return  連結後ã?æ–?­—å?
310             */
311            private String makeCSVvalue( final String[] array ) {
312                    if( array == null || array.length == 0 ) {
313                            String errMsg = "array 引数に、null ã‚??サイズゼロの配å?は使用できませんã€?;
314                            throw new HybsSystemException( errMsg );
315                    }
316    
317                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
318    
319                    if( separator != null ) {
320                            for(int i=0; i < array.length; i++) {
321                                    String[] ary = array[i].split( separator );
322                                    for( int j=0; j<ary.length; j++ ) {
323                                            buf.append( "'" );
324                                            buf.append( ary[j] );
325                                            buf.append( "'," );
326                                    }
327                            }
328                            buf.deleteCharAt( buf.length()-1 );             // æœ?¾Œã? ピリオドを削除するã€?
329                    }
330                    else {
331                            for(int i=0; i < array.length; i++) {
332                                    buf.append( "'" );
333                                    buf.append( array[i] );
334                                    buf.append( "'," );
335                            }
336                            buf.deleteCharAt( buf.length()-1 );             // æœ?¾Œã? ピリオドを削除するã€?
337                    }
338    //              buf.append( "'" );
339    //              buf.append( array[0] );
340    //              buf.append( "'" );
341    //              for(int i=1; i < array.length; i++) {
342    //                      buf.append( ",'" );
343    //                      buf.append( array[i] );
344    //                      buf.append( "'" );
345    //              }
346                    return buf.toString();
347            }
348    
349            /**
350             * スペã?スで区åˆ?‚‰れたè¤?•°の値ã‚?and 接続で連結しますã?
351             *
352             * value="CLM" instrVals="ABC DEF GHI" とæŒ?®šするとã€?
353             * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%'  AND CLM LIKE '%GHI%' "
354             * とã�?�†æ–?­—å?を作æ?しますã?
355             * 個別にLIKE検索é ?›®ã‚?AND 連結する為、現れる場æ‰?�«依存しませんã€?
356             * é€?�«、現れるé ?º�をæŒ?®šするå?合ã?、ABC%DEF の様にæŒ?®š可能ですã?
357             * ただしã?columnMarker の instrVals で、è¤?•°æ–?­—ã?マã?カーを行う場合ã?
358             * ABC%DEF とã�?�†æ–?­—å?は、オリジナルでなã�??で、ã?ークアãƒ??されませんã€?
359             *
360             * @og.rev 5.4.1.0 (2011/11/01) instrType属æ?対å¿?
361             * @og.rev 5.5.1.1 (2012/04/06) notin対å¿?
362             *
363             * @param       instrVals       繰返し処ç�?‚’行う 値
364             * @param       instrType       連結方æ³?
365             * @param       value           繰返し処ç�?‚’行う value
366             *
367             * @return  連結後ã?æ–?­—å?
368             * @see         #setInstrVals( String )
369             * @see         ColumnMarkerTag#setInstrVals( String )
370             */
371            private String makeInstrVals( final String instrVals, final String instrType , final String value ) {
372                    if( instrVals == null || instrVals.length() == 0 ) { return value; }
373    
374                    String reqVals = nval( getRequestParameter( instrVals ),null );
375                    if( reqVals == null || reqVals.length() == 0 ) { return null; }
376    
377                    final String[] vals ;
378                    if( multi ) {
379                            // multi のときã?、makeCSVvalue でåŠ?·¥されたå?になってã�?‚‹ã€?
380                            vals = StringUtil.csv2Array( reqVals,',' );
381                            // 前後ã? ' はずし
382                            for( int i=0; i<vals.length; i++ ) {
383                                    vals[i] = vals[i].substring( 1,vals[i].length()-1 );
384                            }
385                    }
386                    else {
387                            vals = StringUtil.csv2Array( reqVals,' ' );
388                    }
389    
390                    if( vals == null || vals.length == 0 ) { return null; }
391    
392                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
393    
394    //              buf.append( value );
395    //              buf.append( " LIKE '%" );
396    //              buf.append( vals[0] );
397    //              buf.append( "%'" );
398    
399                    buf.append( " (" );
400                    // 条件:and â‡?å�??をandのlike条件で結合(%あり)
401                    if( instrType.startsWith( "a" ) ) {
402                            for(int i=0; i < vals.length; i++) {
403                                    if( i > 0 ) { buf.append( " and " ); }
404                                    buf.append( value );
405                                    buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" );
406                            }
407                    }
408                    // 条件:or â‡?å�??をorのlike条件で結合(%あり)
409                    else if( instrType.startsWith( "o" ) ) {
410                            for(int i=0; i < vals.length; i++) {
411                                    if( i > 0 ) { buf.append( " or " ); }
412                                    buf.append( value );
413                                    buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" );
414                            }
415                    }
416                    // 条件:in â‡?å�??をorのlike条件で結合(%なã�?
417                    else if( instrType.startsWith( "i" ) ) {
418                            for(int i=0; i < vals.length; i++) {
419                                    if( i > 0 ) { buf.append( " or " ); }
420                                    buf.append( value );
421                                    buf.append( " LIKE '" ).append( vals[i] ).append( "'" );
422                            }
423                    }
424                    // 条件:notin â‡?å�??をandのnot like条件で結合(%なã�? 5.5.1.1(2012/04/05)
425                    else if( instrType.startsWith( "n" ) ) {
426                            for(int i=0; i < vals.length; i++) {
427                                    if( i > 0 ) { buf.append( " and " ); }
428                                    buf.append( value );
429                                    buf.append( " NOT LIKE '" ).append( vals[i] ).append( "'" );
430                            }
431                    }
432                    else {
433                            String errMsg = "instrTypeにはã€?and','or','in','notin'のã�?�šれかを指定して下さã�??instrType=[" + instrType + "]";
434                            throw new HybsSystemException( errMsg );
435                    }
436                    buf.append( ") " );
437    
438                    return buf.toString();
439            }
440    
441            /**
442             * 【TAG】SQL条件句のæœ??の演算子をæŒ?®šしまã�?初期値:and)ã€?
443             *
444             * @og.tag
445             * value をé?結するå?合ã?頭に置かれる文字å?で、where句のæœ??には表示されずã?
446             * それ以降につã�?�¦、表示されますã?
447             * (つまりã?where VALUE1 and VALUE2 and VALUE3 … ですã?)
448             * startKey の初期値はã€?and" ですã?
449             *
450             * @param       skey 条件句のæœ??の演算å­?
451             */
452            public void setStartKey( final String skey ) {
453                    if( skey != null && skey.length() > 0 ) { startKey = skey; }
454            }
455    
456            /**
457             * 【TAG】条件の値ã‚?セãƒ?ƒˆしますã?
458             *
459             * @og.tag
460             * 条件値に、{&#064;XXXX} 変数が含まれてã�?‚‹場合ã?そã?リクエストå?がなã�??合ã?ã€?
461             * こã?タグそã?もã?がなにもå?力しませんã€?つまり条件から消えますã?)
462             * BODY 部に記述することが可能ですã?そã?場合ã?、条件属æ?になにも設定できませんã€?
463             *
464             * @param       val 条件値
465             */
466            public void setValue( final String val ) {
467                    value = val;
468            }
469    
470            /**
471             * 【TAG】スペã?スで区åˆ?‚‰れたè¤?•°の値すべてを含ã‚?�¡件を作æ?しますã?
472             *
473             * @og.tag
474             * 通常、value="CLM LIKE 'ABC%'" とã�?�†æ–?­—å?を指定しますがã€?
475             * value="CLM" instrVals="ABC DEF GHI" とæŒ?®šするとã€?
476             * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%'  AND CLM LIKE '%GHI%' "
477             * とã�?�†æ–?­—å?を作æ?しますã?
478             * これは、instrVals にæŒ?®šした引数に対して、スペã?ス区åˆ?‚Šでåˆ?‰²しã?
479             * 前方の value にè¤?•°のAND検索を同時に実現できるようにæŒ?®šしまã�?
480             * 個別にLIKE検索é ?›®ã‚?AND 連結する為、現れる場æ‰?�«依存しませんã€?
481             * é€?�«、現れるé ?º�をæŒ?®šするå?合ã?、ABC%DEF の様にæŒ?®š可能ですã?
482             * ただしã?columnMarker の instrVals で、è¤?•°æ–?­—ã?マã?カーを行う場合ã?
483             * ABC%DEF とã�?�†æ–?­—å?は、オリジナルでなã�??で、ã?ークアãƒ??されませんã€?
484             * ※instrType属æ?のæŒ?®šにより条件の生æ?方法を変更することができますã?
485             *   詳細につã�?�¦は、instrType属æ?のドキュメントを参ç?下さã�??
486             *
487             * @param       val è¤?�ˆ条件作æ?のための設定å?
488             * @see         #setInstrType
489             * @see         ColumnMarkerTag#setInstrVals( String )
490             */
491            public void setInstrVals( final String val ) {
492                    instrVals = val;
493            }
494    
495            /**
496             * 【TAG】instrValsでè¤?•°の値を条件にする際ã?方法をæŒ?®šしまã�?初期値:and)ã€?
497             *
498             * @og.tag
499             * 通常、instrValsにæŒ?®šされた値は、スペã?ス区åˆ?‚Šでåˆ?‰²したå�??をLIKE条件としてand結合しますã?
500             * しかしã?instrType属æ?を変更することで、この条件式ã?生æ?方法を変更
501             * することができますã?
502             * 具体的には、以下ã?通りですã?
503             * â‘?nstrTypeに"and"が指定されてã�?‚‹場å�?初期値)
504             *   タグの記述 : value="CLM" instrVals="ABC DEF GHI"
505             *   生æ?æ–?­—å? :       "( CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' )"
506             * ②instrTypeに"or"が指定されてã�?‚‹場å�?
507             *   タグの記述 : value="CLM" instrVals="ABC DEF GHI"
508             *   生æ?æ–?­—å? :       "( CLM LIKE '%ABC%' OR CLM LIKE '%DEF%' OR CLM LIKE '%GHI%' )"
509             * ③instrTypeに"in"が指定されてã�?‚‹場å�?
510             *   タグの記述 : value="CLM" instrVals="ABC DEF GHI"
511             *   生æ?æ–?­—å? :       "( CLM LIKE 'ABC' OR CLM LIKE 'DEF5' OR CLM LIKE 'GHI' )"
512             * ④instrTypeに"notin"が指定されてã�?‚‹場å�?
513             *       タグの記述 : value="CLM" instrVals="ABC DEF GHI"
514             *   生æ?æ–?­—å? :       "( CLM NOT LIKE 'ABC' AND CLM NOT LIKE 'DEF5' AND CLM NOT LIKE 'GHI' )"
515             * ※こã?属æ?を指定しなã�??合ã?、①のLIKE条件でのand結合となりますã?
516             * ※③④につã�?�¦、LIKE条件で%をè?動付加しなã�?�“とにより、画面からの入力å?に応じてã€?
517             *   前方ä¸??、後方ä¸??、前後方ä¸??の制御を行うことができますã?
518             *
519             * @og.rev 5.5.1.1 (2012/04/06) notin対å¿?コメント修正)
520             *
521             * @param       tp 条件方法[and/or/in/notin]
522             * @see         #setInstrVals( String )
523             */
524            public void setInstrType( final String tp ) {
525                    instrType = nval( getRequestParameter( tp ),tp );
526            }
527    
528            /**
529             * 【TAG】è¤?•°の引数に対して処ç�?�™るかどã�?�‹[true/false]を設定しまã�?初期値:false)ã€?
530             *
531             * @og.tag
532             * {&#064;XXXX} 変数に、å?がè¤?•°含まれてã�?‚‹場合ã?処ç�?‚’規定しますã?
533             * multi="true" に設定すると、è¤?•°の引数はã€?xx1','xx2','xx3', ?¥?¥?¥ とã�?�†
534             * 形式に変換しますã?
535             * where 条件でè¨?�†とã€?"where PN in ( {&#064;PN} )" とã�?�†æ–?­—å?に対してã€?
536             * "where PN in ( 'xx1','xx2','xx3' )" を作æ?することになりますã?
537             * 初期値はã€?false (マルチ変換しなã�? ですã?
538             *
539             * @param   flag マルチ変換 [true:する/それ以å¤?しなã�?
540             * @see         #setSeparator( String )
541             */
542            public void setMulti( final String flag ) {
543                    multi = nval( flag,multi );
544            }
545    
546            /**
547             * 【TAG】multi アクション時ã?æ–?­—å?をå?割するé ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしますã?
548             *
549             * @og.tag
550             * multi="true" の場合ã?è¤?•°のリクエストを連結してã€?in 句で問合せを行うæ–?­—å?ã‚?
551             * 作æ?しますが、separator を指定すると、さらに、separator でæ–?­—å?をå?割してã€?
552             * in 句の引数を構築しますã?
553             * 具体的には、å?割後ã?æ–?­—å?がã?è¤?•°の個ã?のリクエスト変数と同じ形式にåŠ?·¥されますã?
554             * こã?機è?は、multi="true" を指定したå?合ã?み有効になりますã?
555             * 初期値は、null ですã?つまりã?åˆ?‰²処ç�??行いませんã€?
556             *
557             * @og.rev 5.2.2.0 (2010/11/01) 新規追åŠ?
558             *
559             * @param   sepa é ?›®区åˆ?‚Šæ–?­?
560             * @see         #setMulti( String )
561             */
562            public void setSeparator( final String sepa ) {
563                    separator = nval( getRequestParameter( sepa ),separator );
564            }
565    
566            /**
567             * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
568             *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
569             *
570             * @og.tag
571             * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
572             * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨­定にすれば、ある程度は防止できますã?
573             * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
574             * 数字チェãƒ?‚¯で検å?可能ですã?æ–?­—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
575             * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
576             * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
577             * (初期値:シスãƒ?ƒ 定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
578             *
579             * @og.rev 4.0.0.0 (2005/08/31) 新規追åŠ?
580             *
581             * @param   flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
582             * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
583             */
584            public void setQuotCheck( final String flag ) {
585                    quotCheck = nval( getRequestParameter( flag ),quotCheck );
586            }
587    
588            /**
589             * 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?&gt;&lt;) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
590             *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
591             *
592             * @og.tag
593             * クロスサイトスクリプティング(XSS)対策ã?ä¸?’°としてless/greater than signにつã�?�¦のチェãƒ?‚¯を行いますã?
594             * (&gt;&lt;) が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
595             * (初期値:シスãƒ?ƒ 定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
596             *
597             * @og.rev 5.0.0.2 (2009/09/15) 新規追åŠ?
598             *
599             * @param       flag    XSSチェãƒ?‚¯ [true:する/false:しない]
600             * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
601             */
602            public void setXssCheck( final String flag ) {
603                    xssCheck = nval( getRequestParameter( flag ),xssCheck );
604            }
605    
606            /**
607             * 【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しますã?
608             *
609             * @og.tag
610             * matchKey.matches( matchVal ) の値がã?true の場合ã?、このタグは使用されますã?
611             * false の場合ã?、このタグは使用されませんã€?
612             * value 値に、{&#064;XXXX} 変数が含まれてã�?‚‹場合と同じ効果を得られますã?
613             * 何もæŒ?®šしなã�??合ã?またã?、引数ã�?null の場合ã?、true と同じで使用されますã?
614             *
615             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
616             * @og.rev 5.2.2.0 (2010/11/01) å»?­¢(caseKey,caseVal属æ?を使用してくださいã€?
617             *
618             * @param       mkey String
619             */
620    //      public void setMatchKey( final String mkey ) {
621    //              matchKey = nval( getRequestParameter( mkey ),matchKey );
622    //      }
623    
624            /**
625             * 【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しますã?
626             *
627             * @og.tag
628             * matchKey.matches( matchVal ) の値がã?true の場合ã?、このタグは使用されますã?
629             * false の場合ã?、このタグは使用されませんã€?
630             * value 値に、{&#064;XXXX} 変数が含まれてã�?‚‹場合と同じ効果を得られますã?
631             * 何もæŒ?®šしなã�??合ã?またã?、引数ã�?null の場合ã?、true と同じで使用されますã?
632             *
633             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
634             * @og.rev 5.2.2.0 (2010/11/01) å»?­¢(caseKey,caseVal属æ?を使用してくださいã€?
635             *
636             * @param       mval String
637             */
638    //      public void setMatchVal( final String mval ) {
639    //              matchVal = nval( getRequestParameter( mval ),matchVal );
640    //      }
641    
642            /**
643             * タグの名称をã?返しますã?
644             * 自åˆ??身のクラス名よりã?自動的に取り出せなã�?�Ÿめã?こã?メソãƒ?ƒ‰をオーバã?ライドしますã?
645             *
646             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
647             *
648             * @return  タグの名称
649             */
650            @Override
651            protected String getTagName() {
652                    return "and" ;
653            }
654    
655            /**
656             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
657             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
658             *
659             * @return こã?クラスのæ–?­—å?表現
660             */
661            @Override
662            public String toString() {
663                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
664                                    .println( "VERSION"                     ,VERSION        )
665                                    .println( "startKey"            ,startKey       )
666                                    .println( "value"                       ,value          )
667                                    .println( "instrVals"           ,instrVals      )
668                                    .println( "multi"                       ,multi          )
669                                    .println( "quotCheck"           ,quotCheck      )
670                                    .println( "Other..."    ,getAttributes().getAttribute() )
671                                    .fixForm().toString() ;
672            }
673    }