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.DBConstValue;
021
022 import org.opengion.fukurou.util.StringUtil ;
023 import static org.opengion.fukurou.util.StringUtil.nval ;
024
025 import java.util.Map;
026 import java.util.LinkedHashMap;
027
028 /**
029 * TableUpdateTag にパラメーターを渡す為のタグクラスです?
030 *
031 * 汎用???タベ?ス登録処?行えるタグ tableUpdate タグを新規作?します?
032 * これは、?体的なSLQを作?する tableUpdateParam タグと?合わせて使用できます?
033 * tableUpdate タグは、queryType に JDBCTableUpdate を指定します?基本?これ?
034 * です?tableUpdateParam では、sqlType に、INSERT,COPY,UPDATE,MODIFY,DELETE の
035 * どれかを指定する事で、SQL??タイプを?します?COPY,MODIFY は command と
036 * 関連を持たす為に追?て?タイプで、INSERTやUPDATE と同じ処?行います?
037 * tableUpdateParam の table には、作?した?SQL の??ブルを指定します?
038 * where 属?は、検索結果の DBTableModel の更新時に使用する条件を指定します?
039 *
040 * @og.formSample
041 * ●形式?lt;og:tableUpdate command="{@command}" queryType="JDBCTableUpdate" >
042 * <og:tableUpdateParam
043 * sqlType = "{@sqlType}" // INSERT,COPY,UPDATE,MODIFY,DELETE
044 * table = "{@TABLE_NAME}" // 処?象の??ブル?
045 * names = "{@names}" // 処?象のカラ?
046 * omitNames = "{@omitNames}" // 処?象外?カラ?
047 * where = "{@where}" // 処?象を特定するキー
048 * whereNames = "{@whereNames}" // 処?象を特定するキー条件(where句)をCSV形?
049 * constKeys = "{@constKeys}" // 処?ラ?の中の固定情報カラ?
050 * constVals = "{@constVals}" // 処?ラ?の中の固定情報設定?
051 * asNames = "{@asNames}" // 別名を付けたカラ?(select A as B from TBL の B を指?
052 * orgNames = "{@orgNames}" // tableの実際のカラ?(select A as B from TBL の A を指?
053 * funcKeys = "{@funcKeys}" // 関数等を設定するカラ?
054 * funcVals = "{@funcVals}" // 関数等?設定?
055 * logicalDelete = "{@logicalDelete}" // sqlTypeがDELETEの場合にもUPDATE?発?
056 * />
057 * </og:tableUpdate>
058 *
059 * ●body?な?
060 *
061 * ●Tag定義??
062 * <og:tableUpdateParam
063 * sqlType ○?TAG】BODY部に書かれて? SQLタイプを?しま???)
064 * table ○?TAG】??象の??ブル名を?しま???)
065 * names 【TAG】??象のカラ?をCSV形式で??しま?
066 * omitNames 【TAG】??象外?カラ?をCSV形式で??しま?
067 * where 【TAG】??象を特定するキー条件(where句)を指定しま?
068 * whereNames 【TAG】??象を特定するキー条件(where句)をCSV形式で??しま?
069 * constKeys 【TAG】設定?を固定?と置き換える対象となるカラ?をCSV形式で??しま?
070 * constVals 【TAG】設定?を固定?と置き換える対象となる設定?をCSV形式で??しま?
071 * funcKeys 【TAG】関数等を設定するカラ?をCSV形式で??しま?
072 * funcVals 【TAG】関数等?設定?をCSV形式で??しま?
073 * asNames 【TAG】別名を付けたカラ?(select A as B from TBL の B を指?をCSV形式で??しま?
074 * orgNames 【TAG】tableの実際のカラ?(select A as B from TBL の A を指?をCSV形式で??しま?
075 * quotCheck 【TAG】リクエスト情報の クォー?ション(') 存在チェ?を実施するかど?[true/false]を設定しま?(初期値:USE_SQL_INJECTION_CHECK[=true])
076 * constObjKey 【TAG】固定情報カラ??処?ブジェクトを特定するキーを設定しま?初期値:SYSTEM_ID)
077 * logicalDelete 【TAG】sqlType="DELETE"の場合に論理削除(UPDATE)を行うかど?を指定しま?初期値:false)
078 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
079 * />
080 *
081 * ●使用?
082 * ・【entry.jsp?
083 * <og:tableUpdate command="{@command}" queryType="JDBCTableUpdate" >
084 * <og:tableUpdateParam
085 * sqlType = "{@sqlType}"
086 * table = "{@MEM.TABLE_NAME}"
087 * where = "ROWID = [ROWID]"
088 * />
089 * </og:tableUpdate>
090 *
091 * @og.rev 3.8.8.0 (2007/12/22) 新規作?
092 * @og.rev 4.1.2.0 (2008/03/12) 実??大?修正
093 * @og.group ??登録
094 *
095 * @version 4.0
096 * @author Kazuhiko Hasegawa
097 * @since JDK5.0,
098 */
099 public class TableUpdateParamTag extends CommonTagSupport {
100 //* こ?プログラ??VERSION??を設定します? {@value} */
101 private static final String VERSION = "5.5.8.5 (2012/11/27)" ;
102
103 private static final long serialVersionUID = 558520121127L ; // 5.5.8.5 (2012/11/27)
104
105 /** sqlType属?に設定できる値 {@value} */
106 public static final String SQL_TYPE = "|INSERT|COPY|UPDATE|MODIFY|DELETE|" ;
107
108 // 3.8.0.4 (2005/08/08) 印刷時に使用するシス?ID
109 private static final String SYSTEM_ID =HybsSystem.sys( "SYSTEM_ID" );
110
111 // 4.3.6.0 (2009/05/01) ?ォルトで利用するconstObjのシス?リソース?
112 private static final String DEFAULT_CONST_OBJ = HybsSystem.sys( "DEFAULT_CONST_CLASS" );
113
114 private String sqlType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
115 private String table = null; // 処?象の??ブル?
116 private String[] names = null; // 処?象のカラ?
117 private String omitNames = ",ROWID,ROWNUM,WRITABLE,"; // 処?象外?カラ?
118 private String where = null; // 処?象を特定するキー
119 private String whereNames = null; // 5.5.8.5 (2012/11/27) 処?象を特定するCSV形式?カラ?
120 private String[] constKeys = null; // 処?ラ?の中の固定情報カラ?
121 private String[] constVals = null; // 処?ラ?の中の固定情報設定?
122 private String[] funcKeys = null; // 5.5.1.9 (2012/04/19) 関数等を設定するカラ?
123 private String[] funcVals = null; // 5.5.1.9 (2012/04/19) 関数等?設定?
124 private String[] asNames = null; // 5.5.1.9 (2012/04/19) 別名を付けたカラ?(select A as B from TBL の B を指?
125 private String[] orgNames = null; // 5.5.1.9 (2012/04/19) tableの実際のカラ?(select A as B from TBL の A を指?
126 private String constObjKey = SYSTEM_ID; // 固定情報カラ??処?ブジェクトを特定するキー
127 private boolean quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );
128 private boolean logicalDelete = false; // 4.3.7.0 (2009/06/01) sqlTypeがDELETEの場合にもUPDATE?発?
129
130 /**
131 * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
132 *
133 * @og.rev 5.5.1.9 (2012/04/19) エラーチェ?を?に行います?
134 *
135 * @return 後続????( SKIP_BODY )
136 */
137 @Override
138 public int doStartTag() {
139
140 // constKeys,constVals の個数チェ?
141 if( constKeys != null ) {
142 if( constVals == null || constKeys.length != constVals.length ) {
143 String errMsg = "<b>constKeys と、constVals の個数が異なります?</b><br />"
144 + " constKeys=[" + StringUtil.array2csv( constKeys ) + "]"
145 + " constVals=[" + StringUtil.array2csv( constVals ) + "]" ;
146 throw new HybsSystemException( errMsg );
147 }
148 }
149
150 // funcKeys,funcVals の個数チェ?
151 if( funcKeys != null ) {
152 if( funcVals == null || funcKeys.length != funcVals.length ) {
153 String errMsg = "<b>funcKeys と、funcVals の個数が異なります?</b><br />"
154 + " funcKeys=[" + StringUtil.array2csv( funcKeys ) + "]"
155 + " funcVals=[" + StringUtil.array2csv( funcVals ) + "]" ;
156 throw new HybsSystemException( errMsg );
157 }
158 }
159
160 // asNames,orgNames の個数チェ?
161 if( orgNames != null ) {
162 if( asNames == null || orgNames.length != asNames.length ) {
163 String errMsg = "<b>orgNames と、asNames の個数が異なります?</b><br />"
164 + " orgNames=[" + StringUtil.array2csv( orgNames ) + "]"
165 + " asNames=[" + StringUtil.array2csv( asNames ) + "]" ;
166 throw new HybsSystemException( errMsg );
167 }
168 }
169
170 return(SKIP_BODY); // Body を評価しな?
171 }
172
173 /**
174 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
175 *
176 * @og.rev 4.3.7.0 (2009/06/01) 論理削除対?
177 *
178 * @return 後続????
179 */
180 @Override
181 public int doEndTag() {
182 debugPrint();
183
184 TableUpdateTag updateTag = (TableUpdateTag)findAncestorWithClass( this,TableUpdateTag.class );
185 if( updateTag == null ) {
186 // String errMsg = "<b>こ?タグは、TableUpdateTagの??(要?に記述してください?/b>";
187 String errMsg = "<b>" + getTagName() + "タグは、TableUpdateTagの??(要?に記述してください?/b>";
188 throw new HybsSystemException( errMsg );
189 }
190
191 String upSqlType = updateTag.getSqlType() ;
192 if( upSqlType == null || upSqlType.equals( sqlType ) ) {
193 // 通常の names カラ??列を設定します?
194 if( names == null ) { names = updateTag.getNames(); }
195 NamesData namesData = makeNamesData( names );
196
197 String query = null;
198 if( "INSERT".equalsIgnoreCase( sqlType ) || "COPY".equalsIgnoreCase( sqlType ) ) {
199 query = getInsertSQL( namesData );
200 }
201 else if( "UPDATE".equalsIgnoreCase( sqlType ) || "MODIFY".equalsIgnoreCase( sqlType )
202 || ( "DELETE".equalsIgnoreCase( sqlType ) && logicalDelete ) ) { // 4.3.7.0 (2009/06/01)
203 query = getUpdateSQL( namesData );
204 }
205 else if( "DELETE".equalsIgnoreCase( sqlType ) ) {
206 query = getDeleteSQL();
207 }
208
209 jspPrint( query );
210 }
211
212 return(EVAL_PAGE);
213 }
214
215 /**
216 * タグリブオブジェクトをリリースします?
217 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
218 *
219 * @og.rev 4.3.7.0 (2009/06/01) logicalDelete属?追?
220 * @og.rev 5.5.1.9 (2012/04/19) asNames、orgNames、funcKeys、funcVals属?追?
221 * @og.rev 5.5.8.5 (2012/11/27) 処?象を特定するCSV形式?カラ?
222 */
223 @Override
224 protected void release2() {
225 super.release2(); // 3.5.6.0 (2004/06/18) 追?抜けて?)
226 sqlType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
227 table = null; // 処?象の??ブル?
228 names = null; // 処?象のカラ?
229 omitNames = ",ROWID,ROWNUM,WRITABLE,"; // 処?象外?カラ?
230 where = null; // 処?象を特定するキー
231 whereNames = null; // 5.5.8.5 (2012/11/27) 処?象を特定するCSV形式?カラ?
232 constKeys = null; // 処?ラ?の中の固定情報カラ?
233 constVals = null; // 処?ラ?の中の固定情報設定?
234 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );
235 constObjKey = SYSTEM_ID; // 固定情報カラ??処?ブジェクトを特定するキー
236 logicalDelete = false; // 4.3.7.0 (2009/06/01)
237 funcKeys = null; // 5.5.1.9 (2012/04/19) 関数等を設定するカラ?
238 funcVals = null; // 5.5.1.9 (2012/04/19) 関数等?設定?
239 asNames = null; // 5.5.1.9 (2012/04/19) 別名を付けたカラ?(select A as B from TBL の B を指?
240 orgNames = null; // 5.5.1.9 (2012/04/19) tableの実際のカラ?(select A as B from TBL の A を指?
241 }
242
243 /**
244 * 【TAG】BODY部に書かれて? SQLタイプを?します?
245 *
246 * @og.tag
247 * SQLタイプ?、INSERT,COPY,UPDATE,MODIFY,DELETE の中から?す?
248 * ?があります?これら?、?部に書かれるSQLの形式を?する?に使用します?
249 * ?処??、DBTableModelの改?ー?A,C,D)に対して使用され?
250 * SQL を選択する?合???に使用されます?
251 * なお?COPY と MODIFY は、command で?できる簡易機?として用意して?す?
252 * 上位? TableUpdateTag の sqlType 属? と同じsqlType 属?の場合?み、SQL?
253 * 合?・出力します?(上位?sqlTypeがnullの場合?、無条件実行します?)
254 * ??タイプが、異なる?合?、なにも??行いません?
255 *
256 * @param type BODY部に書かれて? SQL タイ?
257 */
258 public void setSqlType( final String type ) {
259 sqlType = nval( getRequestParameter( type ),sqlType );
260 if( sqlType != null && SQL_TYPE.indexOf( "|" + sqlType + "|" ) < 0 ) {
261 sqlType = null;
262 // String errMsg = "sqlType属?には? + SQL_TYPE + "以外設定できません?
263 // + " typeIn=[" + type + "]"
264 // + " sqlType=[" + sqlType + "]" ;
265 // throw new HybsSystemException( errMsg );
266 }
267 }
268
269 /**
270 * 【TAG】??象の??ブル名を?します?
271 *
272 * @og.tag
273 * ??ブル名を?することで、sqlTypeに応じ?QUERYを生成することが?来ます?
274 * 生?する場合?カラ?特定する?合?、names 属?で?できます?
275 * また?WHERE条件は、where属?で?します?
276 *
277 * @param tbl ??ブル?
278 * @see #setNames( String )
279 * @see #setWhere( String )
280 * @see #setSqlType( String )
281 */
282 public void setTable( final String tbl ) {
283 table = nval( getRequestParameter( tbl ),table );
284 }
285
286 /**
287 * 【TAG】??象のカラ?をCSV形式で??します?
288 *
289 * @og.tag
290 * 生?するQUERYのカラ?をカンマ区???CSV)で??します?
291 * ?がな??合?、DBTableModel の全カラ?※)を使用して、QUERYを構築します?
292 * ?に、テーブル結合してDBTableModelを構築した?合?、登録すべきカラ?
293 * ?する?があります?
294 * (※)正確には、DBTableModel の全カラ???、ROWID,ROWNUM,WRITABLE カラ??
295 * 無視します?
296 * ?方法???常のパラメータ取得後に、CSV?します?
297 *
298 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV?に戻します?
299 *
300 * @param nms カラ?(CSV形?
301 * @see #setTable( String )
302 * @see #setOmitNames( String )
303 */
304 public void setNames( final String nms ) {
305 names = StringUtil.csv2Array( getRequestParameter( nms ) );
306 if( names.length == 0 ) { names = null; }
307 }
308
309 /**
310 * 【TAG】??象外?カラ?をCSV形式で??します?
311 *
312 * @og.tag
313 * 生?するQUERYのカラ?に?しな?ラ?をカンマ区???CSV)で??します?
314 * ?がな??合?、DBTableModel の全カラ?※)を使用して、QUERYを構築します?
315 * ??ブル結合などで、??たくな?ラ?の方が少な??合に、names ですべて?
316 * ?するより少な?述ですみます?
317 * (※)正確には、DBTableModel の全カラ???、ROWID,ROWNUM,WRITABLE カラ??
318 * 無視します?
319 *
320 * @param nms カラ?(CSV形?
321 * @see #setTable( String )
322 * @see #setNames( String )
323 */
324 public void setOmitNames( final String nms ) {
325 omitNames = omitNames + nval( getRequestParameter( nms ),"" ) + ",";
326 }
327
328 /**
329 * 【TAG】??象を特定するキー条件(where句)を指定します?
330 *
331 * @og.tag
332 * 生?するQUERYのwhere 句を指定します?通常の WHERE 句の書き方と同じで?
333 * DBTableModelの値を割り当てたい?に[カラ?] を記述します?
334 * ??の場合?設定?をセ?するときに、シングルコー??ション?
335 * 使用しますが、[カラ?]で?する?合?、その前後に?')シングル
336 * コー??ションは、不要です?
337 * {@XXXX}変数を使用する場合?、パース時に固定文字に置き換えられる為?
338 * ???時の(')シングルコー??ションが?になります?
339 * ※ 5.5.8.5 (2012/11/27) whereNames 属?と併用した場合?、where が?and を付けて、文字?結合されます?
340 * 例:FGJ='1' and CLM=[CLM] and SYSTEM_ID in ([SYSID],'**') and KBSAKU='{@KBSAKU}'
341 *
342 * @param wr 検索条件(where句)
343 */
344 public void setWhere( final String wr ) {
345 where = nval( getRequestParameter( wr ),where );
346 }
347
348 /**
349 * 【TAG】??象を特定するキー条件(where句)をCSV形式で??します?
350 *
351 * @og.tag
352 * 生?するQUERYのwhere 句を指定する方法として、?のカラ?をCSV?し、?部で
353 * KEY=[KEY] ??を作?します?
354 * ここでは、カラ?は、データベ?スのカラ?と同じで、かつ、DBTableModel に?
355 * 同じカラ????タが存在して?こと、と?条件付きとします?
356 * また?where 条件との併用を行いますが、こちら?条件が?に使用され、where 条件は?
357 * and を付けて、文字?結合されます?
358 * 例?CLM,SYSTEM_ID,KBSAKU ? CLM=[CLM] and SYSTEM_ID=[SYSTEM_ID] and KBSAKU=[KBSAKU]
359 *
360 * @og.rev 5.5.8.5 (2012/11/27) 新規追?
361 *
362 * @param wrnm 検索条件(where句)作?のためのカラ?(CSV形?
363 */
364 public void setWhereNames( final String wrnm ) {
365 whereNames = nval( getRequestParameter( wrnm ),whereNames );
366 }
367
368 /**
369 * 【TAG】設定?を固定?と置き換える対象となるカラ?をCSV形式で??します?
370 *
371 * @og.tag
372 * names 属?のカラ? table 属?より、QUERYを作?して、DBTableModelの値?
373 * 割り当てる?合?DBTableModelの値ではなく?外部から?した固定??
374 * 割り当てたい場合に、そのカラ?をカンマ区???CSV)で??します?
375 * <del>ここで?するカラ?は、names 属?に含まれるか?DBTableModelのカラ?して
376 * 存在する?があります?なお?names 属?に含まれる場合?、DBTableModelのカラ?
377 * 含まれる??ありません?/del>
378 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
379 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
380 *
381 * @param keys カラ?(CSV形?
382 * @see #setConstVals( String )
383 */
384 public void setConstKeys( final String keys ) {
385 constKeys = getCSVParameter( keys );
386 }
387
388 /**
389 * 【TAG】設定?を固定?と置き換える対象となる設定?をCSV形式で??します?
390 *
391 * @og.tag
392 * names 属?のカラ? table 属?より、QUERYを作?して、DBTableModelの
393 * 値を割り当てる?合?DBTableModelの値ではなく?外部から?した固定??
394 * 割り当てたい場合に、そのカラ?に対応する設定?をカンマ区???CSV)で
395 * ??します?ここで?する設定?は、constKeys 属?と対応させます?
396 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
397 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
398 *
399 * @param vals 設定?(CSV形?
400 * @see #setConstKeys( String )
401 */
402 public void setConstVals( final String vals ) {
403 constVals = getCSVParameter( vals );
404 }
405
406 /**
407 * 【TAG】関数等を設定するカラ?をCSV形式で??します?
408 *
409 * @og.tag
410 * constVals 属?で設定する?は、?シングルクオートが付与されます?
411 * そ?場合?関数などを設定したい場合でも???として設定しようとします?
412 * ここで?するカラ?(funcKeys)自身は、constKeys と同じ書式です?
413 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
414 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
415 *
416 * @og.rev 5.5.1.9 (2012/04/19) 新規追?
417 *
418 * @param keys カラ?(CSV形?
419 * @see #setFuncVals( String )
420 */
421 public void setFuncKeys( final String keys ) {
422 funcKeys = getCSVParameter( keys );
423 }
424
425 /**
426 * 【TAG】関数等?設定?をCSV形式で??します?
427 *
428 * @og.tag
429 * funcKeys 属?に対応す?関数などの設定?を割り当てます?
430 * constVals 属?との違いは、funcVals の設定?は、そのままの形で、SQL??
431 * 構築に使われます?
432 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
433 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
434 *
435 * @og.rev 5.5.1.9 (2012/04/19) 新規追?
436 *
437 * @param vals 設定?(CSV形?
438 * @see #setFuncKeys( String )
439 */
440 public void setFuncVals( final String vals ) {
441 funcVals = getCSVParameter( vals );
442 }
443
444 /**
445 * 【TAG】別名を付けたカラ?(select A as B from TBL の B を指?をCSV形式で??します?
446 *
447 * @og.tag
448 * SELECT ?記述したとき?別名を付けて?り?SELECTした??ブルと別の??ブルに
449 * DBTableModelの値を書き込??合?DBTableModel の持って?カラ?と、実際に
450 * 書き込?ラ?が異なります?そ?ようなケースに、?の別名カラ??します?
451 * orgNames属?の並び?、asNames属?の並び?合わせておく?があります?
452 * こ?カラ?は、DBTableModel には持って?が???ブル側には持って???
453 * なので、?部? omitNames 属?に値を設定します?利用??、omitNames に
454 * 書き込???ありません?
455 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
456 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
457 *
458 * @og.rev 5.5.1.9 (2012/04/19) 新規追?
459 *
460 * @param keys カラ?(CSV形?
461 * @see #setOrgNames( String )
462 */
463 public void setAsNames( final String keys ) {
464 asNames = getCSVParameter( keys );
465 }
466
467 /**
468 * 【TAG】tableの実際のカラ?(select A as B from TBL の A を指?をCSV形式で??します?
469 *
470 * @og.tag
471 * SELECT ?記述したとき?別名を付けて?り?SELECTした??ブルと別の??ブルに
472 * DBTableModelの値を書き込??合?DBTableModel の持って?カラ?と、実際に
473 * 書き込?ラ?が異なります?そ?ようなケースに、テーブルの実カラ??します?
474 * orgNames属?の並び?、asNames属?の並び?合わせておく?があります?
475 * こ?カラ?は、DBTableModel には持って?せんが???ブル側には持って?値
476 * なので、このカラ?で、SQL?構築します? UPDATE TBL SET A=[B] WHERE … となります?
477 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
478 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
479 *
480 * @og.rev 5.5.1.9 (2012/04/19) 新規追?
481 *
482 * @param keys カラ?(CSV形?
483 * @see #setAsNames( String )
484 */
485 public void setOrgNames( final String keys ) {
486 orgNames = getCSVParameter( keys );
487 }
488
489 /**
490 * 【TAG】リクエスト情報の クォー?ション(') 存在チェ?を実施するかど?[true/false]を設定しま?
491 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])?
492 *
493 * @og.tag
494 * ???インジェクション対策??として、暫定的ではありますが、SQLのパラメータに
495 * 渡す文字?にクォー?ション(') を許さな?定にすれば、ある程度は防止できます?
496 * 数字タイプ?引数には?or 5=5 などのクォー?ションを使用しな?ードを埋めても?
497 * 数字チェ?で検?可能です??タイプ?場合?、? (')を?ずして?
498 * ' or 'A' like 'A のような形式になる為?')チェ??でも有効です?
499 * (') が含まれて?エラーにする(true)?かノ?チェ??false)を指定します?
500 * (初期値:シス?定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])?
501 *
502 * @param flag クォー?ションチェ? [true:する/それ以?しない]
503 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
504 */
505 public void setQuotCheck( final String flag ) {
506 quotCheck = nval( getRequestParameter( flag ),quotCheck );
507 }
508
509 /**
510 * 【TAG】固定情報カラ??処?ブジェクトを特定するキーを設定しま?初期値:SYSTEM_ID)?
511 *
512 * @og.tag
513 * 固定情報カラ?をシス?単位にJavaクラスで管?きます?
514 * そ?クラスオブジェクト?、org.opengion.hayabusa.db.DBConstValue インターフェース?
515 * 継承した、plugin クラスになります?
516 * そ?クラスを特定するキーワードを?します?
517 * 初期値は、SYSTEM_ID でシス?単位にクラスを作?します?
518 * もし、他?シス?と共通?場合?、継承?させることも可能です?
519 * 対応したDBConstValueクラスが?ラグインとして存在しな??合??
520 * シス?リソースのDEFAULT_CONST_CLASSで?されたクラスが利用されます?
521 *
522 * 初期値は、SYSTEM_ID です?
523 *
524 * @param key 固定情報カラ??処?ブジェクトを特定するキー
525 */
526 public void setConstObjKey( final String key ) {
527 constObjKey = nval( getRequestParameter( key ),constObjKey );
528 }
529
530 /**
531 * 【TAG】sqlType="DELETE"の場合に論理削除(UPDATE)を行うかど?を指定しま?初期値:false)?
532 *
533 * @og.tag
534 * sqlType="DELETE"の場合に論理削除(UPDATE)を行うかど?を指定します?
535 * trueが指定された場合?、DELETE?はなく?UPDATE?発行されます?
536 * falseが指定された場合?、DELETE?発行されます?
537 * さらに論理削除を行う場合?org.opengion.hayabusa.db.DBConstValue インターフェースに
538 * 定義されて?、getLogicalDeleteKeys()及?getLogicalDeleteValsを実?ることで?
539 * 論理削除する際?フラグの更新方法を統?に管?ることが可能になります?
540 * 初期値は、false(物?除する)で?
541 *
542 * @param flg 論理削除(UPDATE)を行うかど?
543 */
544 public void setLogicalDelete( final String flg ) {
545 logicalDelete = nval( getRequestParameter( flg ),logicalDelete );
546 }
547
548 /**
549 * ??タをインサートする?合に使用するSQL?作?します?
550 *
551 * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定?セ?を採用
552 * @og.rev 4.3.6.4 (2009/05/01) ?ォルト設定をシス?リソースで設定可能にする
553 * @og.rev 5.3.4.0 (2011/04/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロ??)
554 *
555 * @param namesData NamesDataオブジェク?
556 *
557 * @return インサー?QL
558 */
559 private String getInsertSQL( final NamesData namesData ) {
560 String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
561
562 // 4.3.6.4 (2009/05/01) 標準?追?
563 if( cls == null){
564 cls = DEFAULT_CONST_OBJ;
565 }
566
567 // if( cls != null ) { // 5.3.4.0 (2011/04/01)
568 if( cls != null && !cls.isEmpty() ) {
569 DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
570 // 4.2.1.0 (2008/04/16) 初期化追?
571 constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
572 String[] keys = constVal.getInsertKeys();
573 String[] vals = constVal.getInsertVals();
574 namesData.add( keys,vals );
575 }
576
577 String[] nms = namesData.getNames();
578 String[] vls = namesData.getVals();
579
580 StringBuilder sql = new StringBuilder();
581 sql.append( "INSERT INTO " ).append( table );
582 sql.append( " ( " );
583 sql.append( nms[0] );
584 for( int i=1; i<nms.length; i++ ) {
585 sql.append( "," ).append( nms[i] );
586 }
587 sql.append( " ) VALUES ( " );
588 sql.append( vls[0] );
589 for( int i=1; i<vls.length; i++ ) {
590 sql.append( "," ).append( vls[i] );
591 }
592 sql.append( " )" );
593
594 return sql.toString();
595 }
596
597 /**
598 * ??タをア????トする?合に使用するSQL?作?します?
599 *
600 * where と whereNames が同時に?された場合?、whereNames が?に処??
601 * where 条件は、and 結合されます?
602 *
603 * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定?セ?を採用
604 * @og.rev 4.3.6.4 (2009/05/01) ?ォルト設定をシス?リソースで設定可能にする
605 * @og.rev 4.3.7.0 (2009/06/01) 論理削除対?
606 * @og.rev 5.3.7.0 (2011/07/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロ??) 対応忘れ
607 * @og.rev 5.5.8.5 (2012/11/27) whereNames 対?
608 *
609 * @param namesData NamesDataオブジェク?
610 *
611 * @return ア?????QL
612 */
613 private String getUpdateSQL( final NamesData namesData ) {
614 String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
615
616 // 4.3.6.4 (2009/05/01) 標準?追?
617 if( cls == null){
618 cls = DEFAULT_CONST_OBJ;
619 }
620
621 // if( cls != null ) {
622 if( cls != null && !cls.isEmpty() ) { // 5.3.7.0 (2011/07/01)
623 DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
624 // 4.2.1.0 (2008/04/16) 初期化追?
625 constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
626 // 4.3.7.0 (2009/06/01) 論理削除対?
627 String[] keys = null;
628 String[] vals = null;
629 if( "DELETE".equalsIgnoreCase( sqlType ) ) {
630 keys = constVal.getLogicalDeleteKeys();
631 vals = constVal.getLogicalDeleteVals();
632 }
633 else {
634 keys = constVal.getUpdateKeys();
635 vals = constVal.getUpdateVals();
636 }
637 namesData.add( keys,vals );
638 }
639
640 String[] nms = namesData.getNames();
641 String[] vls = namesData.getVals();
642
643 StringBuilder sql = new StringBuilder();
644 sql.append( "UPDATE " ).append( table ).append( " SET " );
645 sql.append( nms[0] ).append( "=" ).append( vls[0] );
646
647 for( int i=1; i<nms.length; i++ ) {
648 sql.append( "," );
649 sql.append( nms[i] ).append( "=" ).append( vls[i] );
650 }
651
652 // 5.5.8.5 (2012/11/27) whereNames 対?
653 String whereAnd = " WHERE " ;
654 if( whereNames != null && whereNames.length() > 0 ) {
655 String[] wnms = whereNames.split(",");
656 sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
657
658 for( int i=1; i<wnms.length; i++ ) {
659 sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
660 }
661 whereAnd = " AND " ; // whereNames 優先?ここを?らなければ、?期?のまま? WHERE " が使われ?
662 }
663
664 // 5.5.8.5 (2012/11/27) whereNames 対応?whereNames が登録されて?ば、AND で繋げる?
665 if( where != null && where.length() > 0 ) {
666 // sql.append( " WHERE " ).append( where );
667 sql.append( whereAnd ).append( where );
668 }
669
670 return sql.toString();
671 }
672
673 /**
674 * ??タをデリートする?合に使用するSQL?作?します?
675 *
676 * where と whereNames が同時に?された場合?、whereNames が?に処??
677 * where 条件は、and 結合されます?
678 *
679 * @og.rev 5.5.8.5 (2012/11/27) whereNames 対?
680 *
681 * @return ?ー?QL
682 */
683 private String getDeleteSQL() {
684 StringBuilder sql = new StringBuilder();
685 sql.append( "DELETE FROM " ).append( table );
686
687 // 5.5.8.5 (2012/11/27) whereNames 対?
688 String whereAnd = " WHERE " ;
689 if( whereNames != null && whereNames.length() > 0 ) {
690 String[] wnms = whereNames.split(",");
691 sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
692
693 for( int i=1; i<wnms.length; i++ ) {
694 sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
695 }
696 whereAnd = " AND " ; // whereNames 優先?ここを?らなければ、?期?のまま? WHERE " が使われ?
697 }
698
699 // 5.5.8.5 (2012/11/27) whereNames 対応?whereNames が登録されて?ば、AND で繋げる?
700 if( where != null && where.length() > 0 ) {
701 // sql.append( " WHERE " ).append( where );
702 sql.append( whereAnd ).append( where );
703 }
704 return sql.toString();
705 }
706
707 /**
708 * names,constKeys,omitNames から、?なキー??と、属???を持っ?NamesData を作?します?
709 *
710 * @og.rev 4.1.2.1 (2008/03/17) 固定?の constVals の前後に?'" を?れる?
711 * @og.rev 5.5.1.9 (2012/04/19) asNames、orgNames、funcKeys、funcVals属?追?
712 *
713 * @param nms カラ?配?
714 *
715 * @return 属???を持ったNamesData
716 */
717 private NamesData makeNamesData( final String[] nms ) {
718
719 NamesData namesData = new NamesData();
720
721 // 5.5.1.9 (2012/04/19) omitNames に、asNames配?の値を設定しておきます?
722 if( asNames != null ) {
723 for( int i=0; i<asNames.length; i++ ) {
724 if( asNames[i] != null && asNames[i].length() > 0 ) {
725 omitNames = omitNames + asNames[i] + ",";
726 }
727 }
728 }
729
730 // names で?されたカラ?
731 for( int i=0; i<nms.length; i++ ) {
732 String nm = nms[i];
733 if( nm != null && nm.length() > 0 && omitNames.indexOf( "," + nm + "," ) < 0 ) {
734 namesData.add( nm,"[" + nm + "]" ) ;
735 }
736 }
737
738 // 固定?の constKeys カラ??列を設定します?
739 if( constKeys != null && constKeys.length > 0 ) {
740 for( int j=0; j<constKeys.length; j++ ) {
741 String nm = constKeys[j];
742 if( nm != null && nm.length() > 0 ) {
743 namesData.add( nm,"'" + constVals[j] + "'" ) ; // constVals は、シングルクオートで囲?す?
744 }
745 }
746 }
747
748 // 関数値の funcKeys カラ??列を設定します?
749 if( funcKeys != null && funcKeys.length > 0 ) {
750 for( int j=0; j<funcKeys.length; j++ ) {
751 String nm = funcKeys[j];
752 if( nm != null && nm.length() > 0 ) {
753 namesData.add( nm, funcVals[j] ) ; // funcVals は、シングルクオートで囲?せん?
754 }
755 }
756 }
757
758 // 別名? asNames,orgNames カラ??列を設定します?
759 if( orgNames != null && orgNames.length > 0 ) {
760 for( int j=0; j<orgNames.length; j++ ) {
761 String onm = orgNames[j];
762 if( onm != null && onm.length() > 0 ) {
763 namesData.add( onm,"[" + asNames[j] + "]" ) ;
764 }
765 }
766 }
767
768 return namesData ;
769 }
770
771 /**
772 * ???タを受け渡す為の、簡易クラスです?
773 * 更新するカラ?と値のセ?配?を管?て?す?
774 *
775 */
776 private static class NamesData {
777 final Map<String,String> data = new LinkedHashMap<String,String>() ;
778
779 /**
780 * キーと値のセ?を追?ます?
781 *
782 * @param nm String
783 * @param val String
784 */
785 public void add( final String nm,final String val ) {
786 data.put( nm,val );
787 }
788
789 /**
790 * キー配?と対応する?値配?のセ?を追?ます?
791 *
792 * @param nms String[]
793 * @param vals String[]
794 */
795 public void add( final String[] nms,final String[] vals ) {
796 if( nms != null ) {
797 for( int i=0; i<nms.length; i++ ) {
798 data.put( nms[i],vals[i] );
799 }
800 }
801 }
802
803 /**
804 * キー配?を返します?
805 *
806 * @return String[]
807 */
808 public String[] getNames() {
809 return data.keySet().toArray( new String[data.size()] );
810 }
811
812 /**
813 * 値配?を返します?
814 *
815 * @return String[]
816 */
817 public String[] getVals() {
818 return data.values().toArray( new String[data.size()] );
819 }
820 }
821
822 /**
823 * こ?オブジェクト???表現を返します?
824 * 基本???目?使用します?
825 *
826 * @return こ?クラスの??表現
827 */
828 @Override
829 public String toString() {
830 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
831 .println( "VERSION" ,VERSION )
832 .println( "sqlType" ,sqlType )
833 .println( "table" ,table )
834 .println( "names" ,names )
835 .println( "omitNames" ,omitNames )
836 .println( "where" ,where )
837 .println( "whereNames" ,whereNames )
838 .println( "constKeys" ,constKeys )
839 .println( "constVals" ,constVals )
840 .println( "logicalDelete" ,logicalDelete )
841 .fixForm().toString() ;
842 }
843 }