001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.db.DBTableModel;
021 import org.opengion.hayabusa.db.TableFilter;
022 import org.opengion.fukurou.db.Transaction;
023 import org.opengion.fukurou.db.TransactionReal;
024 import org.opengion.fukurou.util.ErrorMessage;
025 import org.opengion.fukurou.util.StringUtil;
026 import static org.opengion.fukurou.util.StringUtil.nval ;
027
028 import java.io.ObjectOutputStream;
029 import java.io.ObjectInputStream;
030 import java.io.IOException;
031 import java.util.Map;
032
033 /**
034 * TableFilter のサブクラスをCALLしてDBTableModelにアクセスするタグですã?
035 *
036 * DBTableModel ã‚?TableFilter のサブクラス(classIdでæŒ?®?に渡して処ç�?‚’実行しますã?
037 * クラスを作æ?する場合ã?、org.opengion.hayabusa.db.TableFilter インターフェースを継承した
038 * クラスにするå¿?¦�がありますã?またã?classId 属æ?には、シスãƒ?ƒ リソース で
039 * 設定しã�?TableFilter.XXXX の XXXX を指定しますã?
040 *
041 * BODY部åˆ??、SQLを記述する為ã�?�‘に使ってã�?�¾したがã?CSS定義形式ã?書式で、keys,vals を記述
042 * できるようにしますã?
043 * これは、下記ã?ようなパラメータをã?keys="KEY,KEY2,KEY3" vals='AAAA,"BB,CC,DD",EE' のような記述形式と
044 * {
045 * KEY1 : AAAA ;
046 * KEY2 : BB,CC,DD ;
047 * KEY3 : EE ;
048 * ・・・・・・
049 * }
050 * のような、CSS形式に類似の形式でも記述できるようにしましたã€?
051 * keys,vals と CSS定義形式パラメータを同時にæŒ?®šしたå?合ã?、両方とも有効ですã?
052 * ただしã?キーが重è¤?�—たå?合ã?、不定とè€?�ˆてくださいã€?
053 * 現時点では、CSS定義形式パラメータが優先されますが、これã?、単にå†?ƒ¨パラメータMapへの
054 * 登録é ?�Œ、CSS定義形式パラメータが後ã?為、上書きされるためですã?
055 *
056 * ※ こã?タグは、Transaction タグの対象ですã?
057 *
058 * @og.formSample
059 * ●形式ï¼?lt;og:tableFilter classId="…" />
060 * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
061 *
062 * ●Tag定義??
063 * <og:tableFilter
064 * classId ○ã?TAG】データベã?ス処ç�?‚’実行するクラスパスを指定しまã�?å¿??)ã€?
065 * tableId 【TAGã€?通常は使ã�?�¾せん)DBTableModel sessionに登録されてã�?‚‹キーを指定しまã�?
066 * modifyType 【TAG】データ処ç�??方æ³?A:追åŠ?C:更新 D:削除)を指定しまã�?
067 * keys 【TAG】リンク先に渡すキーを指定しまã�?
068 * vals 【TAG】keys属æ?に対応するå?をCSV形式でè¤?•°æŒ?®šしまã�?
069 * selectedAll 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)
070 * scope 【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)
071 * dbid 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
072 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
073 * > ... Body ...
074 * </og:tableFilter>
075 *
076 * ●使用ä¾?
077 * ・引数/プロシジャーを直接書くå?å�?
078 * 【entry.jspã€?
079 * <og:tableFilter
080 * classId = "WL_LOGICSET" :TableFilter のサブクラス(実行クラス)
081 * tableId = "WL0000" :登録å…??DBTableModelのsession/request変数å†??取得キー
082 * keys = "AA,BB,CC" :実行クラスへの引数のキー
083 * vals = "{@AA},{@BB},{@CC}" :実行クラスへの引数の値
084 * selectedAll = "false/true" :処ç�?¯¾象の行を全行選択するかどã�?�‹(初期値:false)
085 * modifyType = "A/C/D" :処ç�??方æ³?A:追åŠ?C:更新 D:削除)を指定しますã?初期値は自動ですã?
086 * />
087 *
088 * ・BODY部åˆ?�«、CSS形式ã?パラメータ??eys,vals?‰を記述するä¾?
089 *
090 * <og:tableFilter
091 * classId = "WL_LOGICSET" :TableFilter のサブクラス(実行クラス)
092 * tableId = "WL0000" :登録å…??DBTableModelのsession/request変数å†??取得キー
093 * selectedAll = "false/true" :処ç�?¯¾象の行を全行選択するかどã�?�‹(初期値:false)
094 * modifyType = "A/C/D" :処ç�??方æ³?A:追åŠ?C:更新 D:削除)を指定しますã?初期値は自動ですã?
095 * >
096 * {
097 * AA : {@AA}
098 * BB : {@BB}
099 * CC : {@CC}
100 * }
101 * </og:tableFilter>
102 *
103 * @og.group そã?ä»?
104 * @og.rev 3.8.5.0 (2006/03/20) 新規作æ?
105 *
106 * @version 0.9.0 2000/10/17
107 * @author Kazuhiko Hasegawa
108 * @since JDK1.1,
109 */
110 public class TableFilterTag extends CommonTagSupport {
111 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
112 private static final String VERSION = "5.6.5.2 (2013/06/21)" ;
113
114 private static final long serialVersionUID = 565220130621L ;
115
116 private static final String errMsgId = HybsSystem.ERR_MSG_KEY;
117 private transient DBTableModel table = null;
118
119 private String tableId = HybsSystem.TBL_MDL_KEY;
120 private String classId = null;
121 private String modifyType = null;
122 private String[] keys = null;
123 private String[] vals = null;
124
125 private String dbid = null ; // 4.2.4.0 (2008/06/23)
126 // private String body = null ; // 4.2.4.0 (2008/06/23) ã€?.6.5.2 (2013/06/21) sql と paramMap にåˆ?�‘るためã?ローカルåŒ?
127 private String sql = null ; // 5.6.5.2 (2013/06/21) bodyからSQLæ–??みをå?りå?すã?
128 private Map<String,String> paramMap = null; // 5.6.5.2 (2013/06/21) bodyからparamMapを取りだしã?
129
130 private boolean selectedAll = false;
131
132 /**
133 * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
134 *
135 * @return 後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
136 */
137 @Override
138 public int doStartTag() {
139 table = (DBTableModel)getObject( tableId );
140
141 if( keys != null && vals != null && ( keys.length != vals.length ) ) {
142 String errMsg = "keys と vals の設定å?の数が異なりますã?: " + HybsSystem.CR
143 + "keys.length=[" + keys.length + "] , "
144 + "keys.length=[" + StringUtil.array2line( keys,"," ) + "]"
145 + HybsSystem.CR
146 + "vals.length=[" + vals.length + "] , "
147 + "vals.length=[" + StringUtil.array2line( vals,"," ) + "]";
148 throw new HybsSystemException( errMsg );
149 }
150
151 startQueryTransaction( tableId );
152 // return(SKIP_BODY); // Body を評価しなã�?
153 return ( EVAL_BODY_BUFFERED ); // Body を評価する
154 }
155
156 /**
157 * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
158 *
159 * @og.rev 5.6.5.2 (2013/06/21) bodyローカル化ã?sql、paramMap 追åŠ?
160 *
161 * @return 後続å?ç�??æŒ?¤º(SKIP_BODY)
162 */
163 @Override
164 public int doAfterBody() {
165 // body = nval( getBodyString(),body );
166 String body = nval( getBodyString(),null );
167
168 // paramMapの取り出ã�?
169 paramMap = StringUtil.cssParse( body );
170
171 // SQLæ–??åˆ?‚Š出ã�?classId="DBSELECT" の場合ã?みの処ç�?
172 if( "DBSELECT".equalsIgnoreCase( classId ) && body != null ) {
173 int ad1 = body.indexOf( '{' );
174 int ad2 = body.indexOf( '}' );
175
176 if( ad1 >= 0 && ad2 >= 0 ) {
177 sql = body.substring( 0,ad1 ).trim() + body.substring( ad2+1 ).trim();
178 }
179 else {
180 sql = body.trim();
181 }
182 }
183
184 return(SKIP_BODY);
185 }
186
187 /**
188 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
189 *
190 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
191 * @og.rev 4.2.3.0 (2008/06/23) DBIDとボディー部åˆ??記述を下位クラスに渡す用に修正
192 * @og.rev 4.3.7.4 (2009/07/01) Resouceオブジェクトを下位クラスに渡す用に修正
193 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対å¿?
194 * @og.rev 5.2.1.0 (2010/10/01) debugPrint() メソãƒ?ƒ‰の処ç�?�¡件見直ã�?
195 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更 、Transaction対応で、close処ç�?‚’入れるã€?
196 * @og.rev 5.6.5.2 (2013/06/21) bodyローカル化ã?sql、paramMap 追åŠ?
197 *
198 * @return 後続å?ç�??æŒ?¤º
199 */
200 @Override
201 public int doEndTag() {
202 // ãƒ?ƒ�ãƒ?‚°時には、オブジェクトå?部æƒ??を表示するã€?
203 // if( isDebug() ) {
204 // debugPrint(); // 5.2.1.0 (2010/10/01) debugPrint() メソãƒ?ƒ‰自体に、isDebug() がçµ?�¿込まれてã�?‚‹ã€?
205 // }
206 debugPrint(); // 5.2.1.0 (2010/10/01) debugPrint() メソãƒ?ƒ‰自体に、isDebug() がçµ?�¿込まれてã�?‚‹ã€?
207 int rtnCode = EVAL_PAGE; // try ??finally の関係で、変数化しておく
208
209 int[] rowNo = getParameterRows();
210
211 // 5.1.9.0 (2010/08/01) Transaction 対å¿?
212 // final Transaction tran ;
213 Transaction tran = null;
214 final TableFilter filter ;
215 // 5.3.7.0 (2011/07/01) Transaction対応で、close処ç�?‚’入れるã€?
216 try {
217 TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
218 if( tranTag == null ) {
219 // tran = new TransactionReal( dbid,getApplicationInfo() );
220 tran = new TransactionReal( getApplicationInfo() ); // 5.3.7.0 (2011/07/01) 引数変更
221 }
222 else {
223 tran = tranTag.getTransaction();
224 }
225
226 String cls = HybsSystem.sys( "TableFilter_" + classId );
227 // TableFilter filter = (TableFilter)HybsSystem.newInstance( cls );
228 filter = (TableFilter)HybsSystem.newInstance( cls );
229
230 filter.setDBTableModel( table );
231 filter.setParameterRows( rowNo );
232 filter.setModifyType( modifyType );
233 filter.setKeysVals( keys,vals );
234 // filter.setApplicationInfo( getApplicationInfo() ); // 3.8.7.0 (2006/12/15)
235 filter.setTransaction( tran ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
236 filter.setDebug( isDebug() );
237 filter.setDbid( dbid ); // 4.2.4.0 (2008/06/23)
238 // filter.setSql( body ); // 4.2.4.0 (2008/06/23)ã€?.6.5.2 (2013/06/21) bodyå»?¢
239 filter.setSql( sql ); // 5.6.5.2 (2013/06/21) sql 追åŠ?
240 filter.setParamMap( paramMap ); // 5.6.5.2 (2013/06/21) paramMap 追åŠ?
241 filter.setResource( getResource() ); // 4.3.7.4 (2009/07/01)
242
243 table = filter.execute();
244
245 int errCode = filter.getErrorCode();
246 ErrorMessage errMessage = filter.getErrorMessage();
247
248 if( errCode >= ErrorMessage.NG ) { // 異常
249 rtnCode = SKIP_PAGE;
250 }
251
252 String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
253 if( err != null && err.length() > 0 ) {
254 jspPrint( err );
255 setSessionAttribute( errMsgId,errMessage );
256 }
257 else {
258 removeSessionAttribute( errMsgId );
259 }
260 }
261 finally {
262 if( tran != null ) { tran.close(); }
263 }
264
265 if( table != null && ! commitTableObject( tableId, table ) ) {
266 return (SKIP_PAGE);
267 }
268
269 // if( errCode >= ErrorMessage.NG ) { // 異常
270 // return(SKIP_PAGE);
271 // }
272 // else {
273 // return(EVAL_PAGE);
274 // }
275
276 return( rtnCode );
277 }
278
279 /**
280 * タグリブオブジェクトをリリースしますã?
281 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
282 *
283 * @og.rev 5.6.5.2 (2013/06/21) bodyå»?¢、sql、paramMap 追åŠ?
284 */
285 @Override
286 protected void release2() {
287 super.release2();
288 table = null;
289 tableId = HybsSystem.TBL_MDL_KEY;
290 classId = null;
291 modifyType = null;
292 keys = null;
293 vals = null;
294 selectedAll = false;
295 dbid = null; // 4.2.4.0 (2008/06/23)
296 // body = null; // 4.2.4.0 (2008/06/23)ã€?.6.5.2 (2013/06/21) sql と paramMap にåˆ?�‘るためã?ローカルåŒ?
297 sql = null; // 5.6.5.2 (2013/06/21) bodyからSQLæ–??みをå?りå?すã?
298 paramMap = null; // 5.6.5.2 (2013/06/21) bodyからparamMapを取りだすã?
299 }
300
301 /**
302 * 表示ãƒ??タの HybsSystem.ROW_SEL_KEY をå?にã€?�¸ばれた 行を処ç�??対象としますã?
303 *
304 * @return 選択行ã?配å?
305 */
306 @Override
307 protected int[] getParameterRows() {
308 final int[] rowNo ;
309 if( selectedAll ) {
310 int rowCnt = table.getRowCount();
311 rowNo = new int[ rowCnt ];
312 for( int i=0; i<rowCnt; i++ ) {
313 rowNo[i] = i;
314 }
315 } else {
316 rowNo = super.getParameterRows(); // 4.0.0 (2005/01/31)
317 }
318 return rowNo;
319 }
320
321 /**
322 * 【TAG】データベã?ス処ç�?‚’実行するクラスパスを指定しますã?
323 *
324 * @og.tag
325 * ここでæŒ?®šするクラスIDは、シスãƒ?ƒ リソース にて TableFilter の
326 * サブクラス(インターフェース継承)としてæŒ?®šするå¿?¦�がありますã?
327 *
328 * クラス自身は、org.opengion.hayabusa.db.TableFilter インターフェースを継承してã�?‚‹å¿?¦�がありますã?
329 * {@og.doc03Link tableFilter TableFilter_**** クラス}
330 *
331 * @param id TableFilter インターフェースを継承してã�?‚‹実クラスの ID
332 * @see org.opengion.hayabusa.db.TableFilter TableFilter インターフェース
333 */
334 public void setClassId( final String id ) {
335 classId = nval( getRequestParameter( id ),classId );
336 }
337
338 /**
339 * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
340 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
341 *
342 * @og.tag
343 * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
344 * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
345 * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
346 * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
347 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
348 *
349 * @param id sessionに登録する時ã? ID
350 */
351 public void setTableId( final String id ) {
352 tableId = nval( getRequestParameter( id ),tableId );
353 }
354
355 /**
356 * 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
357 *
358 * @og.tag
359 * 全てのãƒ??タを選択済みãƒ??タとして扱って処ç�?�—ますã?
360 * 全件処ç�?�™るå?合に、指定しますã?(true/false)
361 * ãƒ?ƒ•ォルãƒ?false ですã?
362 *
363 * @param all ãƒ??タをå?件選択済み [true:全件選択済み/false:通常]
364 */
365 public void setSelectedAll( final String all ) {
366 selectedAll = nval( getRequestParameter( all ),selectedAll );
367 }
368
369 /**
370 * 【TAG】データ処ç�??方æ³?A:追åŠ?C:更新 D:削除)を指定しますã?
371 *
372 * @og.tag
373 * 通常は、DBTableModel に自動設定されてã�?‚‹ modifyType をå?に、データ処ç�?–¹法を
374 * 選別しますã?(A:追åŠ?C:更新 D:削除)
375 * こã?場合ã?行単位で modifyType の値を取得して判別するå¿?¦�がありますが、ä¸?ˆ¬には
376 * 処ç�?¯¾象は、å?件おなã�?modifyType である可能性が高いですã?
377 * またã?selectedAll などで強制çš?�«全件処ç�?¯¾象とする場合ã?、modifyType に値ã�?
378 * 設定さてã�?�¾せん。その様な場合に外部より modifyType を指定しますã?
379 * 初期値は、è?動判å®?ですã?
380 *
381 * @param type ãƒ??タ処ç�??方æ³?A:追åŠ?C:更新 D:削除)
382 */
383 public void setModifyType( final String type ) {
384 modifyType = nval( getRequestParameter( type ),modifyType );
385
386 if( modifyType != null && !"A".equals( modifyType ) && !"C".equals( modifyType ) && !"D".equals( modifyType ) ) {
387 String errMsg = "modifyType は A:追åŠ?C:更新 D:削除 のどれかを指定してくださいã€? " + HybsSystem.CR
388 + "modifyType=[" + modifyType + "]";
389 throw new HybsSystemException( errMsg );
390 }
391 }
392
393 /**
394 * 【TAG】リンク先に渡すキーを指定しますã?
395 *
396 * @og.tag
397 * 戻る時に、検索時ã?キャãƒ?‚·ュにæŒ?®šした引数以外にæŒ?®šしたり、別の値に置き換えたã‚?
398 * する場合ã?キーを設定できますã?カンマ区åˆ?‚Šでè¤?•°æŒ?®šできますã?
399 * vals 属æ?には、キーに対応するå?をã?設定してくださいã€?
400 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
401 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
402 *
403 * @param key リンク先に渡すキー
404 */
405 public void setKeys( final String key ) {
406 keys = getCSVParameter( key );
407 }
408
409 /**
410 * 【TAG】names属æ?に対応するå?をCSV形式でè¤?•°æŒ?®šしますã?
411 *
412 * @og.tag
413 * キーに設定したå?をã?カンマ区åˆ?‚Šæ–?—でè¤?•°して出来ますã?
414 * æŒ?®šé?序ã?、キーと同じにしておいて下さã�??
415 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
416 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
417 *
418 * @param val names属æ?に対応するå?
419 */
420 public void setVals( final String val ) {
421 vals = getCSVParameter( val );
422 }
423
424 /**
425 * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
426 *
427 * @og.tag
428 * Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
429 * これは、シスãƒ?ƒ リソースで、DEFAULT_DB_URL 等でæŒ?®šしてã�?‚‹ ãƒ??タベã?ス接続å?
430 * æƒ??に、XX_DB_URL を定義することでã€?dbid="XX" とすると、この 接続å?を使用して
431 * ãƒ??タベã?スにアクセスできますã?
432 *
433 * @param id ãƒ??タベã?ス接続ID
434 */
435 public void setDbid( final String id ) {
436 dbid = nval( getRequestParameter( id ),dbid );
437 }
438
439 /**
440 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
441 *
442 * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
443 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
444 *
445 * @param strm ObjectOutputStreamオブジェクãƒ?
446 * @throws IOException 入出力エラーが発生したå?å�?
447 */
448 private void writeObject( final ObjectOutputStream strm ) throws IOException {
449 strm.defaultWriteObject();
450 }
451
452 /**
453 * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
454 *
455 * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
456 *
457 * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
458 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
459 *
460 * @param strm ObjectInputStreamオブジェクãƒ?
461 * @see #release2()
462 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
463 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
464 */
465 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
466 strm.defaultReadObject();
467 }
468
469 /**
470 * こã?オブジェクトã?æ–?—å?表現を返しますã?
471 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
472 *
473 * @return こã?クラスのæ–?—å?表現
474 */
475 @Override
476 public String toString() {
477 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
478 .println( "VERSION" ,VERSION )
479 .println( "tableId" ,tableId )
480 .println( "classId" ,classId )
481 .println( "modifyType" ,modifyType )
482 .println( "selectedAll" ,selectedAll )
483 .println( "keys" ,keys )
484 .println( "vals" ,vals )
485 .println( "dbid" ,dbid ) // 4.2.4.0 (2008/06/23)
486 // .println( "body" ,body ) // 4.2.4.0 (2008/06/23)
487 .println( "sql" ,sql ) // 5.6.5.2 (2013/06/21)
488 .fixForm().toString() ;
489 }
490 }