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