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 * 条件値に、{@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 * {@XXXX} 変数に、å?がè¤?•°含まれてã�?‚‹場合ã?処ç�?‚’規定しますã?
533 * multi="true" に設定すると、è¤?•°の引数はã€?xx1','xx2','xx3', ?¥?¥?¥ とã�?�†
534 * 形式に変換しますã?
535 * where 条件でè¨?�†とã€?"where PN in ( {@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開å§?終äº?–‡å?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[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 * (><) が含まれてã�?�Ÿエラーにする(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 値に、{@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 値に、{@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 }