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.util.Arrays;
021    import java.util.Enumeration;
022    import java.util.Locale;
023    import java.util.Set;
024    import java.util.TreeSet;
025    
026    import org.opengion.fukurou.util.ErrorMessage;
027    import org.opengion.fukurou.util.StringUtil;
028    import org.opengion.hayabusa.common.HybsSystem;
029    import org.opengion.hayabusa.common.HybsSystemException;
030    import org.opengion.hayabusa.db.DBColumn;
031    import org.opengion.hayabusa.db.DBTableModel;
032    
033    /**
034     * 登録ãƒ??タの物ç�?ƒ�ェãƒ?‚¯(整合æ?チェãƒ?‚¯、nullチェãƒ?‚¯)を行うタグですã?
035     *
036     * コマンドに対応したチェãƒ?‚¯方式で、指定ã?カラãƒ?‚’チェãƒ?‚¯しますã?
037     * command="NEW" の場合ã?、columns 引数にCSV形式でæŒ?®šしたカラãƒ?��より
038     * リクエスト情報を取得して、å?をチェãƒ?‚¯しますã?
039     * 引数チェãƒ?‚¯ではã€?%" ã‚?"_" などのあいまã�?¤œ索時にæŒ?®šする記号ã‚?
040     * 含ã‚?�¨エラーになるカラãƒ??チェãƒ?‚¯対象からはずすå¿?¦�がある為ã€?
041     * チェãƒ?‚¯すべきカラãƒ?‚’æŒ?®šするå¿?¦�がありますã?
042     * command="ENTRY" の場合ã?、columns 引数に無関係に、å?てのリクエストされたカラãƒ?
043     * の値をチェãƒ?‚¯しますã?これは、å?の検索時ã?場合と異なりã?ENTRYでは
044     * ãƒ??タベã?スに値を設定する為、無条件にチェãƒ?‚¯するå¿?¦�がありますã?
045     * nullCheck は、command に無関係にæŒ?®šã?カラãƒ?�Œ null (ゼロæ–?­—å?)かどã�?�‹ã‚?
046     * 判定しますã?
047     * maxRowCount は、ä¸?¦§検索時ã?チェãƒ?‚¯された件数がã?æŒ?®šã?値をè¶?�ˆたå?合に
048     * エラーになりますã?minRowCount は、同様に、最小選択件数(設定å?を含ã‚?のæŒ?®šですã?
049     * こã?タグは、エラー時には、それ以降ã?JSP画面を評価しませんã€?ODY 部に記述されã�?
050     * 値は、エラー時ã?み表示され、正常時には、なにも表示されません。これã?、エラー時ã?
051     * メãƒ?‚»ージã‚??ユーザーにエラー時ã?アクションを行ってもらã�??合ã?処ç�?例えばã€?
052     * 画面を戻る為のボタンなど)を表示させますã?
053     * useColumnLabel ã‚?true にセãƒ?ƒˆすると、エラー時ã?カラãƒ?��(ラベル)をã?カラãƒ?‚ªブジェクトかã‚?
054     * 取得するよã�?�«なりますã?動的カラãƒ?®Ÿ行時ã‚??DBTableModelに対して、ColumnEditor等で
055     * ラベルを書き換えた場合に、有効ですã?false の場合ã?、基本çš?�«はラベルリソースからの
056     * 取得になりますが、ケースによっては、カラãƒ?‚ªブジェクトから取得してã�?‚‹場合もありますã?
057     * こã?属æ?は、互換性を重視し、å?期å?がã?false になってã�?�¾すã?
058     *
059     * command="MODIFY" , "DELETE" 時には、強制çš?�«、minRowCount="1" で処ç�?�—ますã?
060     *
061     * @og.formSample
062     * ●形式ï¼?lt;og:columnCheck command = "…" />
063     * ●形式ï¼?lt;og:columnCheck command = "…" >エラー時ã?み処ç�?</og:columnCheck>
064     * ●body?šなã�?あり(EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
065     *
066     * ●Tag定義??
067     *   <og:columnCheck
068     *       command            【TAG】コマンド[NEW/RENEW/ENTRY]をセãƒ?ƒˆしまã�?初期値:NEW)
069     *       columns            【TAG】チェãƒ?‚¯すべきカラãƒ??をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしまã�?
070     *       nullCheck          【TAG】NULL チェãƒ?‚¯すべきカラãƒ??をカンマ区åˆ?CSV形å¼?りでæŒ?®šしまã�?
071     *       mustAnyCheck       【TAG】選択å¿??カラãƒ?æŒ?®šã?カラãƒ??å†?œ€低ã?とつがNULLでなã�?ã‚?AA|BB|CC,XX|YY|ZZ" 形式でæŒ?®šしまã�?
072     *       checkType          【TAGã€?チェãƒ?‚¯対象のãƒ??タ[AUTO/NEW/ENTRY]を指定しまã�?初期値:AUTO)
073     *       maxRowCount        【TAG】ENTRY時にチェãƒ?‚¯で選択された行数のæœ?¤§値を設定しまã�?
074     *       minRowCount        【TAG】ENTRY時にチェãƒ?‚¯で選択された行数のæœ?°�å?を設定しまã�?
075     *       tableId            【TAGã€?通常は使ã�?�¾せん) sessionに登録されてã�?‚‹ DBTableModel を取りå?すキーを指定しまã�?
076     *       matchKeys          【TAG】正規表現でのマッチングを行うカラãƒ??をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしまã�?
077     *       matchVals          【TAG】正規表現でのマッチングを行うカラãƒ??に対する値(正規表現)をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしまã�?
078     *       realTime           【TAGã€?通常使ã�?�¾せん)リアルタイãƒ?ƒ�ェãƒ?‚¯を行う場合に有効にしまã�?
079     *       useStrict          【TAG】NEWの場合に、厳å¯?�«チェãƒ?‚¯するかどã�?�‹[true/false]を指定しまã�?初期値:false)
080     *       useColumnLabel     【TAG】カラãƒ?ƒ©ベルを使用するかどã�?�‹[true/false]を指定しまã�?初期値:false)
081     *       checkNames         【TAG】リクエスト変数の正規化を行うカラãƒ?‚’CSV形式でè¤?•°æŒ?®šしまã�?
082     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
083     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
084     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
085     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
086     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
087     *   >   ... Body ...
088     *   </og:columnCheck>
089     *
090     * ●使用ä¾?
091     * <og:columnCheck
092     *     command = "{@command}"
093     *     columns = "AAA,BBB,CCC"  DB定義(DBColumnリソース)で定義したé ?›®(桁数,タイプç­?でチェãƒ?‚¯しますã?
094     *     maxRowCount = "1"        チェãƒ?‚¯で選ばれた æœ?¤§選択件数(設定å?を含ã‚?を指定ã?
095     *     minRowCount = "1"        チェãƒ?‚¯で選ばれた æœ?°�選択件数(設定å?を含ã‚?を指定ã?
096     *     nullCheck = "AAA,CCC"    NULLチェãƒ?‚¯を実行しますã?
097     * />
098     *
099     * [エラー時に、BODY部に記述されたå?容をå?力するã?正常時には、このBODY部の記述は出力されませんã€?
100     * <og:columnCheck
101     *     command = "{@command}"
102     *     columns = "AAA,BBB,CCC"      DB定義(DBColumnリソース)で定義したé ?›®(桁数,タイプç­?でチェãƒ?‚¯しますã?
103     *     nullCheck = "AAA,CCC"        NULLチェãƒ?‚¯を実行しますã?
104     * >
105     *     <form method="POST" action="forward.jsp" target="RESULT">
106     *         <og:input type="button" onClick="history.back()" msg="MSG0049" accesskey="R" td="false" />
107     *     </form>
108     * </og:columnCheck>
109     *
110     * mustAnyCheck 属æ?にã€?�¸択å¿??カラãƒ?‚’æŒ?®šしますã?
111     *      例:mustAnyCheck="AA|BB|CC"
112     *          AA,BB,CC のカラãƒ?�§選択å¿??(すべてがnullならエラー)
113     *      例:mustAnyCheck="AA|BB|CC,XX|YY|ZZ"
114     *          AA,BB,CC のセãƒ?ƒˆと、XX,YY,ZZのセãƒ?ƒˆでそれぞれ選択å¿??ã€?
115     *      例:mustAnyCheck="AA|XX,AA|YY,AA|ZZ"
116     *          AA に値があれã?すべて成立ã?そうでなã�??合ã?、XX と YY と ZZ がすべてå¿??ã€?
117     *      例:mustAnyCheck="AA|BB,BB|CC,AA|CC"
118     *          AA,BB,CC のå†??どれか?’つがå¿??ã€?Aがæ?立すれã?BBかCCがå¿??。同様にã€?
119     *          BBがæ?立すれã?、AAかCCがå¿??ã€?
120     *
121     *  例:query.jsp
122     *        <og:column name="AA" mustAny="true" />
123     *        <og:column name="BB" mustAny="true" />
124     *        <og:column name="XX" mustAny="XYZ"  />
125     *        <og:column name="YY" mustAny="XYZ"  />
126     *      result.jsp
127     *        <og:columnCheck mustAnyCheck="AA|BB,XX|YY" />
128     *      custom/custom.css
129     *          .XYZ { background-color: Green; }
130     *
131     *  ä¾?動的カラãƒ?�§、entry.jsp でのチェãƒ?‚¯を行う場合ã?
132     *     entry.jsp
133     *        <og:columnCheck command="NEW" columns="*" useColumnLabel="true" />
134     *
135     *     useColumnLabel で、動çš?�«作æ?されたカラãƒ?SAVE=TRUEでキャãƒ?‚·ュ済み)を使って
136     *     チェãƒ?‚¯しますã?command="NEW" なので、対象カラãƒ?‚’æŒ?®šするã?にã€?*" ですべてを選択しますã?
137     *
138     * @og.group 画面登録
139     *
140     * @version  4.0
141     * @author   Kazuhiko Hasegawa
142     * @since    JDK5.0,
143     */
144    public class ColumnCheckTag extends CommonTagSupport {
145            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
146            private static final String VERSION = "5.7.8.0 (2014/07/04)" ;
147    
148            private static final long serialVersionUID = 578020140704L ;
149    
150            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? 新è¦?{@value} */
151            public static final String CMD_NEW      = "NEW" ;
152            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? 再検索 {@value}  */
153            public static final String CMD_RENEW = "RENEW" ;
154            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? エントリー {@value} */
155            public static final String CMD_ENTRY   = "ENTRY" ;
156            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?リスãƒ? */
157    
158            // 4.3.1.1 (2008/08/23) transient 追åŠ?
159            private transient DBTableModel table            = null;         // 4.1.2.1 (2008/03/13)
160    
161            private String          tableId         = HybsSystem.TBL_MDL_KEY;               // 3.5.4.3 (2004/01/05)
162            private String          command         = CMD_NEW;      // 無æŒ?®š時は、チェãƒ?‚¯を行うã€?
163            private String[]        columns         = null;
164            private String[]        nullCheck       = null;
165            private String[]        mustAnyCheck= null;             // 3.8.0.9 (2005/10/17)
166            private int                     maxRowCount     = -1 ;          // 初期値として?Œ無制限をæŒ?®?
167            private int                     minRowCount     = -1 ;          // 初期値として?Œ無制限をæŒ?®?
168            private String          checkType       = "AUTO";
169            private String          bodyString      = null;         // 3.5.4.2 (2003/12/15)
170            private String[]        matchKeys       = null;         // 4.0.0 (2005/11/30)
171            private String[]        matchVals       = null;         // 4.0.0 (2005/11/30)
172            private boolean         isRealTime      = false;        // 4.3.7.0 (2009/06/01)
173            private boolean         isStrict        = false;        // 5.2.2.0 (2010/11/01) NEWの場合に、厳å¯?�«チェãƒ?‚¯するフラグを追åŠ?
174    
175            private boolean         isColumnLabel= false;   // 5.4.3.4 (2012/01/12) true の場合に、カラãƒ?ƒ©ベルを使用しますã?
176    
177            private String                  checkNames      = null; // 5.4.3.8 (2012/01/24)
178    
179            /**
180             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
181             *
182             * @og.rev 3.5.4.2 (2003/12/15) エラー時に、BODY部に記述されたå?容をå?力するã?
183             * @og.rev 5.0.0.2 (2009/09/15) xss対応â�çチェãƒ?‚¯する
184             * @og.rev 5.7.8.0 (2014/07/04) caseKey,caseVal,caseNN,caseNull 属æ?を追åŠ?
185             *
186             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
187             */
188            @Override
189            public int doStartTag() {
190                    // 5.0.0.2 (2009/09/15) XSSチェãƒ?‚¯しなã�?�çする
191                    // useXssCheck( false );
192    //              return EVAL_BODY_BUFFERED ;             // Body を評価する
193    
194                    // 5.7.8.0 (2014/07/04) 追åŠ?
195                    return useTag() ? EVAL_BODY_BUFFERED : SKIP_BODY ;
196            }
197    
198            /**
199             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
200             *
201             * @og.rev 3.5.4.2 (2003/12/15) エラー時に、BODY部に記述されたå?容をå?力するã?
202             *
203             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
204             */
205            @Override
206            public int doAfterBody() {
207                    bodyString = getBodyString();
208    
209                    return SKIP_BODY ;
210            }
211    
212            /**
213             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
214             *
215             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
216             * @og.rev 3.4.0.3 (2003/09/10) command="NEW" でエラー発生時には、DBTableModel をクリアするã€?
217             * @og.rev 3.5.4.2 (2003/12/15) HTMLTableViewForm クラス名変更(â‡?ViewForm_HTMLTable)
218             * @og.rev 3.5.4.2 (2003/12/15) エラー時に、BODY部に記述されたå?容をå?力するã?
219             * @og.rev 3.5.4.3 (2004/01/05) tableId 属æ?を追åŠ??
220             * @og.rev 3.5.4.4 (2004/01/16) エラー結果を表示するãƒ??ブル形式ã?フォーãƒ?¿®正
221             * @og.rev 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソãƒ?ƒ‰を利用
222             * @og.rev 4.1.2.1 (2008/03/13) table 属æ?を追åŠ??
223             * @og.rev 4.3.3.0 (2008/10/01) viewSimple属æ?追åŠ?
224             * @og.rev 4.3.7.0 (2009/06/01) viewSimple属æ?名称変更 â‡?isRealTime
225             * @og.rev 5.6.8.3 (2013/09/27) checkTypeがAutoの場合ã?セãƒ?ƒˆをここで行い、tableModelチェãƒ?‚¯をcheckTypeで行うã€?
226             * @og.rev 5.7.8.0 (2014/07/04) caseKey,caseVal,caseNN,caseNull 属æ?を追åŠ?
227             *
228             * @return      後続å?ç�??æŒ?¤º
229             */
230            @Override
231            public int doEndTag() {
232                    debugPrint();           // 4.0.0 (2005/02/28)
233    
234                    // 5.7.8.0 (2014/07/04) caseKey,caseVal,caseNN,caseNull 属æ?を追åŠ?
235                    if( !useTag() ) { return EVAL_PAGE ; }          // ペã?ジの残りを評価するã€?
236    
237                    int rtnCode = EVAL_PAGE;
238    
239                    // 4.1.2.1 (2008/03/13)
240                    table = (DBTableModel)getObject( tableId );
241                    
242                    // 5.6.8.3 (2013/09/27) チェãƒ?‚¯タイプã?autoをå?れる位置変更
243                    if( "AUTO".equals( checkType ) ) { checkType = command; }
244    
245                    // 3.4.0.3 (2003/09/10) コマンドが、NEW,RENEW 以外ã?場合ã?、DBTableModel はå¿??ã€?
246                    if( 
247                            !CMD_NEW.equals( checkType ) &&         // 5.6.8.3 (2013/09/27) commandから変更
248                            !CMD_RENEW.equals( checkType ) &&
249                            table == null ) {                                       // 4.1.2.1 (2008/03/13)
250                                    String errMsg = "検索結果のオブジェクトが存在しませんã€?
251                                                                    + " checkType=[" + checkType + "]" ;
252                                    jspPrint( errMsg );
253                                    rtnCode = SKIP_PAGE ;
254                    }
255                    else {
256                    // 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソãƒ?ƒ‰を利用
257                            ErrorMessage errMsg = makeErrorDBTable();
258                            if( errMsg.getKekka() >= ErrorMessage.NG ) {
259                                    if( bodyString != null ) { jspPrint( bodyString ); }    // 3.5.4.2 (2003/12/15)
260    
261                                    // 4.3.3.0 (2008/10/01)
262                                    // 4.3.7.0 (2009/06/01)
263                                    if( isRealTime ) { jspPrint( TaglibUtil.makeHTMLSimpleErrorList( errMsg,getResource() ) ); }
264                                    else { jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg, getResource() ) ); }
265    
266                                    if( CMD_NEW.equals( command ) ) {
267                                            removeObject( tableId );
268                                    }
269                                    rtnCode = SKIP_PAGE ;
270                            }
271                            else if( errMsg.getKekka() == ErrorMessage.WARNING ) {
272                                    // 4.3.3.0 (2008/10/01)
273                                    // 4.3.7.0 (2009/06/01)
274                                    if( isRealTime ) { jspPrint( TaglibUtil.makeHTMLSimpleErrorList( errMsg,getResource() ) ); }
275                                    else { jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg, getResource() ) ); }                    }
276                    }
277    
278                    return rtnCode ;
279            }
280    
281            /**
282             * タグリブオブジェクトをリリースしますã?
283             *
284             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
285             *
286             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
287             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
288             * @og.rev 3.5.4.2 (2003/12/15) エラー時に、BODY部に記述されたå?容をå?力するã?
289             * @og.rev 3.5.4.3 (2004/01/05) tableId 属æ?を追åŠ??
290             * @og.rev 3.8.0.9 (2005/10/17) mustAnyCheck 属æ?を追åŠ??
291             * @og.rev 4.1.2.1 (2008/03/13) table 属æ?を追åŠ??
292             * @og.rev 4.3.3.0 (2008/10/01) viewSimple属æ?追åŠ?
293             * @og.rev 4.3.7.0 (2009/06/01) viewSimple属æ?名称変更 â‡?isRealTime
294             * @og.rev 5.2.2.0 (2010/11/01) NEWの場合に、厳å¯?�«チェãƒ?‚¯するフラグを追åŠ?
295             * @og.rev 5.4.3.4 (2012/01/12) isColumnLabelを追åŠ?
296             *
297             */
298            @Override
299            protected void release2() {
300                    super.release2();
301                    command         = CMD_NEW;      // 無æŒ?®š時は、チェãƒ?‚¯を行うã€?
302                    columns         = null;
303                    nullCheck       = null;
304                    maxRowCount     = -1 ;          // 初期値として?Œ無制限をæŒ?®?
305                    minRowCount     = -1 ;          // 初期値として?Œ無制限をæŒ?®?
306                    checkType       = "AUTO";
307                    bodyString      = null ;        // 3.5.4.2 (2003/12/15)
308                    tableId         = HybsSystem.TBL_MDL_KEY;               // 3.5.4.3 (2004/01/05)
309                    mustAnyCheck= null;             // 3.8.0.9 (2005/10/17)
310                    matchKeys       = null;         // 4.0.0 (2005/11/30)
311                    matchVals       = null;         // 4.0.0 (2005/11/30)
312                    table           = null;         // 4.1.2.1 (2008/03/13)
313                    isRealTime      = false;        // 4.3.7.0 (2009/06/01)
314                    isStrict        = false;        // 5.2.2.0 (2010/11/01) NEWの場合に、厳å¯?�«チェãƒ?‚¯するフラグを追åŠ?
315                    isColumnLabel= false;   // 5.4.3.4 (2012/01/12) true の場合に、カラãƒ?ƒ©ベルを使用しますã?
316                    checkNames      = null;         // 5.4.3.8 (2012/01/24)
317            }
318    
319            /**
320             * DBColumn オブジェクトを作æ?して、DBColumn#valueCheck( String )で
321             * チェãƒ?‚¯を行う。その結果の、ErrorMessage オブジェクトを DBTableModel に
322             * 取り込んで、エラーの場合ã?、その表示を行うã€?
323             * 表示方法ã?、そのまま ViewForm オブジェクトを作æ?して、表示を行うã€?
324             *
325             * @og.rev 3.5.5.2 (2004/04/02) リターン値をã?DBTableModel から ErrorMessage に変更
326             * @og.rev 4.0.0.0 (2005/01/31) リターン値の ErrorMessage は、å¿?�š存在するã€?
327             * @og.rev 4.1.2.1 (2008/03/13) command="MODIFY" , "DELETE" 時には、強制çš?�«、minRowCount="1" で処ç�?�—ますã?
328             * @og.rev 5.6.8.3 (2013/09/27) checkTypeのAuto時設定位置をdoEndTagでするように変更
329             *
330             * @return      エラーメãƒ?‚»ージのãƒ??ブルモãƒ?ƒ«
331             */
332            private ErrorMessage makeErrorDBTable() {
333                    ErrorMessage errMsg = new ErrorMessage();
334    
335                    //if( "AUTO".equals( checkType ) ) { checkType = command; } // 5.6.8.3 (2013/09/27) move
336                    if( CMD_ENTRY.equals( checkType ) ) {
337                            errMsg.setTitle( "Request Column Error!" );
338                            errMsg = makeEntryErrorMessage( errMsg );
339                            errMsg = makeMaxRowCountErrorMessage( errMsg );
340                            errMsg = makeMinRowCountErrorMessage( errMsg );
341                    }
342                    else if( CMD_NEW.equals( checkType ) ) {
343                            errMsg.setTitle( "Entry Column Error!" );
344                            errMsg = makeErrorMessage( errMsg );
345                            errMsg = makeMaxRowCountErrorMessage( errMsg );
346                            errMsg = makeMinRowCountErrorMessage( errMsg );
347                    }
348                    else if( minRowCount >= 0 || maxRowCount >= 0) {  // -1 は制限無ã�?
349                            errMsg.setTitle( "Row Count Error Limited Error!" );
350                            errMsg = makeMaxRowCountErrorMessage( errMsg );
351                            errMsg = makeMinRowCountErrorMessage( errMsg );
352                    }
353                    // 4.1.2.1 (2008/03/13) command="MODIFY" , "DELETE" 時には、強制çš?�«、minRowCount="1" で処ç�?�—ますã?
354                    else if( "MODIFY,DELETE".indexOf( checkType ) >= 0 && minRowCount < 0 ) {
355                            minRowCount = 1;
356                            errMsg = makeMinRowCountErrorMessage( errMsg );
357                    }
358                    return errMsg;
359            }
360    
361            /**
362             * ErrorMessageをセãƒ?ƒˆしますã?
363             * 引数のカラãƒ?��配å?よりリクエスト情報を取得して、å?をチェãƒ?‚¯しますã?
364             * DBColumn#valueCheck( String ) の結果のErrorMessageをすべて append
365             * してã�?��ますã?
366             *
367             * @og.rev 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
368             * @og.rev 3.8.1.0 (2005/10/24) リクエスト情報の正規化変換(DBColumn#valueSet(String))中止
369             * @og.rev 3.8.5.3 (2006/06/30) リクエストに % , _ が含まれたときã?、削除しますã?
370             * @og.rev 4.1.2.1 (2008/03/13) must , mustAny の自動取得追åŠ?
371             * @og.rev 5.0.0.2 (2009/09/15) 個別にxssチェãƒ?‚¯をfalse
372             * @og.rev 5.1.9.0 (2010/08/01) 同じ名前のé ?›®はã€?つにまとめる(ラジオボタンç­?
373             * @og.rev 5.2.0.0 (2010/09/01) リアルタイãƒ?ƒ�ェãƒ?‚¯の場合ã?、must,mustAnyの自動チェãƒ?‚¯は行わなã�?
374             * @og.rev 5.2.2.0 (2010/11/01) DBColumn#valueCheck で、甘ã�?ƒ�ェãƒ?‚¯を行うように、引数に isStrict を追åŠ?
375             * @og.rev 5.4.3.4 (2012/01/12) getLabel( String )をã?リソースからに統ä¸?�™るとともに、isColumnLabel 対応を行うã€?
376             * @og.rev 5.4.3.8 (2012/01/28) checkNames対å¿?
377             *
378             * @param       errMsg  ErrorMessageオブジェクãƒ?
379             *
380             * @return      カラãƒ?‚­ー ??値 のエラーメãƒ?‚»ージオブジェクãƒ?
381             */
382            private ErrorMessage makeErrorMessage( final ErrorMessage errMsg ) {
383    
384                    // 4.1.2.1 (2008/03/13) must , mustAny の自動取得追åŠ?
385                    // request から取å?ã�?注意:mustAny 以外ã?自由形式ã?値はæ‰?¾—してã�?�¾せんã€?
386                    // 5.2.0.0 (2010/09/01) リアルタイãƒ?ƒ�ェãƒ?‚¯の場合ã?、must,mustAnyの自動チェãƒ?‚¯は行わなã�?
387                    //  (基本çš?�«パラメーターをé?らなã�?™�りè?動チェãƒ?‚¯は動かなã�?�Œ、RequestCacheにより動くことがあã‚?
388                    if( !isRealTime ) {
389                            if( nullCheck == null ) {
390                                    nullCheck = getRequestValues( HybsSystem.MUST_KEY + "must" );
391                                    // 5.1.9.0 (2010/08/01) 同じ名前のé ?›®はã€?つにまとめる(ラジオボタンç­?
392                                    if( nullCheck != null ) {
393                                            Set<String> ss = new TreeSet<String>();
394                                            ss.addAll( Arrays.asList( nullCheck ) );
395                                            nullCheck = ss.toArray( new String[ss.size()] );                // 5.1.9.0 (2010/08/01) K.H
396                                    }
397                            }
398                            if( mustAnyCheck == null ) {
399                                    String[] mustAnyReq = getRequestValues( HybsSystem.MUST_KEY + "mustAny" );
400                                    if( mustAnyReq != null && mustAnyReq.length > 0 ) {
401                                            mustAnyCheck = new String[] { StringUtil.array2line( mustAnyReq,"|" ) };
402                                    }
403                            }
404                    }
405    
406                    if( nullCheck != null && nullCheck.length != 0 ) {
407                            for( int i=0; i<nullCheck.length; i++ ) {
408                                    String clmKey = nullCheck[i];           // 5.4.3.4 (2012/01/12)
409                                    // String val  = getRequestValue( nullCheck[i] );
410                                    String val  = getRequestValue( clmKey, false ); // 5.0.0.2 (2009/09/15)
411                                    if( val == null || val.length() == 0 ) {
412                                            // 5.4.3.4 (2012/01/12) isColumnLabel 追åŠ?
413                                            String label = isColumnLabel ? getDBColumn( clmKey ).getLabel() : getResource().getLabel( clmKey );
414                                            // ERR0012 : æŒ?®šã?ãƒ??タがセãƒ?ƒˆされてã�?�¾せんã€?NULLエラー)。key={0}
415                                            errMsg.addMessage( 0,ErrorMessage.NG,"ERR0012",label );
416                                    }
417                            }
418                    }
419                    // 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
420                    if( mustAnyCheck != null && mustAnyCheck.length != 0 ) {
421                            for( int i=0; i<mustAnyCheck.length; i++ ) {
422                                    boolean flag = false;
423                                    String[] mustSub = StringUtil.csv2Array( mustAnyCheck[i],'|' );
424                                    for( int j=0; j<mustSub.length; j++ ) {
425                                            // String val  = getRequestValue( mustSub[j] );
426                                            String val  = getRequestValue( mustSub[j], false ); // 5.0.0.2 (2009/09/15)
427                                            if( val != null && val.length() > 0 ) {
428                                                    flag = true; break;             // ひとつでもnullでなければ、OK
429                                            }
430                                    }
431                                    if( ! flag ) {
432                                            StringBuilder buf = new StringBuilder();
433                                            for( int j=0; j<mustSub.length; j++ ) {
434                                                    String clmKey = mustSub[j];             // 5.4.3.4 (2012/01/12)
435                                                    // 5.4.3.4 (2012/01/12) isColumnLabel 追åŠ?
436                                                    String label = isColumnLabel ? getDBColumn( clmKey ).getLabel() : getResource().getLabel( clmKey );
437                                                    buf.append( label ).append( "," );
438                                            }
439                                            // ERR0036 : 選択å¿??エラー。以下ã?ãƒ??タのå†?�©れかは入力してください。key={0}
440                                            errMsg.addMessage( 0,ErrorMessage.NG,"ERR0036",buf.toString() );
441                                    }
442                            }
443                    }
444                    if( columns != null && columns.length != 0 ) {
445                            for( int i=0; i<columns.length; i++ ) {
446                                    // 3.8.1.0 (2005/10/24) リクエスト情報の正規化変換(DBColumn#valueSet(String))中止
447                                    // String clmVal = getRequestValue( columns[i] );
448                                    String clmVal = getRequestValue( columns[i], false ); // 5.0.0.2 (2009/09/15)
449                                    if( clmVal != null && clmVal.length() > 0 ) {
450                                            clmVal = StringUtil.replace( clmVal,"%","" );           // 3.8.5.3 (2006/06/30)
451                                            clmVal = StringUtil.replace( clmVal,"_","" );           // 3.8.5.3 (2006/06/30)
452                                            DBColumn dbColumn = getDBColumn( columns[i] );
453                                            // 5.4.3.8 (2012/01/24) checkNames対å¿?
454                                            if( ( "," + checkNames + "," ).indexOf( "," + columns[i] + "," ) >= 0 ) {
455                                                    String val = dbColumn.valueSet( clmVal );
456                                                    if( val != null ) { clmVal = val; }
457                                            }
458                                            // 5.2.2.0 (2010/11/01) DBColumn#valueCheck で、甘ã�?ƒ�ェãƒ?‚¯を行うように、引数に isStrict を追åŠ?
459                                            errMsg.append( dbColumn.valueCheck( clmVal,isStrict ) );
460                                    }
461                            }
462                    }
463                    // 4.0.0 (2005/11/30) 正規表現チェãƒ?‚¯の追åŠ?
464                    if( matchKeys != null && matchKeys.length != 0 ) {
465                            for( int i=0; i<matchKeys.length; i++ ) {
466                                    String clmKey = matchKeys[i];           // 5.4.3.4 (2012/01/12)
467                                    // String val  = getRequestValue( matchKeys[i] );
468                                    String val  = getRequestValue( clmKey, false ); // 5.0.0.2 (2009/09/15)
469                                    if( val != null && ! val.matches( matchVals[i] ) ) {
470                                            // 5.4.3.4 (2012/01/12) isColumnLabel 追åŠ?
471                                            String label = isColumnLabel ? getDBColumn( clmKey ).getLabel() : getResource().getLabel( clmKey );
472                                            // ERR0037 : ãƒ??タ整合æ?エラー。指定ã?キーは整合æ?チェãƒ?‚¯の結果マッチしませんでした。key={0} val={1} regex={2}
473                                            errMsg.addMessage( 0,ErrorMessage.NG,"ERR0037",label,val,matchVals[i] );
474                                    }
475                            }
476                    }
477    
478                    return errMsg;
479            }
480    
481            /**
482             * エントリーãƒ??タのErrorMessageをセãƒ?ƒˆしますã?
483             * 引数のカラãƒ?��配å?よりエントリーãƒ??タ形式ã?リクエスト情報を取得してã€?
484             * 値をチェãƒ?‚¯しますã?
485             * DBColumn#valueCheck( String ) の結果のErrorMessageをすべて append
486             * してã�?��ますã?
487             *
488             * @og.rev 3.1.0.0 (2003/03/20) 名前と行番号の区åˆ?‚Š記号ã‚?"^" から "__" に変更ã€?
489             * @og.rev 3.5.5.0 (2004/03/12) 名前と行番号の区åˆ?‚Š記号("__")をã?HybsSystem.JOINT_STRING  に変更ã€?
490             * @og.rev 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
491             * @og.rev 4.1.2.1 (2008/03/13) must , mustAny の自動取得追åŠ?
492             * @og.rev 4.3.6.4 (2009/05/01) 削除時にå¿?�šmustAnyチェãƒ?‚¯エラーになるバグを修正(書込み可能行ã?みをå?ç�?�™ã‚?
493             * @og.rev 4.3.7.0 (2009/06/01) リアルタイãƒ?ƒ�ェãƒ?‚¯の場合ã?、must,mustAnyの自動チェãƒ?‚¯は行わなã�?
494             * @og.rev 5.0.0.2 (2009/09/15) xssチェãƒ?‚¯
495             * @og.rev 5.4.3.4 (2012/01/12) getLabel( String )をã?リソースからに統ä¸?�™るとともに、isColumnLabel 対応を行うã€?
496             *
497             * @param       errMsg  ErrorMessageオブジェクãƒ?
498             *
499             * @return      カラãƒ?‚­ー ??値 のエラーメãƒ?‚»ージオブジェクãƒ?
500             */
501            private ErrorMessage makeEntryErrorMessage( final ErrorMessage errMsg ) {
502                    int[] rowNo = getParameterRows();
503                    if( rowNo.length == 0 ) { return errMsg; }
504    
505                    // 4.1.2.1 (2008/03/13) must , mustAny の自動取得追åŠ?
506                    // table から取å?ã�?(ソート済み)
507                    // 4.3.7.0 (2009/06/01) リアルタイãƒ?ƒ�ェãƒ?‚¯の場合ã?、must,mustAnyの自動チェãƒ?‚¯は行わなã�?
508                    if( !isRealTime ) {
509                            if( nullCheck    == null ) { nullCheck    = table.getMustArray();        }
510                            if( mustAnyCheck == null ) { mustAnyCheck = table.getMustAnyArray(); }
511                    }
512    
513                    // 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
514                    boolean[][] rowAnyOne = null;
515                    // 4.3.6.4 (2009/05/01)
516                    boolean[] rowForCheck = null;
517                    if( mustAnyCheck != null && mustAnyCheck.length != 0 ) {
518                            rowAnyOne = new boolean[rowNo.length][mustAnyCheck.length];
519                            rowForCheck = new boolean[rowNo.length];
520            //              for( int i=0; i<rowNo.length; i++ ) {
521            //                      Arrays.fill( rowAnyOne[i],false );
522            //              }
523                    }
524    
525                    DBColumn dbColumn = null;       // 5.4.3.4 (2012/01/12) isColumnLabel 対å¿?
526                    Enumeration<?> enume = getParameterNames();               // 4.3.3.6 (2008/11/15) Generics警告対å¿?
527                    while( enume.hasMoreElements() ) {
528                            String key  = (String)(enume.nextElement());
529                            int    idx  = key.lastIndexOf(HybsSystem.JOINT_STRING);
530    
531                            if( idx > 0 ) {
532                                    String column = key.substring(0,idx);
533                                    int    row    = Integer.parseInt( key.substring(idx + 2) );
534                                    // String val    = getRequestValue( key );
535                                    String val    = getRequestValue( key, false ); // 5.0.0.2 (2009/09/15)
536    
537                                    int i = Arrays.binarySearch( rowNo,row );
538                                    if( i >= 0 ) {
539                                            // 5.4.3.4 (2012/01/12) isColumnLabel 対å¿?
540                                            dbColumn = null;
541                                            if( isColumnLabel && table != null ) {
542                                                    int clmNo = table.getColumnNo( column,false );  // エラーをå?さなã�??
543                                                    if( clmNo >= 0 ) {
544                                                            dbColumn = table.getDBColumn( clmNo );
545                                                    }
546                                            }
547                                            if( dbColumn == null ) {
548                                                    dbColumn = getDBColumn( column );
549                                            }
550    
551                                            String val2 = dbColumn.valueSet( val );
552                                            errMsg.append( row+1,dbColumn.valueCheck( val2 ) );
553                                            if( nullCheck != null && nullCheck.length != 0 ) {
554                                                    int j = Arrays.binarySearch( nullCheck,column );
555                                                    if( j>=0 && ( val2 == null || val2.length() == 0 )) {
556                                                            // ERR0012 : æŒ?®šã?ãƒ??タがセãƒ?ƒˆされてã�?�¾せんã€?NULLエラー)。key={0}
557                                                            errMsg.addMessage( row+1,ErrorMessage.NG,"ERR0012",dbColumn.getLabel() );
558                                                    }
559                                            }
560                                            // 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
561                                            if( rowAnyOne != null ) {
562                                                    for( int j=0; j<mustAnyCheck.length; j++ ) {
563                                                            if( !rowAnyOne[i][j] &&
564                                                                    mustAnyCheck[j].indexOf( column ) >= 0 &&
565                                                                    val2 != null && val2.length() > 0 ) {
566                                                                            rowAnyOne[i][j] = true; // どれかが存在
567                                                            }
568                                                    }
569                                                    // 4.3.6.4 (2009/05/01)
570                                                    rowForCheck[i] = true;
571                                            }
572    
573                                            // 4.0.0 (2005/11/30) 正規表現チェãƒ?‚¯の追åŠ?
574                                            if( matchKeys != null && matchKeys.length != 0 ) {
575                                                    for( int j=0; j<matchKeys.length; j++ ) {
576                                                            if( column.equals( matchKeys[j] ) ) {
577                                                                    if( val2 != null && ! val2.matches( matchVals[j] ) ) {
578                                                                            // 互換性はなくなってã�?‚‹がã?正規表現チェãƒ?‚¯は余り使ってã�?�ªã�??で、統ä¸?�—ておくã€?
579                                                                            // 5.4.3.4 (2012/01/12) isColumnLabel 対å¿?
580                                                                            dbColumn = null;
581                                                                            if( isColumnLabel && table != null ) {
582                                                                                    int clmNo = table.getColumnNo( column,false );  // エラーをå?さなã�??
583                                                                                    if( clmNo >= 0 ) {
584                                                                                            dbColumn = table.getDBColumn( clmNo );
585                                                                                    }
586                                                                            }
587                                                                            if( dbColumn == null ) {
588                                                                                    dbColumn = getDBColumn( column );
589                                                                            }
590    
591                                                                            // ERR0037 : ãƒ??タ整合æ?エラー。指定ã?キーは整合æ?チェãƒ?‚¯の結果マッチしませんでした。key={0} val={1} regex={2}
592                                                                            errMsg.addMessage( row+1,ErrorMessage.NG,"ERR0037",dbColumn.getLabel(),val2,matchVals[i] );
593                                                                    }
594                                                                    break;
595                                                            }
596                                                    }
597                                            }
598                                    }
599                            }
600                    }
601    
602                    // 3.8.0.9 (2005/10/17) 選択å¿?? mustAnyCheck のチェãƒ?‚¯追åŠ?
603                    if( rowAnyOne != null ) {
604                            for( int row=0; row<rowAnyOne.length; row++ ) {
605                                    // 4.3.6.4 (2009/05/01) 書込み可能行ã?みをå?ç�?�™ã‚?
606                                    if ( rowForCheck[row] ) {
607                                            for ( int i = 0; i < mustAnyCheck.length; i++ ) {
608                                                    if ( !rowAnyOne[row][i] ) {
609                                                            String[] mustSub = StringUtil.csv2Array( mustAnyCheck[i], '|' );
610    
611                                                            StringBuilder buf = new StringBuilder();
612                                                            buf.append( "row=[" ).append( rowNo[row]+1 ).append( "] " );
613                                                            for ( int j = 0; j < mustSub.length; j++ ) {
614                                                                    // ここの処ç�?� けã?他と異なるã?は、互換性重視ã?ためã€?選択å¿??は利用頻度が高いのでã€?
615                                                                    // 5.4.3.4 (2012/01/12) isColumnLabel 対å¿?
616                                                                    String label = null ;
617                                                                    if( isColumnLabel && table != null ) {
618                                                                            int clmNo = table.getColumnNo( mustSub[j],false );      // エラーをå?さなã�??
619                                                                            if( clmNo >= 0 ) {
620                                                                                    dbColumn = table.getDBColumn( clmNo );
621                                                                            }
622                                                                            if( dbColumn == null ) {
623                                                                                    dbColumn = getDBColumn( mustSub[j] );
624                                                                            }
625                                                                            label = dbColumn.getLabel();
626                                                                    }
627                                                                    else {
628                                                                            label = getResource().getLabel( mustSub[j] );           // 互換性のための処置ã€?
629                                                                    }
630                                                                    buf.append( label ).append( "|" );
631                                                            }
632                                                            // ERR0036 : 選択å¿??エラー。以下ã?ãƒ??タのå†?�©れかは入力してください。key={0}
633                                                            errMsg.addMessage( rowNo[row]+1, ErrorMessage.NG, "ERR0036", buf.toString() );
634                                                    }
635                                            }
636                                    }
637                            }
638                    }
639    
640                    return errMsg;
641            }
642    
643            /**
644             * ErrorMessageをセãƒ?ƒˆしますã?
645             * リクエストされた件数のæœ?¤§値に制限をåŠ?�ˆますã?
646             * ?‘件ã�?�‘にしたã�??合ã??Œé?常はViewでチェãƒ?‚¯ボックスを使用せずに
647             * ラジオボタンを使用してくださいã€?
648             *
649             * @param       errMsg  ErrorMessageオブジェクãƒ?
650             *
651             * @return      カラãƒ?‚­ー ??値 のエラーメãƒ?‚»ージオブジェクãƒ?
652             */
653            private ErrorMessage makeMaxRowCountErrorMessage( final ErrorMessage errMsg ) {
654                    if( maxRowCount < 0 ) { return errMsg; }     // 無制é™?
655    
656                    // 件数制限ã?チェãƒ?‚¯
657                    int[] rowNo = getParameterRows();
658                    int rowCount = rowNo.length ;
659                    if( rowCount > maxRowCount ) {
660                            // ERR0017 : 選択エラー。選択行数({0} 件)がã?æœ?¤§制限å?({1} 件)以上選ばれましたã€?
661                            String arg0 = String.valueOf( rowCount );
662                            String arg1 = String.valueOf( maxRowCount );
663                            errMsg.addMessage( 0,ErrorMessage.NG,"ERR0017",arg0,arg1 );
664                    }
665    
666                    return errMsg;
667            }
668    
669            /**
670             * ErrorMessageをセãƒ?ƒˆしますã?
671             * リクエストされた件数のæœ?°�å?に制限をåŠ?�ˆますã?
672             * ?‘件ã�?�‘にしたã�??合ã??Œé?常はViewでチェãƒ?‚¯ボックスを使用せずに
673             * ラジオボタンを使用してくださいã€?
674             *
675             * @param       errMsg  ErrorMessageオブジェクãƒ?
676             *
677             * @return      カラãƒ?‚­ー ??値 のエラーメãƒ?‚»ージオブジェクãƒ?
678             */
679            private ErrorMessage makeMinRowCountErrorMessage( final ErrorMessage errMsg ) {
680                    if( minRowCount < 0 ) { return errMsg; }     // 無制é™?
681    
682                    // 件数制限ã?チェãƒ?‚¯
683                    int[] rowNo = getParameterRows();
684                    int rowCount = rowNo.length ;
685                    if( rowCount < minRowCount ) {
686                            // ERR0018 : 選択エラー。選択行数({0} 件)がã?æœ?°�制限å?({1} 件)以下選ばれましたã€?
687                            String arg0 = String.valueOf( rowCount );
688                            String arg1 = String.valueOf( minRowCount );
689                            errMsg.addMessage( 0,ErrorMessage.NG,"ERR0018",arg0,arg1 );
690                    }
691    
692                    return errMsg;
693            }
694    
695            /**
696             * 【TAG】チェãƒ?‚¯すべきカラãƒ??をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしますã?
697             *
698             * @og.tag columns="AAA,BBB,CCC,DDD"
699             * åˆ?§£方法ã?ã€??常のパラメータ取得後に、CSVåˆ?§£しますã?
700             * "*" を指定すると、command="NEW" のときã?判定にすべてのリクエスト文字å?ã‚?
701             * チェãƒ?‚¯対象としますã?通常は、å¿?¦�å?ã�?�‘æŒ?®šしますが、動çš?‚«ラãƒ?�ªどの
702             * 場合ã?、カラãƒ?��を予めæŒ?®šできなã�?�Ÿめã?"*" でæŒ?®šできるようにしますã?
703             * そã?場合ã?"h_" , "hX_" , maxRowCount , command , pageSize , pagePlus ,
704             * GAMENID , BACK_JSPID , BACK_GAMENID の予ç´?ªžã?、対象から除きますã?
705             *
706             * @og.rev 3.5.6.2 (2004/07/05) 先に配å?にåˆ?§£してからリクエスト変数の値を取å¾?
707             * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSVåˆ?§£に戻しますã?
708             * @og.rev 5.4.3.4 (2012/01/12) command="NEW" のときã?動的カラãƒ?¯¾å¿? "*" ですべてのリクエスãƒ?
709             *
710             * @param   clms カラãƒ??(CSV形å¼?
711             */
712            public void setColumns( final String clms ) {
713                    columns = StringUtil.csv2Array( getRequestParameter( clms ) );
714                    if( columns.length == 0 ) { columns = null; }
715    
716                    // 5.4.3.4 (2012/01/12) command="NEW" のときã?動的カラãƒ?¯¾å¿? "*" ですべてのリクエスãƒ?
717                    if( columns != null && "*".equals( columns[0] ) ) {
718                            Set<String> clmSet = new TreeSet<String>();         // リクエストã?バラバラなので、とりあえずソートしてきますã?
719    
720                            Enumeration<?> enume = getParameterNames();               // Generics警告対å¿?
721                            while( enume.hasMoreElements() ) {
722                                    String clm  = (String)(enume.nextElement());
723                                    // 予ç´?ªž以外を登録しますã?
724                                    if( clm != null && !clm.isEmpty() && !clm.startsWith( "h_" ) && !clm.startsWith( "hX_" ) ) {
725                                            clmSet.add( clm );
726                                    }
727                            }
728                            // 予ç´?ªžを削除しますã?
729                            clmSet.remove( "maxRowCount" );
730                            clmSet.remove( "command" );
731                            clmSet.remove( "pageSize" );
732                            clmSet.remove( "pagePlus" );
733                            clmSet.remove( "GAMENID" );
734                            clmSet.remove( "BACK_JSPID" );
735                            clmSet.remove( "BACK_GAMENID" );
736    
737                            columns = clmSet.toArray( new String[clmSet.size()] );
738                    }
739            }
740    
741            /**
742             * 【TAG】NULL チェãƒ?‚¯すべきカラãƒ??をカンマ区åˆ?CSV形å¼?りでæŒ?®šしますã?
743             *
744             * @og.tag
745             * (must 属æ?のセãƒ?ƒˆにより、è?動å?ç�?�•れまã�?
746             * nullCheck="AAA,BBB,CCC,DDD"
747             * åˆ?§£方法ã?ã€??常のパラメータ取得後に、CSVåˆ?§£しますã?
748             *
749             * @og.rev 3.5.6.2 (2004/07/05) 先に配å?にåˆ?§£してからリクエスト変数の値を取å¾?
750             * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSVåˆ?§£に戻しますã?
751             *
752             * @param   clms カラãƒ??(CSV形å¼?
753             */
754            public void setNullCheck( final String clms ) {
755                    nullCheck = StringUtil.csv2Array( getRequestParameter( clms ) );
756                    if( nullCheck.length == 0 ) { nullCheck = null; }
757                    else {
758                            Arrays.sort( nullCheck );
759                    }
760            }
761    
762            /**
763             * 【TAG】選択å¿??カラãƒ?æŒ?®šã?カラãƒ??å†?œ€低ã?とつがNULLでなã�?ã‚?AA|BB|CC,XX|YY|ZZ" 形式でæŒ?®šしますã?
764             *
765             * @og.tag
766             * (mustAny 属æ?のセãƒ?ƒˆにより、è?動å?ç�?�•れまã�?
767             * è¤?•°のカラãƒ?±žæ?の値のã�?�¡、どれかã�?null でなã�??合ã?正常としã?
768             * すべてã�?null の場合を警告しますã?
769             *
770             *  例:mustAnyCheck="AA|BB|CC"
771             *      AA,BB,CC のカラãƒ?�§選択å¿??(すべてがnullならエラー)
772             *  例:mustAnyCheck="AA|BB|CC,XX|YY|ZZ"
773             *      AA,BB,CC のセãƒ?ƒˆと、XX,YY,ZZのセãƒ?ƒˆでそれぞれ選択å¿??ã€?
774             *  例:mustAnyCheck="AA|XX,AA|YY,AA|ZZ"
775             *      AA に値があれã?すべて成立ã?そうでなã�??合ã?、XX と YY と ZZ がすべてå¿??ã€?
776             *  例:mustAnyCheck="AA|BB,BB|CC,AA|CC"
777             *      AA,BB,CC のå†??どれか?’つがå¿??ã€?Aがæ?立すれã?BBかCCがå¿??。同様にã€?
778             *      BBがæ?立すれã?、AAかCCがå¿??ã€?
779             *
780             * 選択å¿??は、must と同様に、色づけを行う(query.jsp)画面では、mustAny 属æ?ã‚?
781             * セãƒ?ƒˆしますã?チェãƒ?‚¯を行う(result.jsp)画面では、columnCheck タグの
782             * mustAnyCheck 属æ?にã€?�¸択å¿??カラãƒ?‚’æŒ?®šしますã?(上記参照)
783             * column タグ等ã? mustAny 属æ?に、mustAny="true" とセãƒ?ƒˆすると、生成される
784             * HTMLは、class="mustAny" がå?力されますã?エンジン標準では、default.css に
785             * .mustAny が定義されてã�?�¾すã?( background-color: #CCFFFF; )
786             * なおã?mustAny 属æ?に、true 以外ã?値をセãƒ?ƒˆした場å�?mustAny="XYZ")はã€?
787             * 生æ?されるHTMLに、class="XYZ" がå?力されますã?これは、è¤?•°のグループ間で
788             * 色を変えてã€?�¸択å¿??を指定するå?合に使用しますã?色は、custom/custom.css
789             * でæŒ?®šしますã?
790             * åˆ?§£方法ã?ã€??常のパラメータ取得後に、CSVåˆ?§£しますã?
791             *
792             * @og.rev 3.8.0.9 (2005/10/17) 新規追åŠ?
793             * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSVåˆ?§£に戻しますã?
794             *
795             * @param   clms 選択å¿??カラãƒ?
796             */
797            public void setMustAnyCheck( final String clms ) {
798                    mustAnyCheck = StringUtil.csv2Array( getRequestParameter( clms ) );
799                    if( mustAnyCheck.length == 0 ) { mustAnyCheck = null; }
800                    else {
801                            Arrays.sort( mustAnyCheck );
802                    }
803            }
804    
805            /**
806             * 【TAG】コマンド[NEW/RENEW/ENTRY]をセãƒ?ƒˆしまã�?初期値:NEW)ã€?
807             *
808             * @og.tag
809             * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,CMD_xxx で設定される
810             * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
811             * 何も設定されなã�??またã?、null の場合ã?ã€?NEW" がå?期å?にセãƒ?ƒˆされますã?
812             *
813             * @param       cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
814             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ColumnCheckTag.CMD_NEW">コマンド定数</a>
815             */
816            public void setCommand( final String cmd ) {
817                    String cmd2 = getRequestParameter( cmd );
818                    if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
819            }
820    
821            /**
822             * 【TAGã€?チェãƒ?‚¯対象のãƒ??タ[AUTO/NEW/ENTRY]を指定しまã�?初期値:AUTO)ã€?
823             *
824             * @og.tag
825             * 通常のリクエストデータは、キーそã?もã?ですが,エントリãƒ??タは表形式ã?
826             * ãƒ??タをä¸?‹¬で登録する為ã€?キー??__" ??行番号)形式を、バラすå¿?¦�がありますã?
827             *
828             * ENTRY は、DBTableModelのリクエスト情報をチェãƒ?‚¯しますã?
829             * これは、å?ãƒ??タが対象になりますã?(columns/nullCheck 属æ?は無効)
830             * AUTO は、command がã?上è¨?NEW ã�?ENTRY かを判断して処ç�?‚’振りå?けますã?
831             * 初期値は、AUTO ですã?
832             *
833             * @param   flag チェãƒ?‚¯対象のãƒ??タ(AUTO,NEW,ENTRY)
834             */
835            public void setCheckType( final String flag ) {
836                    String ct = getRequestParameter( flag );
837                    if( ct != null && ct.length() > 0 ) { checkType = ct ; }
838            }
839    
840            /**
841             * 【TAG】チェãƒ?‚¯で選択された行数のæœ?¤§値を設定しますã?
842             *
843             * @og.tag
844             * æœ?¤§選択件数をè¶?�ˆたå?合ã?,エラーメãƒ?‚»ージを返しますã?
845             * 例えばã€?¼‘件のみを正常とする場合ã?、maxRowCount="1" としますã?
846             *
847             * @param   count 制限をかけたい行数(こã?件数と同じ場合ã?正常 )
848             */
849            public void setMaxRowCount( final String count ) {
850                    maxRowCount = nval( getRequestParameter( count ),maxRowCount );
851            }
852    
853            /**
854             * 【TAG】チェãƒ?‚¯で選択された行数のæœ?°�å?を設定しますã?
855             *
856             * @og.tag
857             * æœ?°�選択件数をè¶?�ˆなã�??合ã?、エラーメãƒ?‚»ージを返しますã?
858             * 例えばã€?¼‘件のみを正常とする場合ã?、minRowCount="1" としますã?
859             *
860             * @param   count 制限をかけたい行数(こã?件数と同じ場合ã?正常 )
861             */
862             public void setMinRowCount( final String count ) {
863                    minRowCount = nval( getRequestParameter( count ), minRowCount );
864             }
865    
866            /**
867             * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
868             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
869             *
870             * @og.tag
871             * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
872             * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
873             * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
874             * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
875             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
876             *
877             * @param       id sessionに登録する時ã? ID
878             */
879            public void setTableId( final String id ) {
880                    tableId = nval( getRequestParameter( id ),tableId );
881            }
882    
883            /**
884             * 【TAG】正規表現でのマッチングを行うカラãƒ??をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしますã?
885             *
886             * @og.tag matchKeys="AAA,BBB,CCC,DDD"
887             * matchKeys属æ?とmatchVals属æ?の個数は、同じでなければなりませんã€?
888             * 先に配å?にåˆ?§£してからリクエスト変数の値を取得するよã�?�«しますã?
889             * こうする事で、リクエストにカンマ区åˆ?‚Šの値を設定できるようになりますã?
890             *
891             * @og.rev 4.0.0.0 (2005/11/30) 新規作æ?
892             *
893             * @param   keys カラãƒ??(CSV形å¼?
894             * @see     #setMatchVals( String )
895             */
896            public void setMatchKeys( final String keys ) {
897                    matchKeys = getCSVParameter( keys );
898    
899                    if( matchVals != null && matchKeys.length != matchVals.length ) {
900                            String errMsg = "matchKeys属æ?とmatchVals属æ?の個数が合ã�?�¾せんã€?
901                                                    + HybsSystem.CR
902                                                    + " matchKeys=[" + matchKeys.length + "]:KEYS="
903                                                    + StringUtil.array2csv( matchKeys ) + HybsSystem.CR
904                                                    + " matchVals=[" + matchVals.length + "]:VLAS="
905                                                    + StringUtil.array2csv( matchVals ) + HybsSystem.CR ;
906                            throw new HybsSystemException( errMsg );
907                    }
908            }
909    
910            /**
911             * 【TAG】正規表現でのマッチングを行うカラãƒ??に対する値(正規表現)をカンマ区åˆ?‚Š(CSV形å¼?でæŒ?®šしますã?
912             *
913             * @og.tag matchVals="AAA,BBB,CCC,DDD"
914             * matchKeys属æ?とmatchVals属æ?の個数は、同じでなければなりませんã€?
915             * 先に配å?にåˆ?§£してからリクエスト変数の値を取得するよã�?�«しますã?
916             * こうする事で、リクエストにカンマ区åˆ?‚Šの値を設定できるようになりますã?
917             *
918             * @og.rev 4.0.0.0 (2005/11/30) 新規作æ?
919             *
920             * @param   vals カラãƒ??に対する値(正規表現)(CSV形å¼?
921             * @see     #setMatchKeys( String )
922             */
923            public void setMatchVals( final String vals ) {
924                    matchVals = getCSVParameter( vals );
925    
926                    if( matchKeys != null && matchKeys.length != matchVals.length ) {
927                            String errMsg = "matchKeys属æ?とmatchVals属æ?の個数が合ã�?�¾せんã€?
928                                                    + HybsSystem.CR
929                                                    + " matchKeys=[" + matchKeys.length + "]:KEYS="
930                                                    + StringUtil.array2csv( matchKeys ) + HybsSystem.CR
931                                                    + " matchVals=[" + matchVals.length + "]:VLAS="
932                                                    + StringUtil.array2csv( matchVals ) + HybsSystem.CR ;
933                            throw new HybsSystemException( errMsg );
934                    }
935            }
936    
937            /**
938             * 【TAGã€?通常使ã�?�¾せん)リアルタイãƒ?ƒ�ェãƒ?‚¯を行う場合に有効にしますã?
939             *
940             * @og.tag
941             * リアルタイãƒ?ƒ�ェãƒ?‚¯を行う場合に有効にする属æ?ですã?
942             * trueが指定された場合ã?通常のチェãƒ?‚¯と比è¼?�—、以下ã?差異がありますã?
943             * â‘?‚¨ラー結果を簡易フォーマットで出力しますã?
944             *   (ViewFormType="HTMLSimpleErrorList"で表示されますã?)
945             *   こã?簡易フォーマットで出力したå?合ã?、ラベル(短)の定義で出力されã?
946             *   カラãƒ?��ã‚?ƒ‡ータ等ã?出力されませんã€?
947             * ②must,mustAny属æ?のチェãƒ?‚¯を行いませんã€?
948             *   å¿??及ã?選択å¿??は、視覚的に判別できるため、リアルタイãƒ?ƒ�ェãƒ?‚¯の
949             *   対象外としますã?
950             *
951             * @og.rev 4.3.3.0 (2008/10/01) 新規作æ?
952             * @og.rev 4.3.7.0 (2009/06/01) viewSimple属æ?名称変更 â‡?isRealTime
953             *
954             * @param   flg 簡易表示を行うかどã�?�‹
955             */
956            public void setRealTime( final String flg ) {
957                    isRealTime = nval( getRequestParameter( flg ),isRealTime );
958            }
959    
960            /**
961             * 【TAG】NEWの場合に、厳å¯?�«チェãƒ?‚¯するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
962             *
963             * @og.tag
964             * ãƒ??タをチェãƒ?‚¯するに当たりã?あいまã�?¤œ索などで厳å¯?�«チェãƒ?‚¯すると
965             * エラーになるケースがあるためã?command="NEW" のチェãƒ?‚¯時には、甘ã�?›®の
966             * チェãƒ?‚¯を行ってã�?�¾すã?DBColumn#valueCheck( String , false )
967             * command="ENTRY" のチェãƒ?‚¯は、厳å¯?�ªチェãƒ?‚¯ですã?
968             * こã?フラグは、検索時でもã?厳å¯?�ªチェãƒ?‚¯を行いたい場合に、true をセãƒ?ƒˆしますã?
969             *
970             * @og.rev 5.2.2.0 (2010/11/01) 新規作æ?
971             *
972             * @param   flg 厳å¯?�«チェãƒ?‚¯するかどã�?�‹ [true:厳å¯?false:甘い]
973             */
974            public void setUseStrict( final String flg ) {
975                    isStrict = nval( getRequestParameter( flg ),isStrict );
976            }
977    
978            /**
979             * 【TAG】カラãƒ?ƒ©ベルを使用するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
980             *
981             * @og.tag
982             * カラãƒ?ƒ©ベルはラベルローãƒ??を利用せずにアプリケーション側で
983             * 追åŠ?�—たラベルをResourceManagerにキャãƒ?‚·ュしてã�?‚‹æ‰?�‹ら取りå?ã�?
984             * かどã�?�‹を指定しますã?
985             * カラãƒ?ƒ©ベルに存在しなã�??合ã?ã€??常のラベルから検索しますã?
986             *
987             * @og.rev 5.4.3.4 (2012/01/12) 新規作æ?
988             *
989             * @param   flg カラãƒ?ƒ©ベルを使用するかどã�?�‹ true:する/false:しない]
990             */
991            public void setUseColumnLabel( final String flg ) {
992                    isColumnLabel = nval( getRequestParameter( flg ),isColumnLabel );
993            }
994    
995            /**
996             * 【TAG】リクエスト変数の正規化を行うカラãƒ?‚’CSV形式でè¤?•°æŒ?®šしますã?
997             *
998             * @og.tag
999             * カラãƒ?ƒ�ェãƒ?‚¯で正規化が行われてã�?�ªã�??ラグインに対して強制çš?�«正規化を行いますã?
1000             * こã?属æ?を利用したチェãƒ?‚¯を行ったå?合ã?、queryタグでPL/SQLを動作させる場合にã‚?
1001             * 同名属æ?でカラãƒ??æŒ?®šを行うå¿?¦�がありますã?
1002             * (queryタグでcheckNamesを利用しなã�??合ã?こã?属æ?はnullにしてください)
1003             * こã?属æ?はチェãƒ?‚¯タイプがNEWの場合ã?み有効ですã?
1004             * リアルタイãƒ?ƒ�ェãƒ?‚¯でこã?機è?を利用したã�??合ã?、columnTag等ã?optionAttributes
1005             * 属æ?にrtOption='checkNames=VIEW_DATE'のように記述してくださいã€?
1006             *
1007             * @og.rev 5.4.3.8 (2012/01/24) 新規追åŠ?
1008             * @og.rev 5.4.4.0 (2012/02/01) コメント修正
1009             * @og.rev 5.6.9.4 (2013/10/31) 空白削除を行う
1010             *
1011             * @param       nm リクエスト変数の正規化を行うカラãƒ?
1012             */
1013            public void setCheckNames( final String nm ) {
1014                    checkNames = StringUtil.deleteWhitespace( nval( getRequestParameter( nm ),checkNames ) ); // 5.6.9.4 (2013/10/31)
1015            }
1016    
1017            /**
1018             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
1019             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
1020             *
1021             * @return こã?クラスのæ–?­—å?表現
1022             */
1023            @Override
1024            public String toString() {
1025                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
1026                                    .println( "VERSION"                     ,VERSION                )
1027                                    .println( "tableId"                     ,tableId                )
1028                                    .println( "command"                     ,command                )
1029                                    .println( "columns"                     ,columns                )
1030                                    .println( "nullCheck"           ,nullCheck              )
1031                                    .println( "mustAnyCheck"        ,mustAnyCheck   )
1032                                    .println( "maxRowCount"         ,maxRowCount    )
1033                                    .println( "minRowCount"         ,minRowCount    )
1034                                    .println( "checkType"           ,checkType              )
1035                                    .println( "matchKeys"           ,matchKeys              )
1036                                    .println( "matchVals"           ,matchVals              )
1037                                    .println( "realTime"            ,isRealTime             )
1038                                    .println( "bodyString"          ,StringUtil.htmlFilter( bodyString ) )
1039                                    .println( "Other..."            ,getAttributes().getAttribute() )
1040                                    .fixForm().toString() ;
1041            }
1042    }