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 = "4.0.0.0 (2005/11/30)" ;
102
103 private static final long serialVersionUID = 4000 ; // 4.0.0 (2005/11/30)
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 throw new HybsSystemException( errMsg );
188 }
189
190 String upSqlType = updateTag.getSqlType() ;
191 if( upSqlType == null || upSqlType.equals( sqlType ) ) {
192 // 通常の names カラãƒ??列を設定しますã?
193 if( names == null ) { names = updateTag.getNames(); }
194 NamesData namesData = makeNamesData( names );
195
196 String query = null;
197 if( "INSERT".equalsIgnoreCase( sqlType ) || "COPY".equalsIgnoreCase( sqlType ) ) {
198 query = getInsertSQL( namesData );
199 }
200 else if( "UPDATE".equalsIgnoreCase( sqlType ) || "MODIFY".equalsIgnoreCase( sqlType )
201 || ( "DELETE".equalsIgnoreCase( sqlType ) && logicalDelete ) ) { // 4.3.7.0 (2009/06/01)
202 query = getUpdateSQL( namesData );
203 }
204 else if( "DELETE".equalsIgnoreCase( sqlType ) ) {
205 query = getDeleteSQL();
206 }
207
208 jspPrint( query );
209 }
210
211 return(EVAL_PAGE);
212 }
213
214 /**
215 * タグリブオブジェクトをリリースしますã?
216 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
217 *
218 * @og.rev 4.3.7.0 (2009/06/01) logicalDelete属æ?追åŠ?
219 * @og.rev 5.5.1.9 (2012/04/19) asNames、orgNames、funcKeys、funcVals属æ?追åŠ?
220 * @og.rev 5.5.8.5 (2012/11/27) 処ç�?¯¾象を特定するCSV形式ã?カラãƒ?��
221 */
222 @Override
223 protected void release2() {
224 super.release2(); // 3.5.6.0 (2004/06/18) 追åŠ?抜けてã�?�Ÿ)
225 sqlType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
226 table = null; // 処ç�?¯¾象のãƒ??ブルå�?
227 names = null; // 処ç�?¯¾象のカラãƒ?��
228 omitNames = ",ROWID,ROWNUM,WRITABLE,"; // 処ç�?¯¾象外ã?カラãƒ?��
229 where = null; // 処ç�?¯¾象を特定するキー
230 whereNames = null; // 5.5.8.5 (2012/11/27) 処ç�?¯¾象を特定するCSV形式ã?カラãƒ?��
231 constKeys = null; // 処ç�?‚«ラãƒ?��の中の固定情報カラãƒ?��
232 constVals = null; // 処ç�?‚«ラãƒ?��の中の固定情報設定å?
233 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );
234 constObjKey = SYSTEM_ID; // 固定情報カラãƒ??処ç�?‚ªブジェクトを特定するキー
235 logicalDelete = false; // 4.3.7.0 (2009/06/01)
236 funcKeys = null; // 5.5.1.9 (2012/04/19) 関数等を設定するカラãƒ?��
237 funcVals = null; // 5.5.1.9 (2012/04/19) 関数等ã?設定å?
238 asNames = null; // 5.5.1.9 (2012/04/19) 別名を付けたカラãƒ?��(select A as B from TBL の B を指å®?
239 orgNames = null; // 5.5.1.9 (2012/04/19) tableの実際のカラãƒ?��(select A as B from TBL の A を指å®?
240 }
241
242 /**
243 * 【TAG】BODY部に書かれてã�?‚‹ SQLタイプをæŒ?®šしますã?
244 *
245 * @og.tag
246 * SQLタイプã?、INSERT,COPY,UPDATE,MODIFY,DELETE の中からæŒ?®šすã‚?
247 * å¿?¦�がありますã?これらã?、å?部に書かれるSQLの形式をæŒ?®šするã?に使用しますã?
248 * å†?ƒ¨処ç�??、DBTableModelの改å»?‚³ーãƒ?A,C,D)に対して使用されã‚?
249 * SQL を選択するå?合ã?æƒ??に使用されますã?
250 * なおã?COPY と MODIFY は、command でæŒ?®šできる簡易機è?として用意してã�?�¾すã?
251 * 上位ã? TableUpdateTag の sqlType 属æ? と同じsqlType 属æ?の場合ã?み、SQLæ–?‚’
252 * 合æ?・出力しますã?(上位ã?sqlTypeがnullの場合ã?、無条件実行しますã?)
253 * æŒ?®šã?タイプが、異なるå?合ã?、なにもå?ç�?‚’行いませんã€?
254 *
255 * @param type BODY部に書かれてã�?‚‹ SQL タイãƒ?
256 */
257 public void setSqlType( final String type ) {
258 sqlType = nval( getRequestParameter( type ),sqlType );
259 if( sqlType != null && SQL_TYPE.indexOf( "|" + sqlType + "|" ) < 0 ) {
260 sqlType = null;
261 // String errMsg = "sqlType属æ?にはã€? + SQL_TYPE + "以外設定できませんã€?
262 // + " typeIn=[" + type + "]"
263 // + " sqlType=[" + sqlType + "]" ;
264 // throw new HybsSystemException( errMsg );
265 }
266 }
267
268 /**
269 * 【TAG】å?ç�?¯¾象のãƒ??ブル名をæŒ?®šしますã?
270 *
271 * @og.tag
272 * ãƒ??ブル名をæŒ?®šすることで、sqlTypeに応じã�?QUERYを生成することがå?来ますã?
273 * 生æ?する場合ã?カラãƒ?‚’特定するå?合ã?、names 属æ?でæŒ?®šできますã?
274 * またã?WHERE条件は、where属æ?でæŒ?®šしますã?
275 *
276 * @param tbl ãƒ??ブルå�?
277 * @see #setNames( String )
278 * @see #setWhere( String )
279 * @see #setSqlType( String )
280 */
281 public void setTable( final String tbl ) {
282 table = nval( getRequestParameter( tbl ),table );
283 }
284
285 /**
286 * 【TAG】å?ç�?¯¾象のカラãƒ?��をCSV形式でè¤?•°æŒ?®šしますã?
287 *
288 * @og.tag
289 * 生æ?するQUERYのカラãƒ?��をカンマ区åˆ?‚Šæ–??CSV)でè¤?•°æŒ?®šしますã?
290 * æŒ?®šがなã�??合ã?、DBTableModel の全カラãƒ?※)を使用して、QUERYを構築しますã?
291 * ä¸?ˆ¬に、テーブル結合してDBTableModelを構築したå?合ã?、登録すべきカラãƒ?‚’
292 * æŒ?®šするå¿?¦�がありますã?
293 * (※)正確には、DBTableModel の全カラãƒ??ã�?�¡、ROWID,ROWNUM,WRITABLE カラãƒ??
294 * 無視しますã?
295 * åˆ?§£方法ã?ã€??常のパラメータ取得後に、CSVåˆ?§£しますã?
296 *
297 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSVåˆ?§£に戻しますã?
298 *
299 * @param nms カラãƒ?��(CSV形å¼?
300 * @see #setTable( String )
301 * @see #setOmitNames( String )
302 */
303 public void setNames( final String nms ) {
304 names = StringUtil.csv2Array( getRequestParameter( nms ) );
305 if( names.length == 0 ) { names = null; }
306 }
307
308 /**
309 * 【TAG】å?ç�?¯¾象外ã?カラãƒ?��をCSV形式でè¤?•°æŒ?®šしますã?
310 *
311 * @og.tag
312 * 生æ?するQUERYのカラãƒ?��にæŒ?®šしなã�?‚«ラãƒ?��をカンマ区åˆ?‚Šæ–??CSV)でè¤?•°æŒ?®šしますã?
313 * æŒ?®šがなã�??合ã?、DBTableModel の全カラãƒ?※)を使用して、QUERYを構築しますã?
314 * ãƒ??ブル結合などで、å?ç�?�—たくなã�?‚«ラãƒ?•°の方が少なã�??合に、names ですべてã‚?
315 * æŒ?®šするより少なã�?¨˜述ですみますã?
316 * (※)正確には、DBTableModel の全カラãƒ??ã�?�¡、ROWID,ROWNUM,WRITABLE カラãƒ??
317 * 無視しますã?
318 *
319 * @og.rev 5.7.0.0 (2013/11/3) 空白æ–?—削除
320 *
321 * @param nms カラãƒ?��(CSV形å¼?
322 * @see #setTable( String )
323 * @see #setNames( String )
324 */
325 public void setOmitNames( final String nms ) {
326 // omitNames = omitNames + nval( getRequestParameter( nms ),"" ) + ",";
327 omitNames = omitNames + StringUtil.deleteWhitespace( nval( getRequestParameter( nms ),"" ) ) + ",";
328 }
329
330 /**
331 * 【TAG】å?ç�?¯¾象を特定するキー条件(where句)を指定しますã?
332 *
333 * @og.tag
334 * 生æ?するQUERYのwhere 句を指定しますã?通常の WHERE 句の書き方と同じでã€?
335 * DBTableModelの値を割り当てたいç®?‰€に[カラãƒ?��] を記述しますã?
336 * æ–?—å?の場合ã?設定å?をセãƒ?ƒˆするときに、シングルコーãƒ??ションã‚?
337 * 使用しますが、[カラãƒ?��]でæŒ?®šするå?合ã?、その前後にã€?')シングル
338 * コーãƒ??ションは、不要ですã?
339 * {@XXXX}変数を使用する場合ã?、パース時に固定文字に置き換えられる為ã€?
340 * æ–?—å?æŒ?®š時の(')シングルコーãƒ??ションがå¿?¦�になりますã?
341 * ※ 5.5.8.5 (2012/11/27) whereNames 属æ?と併用した場合ã?、where がã?and を付けて、文字å?結合されますã?
342 * 例:FGJ='1' and CLM=[CLM] and SYSTEM_ID in ([SYSID],'**') and KBSAKU='{@KBSAKU}'
343 *
344 * @param wr 検索条件(where句)
345 */
346 public void setWhere( final String wr ) {
347 where = nval( getRequestParameter( wr ),where );
348 }
349
350 /**
351 * 【TAG】å?ç�?¯¾象を特定するキー条件(where句)をCSV形式でè¤?•°æŒ?®šしますã?
352 *
353 * @og.tag
354 * 生æ?するQUERYのwhere 句を指定する方法として、è¤?•°のカラãƒ?��をCSVæŒ?®šし、å?部で
355 * KEY=[KEY] æ–?—å?を作æ?しますã?
356 * ここでは、カラãƒ?��は、データベã?スのカラãƒ?��と同じで、かつ、DBTableModel にã‚?
357 * 同じカラãƒ??ãƒ??タが存在してã�?‚‹こと、とã�?�†条件付きとしますã?
358 * またã?where 条件との併用を行いますが、こちらã?条件がå?に使用され、where 条件はã€?
359 * and を付けて、文字å?結合されますã?
360 * 例ï¼?CLM,SYSTEM_ID,KBSAKU â‡? CLM=[CLM] and SYSTEM_ID=[SYSTEM_ID] and KBSAKU=[KBSAKU]
361 *
362 * @og.rev 5.5.8.5 (2012/11/27) 新規追åŠ?
363 *
364 * @param wrnm 検索条件(where句)作æ?のためのカラãƒ?��(CSV形å¼?
365 */
366 public void setWhereNames( final String wrnm ) {
367 whereNames = nval( getRequestParameter( wrnm ),whereNames );
368 }
369
370 /**
371 * 【TAG】設定å?を固定å?と置き換える対象となるカラãƒ?��をCSV形式でè¤?•°æŒ?®šしますã?
372 *
373 * @og.tag
374 * names 属æ?のカラãƒ?‚„ table 属æ?より、QUERYを作æ?して、DBTableModelの値ã‚?
375 * 割り当てるå?合ã?DBTableModelの値ではなくã?外部からæŒ?®šした固定å?ã‚?
376 * 割り当てたい場合に、そのカラãƒ?��をカンマ区åˆ?‚Šæ–??CSV)でè¤?•°æŒ?®šしますã?
377 * <del>ここでæŒ?®šするカラãƒ?��は、names 属æ?に含まれるかã?DBTableModelのカラãƒ?�¨して
378 * 存在するå¿?¦�がありますã?なおã?names 属æ?に含まれる場合ã?、DBTableModelのカラãƒ?�«
379 * 含まれるå¿?¦�ã?ありませんã€?/del>
380 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
381 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
382 *
383 * @param keys カラãƒ?��(CSV形å¼?
384 * @see #setConstVals( String )
385 */
386 public void setConstKeys( final String keys ) {
387 constKeys = getCSVParameter( keys );
388 }
389
390 /**
391 * 【TAG】設定å?を固定å?と置き換える対象となる設定å?をCSV形式でè¤?•°æŒ?®šしますã?
392 *
393 * @og.tag
394 * names 属æ?のカラãƒ?‚„ table 属æ?より、QUERYを作æ?して、DBTableModelの
395 * 値を割り当てるå?合ã?DBTableModelの値ではなくã?外部からæŒ?®šした固定å?ã‚?
396 * 割り当てたい場合に、そのカラãƒ?��に対応する設定å?をカンマ区åˆ?‚Šæ–??CSV)で
397 * è¤?•°æŒ?®šしますã?ここでæŒ?®šする設定å?は、constKeys 属æ?と対応させますã?
398 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
399 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
400 *
401 * @param vals 設定å?(CSV形å¼?
402 * @see #setConstKeys( String )
403 */
404 public void setConstVals( final String vals ) {
405 constVals = getCSVParameter( vals );
406 }
407
408 /**
409 * 【TAG】関数等を設定するカラãƒ?��をCSV形式でè¤?•°æŒ?®šしますã?
410 *
411 * @og.tag
412 * constVals 属æ?で設定するå?は、å¿?�šシングルクオートが付与されますã?
413 * そã?場合ã?関数などを設定したい場合でもã?æ–?—å?として設定しようとしますã?
414 * ここでæŒ?®šするカラãƒ?��(funcKeys)自身は、constKeys と同じ書式ですã?
415 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
416 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
417 *
418 * @og.rev 5.5.1.9 (2012/04/19) 新規追åŠ?
419 *
420 * @param keys カラãƒ?��(CSV形å¼?
421 * @see #setFuncVals( String )
422 */
423 public void setFuncKeys( final String keys ) {
424 funcKeys = getCSVParameter( keys );
425 }
426
427 /**
428 * 【TAG】関数等ã?設定å?をCSV形式でè¤?•°æŒ?®šしますã?
429 *
430 * @og.tag
431 * funcKeys 属æ?に対応すã‚?関数などの設定å?を割り当てますã?
432 * constVals 属æ?との違いは、funcVals の設定å?は、そのままの形で、SQLæ–??
433 * 構築に使われますã?
434 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
435 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
436 *
437 * @og.rev 5.5.1.9 (2012/04/19) 新規追åŠ?
438 *
439 * @param vals 設定å?(CSV形å¼?
440 * @see #setFuncKeys( String )
441 */
442 public void setFuncVals( final String vals ) {
443 funcVals = getCSVParameter( vals );
444 }
445
446 /**
447 * 【TAG】別名を付けたカラãƒ?��(select A as B from TBL の B を指å®?をCSV形式でè¤?•°æŒ?®šしますã?
448 *
449 * @og.tag
450 * SELECT æ–?‚’記述したときã?別名を付けてã�?�Ÿりã?SELECTしたãƒ??ブルと別のãƒ??ブルに
451 * DBTableModelの値を書き込ã‚??合ã?DBTableModel の持ってã�?‚‹カラãƒ?��と、実際に
452 * 書き込ã‚?‚«ラãƒ?��が異なりますã?そã?ようなケースに、å?の別名カラãƒ?‚’æŒ?®šしますã?
453 * orgNames属æ?の並びé ?�¨、asNames属æ?の並びé ?‚’合わせておくå¿?¦�がありますã?
454 * こã?カラãƒ?��は、DBTableModel には持ってã�?‚‹がã?ãƒ??ブル側には持ってã�?�ªã�??
455 * なので、å?部çš?�« omitNames 属æ?に値を設定しますã?利用è€??、omitNames に
456 * 書き込ã‚?¿?¦�ã?ありませんã€?
457 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
458 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
459 *
460 * @og.rev 5.5.1.9 (2012/04/19) 新規追åŠ?
461 *
462 * @param keys カラãƒ?��(CSV形å¼?
463 * @see #setOrgNames( String )
464 */
465 public void setAsNames( final String keys ) {
466 asNames = getCSVParameter( keys );
467 }
468
469 /**
470 * 【TAG】tableの実際のカラãƒ?��(select A as B from TBL の A を指å®?をCSV形式でè¤?•°æŒ?®šしますã?
471 *
472 * @og.tag
473 * SELECT æ–?‚’記述したときã?別名を付けてã�?�Ÿりã?SELECTしたãƒ??ブルと別のãƒ??ブルに
474 * DBTableModelの値を書き込ã‚??合ã?DBTableModel の持ってã�?‚‹カラãƒ?��と、実際に
475 * 書き込ã‚?‚«ラãƒ?��が異なりますã?そã?ようなケースに、テーブルの実カラãƒ?‚’æŒ?®šしますã?
476 * orgNames属æ?の並びé ?�¨、asNames属æ?の並びé ?‚’合わせておくå¿?¦�がありますã?
477 * こã?カラãƒ?��は、DBTableModel には持ってã�?�¾せんがã?ãƒ??ブル側には持ってã�?‚‹値
478 * なので、このカラãƒ?��で、SQLæ–?‚’構築しますã? UPDATE TBL SET A=[B] WHERE … となりますã?
479 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
480 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
481 *
482 * @og.rev 5.5.1.9 (2012/04/19) 新規追åŠ?
483 *
484 * @param keys カラãƒ?��(CSV形å¼?
485 * @see #setAsNames( String )
486 */
487 public void setOrgNames( final String keys ) {
488 orgNames = getCSVParameter( keys );
489 }
490
491 /**
492 * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
493 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
494 *
495 * @og.tag
496 * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
497 * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨定にすれば、ある程度は防止できますã?
498 * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
499 * 数字チェãƒ?‚¯で検å?可能ですã?æ–?—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
500 * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
501 * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
502 * (初期値:シスãƒ?ƒ 定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
503 *
504 * @param flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
505 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
506 */
507 public void setQuotCheck( final String flag ) {
508 quotCheck = nval( getRequestParameter( flag ),quotCheck );
509 }
510
511 /**
512 * 【TAG】固定情報カラãƒ??処ç�?‚ªブジェクトを特定するキーを設定しまã�?初期値:SYSTEM_ID)ã€?
513 *
514 * @og.tag
515 * 固定情報カラãƒ?をシスãƒ?ƒ 単位にJavaクラスで管ç�?�§きますã?
516 * そã?クラスオブジェクトã?、org.opengion.hayabusa.db.DBConstValue インターフェースã‚?
517 * 継承した、plugin クラスになりますã?
518 * そã?クラスを特定するキーワードをæŒ?®šしますã?
519 * 初期値は、SYSTEM_ID でシスãƒ?ƒ 単位にクラスを作æ?しますã?
520 * もし、他ã?シスãƒ?ƒ と共通ã?場合ã?、継承ã�?�‘させることも可能ですã?
521 * 対応したDBConstValueクラスがã?ラグインとして存在しなã�??合ã?ã€?
522 * シスãƒ?ƒ リソースのDEFAULT_CONST_CLASSでæŒ?®šされたクラスが利用されますã?
523 *
524 * 初期値は、SYSTEM_ID ですã?
525 *
526 * @param key 固定情報カラãƒ??処ç�?‚ªブジェクトを特定するキー
527 */
528 public void setConstObjKey( final String key ) {
529 constObjKey = nval( getRequestParameter( key ),constObjKey );
530 }
531
532 /**
533 * 【TAG】sqlType="DELETE"の場合に論理削除(UPDATE)を行うかどã�?�‹を指定しまã�?初期値:false)ã€?
534 *
535 * @og.tag
536 * sqlType="DELETE"の場合に論理削除(UPDATE)を行うかどã�?�‹を指定しますã?
537 * trueが指定された場合ã?、DELETEæ–?�§はなくã?UPDATEæ–?�Œ発行されますã?
538 * falseが指定された場合ã?、DELETEæ–?�Œ発行されますã?
539 * さらに論理削除を行う場合ã?org.opengion.hayabusa.db.DBConstValue インターフェースに
540 * 定義されてã�?‚‹、getLogicalDeleteKeys()及ã?getLogicalDeleteValsを実è£?�™ることでã€?
541 * 論理削除する際ã?フラグの更新方法を統ä¸?š„に管ç�?�™ることが可能になりますã?
542 * 初期値は、false(物ç�?‰Š除する)でã�?
543 *
544 * @param flg 論理削除(UPDATE)を行うかどã�?�‹
545 */
546 public void setLogicalDelete( final String flg ) {
547 logicalDelete = nval( getRequestParameter( flg ),logicalDelete );
548 }
549
550 /**
551 * ãƒ??タをインサートするå?合に使用するSQLæ–?‚’作æ?しますã?
552 *
553 * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定å?セãƒ?ƒˆを採用
554 * @og.rev 4.3.6.4 (2009/05/01) ãƒ?ƒ•ォルト設定をシスãƒ?ƒ リソースで設定可能にする
555 * @og.rev 5.3.4.0 (2011/04/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロæ–?—å?)
556 *
557 * @param namesData NamesDataオブジェクãƒ?
558 *
559 * @return インサーãƒ?QL
560 */
561 private String getInsertSQL( final NamesData namesData ) {
562 String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
563
564 // 4.3.6.4 (2009/05/01) 標準ã?追åŠ?
565 if( cls == null){
566 cls = DEFAULT_CONST_OBJ;
567 }
568
569 // if( cls != null ) { // 5.3.4.0 (2011/04/01)
570 if( cls != null && !cls.isEmpty() ) {
571 DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
572 // 4.2.1.0 (2008/04/16) 初期化追åŠ?
573 constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
574 String[] keys = constVal.getInsertKeys();
575 String[] vals = constVal.getInsertVals();
576 namesData.add( keys,vals );
577 }
578
579 String[] nms = namesData.getNames();
580 String[] vls = namesData.getVals();
581
582 StringBuilder sql = new StringBuilder();
583 sql.append( "INSERT INTO " ).append( table );
584 sql.append( " ( " );
585 sql.append( nms[0] );
586 for( int i=1; i<nms.length; i++ ) {
587 sql.append( "," ).append( nms[i] );
588 }
589 sql.append( " ) VALUES ( " );
590 sql.append( vls[0] );
591 for( int i=1; i<vls.length; i++ ) {
592 sql.append( "," ).append( vls[i] );
593 }
594 sql.append( " )" );
595
596 return sql.toString();
597 }
598
599 /**
600 * ãƒ??タをアãƒ??ãƒ??トするå?合に使用するSQLæ–?‚’作æ?しますã?
601 *
602 * where と whereNames が同時にæŒ?®šされた場合ã?、whereNames がå?に処ç�?�•ã‚?
603 * where 条件は、and 結合されますã?
604 *
605 * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定å?セãƒ?ƒˆを採用
606 * @og.rev 4.3.6.4 (2009/05/01) ãƒ?ƒ•ォルト設定をシスãƒ?ƒ リソースで設定可能にする
607 * @og.rev 4.3.7.0 (2009/06/01) 論理削除対å¿?
608 * @og.rev 5.3.7.0 (2011/07/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロæ–?—å?) 対応忘れ
609 * @og.rev 5.5.8.5 (2012/11/27) whereNames 対å¿?
610 *
611 * @param namesData NamesDataオブジェクãƒ?
612 *
613 * @return アãƒ??ãƒ??ãƒ?QL
614 */
615 private String getUpdateSQL( final NamesData namesData ) {
616 String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
617
618 // 4.3.6.4 (2009/05/01) 標準ã?追åŠ?
619 if( cls == null){
620 cls = DEFAULT_CONST_OBJ;
621 }
622
623 // if( cls != null ) {
624 if( cls != null && !cls.isEmpty() ) { // 5.3.7.0 (2011/07/01)
625 DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
626 // 4.2.1.0 (2008/04/16) 初期化追åŠ?
627 constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
628 // 4.3.7.0 (2009/06/01) 論理削除対å¿?
629 String[] keys = null;
630 String[] vals = null;
631 if( "DELETE".equalsIgnoreCase( sqlType ) ) {
632 keys = constVal.getLogicalDeleteKeys();
633 vals = constVal.getLogicalDeleteVals();
634 }
635 else {
636 keys = constVal.getUpdateKeys();
637 vals = constVal.getUpdateVals();
638 }
639 namesData.add( keys,vals );
640 }
641
642 String[] nms = namesData.getNames();
643 String[] vls = namesData.getVals();
644
645 StringBuilder sql = new StringBuilder();
646 sql.append( "UPDATE " ).append( table ).append( " SET " );
647 sql.append( nms[0] ).append( "=" ).append( vls[0] );
648
649 for( int i=1; i<nms.length; i++ ) {
650 sql.append( "," );
651 sql.append( nms[i] ).append( "=" ).append( vls[i] );
652 }
653
654 // 5.5.8.5 (2012/11/27) whereNames 対å¿?
655 String whereAnd = " WHERE " ;
656 if( whereNames != null && whereNames.length() > 0 ) {
657 String[] wnms = whereNames.split(",");
658 sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
659
660 for( int i=1; i<wnms.length; i++ ) {
661 sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
662 }
663 whereAnd = " AND " ; // whereNames 優先ã?ここをé?らなければ、å?期å?のままã€? WHERE " が使われã‚?
664 }
665
666 // 5.5.8.5 (2012/11/27) whereNames 対応ã?whereNames が登録されてã�?‚Œば、AND で繋げるã?
667 if( where != null && where.length() > 0 ) {
668 // sql.append( " WHERE " ).append( where );
669 sql.append( whereAnd ).append( where );
670 }
671
672 return sql.toString();
673 }
674
675 /**
676 * ãƒ??タをデリートするå?合に使用するSQLæ–?‚’作æ?しますã?
677 *
678 * where と whereNames が同時にæŒ?®šされた場合ã?、whereNames がå?に処ç�?�•ã‚?
679 * where 条件は、and 結合されますã?
680 *
681 * @og.rev 5.5.8.5 (2012/11/27) whereNames 対å¿?
682 *
683 * @return ãƒ?ƒªーãƒ?QL
684 */
685 private String getDeleteSQL() {
686 StringBuilder sql = new StringBuilder();
687 sql.append( "DELETE FROM " ).append( table );
688
689 // 5.5.8.5 (2012/11/27) whereNames 対å¿?
690 String whereAnd = " WHERE " ;
691 if( whereNames != null && whereNames.length() > 0 ) {
692 String[] wnms = whereNames.split(",");
693 sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
694
695 for( int i=1; i<wnms.length; i++ ) {
696 sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
697 }
698 whereAnd = " AND " ; // whereNames 優先ã?ここをé?らなければ、å?期å?のままã€? WHERE " が使われã‚?
699 }
700
701 // 5.5.8.5 (2012/11/27) whereNames 対応ã?whereNames が登録されてã�?‚Œば、AND で繋げるã?
702 if( where != null && where.length() > 0 ) {
703 // sql.append( " WHERE " ).append( where );
704 sql.append( whereAnd ).append( where );
705 }
706 return sql.toString();
707 }
708
709 /**
710 * names,constKeys,omitNames から、å¿?¦�なキーæƒ??と、属æ?æƒ??を持っã�?NamesData を作æ?しますã?
711 *
712 * @og.rev 4.1.2.1 (2008/03/17) 固定å?の constVals の前後にã€?'" をå?れるã€?
713 * @og.rev 5.5.1.9 (2012/04/19) asNames、orgNames、funcKeys、funcVals属æ?追åŠ?
714 *
715 * @param nms カラãƒ?��配å?
716 *
717 * @return 属æ?æƒ??を持ったNamesData
718 */
719 private NamesData makeNamesData( final String[] nms ) {
720
721 NamesData namesData = new NamesData();
722
723 // 5.5.1.9 (2012/04/19) omitNames に、asNames配å?の値を設定しておきますã?
724 if( asNames != null ) {
725 for( int i=0; i<asNames.length; i++ ) {
726 if( asNames[i] != null && asNames[i].length() > 0 ) {
727 omitNames = omitNames + asNames[i] + ",";
728 }
729 }
730 }
731
732 // names でæŒ?®šされたカラãƒ?��
733 for( int i=0; i<nms.length; i++ ) {
734 String nm = nms[i];
735 if( nm != null && nm.length() > 0 && omitNames.indexOf( "," + nm + "," ) < 0 ) {
736 namesData.add( nm,"[" + nm + "]" ) ;
737 }
738 }
739
740 // 固定å?の constKeys カラãƒ??列を設定しますã?
741 if( constKeys != null && constKeys.length > 0 ) {
742 for( int j=0; j<constKeys.length; j++ ) {
743 String nm = constKeys[j];
744 if( nm != null && nm.length() > 0 ) {
745 namesData.add( nm,"'" + constVals[j] + "'" ) ; // constVals は、シングルクオートで囲ã�?�¾すã?
746 }
747 }
748 }
749
750 // 関数値の funcKeys カラãƒ??列を設定しますã?
751 if( funcKeys != null && funcKeys.length > 0 ) {
752 for( int j=0; j<funcKeys.length; j++ ) {
753 String nm = funcKeys[j];
754 if( nm != null && nm.length() > 0 ) {
755 namesData.add( nm, funcVals[j] ) ; // funcVals は、シングルクオートで囲ã�?�¾せんã€?
756 }
757 }
758 }
759
760 // 別名ã? asNames,orgNames カラãƒ??列を設定しますã?
761 if( orgNames != null && orgNames.length > 0 ) {
762 for( int j=0; j<orgNames.length; j++ ) {
763 String onm = orgNames[j];
764 if( onm != null && onm.length() > 0 ) {
765 namesData.add( onm,"[" + asNames[j] + "]" ) ;
766 }
767 }
768 }
769
770 return namesData ;
771 }
772
773 /**
774 * å†?ƒ¨ãƒ??タを受け渡す為の、簡易クラスですã?
775 * 更新するカラãƒ?��と値のセãƒ?ƒˆ配å?を管ç�?�—てã�?�¾すã?
776 *
777 */
778 private static class NamesData {
779 final Map<String,String> data = new LinkedHashMap<String,String>() ;
780
781 /**
782 * キーと値のセãƒ?ƒˆを追åŠ?�—ますã?
783 *
784 * @param nm String
785 * @param val String
786 */
787 public void add( final String nm,final String val ) {
788 data.put( nm,val );
789 }
790
791 /**
792 * キー配å?と対応するã?値配å?のセãƒ?ƒˆを追åŠ?�—ますã?
793 *
794 * @param nms String[]
795 * @param vals String[]
796 */
797 public void add( final String[] nms,final String[] vals ) {
798 if( nms != null ) {
799 for( int i=0; i<nms.length; i++ ) {
800 data.put( nms[i],vals[i] );
801 }
802 }
803 }
804
805 /**
806 * キー配å?を返しますã?
807 *
808 * @return String[]
809 */
810 public String[] getNames() {
811 return data.keySet().toArray( new String[data.size()] );
812 }
813
814 /**
815 * 値配å?を返しますã?
816 *
817 * @return String[]
818 */
819 public String[] getVals() {
820 return data.values().toArray( new String[data.size()] );
821 }
822 }
823
824 /**
825 * こã?オブジェクトã?æ–?—å?表現を返しますã?
826 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
827 *
828 * @return こã?クラスのæ–?—å?表現
829 */
830 @Override
831 public String toString() {
832 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
833 .println( "VERSION" ,VERSION )
834 .println( "sqlType" ,sqlType )
835 .println( "table" ,table )
836 .println( "names" ,names )
837 .println( "omitNames" ,omitNames )
838 .println( "where" ,where )
839 .println( "whereNames" ,whereNames )
840 .println( "constKeys" ,constKeys )
841 .println( "constVals" ,constVals )
842 .println( "logicalDelete" ,logicalDelete )
843 .fixForm().toString() ;
844 }
845 }