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 static org.opengion.fukurou.util.StringUtil.nval;
019    
020    import java.io.IOException;
021    import java.io.ObjectInputStream;
022    import java.io.ObjectOutputStream;
023    import java.util.ArrayList;
024    import java.util.HashMap;
025    import java.util.List;
026    import java.util.Locale;
027    import java.util.Map;
028    
029    import javax.script.ScriptEngine;
030    import javax.script.ScriptEngineManager;
031    import javax.script.ScriptException;
032    import javax.servlet.ServletException;
033    
034    import org.opengion.fukurou.db.DBUtil;
035    import org.opengion.fukurou.db.Transaction;
036    import org.opengion.fukurou.db.TransactionReal;
037    import org.opengion.fukurou.model.Formatter;
038    import org.opengion.fukurou.util.ErrorMessage;
039    import org.opengion.fukurou.util.StringUtil;
040    import org.opengion.hayabusa.common.HybsSystem;
041    import org.opengion.hayabusa.common.HybsSystemException;
042    import org.opengion.hayabusa.db.DBTableModel;
043    import org.opengion.hayabusa.resource.ResourceManager;
044    
045    /**
046     * 画面で入力されたãƒ??タのチェãƒ?‚¯を行うためのタグですã?
047     *
048     * commandがNEWの場合ã?検索条件等ã?リクエストパラメータに対してチェãƒ?‚¯を行いますã?
049     * commandがENTRYの場合ã?、登録時ã?DBãƒ??ブルモãƒ?ƒ«に対するチェãƒ?‚¯を行いますã?
050     * (値の取得ã?、å?に選択された行ã?みにつã�?�¦、実行されますã?)
051     *
052     * チェãƒ?‚¯を行うための定義は、SQLæ–?又ã? JavaScriptの式が記述可能ですã?
053     * これらã?式ã?タグのボディー部åˆ?�«記述しますã?
054     *
055     * SQLæ–?�«よりチェãƒ?‚¯を行う場合ã?、å¿?�š件数が返されるように記述して下さã�?select count(*) ?¥?¥?¥ ç­?
056     * こã?SQLæ–?�§取得された件数とexistの属æ?値とをç?合しチェãƒ?‚¯を行いますã?
057     * ã�?�šれã?場合も、æ?立時は、正常とみなしますã?
058     * (?¢true:存在する?£ には、データが存在した場合にã€?¼¯?«で、なければエラーですã?)
059     *
060     * JavaScript式を記述する場合ã?、å¿?�štrue or falseを返す式をæŒ?®šして下さã�??
061     * こã?式を評価した結果falseが返される場合ã?、エラーとみなしますã?
062     * 式に不等号等を使用する場合ã?、CDATAセクションで囲ã�?‚ˆã�?�«して下さã�??
063     *
064     * またã?ã�?�šれã?チェãƒ?‚¯方法ã?場合でもã?引数部に[カラãƒ?��]を用ã�?�ŸHybs拡張SQLæ–?‚’
065     * æŒ?®šすることが可能ですã?
066     * メãƒ?‚»ージIDの{0},{1}にはそれぞれ[カラãƒ?��]æŒ?®šされたカラãƒ?��及ã?ãƒ??タがカンマ区åˆ?‚Šで
067     * 自動的に設定されますã?
068     *
069     * ※ こã?タグは、Transaction タグの対象ですã?
070     *
071     * @og.formSample
072     * <pre>
073     * ●形式ï¼?
074     *       ・&lt;og:dataCheck
075     *                    command       = "{&#064;command}"
076     *                    exist         = "[auto|true|false|one|notuse]"
077     *                    errRemove     = "[true|false]"
078     *                    lbl           = "{&#064;lbl}"
079     *                    lblParamKeys  = "ZY03"      : メãƒ?‚»ージリソースのキーをカンマ区åˆ?‚ŠでæŒ?®šã?{2} 以降にセãƒ?ƒˆ
080     *                    sqlType       = "{&#064;sqlType}"
081     *                    execType      = "INSERT|COPY|UPDATE|MODIFY|DELETE"  : sqlType を含ã‚??合ã?実è¡?
082     *                    conditionKey  = "FGJ"        : 条件判定するカラãƒ?¼©?¤を指å®?初期値は columnId )
083     *                    conditionList = "0|1|8|9"    : 条件判定するå?のリストをã€?|"で区åˆ?�£て登録(初期値は、無条件)
084     *                    uniqCheckKeys = "CLM,LANG"   : DBTableModelå†?�§のユニã?クキーチェãƒ?‚¯を行うためのカラãƒ?
085     *         &gt;
086     *
087     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{&#064;XXXX} を解析しまã�?
088     *         (SQLæ–?又ã? JavaScriptå¼?
089     *       ?šなã�? from属æ?、where属æ?を使用して、SQLæ–?‚’å†?ƒ¨で作æ?しまã�?
090     *
091     * ●Tag定義??
092     *   &lt;og:dataCheck
093     *       command            【TAG】コマンãƒ?NEW or ENTRY)をセãƒ?ƒˆしまã�?
094     *       exist              【TAG】データベã?スのチェãƒ?‚¯方法[auto/true/false/one/notuse]を指定しまã�?初期値:auto[自動])
095     *       tableId            【TAGã€?通常は使ã�?�¾せん)結果をDBTableModelに書き込んで、sessionに登録するときã?キーを指定しまã�?
096     *       dbid               【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
097     *       lbl                【TAG】ラベルリソースIDを指定しまã�?
098     *       lblParamKeys       【TAG】ラベルリソースの引数をカンマ区åˆ?‚ŠでæŒ?®šしまã�?
099     *       errRemove          【TAG】エラー時ã?選択行を取り除ã�?�¦継続å?ç�?‚’行うかどã�?�‹[true/false]を指定しまã�?初期値:false)
100     *       sqlType            【TAG】このチェãƒ?‚¯を行う、SQLタイãƒ?を指定しまã�?
101     *       execType           【TAG】このチェãƒ?‚¯を行う、実行タイãƒ?を指定しまã�?
102     *       conditionKey       【TAG】条件判定するカラãƒ?¼©?¤を指定しまã�?
103     *       conditionList      【TAG】条件判定するå?のリストをã€?|"で区åˆ?�£て登録しまã�?初期値:無条件)
104     *       uniqCheckClms      【TAG】指定されたキーに従って、メモリ上ã?ãƒ??ブルに対してユニã?クキーチェãƒ?‚¯を行いまã�?
105     *       beforeErrorJsp     【TAG】エラーが発生した際に、エラーメãƒ?‚»ージの表示前にincludeするJSPを指定しまã�?
106     *       afterErrorJsp      【TAG】エラーが発生した際に、エラーメãƒ?‚»ージの表示後にincludeするJSPを指定しまã�?
107     *       selectedAll        【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)
108     *       msg                【å»?­¢】メãƒ?‚»ージIDを指定しまã�?lbl 属æ?を使用してください)
109     *       msgParamKeys       【å»?­¢】メãƒ?‚»ージリソースの引数をカンマ区åˆ?‚ŠでæŒ?®šしまã�?lblParamKeys 属æ?を使用してください)
110     *       from               【TAG】tableExist タグå»?­¢に伴ã�??簡易機è?追åŠ??チェãƒ?‚¯するãƒ??タベã?スå�?from 句)を指定しますã?
111     *       where              【TAG】tableExist タグå»?­¢に伴ã�??簡易機è?追åŠ??チェãƒ?‚¯する検索条件(where句)を指定しますã?
112     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
113     *   &gt;   ... Body ...
114     *   &lt;/og:dataCheck&gt;
115     *
116     * ●使用ä¾?
117     *       ・&lt;og:dataCheck
118     *                    command   = "ENTRY"
119     *                    exist     = "true"
120     *                    lbl       = "MSG0001"
121     *         &gt;
122     *             select count(*) from GEA03 where clm = [CLM]
123     *         &lt;/og:dataCheck&gt;
124     *
125     *          ・exist 属æ?の値に応じて、チェãƒ?‚¯方法が異なりますã?
126     *            [ auto , true , false , one , notuse が指定できますã?]
127     *
128     *       ・&lt;og:dataCheck
129     *                    command   = "ENTRY"
130     *                    lbl       = "MSG0001"
131     *         &gt;
132     *           &lt;![CDATA[
133     *             [DYSTART] &lt; [DY] &amp;&amp; [DY] &lt; [DYEND]
134     *           ]]&gt;
135     *         &lt;/og:dataCheck&gt;
136     *
137     *         ・&lt;og:dataCheck
138     *                    command   = "ENTRY"
139     *                    lbl       = "MSG0001"
140     *         &gt;
141     *           &lt;![CDATA[
142     *             [GOKEI] &lt; [TANKA] * [RITU]
143     *           ]]&gt;
144     *         &lt;/og:dataCheck&gt;
145     *
146     *    ※ og:tableExist タグがå»?­¢されました。og:dataCheckタグで置き換えてくださいã€?
147     *       ・&lt;og:tableExist
148     *                    command = "{&#064;command}"
149     *                    names   = "USERID,SYSTEM_ID"
150     *                    from    = "GE10"
151     *                    where   = "USERID=? AND SYSTEM_ID=?"
152     *                    exist   = "true"
153     *         /&gt;
154     * 
155     *        �
156     *       ・&lt;og:dataCheck
157     *                    command = "{&#064;command}"
158     *                    exist   = "true"
159     *                    from    = "GE10"
160     *                    where   = "USERID=[USERID] AND SYSTEM_ID=[SYSTEM_ID]"
161     *         /&gt;
162     * 
163     *       ・&lt;og:tableExist
164     *                    command = "{&#064;command}"
165     *                    from    = "GE10"
166     *                    where   = "USERID=[USERID] AND SYSTEM_ID=[SYSTEM_ID]"  /&gt;
167     *        �
168     *       ・&lt;og:dataCheck
169     *                    command = "{&#064;command}"
170     *                    from    = "GE10"
171     *                    where   = "USERID=[USERID] AND SYSTEM_ID=[SYSTEM_ID]"  /&gt;
172     *         /&gt;
173     *
174     * </pre>
175     *
176     * @og.rev 4.1.1.1 (2008/02/22) 新規作æ?
177     * @og.group ?¤?¢登録
178     *
179     * @version  4.0
180     * @author       Hiroki Nakamura
181     * @since    JDK5.0,
182     */
183    public class DataCheckTag extends CommonTagSupport {
184            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
185            private static final String VERSION = "5.7.6.2 (2014/05/16)";
186    
187            private static final long       serialVersionUID        = 576220140516L ;
188    
189            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?{@value} */
190            public static final String              CMD_NEW                         = "NEW";
191    
192            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?{@value} */
193            public static final String              CMD_ENTRY                       = "ENTRY";
194    
195            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?リスãƒ? */
196            private static final String[]   COMMAND_LIST            = { CMD_ENTRY, CMD_NEW };
197    
198            /** å†?ƒ¨変数 */
199            private transient DBTableModel  table           = null;
200            private transient boolean               isSql           = false;
201            private transient boolean               isUniqCheck     = false; // 4.3.4.0 (2008/12/01) 追åŠ?
202            private transient ScriptEngine  jsEngine        = null;
203            private transient String                bodyStr         = null; // 4.3.4.0 (2008/12/01) 追åŠ?
204    
205            /** タグで設定する属æ? */
206            private String          command                 = CMD_ENTRY;
207            private String          exist                   = "auto";
208            private String          tableId                 = HybsSystem.TBL_MDL_KEY;
209            private String          dbid                    = null;
210            private String          lbl                             = null;
211            private String[]        lblParamKeys    = null;         // 4.2.0.1 (2008/03/27)
212            private boolean         errRemove               = false;
213            private String          sqlType                 = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
214            private String          execType                = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
215            private boolean         isExec                  = true;         // 4.1.2.0 (2008/03/12)
216    
217            private String          conditionKey    = null;         // 4.2.0.1 (2008/03/27)
218            private String          conditionList   = null;         // 4.2.0.1 (2008/03/27)
219            private String          from                    = null;         // 4.2.0.1 (2008/03/27)
220            private String          where                   = null;         // 5.7.6.2 (2014/05/16) tableExist タグに伴ã�?¾¿利機è?追åŠ?
221            private String[]        uniqCheckClms   = null;         // 4.3.4.0 (2008/12/01)
222    
223            private String          beforeErrorJsp  = null;         // 5.1.9.0 (2010/08/01)
224            private String          afterErrorJsp   = null;         // 5.1.9.0 (2010/08/01)
225            private boolean         selectedAll             = false;        // 5.1.9.0 (2010/08/01)
226    
227            /**
228             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
229             *
230             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
231             * @og.rev 4.1.2.0 (2008/03/12) sqlType,execType 判å®?
232             *
233             * @return      後続å?ç�??æŒ?¤º
234             */
235            @Override
236            public int doStartTag() {
237                    isExec = sqlType == null || execType == null || execType.indexOf( sqlType ) >= 0 ;
238    
239                    if( isExec ) {
240                            return EVAL_BODY_BUFFERED ;             // Body を評価する
241                    }
242                    else {
243                            return SKIP_BODY ;                              // Body を評価しなã�?
244                    }
245            }
246    
247            /**
248             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
249             *
250             * @og.rev 4.3.4.0 (2008/12/01) 新規追åŠ?
251             *
252             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
253             */
254            @Override
255            public int doAfterBody() {
256                    bodyStr = getBodyString().trim();
257                    return SKIP_BODY ;
258            }
259    
260            /**
261             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
262             *
263             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
264             * @og.rev 4.1.2.0 (2008/03/12) sqlType,execType 判å®?
265             * @og.rev 4.2.0.1 (2008/03/27) from を取å¾?
266             * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対å¿?
267             * @og.rev 4.3.4.0 (2008/12/01) ユニã?クキーチェãƒ?‚¯対応ã?bodyContentの取得を#doAfterBody()で行うã€?
268             * @og.rev 5.1.9.0 (2010/08/01) エラーメãƒ?‚»ージの表示前後にincludeするJSPを指定できるようにするã€?
269             * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
270             * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更 、Transaction対応で、close処ç�?‚’入れるã€?
271             *
272             * @return      後続å?ç�??æŒ?¤º
273             */
274            @Override
275            public int doEndTag() {
276                    debugPrint();
277                    int rtnCode = EVAL_PAGE;
278    
279                    // 4.1.2.0 (2008/03/12) 実行条件 isExec を評価
280                    if( isExec && check( command, COMMAND_LIST ) ) {
281                            // exist="notuse"の場合ã?チェãƒ?‚¯しなã�?
282                            if( "notuse".equalsIgnoreCase( exist ) ) { return rtnCode; }
283    
284                            // パラメーターから処ç�??タイプを判別
285                            checkParam();
286    
287                            // エラーメãƒ?‚»ージを管ç�?�™るクラスを作æ?しますã?
288                            ErrMessageManager manager = new ErrMessageManager();
289                            manager.setTitle( "Data Check Error!" );
290                            manager.setParamKeys( lblParamKeys );
291                            manager.setResourceManager( getResource() );
292                            manager.setFrom( from );
293    
294                            // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
295                            Transaction tran = null ;
296                            // 5.3.7.0 (2011/07/01) Transaction対応で、close処ç�?‚’入れるã€?
297                            try {
298                                    if( isSql ) {
299                                            TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
300                                            if( tranTag == null ) {
301                                                    tran = new TransactionReal( getApplicationInfo() );             // 5.3.7.0 (2011/07/01) 引数変更
302                                            }
303                                            else {
304                                                    tran = tranTag.getTransaction();
305                                            }
306                                    }
307    
308                                    // command="NEW"の場å�?
309                                    if( CMD_NEW.equals( command ) ) {
310                                            if( isSql ) {
311                                                    checkSql( bodyStr, manager, null, 0, DBTableModel.UPDATE_TYPE, tran );          // 5.1.9.0 (2010/08/01)
312                                            }
313                                            else {
314                                                    checkJs( bodyStr, manager, null, 0, jsEngine );
315                                            }
316                                    }
317                                    // command="ENTRY"の場å�?ãƒ??ブルモãƒ?ƒ«が存在しなã�??合ã?処ç�?�—なã�?
318                                    else if( CMD_ENTRY.equals( command ) ) {
319                                            table = (DBTableModel) getObject( tableId );
320                                            if( table != null && table.getRowCount() > 0 ) {
321                                                    manager.setDBTableModel( table );
322                                                    if( isUniqCheck ) {
323                                                            checkUnique( manager );
324                                                    }
325                                                    else {
326                                                            checkRows( bodyStr, manager, tran );            // 5.1.9.0 (2010/08/01)
327                                                    }
328                                            }
329                                            else {
330                                                    System.out.println( "DBTableModel doesn't exist!! need this when command=\"ENTRY\"" );
331                                            }
332                                    }
333                            }
334                            finally {
335                                    if( tran != null ) { tran.close(); }
336                            }
337    
338                            // エラーが発生したå?合ã?、エラーメãƒ?‚»ージを表示して以降ã?処ç�?‚’行わなã�??
339                            ErrorMessage errMessage = manager.getErrMessage() ;
340                            if( errMessage != null && !errMessage.isOK() && !errRemove ) {
341                                    rtnCode = SKIP_PAGE;
342    
343                                    // 5.1.9.0 (2010/08/01) エラーメãƒ?‚»ージの表示前にincludeするJSPを指å®?
344                                    if( beforeErrorJsp != null && beforeErrorJsp.length() > 0 ) {
345                                            includeJsp( beforeErrorJsp );
346                                    }
347    
348                                    jspPrint( TaglibUtil.makeHTMLErrorTable( errMessage, getResource() ) );
349    
350                                    // 5.1.9.0 (2010/08/01) エラーメãƒ?‚»ージの表示後にincludeするJSPを指å®?
351                                    if( afterErrorJsp != null && afterErrorJsp.length() > 0 ) {
352                                            includeJsp( afterErrorJsp );
353                                    }
354                            }
355                    }
356    
357                    return rtnCode ;
358            }
359    
360            /**
361             * タグリブオブジェクトをリリースしますã?
362             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
363             *
364             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
365             * @og.rev 4.1.2.0 (2008/03/12) sqlType , execType , isExec 追åŠ?
366             * @og.rev 4.2.0.1 (2008/03/27) conditionKey , conditionList , msgParamKeys 追åŠ?
367             * @og.rev 5.1.9.0 (2010/08/01) beforeErrorJsp , afterErrorJsp, selectedAll 追åŠ?
368             * @og.rev 5.7.6.2 (2014/05/16) where 追åŠ??tableExist タグに伴ã�?¾¿利機è?追åŠ?
369             */
370            @Override
371            protected void release2() {
372                    super.release2();
373                    tableId                 = HybsSystem.TBL_MDL_KEY;
374                    dbid                    = null;
375                    command                 = CMD_ENTRY;
376                    table                   = null;
377                    exist                   = "auto";
378                    errRemove               = false;
379                    lbl                     = null;
380                    lblParamKeys    = null;         // 4.2.0.1 (2008/03/27)
381                    isSql                   = false;
382                    isUniqCheck             = false;        // 4.3.4.0 (2008/12/01)
383                    jsEngine                = null;
384                    sqlType                 = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
385                    execType                = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
386                    isExec                  = true;         // 4.1.2.0 (2008/03/12)
387                    conditionKey    = null;         // 4.2.0.1 (2008/03/27)
388                    conditionList   = null;         // 4.2.0.1 (2008/03/27)
389                    from                    = null;         // 4.2.0.1 (2008/03/27)
390                    where                   = null;         // 5.7.6.2 (2014/05/16) tableExist タグに伴ã�?¾¿利機è?追åŠ?
391                    bodyStr                 = null;         // 4.3.4.0 (2008/12/01))
392                    uniqCheckClms   = null;         // 4.3.4.0 (2008/12/01)
393                    beforeErrorJsp  = null;         // 5.1.9.0 (2010/08/01)
394                    afterErrorJsp   = null;         // 5.1.9.0 (2010/08/01)
395                    selectedAll             = false;        // 5.1.9.0 (2010/08/01)
396            }
397    
398            /**
399             * 引数及ã?ボディー部åˆ??チェãƒ?‚¯を行い、å?ç�??タイプを判別しますã?
400             *
401             * @og.rev 5.5.8.0 (2012/11/01) タイプ判別変更
402             * @og.rev 5.6.1.1 (2013/02/08) FROM 部のåˆ?‚Š出し位置修正
403             * @og.rev 5.7.6.2 (2014/05/16) tableExist タグに伴ã�?¾¿利機è?追åŠ??from属æ?とwhere属æ?追åŠ?
404             */
405            private void checkParam() {
406                    isUniqCheck = uniqCheckClms != null && uniqCheckClms.length > 0 ;
407                    if( isUniqCheck ) {
408                            if( !CMD_ENTRY.equals( command ) ) {
409                                    String errMsg = "ユニã?クキーチェãƒ?‚¯は、command=\"ENTRY\"の場合ã?み使用可能ですã?"
410                                                            + " command=" + command ;               // 5.1.8.0 (2010/07/01) errMsg 修正
411                                    throw new HybsSystemException( errMsg );
412                            }
413                    }
414                    // 5.7.6.2 (2014/05/16) tableExist タグに伴ã�?¾¿利機è?追åŠ??from属æ?とwhere属æ?追åŠ?
415                    else if( from != null ) {
416                            StringBuilder buf = new StringBuilder();
417                            buf.append( "SELECT count(*) FROM " ).append( from );
418                            if( where != null ) { buf.append( " WHERE " ).append( where ); }
419                            bodyStr = buf.toString();
420                            isSql = true;
421                    }
422                    else {
423                            if( bodyStr == null || bodyStr.length() == 0 ) {
424                                    String errMsg = "Body部åˆ?�«チェãƒ?‚¯定義を記述して下さã�??";
425                                    throw new HybsSystemException( errMsg );
426                            }
427                            else {
428                                    // SQLチェãƒ?‚¯かJavaScriptによるチェãƒ?‚¯かã?判å®?
429                                    String query = bodyStr.toUpperCase( Locale.JAPAN );             // 4.2.0.1 (2008/03/27)
430                                    if( query.indexOf( "SELECT" ) == 0 ) { // 5.5.8.0 (2012/11/01) 先é?に限定するã?(trim済ã?ため)
431                                            isSql = true;
432                                            int st = query.indexOf( "FROM" ) ;
433                                            int ed = query.indexOf( "WHERE" ) ;
434                                            if( st > 0 && st < ed ) {
435                                                    from = query.substring( st+"FROM".length(),ed ).trim();         // 5.6.1.1 (2013/02/08)
436                                            }
437                                    }
438                                    else {
439                                            jsEngine = new ScriptEngineManager().getEngineByName( "JavaScript" );
440                                    }
441                            }
442                    }
443            }
444    
445            /**
446             * SQLによるãƒ??タチェãƒ?‚¯を行いますã?
447             * チェãƒ?‚¯方法ã?、exist属æ?のæŒ?®šに依存しますã?
448             * autoの場合ã?、テーブルモãƒ?ƒ«の改廃Cから自動でチェãƒ?‚¯方法が決定されますã?
449             *
450             * @param       str     実行するSQLæ–?
451             * @param       manager ErrMessageManager オブジェクãƒ?
452             * @param       values  SQLæ–??パラメータ
453             * @param       row     行番号
454             * @param       modifyType      改廃C
455             * @param       tran    トランザクションオブジェクãƒ?
456             *
457             * @return      処ç�??成否
458             *
459             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
460             * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対å¿?
461             * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
462             */
463            private boolean checkSql( final String str, final ErrMessageManager manager, final String[] values
464                                                            , final int row, final String modifyType, final Transaction tran ) {
465    
466                    int cnt = DBUtil.dbExist( str, values, tran, dbid );                    // 5.1.9.0 (2010/08/01)
467    
468                    boolean okFlag = true;
469                    String id = null;
470                    if( ( "true".equalsIgnoreCase( exist ) || ( "auto".equalsIgnoreCase( exist )
471                                    && ( DBTableModel.UPDATE_TYPE.equals( modifyType ) || DBTableModel.DELETE_TYPE.equals( modifyType ) ) ) ) && cnt <= 0 ) {
472                            // ERR0025=ãƒ??タ未登録エラー。キー={0}、å?={1} のãƒ??タは、存在してã�?�¾せんã€?
473                            id = ( lbl == null ? "ERR0025" : lbl );
474                            okFlag = false;
475                    }
476                    else if( ( "false".equalsIgnoreCase( exist ) || ( "auto".equalsIgnoreCase( exist )
477                                    && DBTableModel.INSERT_TYPE.equals( modifyType ) ) ) && cnt > 0 ) {
478                            // ERR0026=ãƒ??タ登録済みエラー。キー={0}、å?={1} のãƒ??タは、すでに存在してã�?�¾すã?
479                            id = ( lbl == null ? "ERR0026" : lbl );
480                            okFlag = false;
481                    }
482                    else if( "one".equalsIgnoreCase( exist ) && cnt > 1 ) {
483                            // ERR0027=ãƒ??タ?’重登録エラー。キー={0}、å?={1} のãƒ??タはã€?‡�è¤?�—て存在してã�?�¾すã?
484                            id = ( lbl == null ? "ERR0027" : lbl );
485                            okFlag = false;
486                    }
487    
488                    if( !okFlag ) {
489                            manager.addMessage( row, id, values );
490    
491                    }
492                    return okFlag;
493            }
494    
495            /**
496             * JavaScriptの式を実行しますã?
497             * 実行した結果がboolean型でなã�??合ã?エラーとなりますã?
498             *
499             * @param str  実行するSQLæ–?
500             * @param       manager オブジェクãƒ?
501             * @param values 値配å?
502             * @param row 行番号
503             * @param engine JavaScriptエンジン
504             *
505             * @return 処ç�??成否
506             *
507             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
508             * @og.rev 4.2.0.1 (2008/03/27) getClass().getName() から、instanceof に変更
509             * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対å¿?
510             */
511            private boolean checkJs(  final String str, final ErrMessageManager manager, final String[] values
512                                                            , final int row, final ScriptEngine engine ) {
513                    // JavaScriptエンジンによる評価
514                    Object obj = null;
515                    try {
516                            obj = engine.eval( str );
517                    }
518                    catch( ScriptException ex ) {
519                            String errMsg = "JavaScript式ã?パã?スに失敗しましたã€?" + str + "]";
520                            throw new HybsSystemException( errMsg , ex );
521                    }
522    
523                    // 返り値がBoolean型かチェãƒ?‚¯
524                    boolean okFlag = false;
525                    // 4.2.0.1 (2008/03/27) instanceof に変更
526                    if( obj instanceof Boolean ) {  // 4.3.1.1 (2008/08/23) instanceof チェãƒ?‚¯は、nullチェãƒ?‚¯不è¦?
527                            okFlag = ((Boolean)obj).booleanValue();
528                    }
529                    else {
530                            String errMsg = "JavaScript式には true 若しくは false が返るように設定して下さã�?
531                                                    + " Object=" + obj ;                    // 5.1.8.0 (2010/07/01) errMsg 修正
532                            throw new HybsSystemException( errMsg );
533                    }
534    
535                    if( !okFlag ) {
536                            // ERR0030=入力したデータが不正ですã?key={0} value={1} 形å¼?{2}
537                            String id = ( lbl == null ? "ERR0030" : lbl );
538    
539                            manager.addMessage( row, id, values );
540                    }
541    
542                    return okFlag;
543            }
544    
545            /**
546             * DBãƒ??ブルモãƒ?ƒ«のå�?¡Œに対してãƒ??タチェãƒ?‚¯を行いますã?
547             *
548             * @param str チェãƒ?‚¯対象のæ–?­—å?
549             * @param manager ErrMessageManagerオブジェクãƒ?
550             * @param tran Transactionトランザクションオブジェクãƒ?
551             *
552             * @og.rev 4.1.1.0 (2008/02/22) 新規作æ?
553             * @og.rev 4.2.0.1 (2008/03/27) conditionKey,conditionList 対å¿?
554             * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対å¿?
555             * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
556             */
557            private void checkRows( final String str, final ErrMessageManager manager, final Transaction tran ) {
558    
559                    int[] rowNo = getParameterRows(); // 4.0.0 (2005/01/31)
560                    if( rowNo.length == 0 ) { return; }
561    
562                    Formatter format = new Formatter( table );
563                    format.setFormat( str );
564                    int[] clmNo = format.getClmNos();
565                    // 4.2.0.1 (2008/03/27) カラãƒ?��のメãƒ?‚»ージリソースæ–?­—å?を作æ?しますã?
566                    manager.setClmNos( clmNo );
567    
568                    // SQLæ–??場合ã?み[xxx]ã‚?に変換したSQLæ–?‚’取å¾?JavaScriptの場合ã?ループå?でå�?¡Œ毎に取å¾?
569                    String query = null;
570                    if( isSql ) {
571                            query = format.getQueryFormatString();
572                    }
573    
574                    // 4.2.0.1 (2008/03/27) conditionKey,conditionList 対å¿?
575                    int cndKeyNo = -1;
576                    if( conditionKey != null && conditionList != null ) {
577                            cndKeyNo = table.getColumnNo( conditionKey );           // 不正æŒ?®šã?エラー
578                    }
579    
580                    List<Integer> list = new ArrayList<Integer>();
581                    boolean okFlag = false;
582                    for( int i = 0; i < rowNo.length; i++ ) {
583                            int row = rowNo[i] ;
584                            String[] values = getTableModelData( row, clmNo );
585                            // 4.2.0.1 (2008/03/27) 条件æŒ?®šがされてã�?‚‹場合にã€?
586                            // Listに含まれなã�??合ã?、実行されなã�??
587                            // 4.2.1.0 (2008/04/11) 厳å¯?�«処ç�?�—ますã?
588                            if( cndKeyNo >= 0 && conditionList.indexOf( table.getValue( row,cndKeyNo ) ) < 0 ) {
589                                    String conVal = "|" + table.getValue( row,cndKeyNo ) + "|" ;
590                                    if( conditionList.indexOf( conVal ) < 0 ) { continue; }
591                            }
592    
593                            if( isSql ) {
594                                    okFlag = checkSql( query, manager, values, row, table.getModifyType( row ), tran );
595                            }
596                            else {
597                                    String jsStr = format.getFormatString( row, "\"" );
598                                    okFlag = checkJs( jsStr, manager, values, row, jsEngine );
599                            }
600    
601                            if( errRemove && okFlag ) {
602                                    list.add( row );
603                            }
604                    }
605    
606                    if( errRemove ) {
607                            Integer[] in = list.toArray( new Integer[list.size()] );
608                            int[] newRowNo = new int[in.length];
609                            for( int i = 0; i < in.length; i++ ) {
610                                    newRowNo[i] = in[i].intValue();
611                            }
612                            setParameterRows( newRowNo );
613                    }
614            }
615    
616            /**
617             * DBãƒ??ブルモãƒ?ƒ«のå�?¡Œにユニã?クキーのチェãƒ?‚¯を行いますã?
618             *
619             * @og.rev 4.3.4.0 (2008/12/01) 新規作æ?
620             *
621             * @param manager ErrMessageManagerオブジェクãƒ?
622             */
623            private void checkUnique( final ErrMessageManager manager ) {
624                    int[] rowNo = getParameterRows();
625                    if( rowNo.length == 0 ) { return; }
626    
627                    int[] clmNo = new int[uniqCheckClms.length];
628                    for( int i=0; i<clmNo.length; i++ ) {
629                            clmNo[i] = table.getColumnNo( uniqCheckClms[i] );
630                    }
631    
632                    manager.setClmNos( clmNo );
633    
634                    List<Integer> list = new ArrayList<Integer>();
635                    Map<String,Integer> map = new HashMap<String,Integer>();
636                    for( int i = 0; i < rowNo.length; i++ ) {
637                            int row = rowNo[i] ;
638                            String[] values = getTableModelData( row, clmNo );
639                            String key = StringUtil.array2line( values, " + " );
640    
641                            if( map.get( key ) == null ) {
642                                    map.put( key, 1 );
643                                    if( errRemove ) {
644                                            list.add( row );
645                                    }
646                            }
647                            else {
648                                    // ERR0027=ãƒ??タ?’重登録エラー。キー={0}、å?={1} のãƒ??タはã€?‡�è¤?�—て存在してã�?�¾すã?
649                                    id = ( lbl == null ? "ERR0027" : lbl );
650                                    manager.addMessage( row, id, values );
651                            }
652                    }
653    
654                    if( errRemove ) {
655                            Integer[] in = list.toArray( new Integer[list.size()] );
656                            int[] newRowNo = new int[in.length];
657                            for( int i = 0; i < in.length; i++ ) {
658                                    newRowNo[i] = in[i].intValue();
659                            }
660                            setParameterRows( newRowNo );
661                    }
662            }
663    
664            /**
665             * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
666             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
667             *
668             * @og.tag
669             * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
670             * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
671             * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
672             * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
673             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
674             *
675             * @param       id sessionに登録する時ã? ID
676             */
677            public void setTableId( final String id ) {
678                    tableId = nval( getRequestParameter( id ), tableId );
679            }
680    
681            /**
682             * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
683             *
684             * @og.tag Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
685             *
686             * @param       id ãƒ??タベã?ス接続ID
687             */
688            public void setDbid( final String id ) {
689                    dbid = nval( getRequestParameter( id ), dbid );
690            }
691    
692            /**
693             * 【TAG】コマンãƒ?NEW or ENTRY)をセãƒ?ƒˆしますã?
694             *
695             * @og.tag
696             * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,CMD_xxx で設定される
697             * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
698             *
699             * @param       cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
700             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.DataCheckTag.CMD_NEW">コマンド定数</a>
701             */
702            public void setCommand( final String cmd ) {
703                    String cmd2 = getRequestParameter( cmd );
704                    if( cmd2 != null && cmd2.length() > 0 ) {
705                            command = cmd2.toUpperCase( Locale.JAPAN );
706                    }
707            }
708    
709            /**
710             * 【TAG】データベã?スのチェãƒ?‚¯方法[auto/true/false/one/notuse]を指定しまã�?初期値:auto[自動])ã€?
711             *
712             * @og.tag
713             * exist 属æ?にæŒ?®šされた ã€?½¢true:存在する?£ã€?½¢false:存在しなã�?½£ã€?½¢one:ひとつ以下」ã€?
714             * の値は、いずれの場合も、æ?立時は、正常とみなしますã?
715             * ?¢auto:自動」は、DBTableModeleのmodifyType(A,C,D)に応じて、チェãƒ?‚¯しますã?
716             * A,C,D は、entryタグにコマンドを渡してãƒ??タを作æ?したときに、å?部で作æ?されますã?
717             * (command="NEW"の場合ã?、trueと同じ動きになりますã?)
718             * notuse は、チェãƒ?‚¯を行いません。これã?、このタグをå?有使用する場合に、外部で
719             * チェãƒ?‚¯を行うかどã�?�‹を指定できるようにするために使用しますã?
720             * (?¢true:存在する?£ には、データが存在した場合にã€?¼¯?«で、なければエラーですã?)
721             * 初期値はã€?½¢auto:自動」ですã?
722             *
723             * @param       ext チェãƒ?‚¯方æ³??¢auto:自動」ã€?½¢true:存在する?£ã€?½¢false:存在しなã�?½£ã€?½¢one:ひとつ以下」ã€?½¢notuse:チェãƒ?‚¯しなã�?½£)
724             */
725            public void setExist( final String ext ) {
726                    exist = nval( getRequestParameter( ext ), exist );
727                    if( !"auto".equalsIgnoreCase( exist )
728                                    && !"true".equalsIgnoreCase( exist )
729                                    && !"false".equalsIgnoreCase( exist )
730                                    && !"one".equalsIgnoreCase( exist )
731                                    && !"notuse".equalsIgnoreCase( exist ) ) {
732                            String errMsg = "exist 属æ?はã€?auto,true,false,one,notuse)を指定してくださいã€?[" + exist + "]" + HybsSystem.CR;
733                            throw new HybsSystemException( errMsg );
734                    }
735            }
736    
737            /**
738             * 【TAG】エラー時ã?選択行を取り除ã�?�¦継続å?ç�?‚’行うかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
739             *
740             * @og.tag
741             * exist 属æ?にæŒ?®šされた ã€?½¢true:存在する?£ã€?½¢false:存在しなã�?½£ã€?½¢one:ひとつ以下」ã€?
742             * に対して、エラーが発生した選択行番号をã?取り除ã�?�¦以下ã?処ç�?‚’継続するかどã�?�‹ã‚?
743             * æŒ?®šしますã?
744             * true に設定したå?合ã?、エラーãƒ??タを削除しã?継続å?ç�?‚’行うことができますã?
745             * flase の場合ã?、エラーãƒ??タを表示して、継続å?ç�?‚’停止しますã?
746             * 初期値はã€?½¢false:エラー時停止?£ですã?
747             *
748             * @param       flag エラー時ã?継続å?ç�?[true:エラー行番号を取り除き継続å?ç�?false:エラー時停止]
749             */
750            public void setErrRemove( final String flag ) {
751                    errRemove = nval( getRequestParameter( flag ), errRemove );
752            }
753    
754            /**
755             * 【å»?­¢】メãƒ?‚»ージIDを指定しまã�?lbl 属æ?を使用してください)ã€?
756             *
757             * @og.tag メãƒ?‚»ージIDを指定しますã?
758             * å�??ç�?�«応じたå?期設定ã?メãƒ?‚»ージIDは、以下ã?通りですã?
759             *   exist="true"   ERR0025=ãƒ??タ未登録エラー。キー={0}、å?={1} のãƒ??タは、存在してã�?�¾せんã€?
760             *   exist="false"  ERR0026=ãƒ??タ登録済みエラー。キー={0}、å?={1} のãƒ??タは、すでに存在してã�?�¾すã?
761             *   exist="one"    ERR0027=ãƒ??タ?’重登録エラー。キー={0}、å?={1} のãƒ??タはã€?‡�è¤?�—て存在してã�?�¾すã?
762             *   JavaScript     ERR0030=入力したデータが不正ですã?key={0} value={1} 形å¼?{2}
763             * 引数のパラメータにはã€??常、チェãƒ?‚¯に使用した実データがã?DBTableModel から取得されますã?
764             * 引数を変更する場合ã?、lblParamKeys を使用してくださいã€?
765             *
766             * @og.rev 5.2.2.0 (2010/11/01) å»?­¢しますã?lbl 属æ?を使用してくださいã€?
767             *
768             * @param id メãƒ?‚»ージID
769             * @see    #setMsgParamKeys( String )
770             * @deprecated  lbl 属æ?を使用してくださいã€?
771             */
772            @Deprecated public void setMsg( final String id ) {
773                    setLbl( id );
774    //              msg = nval( getRequestParameter( id ), msg );
775            }
776    
777            /**
778             * 【TAG】ラベルリソースIDを指定しますã?
779             *
780             * @og.tag ラベルリソースIDを指定しますã?
781             * å�??ç�?�«応じたå?期設定ã?ラベルリソースIDは、以下ã?通りですã?
782             *   exist="true"   ERR0025=ãƒ??タ未登録エラー。キー={0}、å?={1} のãƒ??タは、存在してã�?�¾せんã€?
783             *   exist="false"  ERR0026=ãƒ??タ登録済みエラー。キー={0}、å?={1} のãƒ??タは、すでに存在してã�?�¾すã?
784             *   exist="one"    ERR0027=ãƒ??タ?’重登録エラー。キー={0}、å?={1} のãƒ??タはã€?‡�è¤?�—て存在してã�?�¾すã?
785             *   JavaScript     ERR0030=入力したデータが不正ですã?key={0} value={1} 形å¼?{2}
786             * 引数のパラメータにはã€??常、チェãƒ?‚¯に使用した実データがã?DBTableModel から取得されますã?
787             * 引数を変更する場合ã?、lblParamKeys を使用してくださいã€?
788             *
789             * @param id メãƒ?‚»ージID
790             * @see    #setLblParamKeys( String )
791             */
792            @Override
793            public void setLbl( final String id ) {
794                    // 継承親のメソãƒ?ƒ‰を使わなã�??
795                    lbl = nval( getRequestParameter( id ), lbl );
796            }
797    
798            /**
799             * 【å»?­¢】メãƒ?‚»ージリソースの引数をカンマ区åˆ?‚ŠでæŒ?®šしまã�?lblParamKeys 属æ?を使用してください)ã€?
800             *
801             * @og.tag
802             * メãƒ?‚»ージリソースのキーをカンマ区åˆ?‚ŠでæŒ?®šすることで、設定しますã?
803             * メãƒ?‚»ージに引数( {0},{1} など ) があるå?合ã?ここでæŒ?®šしたå?ã‚?
804             * é ?•ªに、{0},{1},{2}・・・ に当てはめてã�?��ますã?
805             * キーワードã?、カンマ区åˆ?‚ŠでæŒ?®šし、それをåˆ?§£後ã?ラベルリソースで
806             * リソース変換を行いますã?(つまりã?記述されたå?そã?もã?では在りません)
807             * PL/SQL ではã€?{#PN}" などとæŒ?®šしてã�?�Ÿåˆ??、同様に "PN" とæŒ?®šしですã?
808             * å†?ƒ¨çš?�«、where 条件にæŒ?®šされたキーと値は、@KEY と @VAL にã€?
809             * from と where の間ã?æ–?­—å?はã€?#064;TBL に対応付けられますã?
810             * {&#064;XXXX} 変数も使用できますã?実データの値を取出したã�??合ã?、[PN]と
811             * すれば、DBTableModel の PN の値を取出しますã?
812             * なにも指定しなã�??合ã?、キー={0} 、å?={1}、from={2} ですã?
813             *
814             * @og.rev 4.2.0.1 (2008/03/27) 新規追åŠ?
815             * @og.rev 5.2.2.0 (2010/11/01) å»?­¢しますã?lbl 属æ?を使用してくださいã€?
816             *
817             * @param keys メãƒ?‚»ージリソースのキー(CSV)
818             * @see    #setLbl( String )
819             * @deprecated  lblParamKeys 属æ?を使用してくださいã€?
820             */
821            @Deprecated public void setMsgParamKeys( final String keys ) {
822                    setLblParamKeys( keys );
823    //              lblParamKeys = getCSVParameter( keys );
824            }
825    
826            /**
827             * 【TAG】ラベルリソースの引数をカンマ区åˆ?‚ŠでæŒ?®šしますã?
828             *
829             * @og.tag
830             * ラベルリソースのキーをカンマ区åˆ?‚ŠでæŒ?®šすることで、設定しますã?
831             * ラベルに引数( {0},{1} など ) があるå?合ã?ここでæŒ?®šしたå?ã‚?
832             * é ?•ªに、{0},{1},{2}・・・ に当てはめてã�?��ますã?
833             * キーワードã?、カンマ区åˆ?‚ŠでæŒ?®šし、それをåˆ?§£後ã?ラベルリソースで
834             * リソース変換を行いますã?(つまりã?記述されたå?そã?もã?では在りません)
835             * PL/SQL ではã€?{#PN}" などとæŒ?®šしてã�?�Ÿåˆ??、同様に "PN" とæŒ?®šしですã?
836             * å†?ƒ¨çš?�«、where 条件にæŒ?®šされたキーと値はã€?#064;KEY と &#064;VAL にã€?
837             * from と where の間ã?æ–?­—å?はã€?#064;TBL に対応付けられますã?
838             * {&#064;XXXX} 変数も使用できますã?実データの値を取出したã�??合ã?、[PN]と
839             * すれば、DBTableModel の PN の値を取出しますã?
840             * なにも指定しなã�??合ã?、キー={0} 、å?={1}、from={2} ですã?
841             *
842             * @og.rev 4.2.0.1 (2008/03/27) 新規追åŠ?
843             *
844             * @param keys メãƒ?‚»ージリソースのキー(CSV)
845             * @see    #setLbl( String )
846             */
847            public void setLblParamKeys( final String keys ) {
848                    lblParamKeys = getCSVParameter( keys );
849            }
850    
851            /**
852             * 【TAG】このチェãƒ?‚¯を行う、SQLタイãƒ?を指定しますã?
853             *
854             * @og.tag
855             * SQLタイプã?、INSERT,COPY,UPDATE,MODIFY,DELETE などの記号を指定しますã?
856             * ä¸?ˆ¬には、result 画面から update 画面へ遷移するときã?、command と
857             * 同じにしておけばよいでしょã�??
858             * これは、execType とマッチしたå?合ã?み、このチェãƒ?‚¯がå?ç�?�•れますã?
859             * 簡æ˜?equals タグの代役に使用できますã?
860             * なにも指定しなã�??合ã?、チェãƒ?‚¯は実行されますã?
861             *
862             * @og.rev 4.1.2.0 (2008/03/12) 新規追åŠ?
863             *
864             * @param       type こã?チェãƒ?‚¯を行う、SQLタイãƒ?
865             */
866            public void setSqlType( final String type ) {
867                    sqlType = nval( getRequestParameter( type ),sqlType );
868            }
869    
870            /**
871             * 【TAG】このチェãƒ?‚¯を行う、実行タイãƒ?を指定しますã?
872             *
873             * @og.tag
874             * 実行タイプã?、sqlType とマッチしたå?合ã?み、このチェãƒ?‚¯がå?ç�?�•れますã?
875             * 簡æ˜?equals タグの代役に使用できますã?
876             * execType は、è¤?•°æŒ?®šが可能ですã?単純なæ–?­—å?マッチで、sqlType ã‚?
877             * 含めã?、実行されますã?
878             * 例えば、sqlType={&#064;sqlType} execType="INSERT|COPY" とすればã€?
879             * sqlType に、INSERT またã?、COPY が登録されたå?合にチェãƒ?‚¯が掛かりますã?
880             * なにも指定しなã�??合ã?、チェãƒ?‚¯は実行されますã?
881             *
882             * @og.rev 4.1.2.0 (2008/03/12) 新規追åŠ?
883             *
884             * @param       type こã?チェãƒ?‚¯を行う、実行タイãƒ?
885             */
886            public void setExecType( final String type ) {
887                    execType = nval( getRequestParameter( type ),execType );
888            }
889    
890            /**
891             * 【TAG】条件判定するカラãƒ?¼©?¤を指定しますã?
892             *
893             * @og.tag
894             * æŒ?®šã?カラãƒ?¼©?¤の値と、conditionList の値を比è¼?�—てã€?
895             * 存在する場合ã?、check処ç�?‚’実行しますã?
896             * こã?処ç�?�Œ有効なのは、command="ENTRY" の場合ã?みですã?
897             *
898             * @og.rev 4.2.0.1 (2008/03/27) 新規追åŠ?
899             *
900             * @param       key カラãƒ?¼©?¤
901             * @see         #setConditionList( String )
902             */
903            public void setConditionKey( final String key ) {
904                    conditionKey = nval( getRequestParameter( key ),null ) ;
905            }
906    
907            /**
908             * 【TAG】条件判定するå?のリストをã€?|"で区åˆ?�£て登録しまã�?初期値:無条件)ã€?
909             *
910             * @og.tag
911             * conditionKey とペアでæŒ?®šしますã?ここには、カラãƒ??設定å?のリストを
912             * æŒ?®šすることで、è¤?•°条件(?¯?²結合)での比è¼?‚’行い、リストにカラãƒ??ã�?
913             * 存在する場合ã?み、check処ç�?‚’実行しますã?
914             * こã?処ç�?�Œ有効なのは、command="ENTRY" の場合ã?みですã?
915             * 設定しなã�??合ã?、無条件に実行しますã?
916             *
917             * @og.rev 4.2.0.1 (2008/03/27) 新規追åŠ?
918             *
919             * @param       list 条件判定するå?("|"で区åˆ?
920             * @see         #setConditionKey( String )
921             */
922            public void setConditionList( final String list ) {
923                    conditionList = nval( getRequestParameter( list ),null ) ;
924                    if( conditionList != null ) {
925                            conditionList = "|" + conditionList + "|" ;
926                    }
927            }
928    
929            /**
930             * 【TAG】指定されたキーに従って、メモリ上ã?ãƒ??ブルに対してユニã?クキーチェãƒ?‚¯を行いますã?
931             *
932             * @og.tag
933             * ユニã?クキーチェãƒ?‚¯を行うキーを指定しますã?ここで、指定されたキーに対してã€?
934             * DBTableModelの値をチェãƒ?‚¯しã?全てのキーに同じ値となってã�?‚‹行が存在すればエラーとなりますã?
935             * こã?チェãƒ?‚¯は、command="ENTRY"の場合ã?み有効ですã?
936             * またã?こã?チェãƒ?‚¯は他ã?チェãƒ?‚¯(DB存在チェãƒ?‚¯など)と同時に処ç�?�™ることはできませんã€?
937             * キーが指定され手ã�?‚‹場合ã?、ã?ãƒ?‚£部åˆ?�«記述されてã�?‚‹定義は無視されますã?
938             * errRemoveの属æ?がtrueにæŒ?®šされてã�?‚‹場合ã?重è¤?¡Œã?、DBTableModelの並びé ?�‹ら見てã€?
939             * æœ??の行ã?み処ç�?�•れã?2つめ以降ã?重è¤?¡Œã?無視されますã?
940             * なおã?キーはカンマ区åˆ?‚Š(CSV形å¼?でè¤?•°æŒ?®šが可能ですã?
941             *
942             * @og.rev 4.3.4.0 (2008/12/01) 新規追åŠ?
943             *
944             * @param       clm チェãƒ?‚¯キー(CSV形å¼?
945             */
946            public void setUniqCheckClms( final String clm ) {
947                    String tmp = nval( getRequestParameter( clm ),null );
948                    uniqCheckClms = StringUtil.csv2Array( tmp );
949            }
950    
951            /**
952             * 【TAG】エラーが発生した際に、エラーメãƒ?‚»ージの表示前にincludeするJSPを指定しますã?
953             *
954             * @og.tag
955             * エラーが発生した際に、エラーメãƒ?‚»ージの表示前にincludeするJSPを指定しますã?
956             * エラーが発生してã�?�ªã�??合ã?、ここでæŒ?®šされたJSPがå?ç�?�•れることはありませんã€?
957             * 通常は、戻るリンクなどを指定しますã?
958             *
959             * æŒ?®šã?方法ã?、相対パス、絶対パスの両方でæŒ?®šすることができますã?
960             * ä½?�—、絶対パスでæŒ?®šしたå?合ã?そã?基点は、コンãƒ?‚­ストã?ルートディレクトリになりますã?
961             * ä¾? beforeErrorJsp = "/jsp/common/history_back.jsp"
962             *
963             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
964             *
965             * @param jsp 表示前にincludeするJSPファイルå�?
966             */
967            public void setBeforeErrorJsp( final String jsp ) {
968                    beforeErrorJsp = nval( getRequestParameter( jsp ),beforeErrorJsp );
969            }
970    
971            /**
972             * 【TAG】エラーが発生した際に、エラーメãƒ?‚»ージの表示後にincludeするJSPを指定しますã?
973             *
974             * @og.tag
975             * エラーが発生した際に、エラーメãƒ?‚»ージの表示前にincludeするJSPを指定しますã?
976             * エラーが発生してã�?�ªã�??合ã?、ここでæŒ?®šされたJSPがå?ç�?�•れることはありませんã€?
977             *
978             * æŒ?®šã?方法ã?、相対パス、絶対パスの両方でæŒ?®šすることができますã?
979             * ä½?�—、絶対パスでæŒ?®šしたå?合ã?そã?基点は、コンãƒ?‚­ストã?ルートディレクトリになりますã?
980             * ä¾? afterErrorJsp = "/jsp/common/history_back.jsp"
981             *
982             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
983             *
984             * @param jsp 表示後にincludeするJSPファイルå�?
985             */
986            public void setAfterErrorJsp( final String jsp ) {
987                    afterErrorJsp = nval( getRequestParameter( jsp ),afterErrorJsp );
988            }
989    
990            /**
991             * 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
992             *
993             * @og.tag
994             * 全てのãƒ??タを選択済みãƒ??タとして扱って処ç�?�—ますã?
995             * 全件処ç�?�™るå?合にã€?true/false)を指定しますã?
996             * 初期値は false ですã?
997             *
998             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
999             *
1000             * @param  all 選択済みとして処ç�?�™るかどã�?�‹[true:全件選択済み/false:通常]
1001             */
1002            public void setSelectedAll( final String all ) {
1003                    selectedAll = nval( getRequestParameter( all ),selectedAll );
1004            }
1005    
1006            /**
1007             * 【TAG】チェãƒ?‚¯するãƒ??タベã?スå�?from 句)を指定しますã?
1008             *
1009             * @og.tag
1010             * これは、tableExist タグå»?­¢に伴ã�?¾¿利機è?でã€??常、BODYに記述されã�?
1011             * SELECT count(*) from XXXX where XXXXX で、チェãƒ?‚¯しますがã€?
1012             * from 属æ? と、where 属æ?を指定する事で、å?部で、チェãƒ?‚¯用のSQLæ–?‚’
1013             * 作æ?しますã?
1014             * from が指定された場合ã?、BODY は無視されますã?で、ご注意くã�?�•ã�??
1015             *
1016             * @og.rev 5.7.6.2 (2014/05/16) 新規追åŠ?
1017             *
1018             * @param  frm チェãƒ?‚¯するãƒ??ブルID
1019             */
1020            public void setFrom( final String frm ) {
1021                    from = nval( getRequestParameter( frm ),from );
1022            }
1023    
1024            /**
1025             * 【TAG】チェãƒ?‚¯する検索条件(where句)を指定しますã?
1026             *
1027             * @og.tag
1028             * これは、tableExist タグå»?­¢に伴ã�?¾¿利機è?でã€??常、BODYに記述されã�?
1029             * SELECT count(*) from XXXX where XXXXX で、チェãƒ?‚¯しますがã€?
1030             * from 属æ? と、where 属æ?を指定する事で、å?部で、チェãƒ?‚¯用のSQLæ–?‚’
1031             * 作æ?しますã?
1032             * where は、from が指定された場合ã?み、有効ですし、where を指定しなければã€?
1033             * 全件検索になりますã?
1034             * tableExist タグと異なるã?は、where のæŒ?®šã?仕方で、tableExist タグではã€?
1035             * names 属æ?と、対応すã‚?where にはã€? で記述してã�?�¾したがã?
1036             * dataCheck タグではã€??常の [] でDBTableModelの値を指定しますã?
1037             *
1038             * @og.rev 5.7.6.2 (2014/05/16) 新規追åŠ?
1039             *
1040             * @param  whr チェãƒ?‚¯するWHERE 条件
1041             */
1042            public void setWhere( final String whr ) {
1043                    where = nval( getRequestParameter( whr ),where );
1044            }
1045    
1046            /**
1047             * æŒ?®šã?行番号の、カラãƒ?o配å?(int[])に対応したå?の配å?を返しますã?
1048             *
1049             * 表示ãƒ??タの HybsSystem.ROW_SEL_KEY をå?にã€?�¸ばれた 行を
1050             * 処ç�??対象としますã?
1051             *
1052             * @og.rev 4.2.0.1 (2008/03/27) row と clm をå?れ替えますã?(他とあわせまã�?
1053             *
1054             * @param       row   行番号
1055             * @param       clmNo カラãƒ?o配å?
1056             *
1057             * @return      行番号とカラãƒ?o配å?に対応したã?値の配å?
1058             */
1059            private String[] getTableModelData( final int row, final int[] clmNo ) {
1060                    String[] values = new String[clmNo.length];
1061                    for( int i = 0; i < values.length; i++ ) {
1062                            values[i] = table.getValue( row, clmNo[i] );
1063                    }
1064                    return values;
1065            }
1066    
1067            /**
1068             * エラーメãƒ?‚»ージの前後に処ç�?�™るJSPをインクルードしますã?
1069             *
1070             * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
1071             *
1072             * @param jsp JSP�
1073             */
1074            private void includeJsp( final String jsp ) {
1075                    try {
1076                            pageContext.include( jsp, false );
1077                    } catch ( IOException ex ) {
1078                            String errMsg = jsp + " の include に失敗しましたã€?";
1079                            throw new HybsSystemException( errMsg,ex );
1080                    } catch ( ServletException ex ) {
1081                            String errMsg = jsp + " の include に失敗しましたã€?";
1082                            throw new HybsSystemException( errMsg,ex );
1083                    }
1084            }
1085    
1086            /**
1087             * 表示ãƒ??タの HybsSystem.ROW_SEL_KEY をå?にã€?�¸ばれた 行を処ç�??対象としますã?
1088             *
1089             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
1090             *
1091             * @return      選択行ã?配å?
1092             */
1093            @Override
1094            protected int[] getParameterRows() {
1095                    final int[] rowNo ;
1096                    if( selectedAll ) {
1097                            int rowCnt = table.getRowCount();
1098                            rowNo = new int[ rowCnt ];
1099                            for( int i=0; i<rowCnt; i++ ) {
1100                                    rowNo[i] = i;
1101                            }
1102                    } else {
1103                            rowNo = super.getParameterRows();
1104                    }
1105                    return rowNo ;
1106            }
1107    
1108            /**
1109             * ErrMessage を管ç�?�—てã�?‚‹ メソãƒ?ƒ‰é›?´?ž‹å†?ƒ¨クラス
1110             *
1111             * 繰返し処ç�?ƒ¨と、固定部が混在したエラーメãƒ?‚»ージで、固定部をå?に処ç�?�—ã€?
1112             * 繰返し部は、å¿?¦�時に処ç�?�™るよã�?�«しましたã€?
1113             * またã?実際にエラーが発生してå¿?¦�になるまで、実行遅延させますã?
1114             *
1115             * @og.rev 4.2.1.0 (2008/04/11) 新規追åŠ?
1116             * @og.rev 4.3.0.0 (2008/07/24) クラス宣è¨?‚’staticåŒ?
1117             */
1118            private static final class ErrMessageManager {
1119                    // 引数として初期設定される変数
1120                    private String title     = null;
1121                    private String from      = null;
1122                    private String[] lblKeys = null;
1123                    private ResourceManager resource = null;
1124                    private DBTableModel    table    = null;
1125                    private int[]  clmNo    = null;
1126    
1127                    // å†?ƒ¨引数として処ç�?�•れたキャãƒ?‚·ュ値
1128                    private ErrorMessage errMessage  = null;
1129                    private String names     = null;
1130                    private String fromLbl   = null;
1131                    private String[] lblVals = null;
1132    
1133                    private boolean isFirst  = true;                // 初期化されてã�?�ªã�?true
1134    
1135                    /**
1136                     * ErrMessage のタイトルを設定しますã?
1137                     *
1138                     * @param       title   タイトル
1139                     */
1140                    public void setTitle( final String title ) { this.title = title; }
1141    
1142                    /**
1143                     * 処ç�?¯¾象のãƒ??ブル名を設定しますã?
1144                     *
1145                     * @param       from    ãƒ??ブルå�?
1146                     */
1147                    public void setFrom( final String from ) { this.from = from; }
1148    
1149                    /**
1150                     * 処ç�?¯¾象のãƒ??ブルオブジェクトを設定しますã?
1151                     *
1152                     * @param table DBTableModelオブジェクãƒ?
1153                     */
1154                    public void setDBTableModel( final DBTableModel table ) { this.table = table; }
1155    
1156                    /**
1157                     * ResourceManagerオブジェクトを設定しますã?
1158                     *
1159                     * @param resource ResourceManagerオブジェクãƒ?
1160                     */
1161                    public void setResourceManager( final ResourceManager resource ) { this.resource = resource; }
1162    
1163                    /**
1164                     * lblParamKeys 属æ?の配å?を設定しますã?
1165                     *
1166                     * @param       lblKeys 属æ?の配å?
1167                     */
1168                    public void setParamKeys( final String[] lblKeys ) { this.lblKeys = lblKeys; }
1169    
1170                    /**
1171                     * カラãƒ?��列を設定しますã?
1172                     *
1173                     * @param       clmNo   カラãƒ?��
1174                     */
1175                    public void setClmNos( final int[] clmNo ) { this.clmNo = clmNo ; }
1176    
1177                    /**
1178                     * 初期処ç�?‚’行いますã?
1179                     * エラー処ç�??、エラー時ã?み実行する為、å¿?¦�ã?なã�??合ã?、å?ç�?�Œ不要ですã?
1180                     * æœ??のエラー出力までは、å?部オブジェクトã?構築å?ç�?‚’行いませんã€?
1181                     * ?’回目以降ã?、å?部変数にキャãƒ?‚·ュされた変換値を利用してã€?«˜é?化しますã?
1182                     *
1183                     * @og.rev 4.2.3.2 (2008/06/20) from がã?null ならã?なにもしなã�??
1184                     */
1185                    private void firstExecute() {
1186                            errMessage = new ErrorMessage( title );
1187    
1188                            // ãƒ??ブル(from) をキーにラベルリソースから値を取得しますã?
1189                            // 4.2.3.2 (2008/06/20) from がã?null ならã?なにもしなã�??
1190                            if( from != null ) {
1191                                    fromLbl  = resource.getLabel( from );
1192                            }
1193    
1194                            // カラãƒ?•ª号配å?から、カラãƒ?��のラベルリソースæƒ??のCSVæ–?­—å?を作æ?しますã?
1195                            names = getKeysLabel( clmNo );
1196    
1197                            if( lblKeys != null && lblKeys.length > 0 ) {
1198                                    int size = lblKeys.length;
1199                                    lblVals = new String[size] ;
1200    
1201                                    for( int i=0; i<size; i++ ) {
1202                                            String key = lblKeys[i] ;
1203                                            if( key != null ) {
1204                                                    if(              "@KEY".equals( key ) ) { lblVals[i] = names;   }
1205                                                    else if( "@TBL".equals( key ) ) { lblVals[i] = fromLbl;}
1206                                                    else if( key.startsWith( "{#" ) && key.endsWith( "}" )  ) {
1207                                                            lblVals[i] = resource.getLabel( key.substring( 2,key.length()-1 ));
1208                                                    }
1209                                                    else {
1210                                                            lblVals[i] = key;
1211                                                    }
1212                                            }
1213                                    }
1214                            }
1215                    }
1216    
1217                    /**
1218                     * カラãƒ?o配å?(int[])に対応したカラãƒ?��のメãƒ?‚»ージリソースæ–?­—å?を返しますã?
1219                     *
1220                     * @param       clmNo カラãƒ?o配å?
1221                     * @return      カラãƒ?o配å?に対応したã?カラãƒ?��のメãƒ?‚»ージリソース
1222                     */
1223                    private String getKeysLabel( final int[] clmNo ) {
1224                            StringBuilder buf = new StringBuilder();
1225                            if( table != null && clmNo.length > 0 ) {
1226                                    String key = table.getColumnName( clmNo[0] );
1227                                    buf.append( resource.getLabel( key ) );
1228                                    for( int i=1; i<clmNo.length; i++ ) {
1229                                            key = table.getColumnName( clmNo[i] );
1230                                            buf.append( "," ).append( resource.getLabel( key ) );
1231                                    }
1232                            }
1233    
1234                            return buf.toString();
1235                    }
1236    
1237                    /**
1238                     * カラãƒ?��列を設定しますã?
1239                     *
1240                     * @og.rev 4.3.5.7 (2008/03/22) エラーメãƒ?‚»ージの行番号を実際の行番号とä¸??させるã?
1241                     *
1242                     * @param       row     カラãƒ?��
1243                     * @param       id      カラãƒ?��
1244                     * @param       values  æŒ?®šã?行に対する値
1245                     */
1246                    public void addMessage( final int row, final String id, final String[] values ) {
1247                            if( isFirst ) { firstExecute(); isFirst = false; }
1248    
1249                            String vals = StringUtil.array2csv( values );
1250                            if( lblVals == null ) {
1251                                    errMessage.addMessage( row + 1, ErrorMessage.NG, id, names, vals, fromLbl );
1252                            }
1253                            else {
1254                                    int size = lblKeys.length;
1255                                    String[] args = new String[size] ;
1256    
1257                                    for( int i=0; i<size; i++ ) {
1258                                            String key = lblVals[i] ;
1259                                            if( key != null ) {
1260                                                    if(              "@VAL".equals( key ) ) { args[i] = vals; }
1261                                                    else if( key.startsWith( "[" ) && key.endsWith( "]" )  ) {
1262                                                            if( table != null ) {
1263                                                                    args[i] = table.getValue( row,key.substring( 1,key.length()-1 ) );
1264                                                            }
1265                                                    }
1266                                                    else {
1267                                                            args[i] = key;
1268                                                    }
1269                                            }
1270                                    }
1271                                    errMessage.addMessage( row + 1, ErrorMessage.NG, id, args );
1272                            }
1273                    }
1274    
1275                    /**
1276                     * ErrorMessageオブジェクトを返しますã?
1277                     *
1278                     * @return ErrorMessage オブジェクãƒ?
1279                     */
1280                    public ErrorMessage getErrMessage() { return errMessage; }
1281            }
1282    
1283            /**
1284             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
1285             *
1286             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
1287             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
1288             *
1289             * @param       strm    ObjectOutputStreamオブジェクãƒ?
1290             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
1291             */
1292            private void writeObject( final ObjectOutputStream strm ) throws IOException {
1293                    strm.defaultWriteObject();
1294            }
1295    
1296            /**
1297             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
1298             *
1299             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
1300             *
1301             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
1302             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
1303             *
1304             * @param       strm    ObjectInputStreamオブジェクãƒ?
1305             * @see #release2()
1306             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
1307             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
1308             */
1309            private void readObject( final ObjectInputStream strm ) throws IOException, ClassNotFoundException {
1310                    strm.defaultReadObject();
1311            }
1312    
1313            /**
1314             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
1315             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
1316             *
1317             * @return こã?クラスのæ–?­—å?表現
1318             */
1319            @Override
1320            public String toString() {
1321                    return org.opengion.fukurou.util.ToString.title(this.getClass().getName() )
1322                    .println( "VERSION", VERSION )
1323                    .println( "tableId", tableId )
1324                    .println( "dbid", dbid )
1325                    .println( "command", command )
1326                    .println( "exist", exist )
1327                    .println( "lbl", lbl )
1328                    .println( "Other...", getAttributes().getAttribute() ).fixForm().toString();
1329            }
1330    }