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