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             * {&#064;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='{&#064;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             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
376             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
377             *
378             * @param       keys カラ?(CSV形?
379             * @see         #setConstVals( String )
380             */
381            public void setConstKeys( final String keys ) {
382                    constKeys = getCSVParameter( keys );
383            }
384    
385            /**
386             * 【TAG】設定?を固定?と置き換える対象となる設定?をCSV形式で??します?
387             *
388             * @og.tag
389             * names 属?のカラ? table 属?より、QUERYを作?して、DBTableModelの
390             * 値を割り当てる?合?DBTableModelの値ではなく?外部から?した固定??
391             * 割り当てたい場合に、そのカラ?に対応する設定?をカンマ区???CSV)で
392             * ??します?ここで?する設定?は、constKeys 属?と対応させます?
393             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
394             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
395             *
396             * @param       vals 設定?(CSV形?
397             * @see         #setConstKeys( String )
398             */
399            public void setConstVals( final String vals ) {
400                    constVals = getCSVParameter( vals );
401            }
402    
403            /**
404             * 【TAG】関数等を設定するカラ?をCSV形式で??します?
405             *
406             * @og.tag
407             * constVals 属?で設定する?は、?シングルクオートが付与されます?
408             * そ?場合?関数などを設定したい場合でも???として設定しようとします?
409             * ここで?するカラ?(funcKeys)自身は、constKeys と同じ書式です?
410             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
411             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
412             *
413             * @og.rev 5.5.1.9 (2012/04/19) 新規追?
414             *
415             * @param       keys カラ?(CSV形?
416             * @see         #setFuncVals( String )
417             */
418            public void setFuncKeys( final String keys ) {
419                    funcKeys = getCSVParameter( keys );
420            }
421    
422            /**
423             * 【TAG】関数等?設定?をCSV形式で??します?
424             *
425             * @og.tag
426             * funcKeys 属?に対応す?関数などの設定?を割り当てます?
427             * constVals 属?との違いは、funcVals の設定?は、そのままの形で、SQL??
428             * 構築に使われます?
429             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
430             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
431             *
432             * @og.rev 5.5.1.9 (2012/04/19) 新規追?
433             *
434             * @param       vals 設定?(CSV形?
435             * @see         #setFuncKeys( String )
436             */
437            public void setFuncVals( final String vals ) {
438                    funcVals = getCSVParameter( vals );
439            }
440    
441            /**
442             * 【TAG】別名を付けたカラ?(select A as B from TBL の B を指?をCSV形式で??します?
443             *
444             * @og.tag
445             * SELECT ?記述したとき?別名を付けて?り?SELECTした??ブルと別の??ブルに
446             * DBTableModelの値を書き込??合?DBTableModel の持って?カラ?と、実際に
447             * 書き込?ラ?が異なります?そ?ようなケースに、?の別名カラ??します?
448             * orgNames属?の並び?、asNames属?の並び?合わせておく?があります?
449             * こ?カラ?は、DBTableModel には持って?が???ブル側には持って???
450             * なので、?部? omitNames 属?に値を設定します?利用??、omitNames に
451             * 書き込???ありません?
452             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
453             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
454             *
455             * @og.rev 5.5.1.9 (2012/04/19) 新規追?
456             *
457             * @param       keys カラ?(CSV形?
458             * @see         #setOrgNames( String )
459             */
460            public void setAsNames( final String keys ) {
461                    asNames = getCSVParameter( keys );
462            }
463    
464            /**
465             * 【TAG】tableの実際のカラ?(select A as B from TBL の A を指?をCSV形式で??します?
466             *
467             * @og.tag
468             * SELECT ?記述したとき?別名を付けて?り?SELECTした??ブルと別の??ブルに
469             * DBTableModelの値を書き込??合?DBTableModel の持って?カラ?と、実際に
470             * 書き込?ラ?が異なります?そ?ようなケースに、テーブルの実カラ??します?
471             * orgNames属?の並び?、asNames属?の並び?合わせておく?があります?
472             * こ?カラ?は、DBTableModel には持って?せんが???ブル側には持って?値
473             * なので、このカラ?で、SQL?構築します? UPDATE TBL SET A=[B] WHERE … となります?
474             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
475             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
476             *
477             * @og.rev 5.5.1.9 (2012/04/19) 新規追?
478             *
479             * @param       keys カラ?(CSV形?
480             * @see         #setAsNames( String )
481             */
482            public void setOrgNames( final String keys ) {
483                    orgNames = getCSVParameter( keys );
484            }
485    
486            /**
487             * 【TAG】リクエスト情報の クォー?ション(') 存在チェ?を実施するかど?[true/false]を設定しま?
488             *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])?
489             *
490             * @og.tag
491             * ???インジェクション対策??として、暫定的ではありますが、SQLのパラメータに
492             * 渡す文字?にクォー?ション(') を許さな?定にすれば、ある程度は防止できます?
493             * 数字タイプ?引数には?or 5=5 などのクォー?ションを使用しな?ードを埋めても?
494             * 数字チェ?で検?可能です??タイプ?場合?、? (')を?ずして?
495             * ' or 'A' like 'A のような形式になる為?')チェ??でも有効です?
496             * (') が含まれて?エラーにする(true)?かノ?チェ??false)を指定します?
497             * (初期値:シス?定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])?
498             *
499             * @param   flag クォー?ションチェ? [true:する/それ以?しない]
500             * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
501             */
502            public void setQuotCheck( final String flag ) {
503                    quotCheck = nval( getRequestParameter( flag ),quotCheck );
504            }
505    
506            /**
507             * 【TAG】固定情報カラ??処?ブジェクトを特定するキーを設定しま?初期値:SYSTEM_ID)?
508             *
509             * @og.tag
510             * 固定情報カラ?をシス?単位にJavaクラスで管?きます?
511             * そ?クラスオブジェクト?、org.opengion.hayabusa.db.DBConstValue インターフェース?
512             * 継承した、plugin クラスになります?
513             * そ?クラスを特定するキーワードを?します?
514             * 初期値は、SYSTEM_ID でシス?単位にクラスを作?します?
515             * もし、他?シス?と共通?場合?、継承?させることも可能です?
516             * 対応したDBConstValueクラスが?ラグインとして存在しな??合??
517             * シス?リソースのDEFAULT_CONST_CLASSで?されたクラスが利用されます?
518             *
519             * 初期値は、SYSTEM_ID です?
520             *
521             * @param   key 固定情報カラ??処?ブジェクトを特定するキー
522             */
523            public void setConstObjKey( final String key ) {
524                    constObjKey = nval( getRequestParameter( key ),constObjKey );
525            }
526    
527            /**
528             * 【TAG】sqlType="DELETE"の場合に論理削除(UPDATE)を行うかど?を指定しま?初期値:false)?
529             *
530             * @og.tag
531             * sqlType="DELETE"の場合に論理削除(UPDATE)を行うかど?を指定します?
532             * trueが指定された場合?、DELETE?はなく?UPDATE?発行されます?
533             * falseが指定された場合?、DELETE?発行されます?
534             * さらに論理削除を行う場合?org.opengion.hayabusa.db.DBConstValue インターフェースに
535             * 定義されて?、getLogicalDeleteKeys()及?getLogicalDeleteValsを実?ることで?
536             * 論理削除する際?フラグの更新方法を統?に管?ることが可能になります?
537             * 初期値は、false(物?除する)で?
538             *
539             * @param   flg 論理削除(UPDATE)を行うかど?
540             */
541            public void setLogicalDelete( final String flg ) {
542                    logicalDelete = nval( getRequestParameter( flg ),logicalDelete );
543            }
544    
545            /**
546             * ??タをインサートする?合に使用するSQL?作?します?
547             *
548             * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定?セ?を採用
549             * @og.rev 4.3.6.4 (2009/05/01) ?ォルト設定をシス?リソースで設定可能にする
550             * @og.rev 5.3.4.0 (2011/04/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロ??)
551             *
552             * @param   namesData NamesDataオブジェク?
553             *
554             * @return  インサー?QL
555             */
556            private String getInsertSQL( final NamesData namesData ) {
557                    String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
558    
559                    // 4.3.6.4 (2009/05/01) 標準?追?
560                    if( cls == null){
561                            cls = DEFAULT_CONST_OBJ;
562                    }
563    
564    //              if( cls != null ) {             // 5.3.4.0 (2011/04/01)
565                    if( cls != null && !cls.isEmpty() ) {
566                            DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
567                            // 4.2.1.0 (2008/04/16) 初期化追?
568                            constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
569                            String[] keys = constVal.getInsertKeys();
570                            String[] vals = constVal.getInsertVals();
571                            namesData.add( keys,vals );
572                    }
573    
574                    String[] nms = namesData.getNames();
575                    String[] vls = namesData.getVals();
576    
577                    StringBuilder sql = new StringBuilder();
578                    sql.append( "INSERT INTO " ).append( table );
579                    sql.append( " ( " );
580                    sql.append( nms[0] );
581                    for( int i=1; i<nms.length; i++ ) {
582                            sql.append( "," ).append( nms[i] );
583                    }
584                    sql.append( " ) VALUES ( " );
585                    sql.append( vls[0] );
586                    for( int i=1; i<vls.length; i++ ) {
587                            sql.append( "," ).append( vls[i] );
588                    }
589                    sql.append( " )" );
590    
591                    return sql.toString();
592            }
593    
594            /**
595             * ??タをア????トする?合に使用するSQL?作?します?
596             *
597             * where と whereNames が同時に?された場合?、whereNames が?に処??
598             * where 条件は、and 結合されます?
599             *
600             * @og.rev 4.1.2.1 (2008/03/17) DBConstValue による固定?セ?を採用
601             * @og.rev 4.3.6.4 (2009/05/01) ?ォルト設定をシス?リソースで設定可能にする
602             * @og.rev 4.3.7.0 (2009/06/01) 論理削除対?
603             * @og.rev 5.3.7.0 (2011/07/01) DEFAULT_CONST_OBJの初期値変更(null→ゼロ??) 対応忘れ
604             * @og.rev 5.5.8.5 (2012/11/27) whereNames 対?
605             *
606             * @param   namesData NamesDataオブジェク?
607             *
608             * @return  ア?????QL
609             */
610            private String getUpdateSQL( final NamesData namesData ) {
611                    String cls = HybsSystem.sys( "DBConstValue_" + constObjKey ) ;
612    
613                    // 4.3.6.4 (2009/05/01) 標準?追?
614                    if( cls == null){
615                            cls = DEFAULT_CONST_OBJ;
616                    }
617    
618    //              if( cls != null ) {
619                    if( cls != null && !cls.isEmpty() ) {           // 5.3.7.0 (2011/07/01)
620                            DBConstValue constVal = (DBConstValue)HybsSystem.newInstance( cls );
621                            // 4.2.1.0 (2008/04/16) 初期化追?
622                            constVal.init( table,getUser().getUserID(),getGUIInfoAttri( "KEY" ) );
623                            // 4.3.7.0 (2009/06/01) 論理削除対?
624                            String[] keys = null;
625                            String[] vals = null;
626                            if( "DELETE".equalsIgnoreCase( sqlType ) ) {
627                                    keys = constVal.getLogicalDeleteKeys();
628                                    vals = constVal.getLogicalDeleteVals();
629                            }
630                            else {
631                                    keys = constVal.getUpdateKeys();
632                                    vals = constVal.getUpdateVals();
633                            }
634                            namesData.add( keys,vals );
635                    }
636    
637                    String[] nms = namesData.getNames();
638                    String[] vls = namesData.getVals();
639    
640                    StringBuilder sql = new StringBuilder();
641                    sql.append( "UPDATE " ).append( table ).append( " SET " );
642                    sql.append( nms[0] ).append( "=" ).append( vls[0] );
643    
644                    for( int i=1; i<nms.length; i++ ) {
645                            sql.append( "," );
646                            sql.append( nms[i] ).append( "=" ).append( vls[i] );
647                    }
648    
649                    // 5.5.8.5 (2012/11/27) whereNames 対?
650                    String whereAnd = " WHERE " ;
651                    if( whereNames != null && whereNames.length() > 0 ) {
652                            String[] wnms = whereNames.split(",");
653                            sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
654    
655                            for( int i=1; i<wnms.length; i++ ) {
656                                    sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
657                            }
658                            whereAnd = " AND " ;            // whereNames 優先?ここを?らなければ、?期?のまま? WHERE " が使われ?
659                    }
660    
661                    // 5.5.8.5 (2012/11/27) whereNames 対応?whereNames が登録されて?ば、AND で繋げる?
662                    if( where != null && where.length() > 0 ) {
663    //                      sql.append( " WHERE " ).append( where );
664                            sql.append( whereAnd ).append( where );
665                    }
666    
667                    return sql.toString();
668            }
669    
670            /**
671             * ??タをデリートする?合に使用するSQL?作?します?
672             *
673             * where と whereNames が同時に?された場合?、whereNames が?に処??
674             * where 条件は、and 結合されます?
675             *
676             * @og.rev 5.5.8.5 (2012/11/27) whereNames 対?
677             *
678             * @return  ?ー?QL
679             */
680            private String getDeleteSQL() {
681                    StringBuilder sql = new StringBuilder();
682                    sql.append( "DELETE FROM " ).append( table );
683    
684                    // 5.5.8.5 (2012/11/27) whereNames 対?
685                    String whereAnd = " WHERE " ;
686                    if( whereNames != null && whereNames.length() > 0 ) {
687                            String[] wnms = whereNames.split(",");
688                            sql.append( whereAnd ).append( wnms[0] ).append( "=[" ).append( wnms[0] ).append( "]" );
689    
690                            for( int i=1; i<wnms.length; i++ ) {
691                                    sql.append( " AND " ).append( wnms[i] ).append( "=[" ).append( wnms[i] ).append( "]" );
692                            }
693                            whereAnd = " AND " ;            // whereNames 優先?ここを?らなければ、?期?のまま? WHERE " が使われ?
694                    }
695    
696                    // 5.5.8.5 (2012/11/27) whereNames 対応?whereNames が登録されて?ば、AND で繋げる?
697                    if( where != null && where.length() > 0 ) {
698    //                      sql.append( " WHERE " ).append( where );
699                            sql.append( whereAnd ).append( where );
700                    }
701                    return sql.toString();
702            }
703    
704            /**
705             * names,constKeys,omitNames から、?なキー??と、属???を持っ?NamesData を作?します?
706             *
707             * @og.rev 4.1.2.1 (2008/03/17) 固定?の constVals の前後に?'" を?れる?
708             * @og.rev 5.5.1.9 (2012/04/19) asNames、orgNames、funcKeys、funcVals属?追?
709             *
710             * @param   nms カラ?配?
711             *
712             * @return      属???を持ったNamesData
713             */
714            private NamesData makeNamesData( final String[] nms ) {
715    
716                    NamesData namesData = new NamesData();
717    
718                    // 5.5.1.9 (2012/04/19) omitNames に、asNames配?の値を設定しておきます?
719                    if( asNames != null ) {
720                            for( int i=0; i<asNames.length; i++ ) {
721                                    if( asNames[i] != null && asNames[i].length() > 0 ) {
722                                            omitNames = omitNames + asNames[i] + ",";
723                                    }
724                            }
725                    }
726    
727                    // names で?されたカラ?
728                    for( int i=0; i<nms.length; i++ ) {
729                            String nm = nms[i];
730                            if( nm != null && nm.length() > 0 && omitNames.indexOf( "," + nm + "," ) < 0 ) {
731                                    namesData.add( nm,"[" + nm + "]" ) ;
732                            }
733                    }
734    
735                    // 固定?の constKeys カラ??列を設定します?
736                    if( constKeys != null && constKeys.length > 0 ) {
737                            for( int j=0; j<constKeys.length; j++ ) {
738                                    String nm = constKeys[j];
739                                    if( nm != null && nm.length() > 0 ) {
740                                            namesData.add( nm,"'" + constVals[j] + "'" ) ;  // constVals は、シングルクオートで囲?す?
741                                    }
742                            }
743                    }
744    
745                    // 関数値の funcKeys カラ??列を設定します?
746                    if( funcKeys != null && funcKeys.length > 0 ) {
747                            for( int j=0; j<funcKeys.length; j++ ) {
748                                    String nm = funcKeys[j];
749                                    if( nm != null && nm.length() > 0 ) {
750                                            namesData.add( nm, funcVals[j] ) ;              // funcVals は、シングルクオートで囲?せん?
751                                    }
752                            }
753                    }
754    
755                    // 別名? asNames,orgNames カラ??列を設定します?
756                    if( orgNames != null && orgNames.length > 0 ) {
757                            for( int j=0; j<orgNames.length; j++ ) {
758                                    String onm = orgNames[j];
759                                    if( onm != null && onm.length() > 0 ) {
760                                            namesData.add( onm,"[" + asNames[j] + "]" ) ;
761                                    }
762                            }
763                    }
764    
765                    return namesData ;
766            }
767    
768            /**
769             * ???タを受け渡す為の、簡易クラスです?
770             * 更新するカラ?と値のセ?配?を管?て?す?
771             *
772             */
773            private static class NamesData {
774                    final Map<String,String> data = new LinkedHashMap<String,String>() ;
775    
776                    /**
777                     * キーと値のセ?を追?ます?
778                     *
779                     * @param   nm String
780                     * @param   val String
781                     */
782                    public void add( final String nm,final String val ) {
783                            data.put( nm,val );
784                    }
785    
786                    /**
787                     * キー配?と対応する?値配?のセ?を追?ます?
788                     *
789                     * @param   nms String[]
790                     * @param   vals String[]
791                     */
792                    public void add( final String[] nms,final String[] vals ) {
793                            if( nms != null ) {
794                                    for( int i=0; i<nms.length; i++ ) {
795                                            data.put( nms[i],vals[i] );
796                                    }
797                            }
798                    }
799    
800                    /**
801                     * キー配?を返します?
802                     *
803                     * @return   String[]
804                     */
805                    public String[] getNames() {
806                            return data.keySet().toArray( new String[data.size()] );
807                    }
808    
809                    /**
810                     * 値配?を返します?
811                     *
812                     * @return   String[]
813                     */
814                    public String[] getVals()  {
815                            return data.values().toArray( new String[data.size()] );
816                    }
817            }
818    
819            /**
820             * こ?オブジェクト???表現を返します?
821             * 基本???目?使用します?
822             *
823             * @return こ?クラスの??表現
824             */
825            @Override
826            public String toString() {
827                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
828                                    .println( "VERSION"                     ,VERSION                )
829                                    .println( "sqlType"                     ,sqlType                )
830                                    .println( "table"                       ,table                  )
831                                    .println( "names"                       ,names                  )
832                                    .println( "omitNames"           ,omitNames              )
833                                    .println( "where"                       ,where                  )
834                                    .println( "whereNames"          ,whereNames             )
835                                    .println( "constKeys"           ,constKeys              )
836                                    .println( "constVals"           ,constVals              )
837                                    .println( "logicalDelete"       ,logicalDelete  )
838                                    .fixForm().toString() ;
839            }
840    }