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             * {&#064;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='{&#064;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    }