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 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.IOException;
021import java.io.ObjectInputStream;
022import java.io.ObjectOutputStream;
023import java.net.InetAddress;
024import java.net.UnknownHostException;
025// import java.text.DateFormat;
026// import java.text.SimpleDateFormat;
027import java.util.Arrays;
028// import java.util.Calendar;
029import java.util.Collections;
030import java.util.Enumeration;
031import java.util.HashMap;
032import java.util.Locale;
033import java.util.Map;
034
035import javax.servlet.ServletContext;
036import javax.servlet.ServletRequest;
037import javax.servlet.http.Cookie;
038import javax.servlet.http.HttpServletRequest;
039import javax.servlet.http.HttpServletResponse;
040import javax.servlet.http.HttpSession;
041import javax.servlet.jsp.JspWriter;
042import javax.servlet.jsp.tagext.BodyContent;
043import javax.servlet.jsp.tagext.BodyTagSupport;
044import javax.servlet.jsp.tagext.TryCatchFinally;
045
046import org.opengion.fukurou.db.DBFunctionName;
047import org.opengion.fukurou.util.ApplicationInfo;
048import org.opengion.fukurou.util.Attributes;
049import org.opengion.fukurou.util.StringUtil;
050import org.opengion.fukurou.util.SystemParameter;
051import org.opengion.fukurou.util.HybsDateUtil;
052import org.opengion.hayabusa.common.HybsSystem;
053import org.opengion.hayabusa.common.HybsSystemException;
054import org.opengion.hayabusa.db.DBColumn;
055import org.opengion.hayabusa.db.DBEventColumn;
056import org.opengion.hayabusa.db.DBLastSql;
057import org.opengion.hayabusa.db.DBTableModel;
058import org.opengion.hayabusa.resource.GUIInfo;
059import org.opengion.hayabusa.resource.LabelInterface;
060import org.opengion.hayabusa.resource.ResourceFactory;
061import org.opengion.hayabusa.resource.ResourceManager;
062import org.opengion.hayabusa.resource.UserInfo;
063
064/**
065 * TagSupport から継承されたサブクラスです。
066 *
067 * 汎用属性 のsetterメソッドと、Attributes オブジェクトを持っています。
068 * それ以外に、{@XXXX} 変数の対応と、lang属性のメソッドも用意しています。
069 *
070 * ロケールは、ユーザー情報の lang 属性をデフォルトで使用し、
071 * セットされていない場合は、リクエスト情報のロケールから取得します。
072 *
073 * 各属性は、{@XXXX} 変数が使用できます。
074 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に
075 * 割り当てます。つまり、このXXXXをキーにリクエストすれば、
076 * この変数に値をセットすることができます。
077 *
078 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2
079 *
080 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。
081 *
082 * このタグは、ラベル部分と入力フィールド部分がテーブルタグの<td>
083 * により左右に分割されます。HTML 表示時は、前後に<tr>タグで囲って,
084 * 整形できます。
085 *
086 * @og.group 画面制御
087 *
088 * @version  4.0
089 * @author   Kazuhiko Hasegawa
090 * @since    JDK5.0,
091 */
092class CommonTagSupport extends BodyTagSupport implements TryCatchFinally {
093        private static final long serialVersionUID = 574220140320L ;    // 5.7.4.2 (2014/03/20)
094
095        private transient Attributes            attri           = new Attributes();
096        private transient ResourceManager       resource        = null;
097        private transient UserInfo                      userInfo        = null;
098        private transient GUIInfo                       guiInfo         = null;
099        private transient HttpSession           session         = null;
100        private transient ServletRequest        request         = null;
101        private transient Map<String,String[]>    requestCache = null;            // 3.5.6.2 (2004/07/05)
102        private transient LabelInterface        msglbl      = null;                     // 4.0.0 (2005/01/31)
103        private String                          language        = null;
104        private boolean                         debugFlag       = false;                // 3.5.5.3 (2004/04/09)
105        private boolean                         isReqNull       = false;
106        private boolean                         quotCheck       = false;                // 4.0.0 (2005/08/31)
107        private String                          scope           = "session";    // "request","page","session","applicaton"
108        // 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
109//      private boolean             useValue    = true;                 // 5.1.8.0 (2010/07/01) useValue 属性廃止
110        private Long                            startTransaction = null;        // 3.6.0.8 (2004/11/19)
111        private int[]                           rowNo           = null;                 // 4.0.0 (2005/01/31)
112//      private Calendar                        rightNow        = null;                 // 3.8.0.2 (2005/07/11)
113//      private String                          rightNow        = null;                 // 5.5.7.2 (2012/10/09) 初期値をCalendarでなくStringで持つ。5.7.4.1 (2014/03/14) 廃止
114        private boolean                         xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15)
115//      private boolean                         useMainTrans    = false;                // 5.1.6.0 (2010/05/01)
116        private boolean                         useTrans        = false;                // 5.1.6.0 (2010/05/01)
117
118        private String                          caseKey         = null;                 // 5.2.2.0 (2010/11/01) 新規追加
119        private String                          caseVal         = null;                 // 5.2.2.0 (2010/11/01) 新規追加
120        private boolean                         caseNN          = true;                 // 5.6.7.0 (2013/07/27) 新規追加
121        private boolean                         caseNull        = true;                 // 5.6.8.0 (2013/09/06) 新規追加
122
123        private boolean                         isSanitized     = false;                // 5.7.4.2 (2014/03/20) 新規追加
124
125        // 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため、廃止します。
126//      private static final Map<String,String>   DATE_FORMAT = new HashMap<String,String>();       // 3.8.0.2 (2005/07/11)
127//      static {
128//              DATE_FORMAT.put( "YMD"          ,"yyyyMMdd"                             );
129//              DATE_FORMAT.put( "Y2MD"         ,"yyMMdd"                               );
130//              DATE_FORMAT.put( "YM"           ,"yyyyMM"                               );
131//              DATE_FORMAT.put( "MD"           ,"MMdd"                                 );      // 5.5.5.2 (2012/08/18)
132//              DATE_FORMAT.put( "HMS"          ,"HHmmss"                               );
133//              DATE_FORMAT.put( "YMDHMS"       ,"yyyyMMddHHmmss"               );
134//              DATE_FORMAT.put( "EEE"          ,"EEE"                                  );
135//              DATE_FORMAT.put( "YMDF"         ,"yyyy/MM/dd"                   );
136//              DATE_FORMAT.put( "Y2MDF"        ,"yy/MM/dd"                     );
137//              DATE_FORMAT.put( "YMF"          ,"yyyy/MM"                              );
138//              DATE_FORMAT.put( "HMSF"         ,"HH:mm:ss"                     );
139//              DATE_FORMAT.put( "YMDHMSF"      ,"yyyy/MM/dd HH:mm:ss" );
140//              DATE_FORMAT.put( "MDF"          ,"MM/dd"                                ); // 5.5.0.2 (2012/03/09) 和暦
141//              DATE_FORMAT.put( "MDEF"         ,"MM/dd(EEE)"                   ); // 5.5.0.2 (2012/03/09) 和暦
142//              DATE_FORMAT.put( "MD2F"         ,"MM月dd日"                               ); //                                                           5.5.5.2 (2012/08/18) 和暦
143//              DATE_FORMAT.put( "GYMDF"        ,"GGGGyyyy年MM月dd日"      ); // 5.5.0.2 (2012/03/09) 和暦
144//              DATE_FORMAT.put( "G2YMDF"       ,"Gyyyy/MM/dd"                  ); // 5.5.0.2 (2012/03/09) 和暦
145//              DATE_FORMAT.put( "GYMF"         ,"GGGGyyyy年MM月"         ); // 5.5.0.2 (2012/03/09) 和暦
146//              DATE_FORMAT.put( "GYF"          ,"GGGGyyyy"                     ); // 5.5.0.2 (2012/03/09) 和暦
147//      }
148
149        /**
150         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
151         *
152         * @return      後続処理の指示(SKIP_BODY)
153         */
154        @Override
155        public int doStartTag() {
156                return(SKIP_BODY);                              // Body を評価しない
157        //      return( EVAL_BODY_INCLUDE );    // Body インクルード( extends TagSupport 時)
158        //      return( EVAL_BODY_BUFFERED );   // Body を評価する。( extends BodyTagSupport 時)
159        }
160
161        /**
162         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
163         *
164         * @return      後続処理の指示(SKIP_BODY)
165         */
166        @Override
167        public int doAfterBody() {
168                return(SKIP_BODY);                              // Body を評価しない
169        //      return( EVAL_BODY_AGAIN );              // ボディーを再評価( extends TagSupport 時)
170        //      return( EVAL_BODY_BUFFERED );   // ボディーを再評価( extends BodyTagSupport 時)
171        }
172
173        /**
174         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
175         *
176         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
177         *
178         * @return      後続処理の指示
179         */
180        @Override
181        public int doEndTag() {
182                debugPrint();           // 4.0.0 (2005/02/28)
183
184                return(EVAL_PAGE);              // ページの残りを評価する。( extends TagSupport 時)
185        //      return(SKIP_PAGE);              // ページの残りの処理を行わない。
186        }
187
188        /**
189         * タグの処理中(セッターメソッドを除く)の例外を全て受け取ります。
190         *
191         * タグの中のボディ部の評価中、または Tag.doStartTag(), Tag.doEndTag(),
192         * IterationTag.doAfterBody(), BodyTag.doInitBody() のいずれもの
193         * メソッドの中で、Throwableが投げられたときに呼び出されます。
194         *
195         * このメソッドはセッターメソッドの中でThrowableが起きた場合は呼び出されません。
196         *
197         * @og.rev 3.5.0.0 (2003/09/17) TryCatchFinally インターフェースを適用。
198         *
199         * @param       th      このタグを通過してきたThrowableな例外
200         */
201        @Override
202        public void doCatch(final Throwable th) throws Throwable {
203                throw th;
204        }
205
206        /**
207         * タグの処理毎の、doEndTag()の後で呼び出されます。
208         *
209         * Tag,IterationTag,BodyTagを実装した全てのクラスの doEndTag()の
210         * 後で呼び出されます。 このメソッドはタグのボディ部や Tag.doStartTag(),
211         * Tag.doEndTag(), IterationTag.doAfterBody() ,BodyTag.doInitBody()の
212         * すべてのメソッドで例外が発生した後でも呼び出されます。
213         *
214         * このメソッドはセッターメソッドの中でThrowableが起きた場合は呼び出されません。
215         *
216         * このメソッドからは例外を投げるべきではありません。
217         * このメソッドは呼び出し毎のデータの整合性をとることとリソース管理の
218         * 動作をさせることを意図しています。
219         *
220         * @og.rev 3.5.0.0 (2003/09/17) TryCatchFinally インターフェースを適用。
221         *
222         */
223        @Override
224        public void doFinally() {
225                release2();
226        }
227
228        /**
229         * タグリブオブジェクトをリリースします。
230         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
231         *
232         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
233         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
234         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。
235         * @og.rev 3.1.3.0 (2003/04/10) エンコード情報の取得を廃止する。
236         * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
237         * @og.rev 3.5.5.3 (2004/04/09) debugFlag を、String ではなく、boolean 型に変更
238         * @og.rev 3.6.0.8 (2004/11/19) startTransaction 属性を追加
239         * @og.rev 3.8.0.2 (2005/07/11) rightNow 属性を追加
240         * @og.rev 5.0.0.2 (2009/09/15) XSS対応
241         * @og.rev 5.1.6.0 (2010/05/01) DBLastSQL周りの実装見直し
242         * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止
243         * @og.rev 5.2.2.0 (2010/11/01) caseKey、caseVal 属性の追加
244         * @og.rev 5.3.2.0 (2011/02/01) paramNames 属性の追加
245         * @og.rev 5.6.7.0 (2013/07/27) caseNN 属性の追加
246         * @og.rev 5.6.8.0 (2013/09/06) caseNull 属性の追加
247         * @og.rev 5.7.4.1 (2014/03/14) rightNow 属性 廃止
248         * @og.rev 5.7.4.1 (2014/03/14) isSanitized 属性の追加
249         */
250        protected void release2() {
251                language        = null;
252                attri           = new Attributes();
253                resource        = null;
254                debugFlag       = false;                // 3.5.5.3 (2004/04/09)
255                userInfo        = null;
256                guiInfo         = null;
257                session         = null;
258                request         = null;
259                isReqNull       = false;
260                scope           = "session";    // "request","page","session","applicaton"
261                requestCache = null;
262//              useValue        = true;
263                startTransaction = null;        // 3.6.0.8 (2004/11/19)
264                rowNo           = null;                 // 4.0.0 (2005/01/31)
265                msglbl          = null;                 // 4.0.0 (2005/01/31)
266//              rightNow        = null;                 // 3.8.0.2 (2005/07/11) 追加 , 5.7.4.1 (2014/03/14) 廃止
267                quotCheck       = false;                // 4.0.0 (2005/08/31)
268                xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15)
269                useTrans        = false;                // 5.1.6.0 (2010/05/01)
270                caseKey         = null;                 // 5.2.2.0 (2010/11/01)
271                caseVal         = null;                 // 5.2.2.0 (2010/11/01)
272                caseNN          = true;                 // 5.6.7.0 (2013/07/27) 新規追加
273                caseNull        = true;                 // 5.6.8.0 (2013/09/06) 新規追加
274                isSanitized     = false;                // 5.7.4.2 (2014/03/20) 新規追加。一応入れておくが都度、初期化しています。
275        }
276
277        /**
278         * 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します。
279         *
280         * @og.tag
281         * この言語コードに基づいて、表示のラベルをリソースから作成します。
282         *
283         * @param   lang 言語コード[ja/en/zh/…]
284         * @see         #getLanguage()
285         */
286        public void setLanguage( final String lang ) {
287                language = getRequestParameter( lang );
288        }
289
290        /**
291         * 言語コード[ja/en/zh/…]を取得します。
292         *
293         * 言語コードが、セットされている場合は,設定値を優先します。
294         * 設定されていない場合は、ログインユーザーの持つLANG属性を、それが null の場合は、
295         * 実行環境のリクエストの言語を返します。
296         *
297         * @og.rev 2.1.1.0 (2002/11/08) セッション情報から取得できない場合に、クライアントの
298         *                      リクエスト情報のロケールから取得する処理を追加
299         * @og.rev 2.2.0.0 (2002/12/17) セッション情報から取得するのではなく、ユーザー情報より
300         *                      取得するように変更。そこにない場合は、リクエスト情報の
301         *                      ロケールから取得する
302         *
303         * @return   言語コード[ja/en/zh/…]
304         * @see         #setLanguage( String )
305         */
306        protected String getLanguage() {
307                if( language == null ) {
308                        language = getUser().getLang();
309                        if( language == null ) {
310                                language = getRequest().getLocale().getLanguage();
311                        }
312                }
313
314                if( language != null ) {
315                        return language ;
316                }
317
318                String errMsg = "言語コードがセットされていません。" ;
319                throw new HybsSystemException( errMsg );
320        }
321
322        /**
323         * 【TAG】ラベルリソースのラベルIDを指定します。
324         *
325         * @og.tag
326         * ラベルを変更するときに、lbl属性を使います。
327         *
328         * ラベルID は、所定の language に基づく ResourceManager の
329         * getLabelData( id ) を呼び出し、その結果のLabelInterfaceを使用します。
330         * getMsglbl() で取り出せます。
331         * ラベルとメッセージは統一されました。
332         *
333         * @og.rev 4.0.0.0 (2005/01/31) label 変数は、生データを保管するように変更。
334         *
335         * @param   lbl ラベルID
336         * @see         #getMsglbl()
337         */
338        public void setLbl( final String lbl ) {
339//              if( msglbl != null ) {
340//                      String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR
341//                                              + "msg=[" + msglbl + "] lbl=[" + lbl + "]";
342//                      throw new HybsSystemException( errMsg );
343//              }
344                msglbl = (LabelInterface)getResource().getLabelData( getRequestParameter( lbl ) ) ;             // 4.0.0 (2005/01/31)
345        }
346
347        /**
348         * 【TAG】メッセージリソースのメッセージIDを指定します。
349         *
350         * @og.tag
351         * メッセージID は、所定の language に基づく ResourceManager の
352         * getMessage( id ) を呼び出し、その結果を msglbl に登録します。
353         * getMsglbl() で取り出せます。
354         * ラベルIDとメッセージIDは同時には登録できません。
355         *
356         * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、廃止
357         *
358         * @param   msg メッセージID
359         */
360//      public void setMsg( final String msg ) {
361//              setLbl( msg );
362//              if( msglbl != null ) {
363//                      String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR
364//                                              + "msg=[" + msg + "] lbl=[" + msglbl + "]";
365//                      throw new HybsSystemException( errMsg );
366//              }
367//              msglbl = (LabelInterface)getResource().getMessageData( getRequestParameter( msg ) ) ;           // 4.0.0 (2005/01/31)
368//      }
369
370        /**
371         * 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)。
372         *
373         * @og.tag
374         * デバッグ情報を [true:出力する/false:しない]を指定します。
375         * 出力形式自体は、個々のタグによって異なります。
376         *
377         * @og.rev 3.5.5.3 (2004/04/09) debugFlag を、String ではなく、boolean 型に変更
378         *
379         * @param   flag  [true:出力する/それ以外:しない]
380         */
381        public void setDebug( final String flag ) {
382                debugFlag = nval( getRequestParameter( flag ),debugFlag );
383        }
384
385        /**
386         * 【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)。
387         *
388         * @og.tag
389         * "request","page","session","applicaton" が指定できます。
390         * JSPのスコープは、「変数の有効範囲」を表すもので、フレームワーク上では、
391         * 主にテーブルモデルを管理するスコープを指します。
392         *
393     * <table border="1" frame="box" rules="all" >
394     *   <caption>テーブルモデルを管理するスコープ変数の有効範囲</caption>
395     *   <tr><th>スコープ       </th><th>変数の有効範囲</th><th>説明</th></tr>
396     *   <tr><td>page               </td><td>JSPページ内</td>
397     *       <td>そのJSPページ内のみで有効です。フレームワーク的には、JSPページにまたがる処理が多いため、ほとんど使う機会はありません。</td></tr>
398     *   <tr><td>request    </td><td>HTTPリクエスト</td>
399     *       <td>リクエストの一連の処理期間中に有効な変数で、メモリに多くの情報を残したくない場合に利用します。検索系やポップアップのJSP画面等に利用します。</td></tr>
400     *   <tr><td>session    </td><td>HTTPセッション</td>
401     *       <td>初期設定されているスコープで、ログインユーザー単位にログアウトまで保持されます。
402     *           内部的には、同じキーワード(tableId)で管理しているため、検索都度、破棄されます。
403     *           (ガーベジコレクションにて破棄されるのを待ちます。)</td></tr>
404     *   <tr><td>application</td><td>Webアプリケーション</td>
405     *       <td>ユーザー間で共有する場合のスコープになります。JSP画面の開発では、まず使うことはありません。</td></tr>
406     * </table>
407     *
408         * @param  scp スコープ[request/page/session/applicaton]
409         * @see         #getScope()
410         */
411        public void setScope( final String scp ) {
412                scope = nval( getRequestParameter( scp ),scope );
413        }
414
415        /**
416         * キャッシュする場合のスコープ[request/page/session/applicaton]を返します。
417         *
418         * "request","page","session","applicaton" があります。
419         *
420         * @og.rev 3.5.5.8 (2004/05/20) 新規追加
421         *
422         * @return   スコープ[request/page/session/applicaton]
423         * @see         #setScope( String )
424         */
425        public String getScope() {
426                return scope ;
427        }
428
429        /**
430         * 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)。
431         *
432         * @og.tag
433         * caseKey.matches( caseVal ) の値が、true の場合は、このタグは使用されます。
434         * false の場合は、このタグは使用されません。
435         *
436         * caseKey , caseVal ともに null の場合は、true です。どちらかが、非null の場合は、
437         * もう片方も 非null で、かつ、caseKey.matches( caseVal ) が成立する必要があります。
438         * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。
439         *
440         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
441         * @og.rev 5.6.3.3 (2013/04/19) 条件変更のためのコメント修正
442         *
443         * @param       ckey 条件キー(何も指定されない場合は、使用すると判断)
444         * @see         #setCaseVal( String )
445         * @see         #useTag()
446         */
447        public void setCaseKey( final String ckey ) {
448                caseKey = nval( getRequestParameter( ckey ),caseKey );
449        }
450
451        /**
452         * 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)。
453         *
454         * @og.tag
455         * caseKey.matches( caseVal ) の値が、true の場合は、このタグは使用されます。
456         * false の場合は、このタグは使用されません。
457         *
458         * caseKey , caseVal ともに null の場合は、true です。どちらかが、非null の場合は、
459         * もう片方も 非null で、かつ、caseKey.matches( caseVal ) が成立する必要があります。
460         * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。
461         *
462         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
463         * @og.rev 5.6.3.3 (2013/04/19) 条件変更のためのコメント修正
464         *
465         * @param       cval 条件値(何も指定されない場合は、使用すると判断)
466         * @see         #setCaseKey( String )
467         * @see         #useTag()
468         */
469        public void setCaseVal( final String cval ) {
470                caseVal = nval( getRequestParameter( cval ),caseVal );
471        }
472
473        /**
474         * 【TAG】このタグ自体を利用するかどうかの条件として、NotNullかどうか判定します(初期値:true)。
475         *
476         * @og.tag
477         * この値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます。
478         * null/ゼロ文字列 の場合は、このタグは使用されません。
479         * 何も指定しない場合は、使用されます。
480         * caseNull と逆の動きをします。
481         * {&#064;XXXX} で、指定した場合は、値が設定されなければ、使用されません。
482         *
483         * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。
484         *
485         * @og.rev 5.6.7.0 (2013/07/27) 新規追加
486         *
487         * @param       cnn NotNullかどうか判定する属性(何も指定されない場合は、使用すると判断)
488         * @see         #setCaseVal( String )
489         * @see         #useTag()
490         */
491        public void setCaseNN( final String cnn ) {
492                String tempNN = nval( getRequestParameter( cnn ),null );
493
494                caseNN = ( tempNN != null && !tempNN.isEmpty() );
495        }
496
497        /**
498         * 【TAG】このタグ自体を利用するかどうかの条件として、Nullかどうか判定します(初期値:true)。
499         *
500         * @og.tag
501         * この値が、null/ゼロ文字列 の場合は、このタグは使用されます。
502         * null/ゼロ文字列 でない場合は、このタグは使用されません。
503         * 何も指定しない場合は、使用されます。
504         * caseNN と逆の動きをします。
505         * {&#064;XXXX} で、指定した場合は、値が設定されていなければ、使用されます。
506         *
507         * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。
508         *
509         * @og.rev 5.6.8.0 (2013/09/06) 新規追加
510         *
511         * @param       cnul NotNullかどうか判定する属性(何も指定されない場合は、使用すると判断)
512         * @see         #setCaseVal( String )
513         * @see         #useTag()
514         */
515        public void setCaseNull( final String cnul ) {
516                String tempNull = nval( getRequestParameter( cnul ),null );
517
518                caseNull = ( tempNull == null || tempNull.isEmpty() );
519        }
520
521        /**
522         * このタグ自体を利用するかどうかの条件判定を行います。
523         *
524         * caseNN &amp;&amp; caseNull &amp;&amp;
525         *    ( (caseKey == null &amp;&amp; caseVal == null) ||
526         *              (caseKey != null &amp;&amp; caseVal != null &amp;&amp; caseKey.matches( caseVal )))
527         * の結果を返します。
528         *
529         * これは、タグ本体に、条件式を登録できる機能です。必要なタグには、tld ファイルで、
530         * caseKey 、caseVal 、caseNN 、caseNull属性が使用できるように、設定します。
531         * 各タグを、equals タグで括る方法では、ソースの見通しが悪くなるため、
532         * ある程度タグ自身に判定機能を設けることで対応できるようにしました。
533         * ただ、本来、JSP 側にロジックを持ち込むのはよくないので、利用に関しては、
534         * 慎重にお願いします。
535         *
536         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
537         * @og.rev 5.6.3.3 (2013/04/19) 条件変更(caseKey と caseVal が 両方とも null の場合のみ true)
538         * @og.rev 5.6.7.0 (2013/07/27) caseNN 属性追加。先のcaseKey、caseVal 条件と、AND 結合になります。
539         * @og.rev 5.6.8.0 (2013/09/06) caseNull 属性追加。先の条件と、AND 結合になります。
540         *
541         * @return      このタグ自体を利用するかどうか(true:利用する/false:利用しない)
542         * @see         #setCaseVal( String )
543         * @see         #setCaseKey( String )
544         * @see         #setCaseNN( String )
545         */
546        protected boolean useTag() {
547//              return (caseKey == null) || (caseVal == null) || caseKey.matches( caseVal ) ;
548//              return (caseKey == null && caseVal == null) || (caseKey != null && caseVal != null && caseKey.matches( caseVal )) ;
549//              return caseNN &&
550                return caseNN && caseNull &&
551                                        ( (caseKey == null && caseVal == null) ||
552                                          (caseKey != null && caseVal != null && caseKey.matches( caseVal ))) ;
553        }
554
555        /**
556         * (通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。
557         *
558         * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが
559         * ファイルダウンロードの対象の表になります。
560         *
561         * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。
562         * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい
563         * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から
564         * 除外することができます。
565         *
566         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
567         *
568         * @param  flag メイントランザクションかどうか
569         */
570        protected void useMainTrans( final boolean flag ) {
571                useTrans = flag;
572        }
573
574        /**
575         * メッセージラベル(msglbl)を取得します。
576         *
577         * メッセージラベルは、lbl属性で登録された値を、
578         * それぞれのリソースに応じて各言語に変換した結果を格納しています。
579         *
580         * @og.rev 4.0.0.0 (2005/01/31) msglbl は、LabelInterface オブジェクトを利用
581         *
582         * @return   メッセージラベル
583         * @see         #setLbl( String )
584         */
585        protected String getMsglbl() {
586                String rtn = null;
587
588                if( msglbl != null ) { rtn = msglbl.getLabel(); }
589
590                return rtn ;
591        }
592
593        /**
594         * メッセージラベル(msglbl)のチップス表記を取得します。
595         *
596         * メッセージラベルは、lbl属性で登録された値を、
597         * それぞれのリソースに応じて各言語に変換した結果を格納しています。
598         * 別途、title属性を指定している場合は、置き換えます。
599         *
600         * @og.rev 4.0.0.0 (2005/01/31) msglbl は、LabelInterface オブジェクトを利用
601         *
602         * @return   メッセージラベル
603         */
604        protected String getLongLabel() {
605                String rtn = null;
606
607                if( msglbl != null ) {
608                        rtn = msglbl.getLongLabel( get( "title" ) );
609                }
610
611                return rtn ;
612        }
613
614        /**
615         * メッセージラベル(LabelInterface)を取得します。
616         *
617         * メッセージラベルは、lbl属性で登録された値を、
618         * それぞれのリソースに応じて各言語に変換した結果を格納しています。
619         *
620         * @return   メッセージラベル
621         */
622        protected LabelInterface getLabelInterface() {
623                return msglbl ;
624        }
625
626        /**
627         * メッセージリソース情報を処理します。
628         *
629         * これは、{&#064;MSG.XXXX AA &#064;BB #CC} 引数処理をおこなうための、サポートメソッドです。
630         * 引数は、"XXXX AA &#064;BB #CC" という状態で受け取ります。(MSG. ははずした形)
631         * "AA @BB #CC" は、スペースで区切られたメッセージリソースの引数文字です。
632         * この、引数文字には、通常文字(AA)、リクエスト文字(@BB)、ラベル文字(#CC)が指定できます。
633         * ・通常文字(AA):そのまま、メッセージリソースの引数にセットされます。
634         * ・リクエスト文字(&#064;BB):リクエスト引数に置き換えます。通常、{&#064;BB} 指定しますが、
635         *   メッセージパラメータの引数、{&#064;XXXX ・・・ {&#064;BB} ・・・} と、入れ子で指定できないため、
636         *   {&#064;XXXX ・・・ &#064;BB ・・・} と、省略形で指定します。よって、引数として、通常文字の
637         *   先頭に、"&#064;" を使用することは出来ません。
638         * ・ラベル文字(#CC):ラベルキーを指定されたと解釈して、処理します。これは、"CC"を
639         *   キーに、ラベルリソースを検索し、その言語に応じた文字に変換後、メッセージリソースの
640         *   引数に指定します。PL/SQL等で、SET_ERRMSGS プロシージャの引数に、{#CC} 文字を
641         *   指定して、ラベルリソースを利用できますが、{&#064;XXXX ・・・ {#CC} ・・・} と、入れ子で
642         *   指定できないため、{&#064;XXXX ・・・ #CC ・・・} と、省略形で指定します。
643         *   よって、引数として、通常文字の先頭に、"#" を使用することは出来ません。(エスケープ未採用)
644         * メッセージキーそのものをパラメータ化することが出来ます。
645         * これは、{&#064;MSG.&#064;XXXX}という形式になります。引数は、先の説明と同じです。
646         * この場合は、XXXX をキーにリクエスト引数の値が、メッセージリソースのキーになります。
647         *
648         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
649         * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、廃止
650         *
651         * @param       msg     パラメータ
652         *
653         * @return   メッセージ情報
654         */
655//      protected String getMessage( final String msg ) {
656//              String   key     = msg;
657//              String[] msgVals = null;
658//              int spc = msg.indexOf( ' ' );           // スペースがあるかどうか
659//              if( spc > 0 ) {
660//                      key     = msg.substring( 0,spc );
661//                      msgVals = StringUtil.csv2Array( msg.substring( spc+1 ),' ' );
662//                      for( int i=0; i<msgVals.length; i++ ) {
663//                              // リクエスト文字パラメータ時の処理。その他は、ラベル文字は処理不要。
664//                              if( msgVals[i].startsWith( "@" ) ) {
665//                                      msgVals[i] = getRequestValue( msgVals[i].substring( 1 ) );
666//                              }
667//                      }
668//              }
669//              if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); }
670//
671//              return getResource().getMessage( key,msgVals );
672//      }
673
674        /**
675         * メッセージラベル(msglbl)を設定します。
676         *
677         * メッセージラベルは、meg属性か、lbl属性で登録された値を、
678         * それぞれのリソースに応じて各言語に変換した結果を格納しています。
679         * meg属性 と lbl属性は、同時登録できません。
680         * ここで登録された値が、最優先されます。
681         * もちろん、protected メソッドなので、TagLib属性での登録はできません。
682         *
683         * @og.rev 5.2.2.0 (2010/11/01) メッセージリソース統合に伴い、廃止
684         *
685         * @param       lbl     メッセージラベル
686         */
687//      protected void setMsglbl( final String lbl ) {
688//              if( msglbl != null ) {
689//                      String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR
690//                                              + "label=[" + lbl + "] msglbl=[" + msglbl + "]";
691//                      throw new HybsSystemException( errMsg );
692//              }
693//              msglbl = (LabelInterface)getResource().getLabelData( getRequestParameter( lbl ) ) ;             // 4.0.0 (2005/01/31)
694//      }
695
696        /**
697         * ResourceManager を取得します。
698         *
699         * ページスコープ にセットされた ResourceManager があれば、それを、
700         * なければ、language 属性よりデフォルト ResourceManager を構築します。
701         * LOCAL_RES_KEY で管理される ResourceManager は、LocalResourceTag で
702         * 登録されたリソースです。これは、ローカルリソース情報として、使用されます。
703         *
704         * @return      ResourceManagerオブジェクト
705         */
706        protected ResourceManager getResource() {
707                if( resource == null ) {
708                        resource = (ResourceManager)pageContext.getAttribute( HybsSystem.LOCAL_RES_KEY );
709                        if( resource == null ) {
710                                resource = ResourceFactory.newInstance( getLanguage() );
711                        }
712                }
713                return resource;
714        }
715
716        /**
717         * デバッグ状態 を取得します。
718         *
719         * setDebug( String )で登録します。
720         * 初期値は、false です。
721         *
722         * @og.rev 3.5.5.3 (2004/04/09) getDebug() から、メソッド名変更
723         *
724         * @return   true(デバッグ状態)/ false(通常)
725         */
726        protected boolean isDebug() {
727                return debugFlag ;
728        }
729
730        /**
731         * ラベル文字列を返します。
732         *
733         * これは、{&#064;LBL.XXXX %Y} 引数処理をおこなうための、サポートメソッドです。
734         * 引数は、"XXXX %Y" という状態で受け取ります。(LBL. ははずした形)
735         * ラベルには、通常のラベル(Label)以外に、Short,Tips,Description,RawShortLabel の情報を持っています。
736         * {&#064;LBL.XXXX %Y} の Y に、先のLabel,Short,Tips,Description,RawShortLabel,CodeData の頭文字('L','S','T','D','R','C')を
737         * 指定することで、それぞれの状態を取得することが可能になります。
738         * Y を指定しない場合({&#064;LBL.XXXX}) は、'L' が指定された場合と同じ効果があります。
739         * Y は、先頭文字1文字で判断していますので、{&#064;LBL.XXXX %Short}と記述できます。
740         * Y 引数には、&#064;で始まるリクエスト引数が指定できます。例えば、{&#064;LBL.XXXX &#064;ZZ}
741         * とすると、ZZ のリクエスト引数の値が Y に適用されます。
742         * ラベルキーそのものをパラメータ化することが出来ます。
743         * これは、{&#064;LBL.&#064;XXXX}という形式になります。引数は、先の説明と同じです。
744         * この場合は、XXXX をキーにリクエスト引数の値が、ラベルリソースのキーになります。
745         *
746         * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、{&#064;LBL.XXXX Y}⇒{&#064;LBL.XXXX %Y}
747         * @og.rev 5.4.0.1 (2011/11/01) ラベル形式('L','S','T','D') に、R(RawShortLabel) を追加
748         * @og.rev 5.5.7.2 (2012/10/09) ラベル形式('L','S','T','D','R') に、C(CodeData) を追加
749         *
750         * @param    lbl ラベルのキー
751         *
752         * @return   ラベル文字列
753         */
754        protected String getLabel( final String lbl ) {
755
756                String key = lbl ;
757                String val = null;
758
759                int spc = lbl.indexOf( ' ' );           // " " があるかどうか
760                if( spc > 0 ) {
761                        key = lbl.substring( 0,spc );
762                        if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); }
763
764                        // リクエスト引数が指定された場合
765                        char ch  = lbl.length() > spc+1 ? lbl.toUpperCase( Locale.JAPAN ).charAt( spc+1 ) : ' ';     // Label,Short,Tips,Description
766                        char ch2 = lbl.length() > spc+2 ? lbl.toUpperCase( Locale.JAPAN ).charAt( spc+2 ) : ' ';     // Label,Short,Tips,Description
767                        if( ch == '@' ) {
768                                String tmp = getRequestValue( lbl.substring( spc+2 ) );
769                                if( tmp != null && tmp.length() > 0 ) {
770                                        ch  = tmp.toUpperCase( Locale.JAPAN ).charAt( 0 );
771                                        ch2 = tmp.length() > 1 ? tmp.toUpperCase( Locale.JAPAN ).charAt( 1 ) : ' ';
772                                }
773                        }
774                        // 4.0.0.0 (2007/10/19)
775                        if( ch == '%' ) {
776                                switch( ch2 ) {
777                                        case 'L': val = getResource().getLabel( key ); break;
778                                        case 'S': val = getResource().getLabelData( key ).getShortLabel(); break;
779                                        case 'T': val = getResource().getLabelData( key ).getLongLabel(); break;
780                                        case 'D': val = getResource().getLabelData( key ).getDescription(); break;
781                                        case 'R': val = getResource().getLabelData( key ).getRawShortLabel(); break;    // 5.4.0.1 (2011/11/01)
782                                        case 'C': val = getResource().getLabelData( key + "." + getRequestValue( key ) ).getShortLabel(); break;        // 5.5.7.2 (2012/10/09)
783                                        default : break;
784                                }
785                        }
786                        else if( ch != ' ' ) {
787                                String[] msgVals = StringUtil.csv2Array( lbl.substring( spc+1 ),' ' );
788                                for( int i=0; i<msgVals.length; i++ ) {
789                                        // リクエスト文字パラメータ時の処理。その他は、ラベル文字は処理不要。
790                                        if( msgVals[i].startsWith( "@" ) ) {
791                                                msgVals[i] = getRequestValue( msgVals[i].substring( 1 ) );
792                                        }
793                                }
794                                val = getResource().getLabel( key,msgVals );
795                        }
796                }
797                else {
798                        if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); }
799                }
800
801                if( val == null ) { val = getResource().getLabel( key ); }
802                return val;
803        }
804
805        /**
806         * DBColumn オブジェクトを返します。
807         *
808         * これは、キーを元に DBColumnオブジェクトをカラムリソースの
809         * 定義ファイルより取得して、リソースマネージャで管理します。
810         *
811         * @param       key     オブジェクトのキー
812         *
813         * @return      DBColumnオブジェクト
814         */
815        protected DBColumn getDBColumn( final String key ) {
816                return getResource().makeDBColumn( key ) ;
817        }
818
819        /**
820         * 内部の Attributes オブジェクトに、属性値をセットします。
821         *
822         * 同じキーの値が登録されていた場合は、置き換えられます。
823         *
824         * @param   key   キー
825         * @param   value 属性値
826         * @see         #add( String , String )
827         */
828        protected void set( final String key, final String value ) {
829                attri.set( key,value );
830        }
831
832        /**
833         * 内部の Attributes オブジェクトに、属性値を追加します。
834         *
835         * ここでは、すでに同じキーが登録されている場合は、その値に、
836         * 標準セパレータ(スペース)を追加して、文字列結合します。
837         * たとえば、class 属性などは、値をスペースで追加する事で、
838         * CSS で処理することができます。
839         *
840         * @og.rev 4.0.0.0 (2007/05/18) 新規追加
841         *
842         * @param   key   キー
843         * @param   value 属性値
844         * @see         #add( String , String , String )
845         * @see         #set( String , String )
846         */
847        protected void add( final String key, final String value ) {
848                attri.add( key,value );
849        }
850
851        /**
852         * 内部の Attributes オブジェクトに、属性値を追加します。
853         *
854         * ここでは、すでに同じキーが登録されている場合は、その値に、
855         * 引数のセパレータを追加して、文字列結合します。
856         *
857         * @og.rev 3.5.0.0 (2003/09/17) 新規追加
858         * @og.rev 3.5.5.9 (2004/06/07) セパレータ引数付きのメソッドに変更
859         *
860         * @param   key   キー
861         * @param   value 属性値
862         * @param   sepa  セパレータ
863         * @see         #add( String , String )
864         */
865        protected void add( final String key, final String value, final String sepa ) {
866                attri.add( key,value,sepa );
867        }
868
869        /**
870         * 内部の Attributes オブジェクトから、属性値を取得します。
871         *
872         * @param       key     キー
873         *
874         * @return      属性値
875         * @see         #set( String , String )
876         */
877        protected String get( final String key ) {
878                return attri.get( key );
879        }
880
881        /**
882         * 属性オブジェクトの取得。
883         *
884         * Attributes オブジェクトを取得します。
885         *
886         * @return      Attributesオブジェクト
887         */
888        protected Attributes getAttributes() {
889                return attri;
890        }
891
892        /**
893         * {&#064;XXXX} 形式の文字列から XXXX をキーとして ServletRequest から getParameter で値を取り出します。
894         *
895         * 他の文字列に混在した {&#064;XXXX} 文字を変換可能です。
896         * ただし、処理の簡素化のため、上記形式以外は変換いたしません。
897         * エラー例)× { &#064;XXXX }、{&#064; XXXX }、{&#064;XXXX&#064;yyyy}、{&#064;XXXX{&#064;yyyy}}
898         * また、"{&#064;" を通常の記述で使うことは無いと考え、エスケープも用意して
899         * いません。よって、"{&#064;" のパターンが見つかって,"}" で閉じられていない
900         * 場合は,エラーとして、HybsSystemException を throw します。
901         *
902         * @og.rev 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。
903         *
904         * @param   key リクエストのキー
905         *
906         * @return  リクエストの値
907         */
908        protected String getRequestParameter( final String key ) {
909                isReqNull = false;
910
911                if( key == null ) { isReqNull = true; return ""; }
912                int index = key.indexOf( "{@" );
913                if( index < 0 ) { return key; }
914
915                // 変数が "{@XXXX}" の場合を優先的に検索。
916                // これにより多くのパターンで、StringTokenizer による
917                // 文字列操作を行う必要がなくなります。
918                if( index == 0 &&
919                        ( key.indexOf( '}' ) == key.lastIndexOf( '}' ) ) &&
920                        ( key.charAt(key.length()-1) == '}' ) ) {
921                                return getRequestValue( key.substring( 2,key.length()-1 ) );
922                }
923
924                // 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。
925                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_SMALL );
926                int start = 0;
927                while( index >= 0 ) {
928                        int end = key.indexOf( '}',index );
929                        if( end < 0 ) {
930                                String errMsg = "{@ と } との対応関係がずれています。" + HybsSystem.CR
931                                                        + "key=[" + key + "] : index=" + index ;
932                                throw new HybsSystemException( errMsg );
933                        }
934
935                        // {@ より前方の文字列を追加
936                        if( index > 0 ) { rtn.append( key.substring( start,index ) ); }
937
938                        // {@XXXX} の XXXX部分を処理
939                        String val = getRequestValue( key.substring( index+2,end ) );
940                        if( val != null ) { rtn.append( val ); }
941
942                        start = end+1 ;
943                        index = key.indexOf( "{@",start );
944                }
945                rtn.append( key.substring( start ) );
946
947                return rtn.toString();
948        }
949
950        /**
951         * {&#064;XXX.YYYY} 形式の文字列から値を取得します。
952         * 予約語のみ処理をし、それ以外は{&#064;xxx}のままとします。
953         *
954         * 他の文字列に混在した {&#064;XXXX} 文字を変換可能です。
955         * ただし、処理の簡素化のため、上記形式以外は変換いたしません。
956         * エラー例)× { &#064;XXXX }、{&#064; XXXX }、{&#064;XXXX&#064;yyyy}、{&#064;XXXX{&#064;yyyy}}
957         * また、"{&#064;" を通常の記述で使うことは無いと考え、エスケープも用意して
958         * いません。よって、"{&#064;" のパターンが見つかって,"}" で閉じられていない
959         * 場合は,エラーとして、HybsSystemException を throw します。
960         *
961         * @og.rev 5.5.4.0 (2012/07/02) 新規作成
962         *
963         * @param   key リクエストのキー
964         *
965         * @return  リクエストの値
966         */
967        protected String getReservedParameter( final String key ) {
968                isReqNull = false;
969
970                if( key == null ) { isReqNull = true; return ""; }
971                int index = key.indexOf( "{@" );
972                if( index < 0 ) { return key; }
973
974                // 変数が "{@XXXX}" の場合を優先的に検索。
975                // これにより多くのパターンで、StringTokenizer による
976                // 文字列操作を行う必要がなくなります。
977                if( index == 0 &&
978                        ( key.indexOf( '}' ) == key.lastIndexOf( '}' ) ) &&
979                        ( key.charAt(key.length()-1) == '}' ) ) {
980                                return getReservedValue( key.substring( 2,key.length()-1 ) );
981                }
982
983                // 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。
984                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_SMALL );
985                int start = 0;
986                while( index >= 0 ) {
987                        int end = key.indexOf( '}',index );
988                        if( end < 0 ) {
989                                String errMsg = "{@ と } との対応関係がずれています。" + HybsSystem.CR
990                                                        + "key=[" + key + "] : index=" + index ;
991                                throw new HybsSystemException( errMsg );
992                        }
993
994                        // {@ より前方の文字列を追加
995                        if( index > 0 ) { rtn.append( key.substring( start,index ) ); }
996
997                        // {@XXXX} の XXXX部分を処理
998                        String val = getReservedValue( key.substring( index+2,end ) );
999                        if( val != null ) { rtn.append( val ); }
1000
1001                        start = end+1 ;
1002                        index = key.indexOf( "{@",start );
1003                }
1004                rtn.append( key.substring( start ) );
1005
1006                return rtn.toString();
1007        }
1008
1009        /**
1010         * {&#064;XXXX} 形式の文字列から XXXX をキーとして ServletRequest から getParameterValues で値を取り出します。
1011         *
1012         * これは、複数(配列)でリクエストを取り出すことが可能です。
1013         * そのため、他の文字列に混在させて変換することができません。
1014         * "{&#064;XXXX}" 形式 からのみの変換となります。
1015         *
1016         * @og.rev 3.6.0.0 (2004/09/22) キーがnull のときにnullではなく長さ0の配列を返します。
1017         *
1018         * @param   key リクエストのキー
1019         *
1020         * @return  リクエストの値
1021         */
1022        protected String[] getRequestParameterValues( final String key ) {
1023                if( key == null ) { return new String[0]; }             // 3.6.0.0 (2004/09/22)
1024                int index = key.indexOf( "{@" );
1025                if( index < 0 ) { return StringUtil.csv2Array( key ); }
1026
1027                if( index == 0 && ( key.charAt( key.length()-1 ) == '}' )) {
1028                        return getRequestValues( key.substring( 2,key.length()-1 ) );
1029                }
1030
1031                String errMsg = "引数の形式が異なります。 [" + key + "]" ;
1032                throw new HybsSystemException( errMsg );
1033        }
1034
1035        /**
1036         * 引数 in が、引数 check の文字列の中に存在すれば、 true を、存在しなければ、false を返します。
1037         *
1038         * check は、 非null のString を、in は、null でも構いません。
1039         *
1040         * @param    in    チェックする文字列
1041         * @param    check チェック用の基本文字列
1042         *
1043         * @return   存在する true /  存在しない false
1044         */
1045        protected boolean check( final String in, final String check ) {
1046                if( in == null ) { return false; }
1047                return check.indexOf( in ) >= 0 ;
1048        }
1049
1050        /**
1051         * 引数 in が、引数 check の文字列配列の中に存在すれば、 true を、存在しなければ、false を返します。
1052         *
1053         * check は、 String配列 を、in は、null でも構いません。
1054         *
1055         * @og.rev 2.1.0.3 (2002/11/08) 文字列配列を引数に取るメソッドを追加
1056         *
1057         * @param    in    チェックする文字列
1058         * @param    check チェック用の基本文字列配列
1059         *
1060         * @return   存在する true /  存在しない false
1061         */
1062        protected boolean check( final String in, final String[] check ) {
1063                if( in == null || check == null ) { return false; }
1064                for( int i=0; i<check.length; i++ ) {
1065                        if( in.equals( check[i] ) ) { return true; }
1066                }
1067                return false ;
1068        }
1069
1070        /**
1071         * ユーザーオブジェクトが持っている内部情報を取得します。
1072         *
1073         * これは、UserInfo#getAttribute( String ) で取得される情報です。
1074         * ユーザーパラメータとは異なります。
1075         *
1076         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 getUser() を使用するように変更
1077         *
1078         * @param    user ユーザー情報を取り出すキー
1079         *
1080         * @return   ユーザー情報文字列
1081         */
1082        protected String getUserInfo( final String user ) {
1083                if( user == null ) { return null; }
1084
1085                String key = user ;
1086                if( key.charAt(0) == '@' ) {
1087                        key = getRequestValue( key.substring( 1 ) );
1088                }
1089
1090                return getUser().getAttribute( key );
1091        }
1092        
1093        /**
1094         * ユーザーオブジェクトが持っているEditの内部情報を取得します。
1095         *
1096         * これは、UserInfo#getSelectedEdit( String ) で取得される情報です。
1097         * ユーザーパラメータとは異なります。
1098         *
1099         * @og.rev 5.8.2.3 (2014/12/27) 新規作成
1100         * 
1101         * @param    guikey 取り出す画面ID
1102         *
1103         * @return   ユーザー情報文字列
1104         */
1105        protected String getUserEditInfo( final String guikey ) {
1106                if( guikey == null ) { return null; }
1107
1108                String key = guikey ;
1109                if( key.charAt(0) == '@' ) {
1110                        key = getRequestValue( key.substring( 1 ) );
1111                }
1112
1113                return getUser().getSelectedEdit( key );
1114        }
1115
1116        /**
1117         * ユーザー情報を設定します。
1118         *
1119         * 初めての場合は、session 登録項目 の HybsSystem#USERINFO_KEY キー の値で
1120         * 取得します。
1121         *
1122         * @og.rev 2.1.1.4 (2002/11/25) ユーザー情報をセットするメソッドを追加
1123         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 getUser() を使用するように変更
1124         * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するかのフラグを追加
1125         *
1126         * @param    key ユーザー情報をセットするキー
1127         * @param    value ユーザー情報文字列
1128         * @param    save GE20(ユーザー定数)に情報を保存するか
1129         */
1130//      protected void setUserInfo( final String key,final String value ) {
1131        protected void setUserInfo( final String key,final String value, final boolean save ) {
1132                if( key != null ) {
1133//                      getUser().setAttribute( key, value );
1134                        getUser().setAttribute( key, value, save );
1135                }
1136        }
1137
1138        /**
1139         * ユーザー情報オブジェクトを取得します。
1140         *
1141         * 初めての場合は、session 登録項目 の HybsSystem#USERINFO_KEY キー の値で
1142         * 取得します。
1143         *
1144         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 新規追加
1145         * @og.rev 3.6.0.0 (2004/09/17) private ⇒ protected 化します。
1146         *
1147         * @return   ユーザー情報オブジェクト
1148         */
1149        protected UserInfo getUser() {
1150                if( userInfo == null ) {
1151                        userInfo = (UserInfo)getSessionAttribute( HybsSystem.USERINFO_KEY );
1152                }
1153                if( userInfo == null ) {
1154                        String errMsg = "ユーザーオブジェクトが存在しません。";
1155                        throw new HybsSystemException( errMsg );
1156                }
1157                return userInfo ;
1158        }
1159
1160        /**
1161         * 画面情報(GUIInfo)を取得します。
1162         *
1163         * これは、session 登録項目 の HybsSystem#GUIMAP_KEY キー の値で
1164         * 登録された MAP を取り出し、そこから取得します。
1165         * 画面情報は、ログインユーザー毎に個別に持っています。
1166         *
1167         * @og.rev 4.0.0.0 (2005/01/31) GUIInfo が存在しない場合も処理を続けます。
1168         *
1169         * @param    gamenId 画面ID
1170         *
1171         * @return   画面情報(GUIInfo)
1172         */
1173        protected GUIInfo getGUIInfo( final String gamenId ) {
1174                return getUser().getGUIInfo( gamenId );
1175        }
1176
1177        /**
1178         * 画面情報(GUIInfo)の属性値を取得します。
1179         *
1180         * これは、{&#064;GUI.XXXX ID} 引数処理をおこなうための、サポートメソッドです。
1181         * 引数は、"XXXX ID" という状態で受け取ります。(GUI. ははずした形)
1182         * XXXXには、画面情報(GUIInfo)の属性キーを指定します。IDが指定されない場合は、
1183         * 実行中の自分自身の画面が指定されたことになります。
1184         * これは、session 登録項目 の HybsSystem#GUIINFO_KEY キー の値で取得します。
1185         * この値は,画面が呼び出される毎に毎回設定されており、リクエスト毎に
1186         * 所得し直す必要があります。
1187         *
1188         * ID に、画面IDを指定した場合は、&#064; 指定によるリクエスト引数の値を適用できます。
1189         * {&#064;GUI.&#064;XXXX ID} や、{&#064;GUI.XXXX &#064;ID} です。(同時指定も可能)
1190         *
1191         * @og.rev 3.6.0.6 (2004/10/22) GUIInfo が存在しない場合も処理を続けます。
1192         * @og.rev 4.0.0.0 (2004/11/30) 画面ID引数や、リクエスト引数の使用を可能にします。
1193         *
1194         * @param    attkey 画面情報を取り出すキー
1195         *
1196         * @return   画面情報文字列
1197         */
1198        protected String getGUIInfoAttri( final String attkey ) {
1199                if( attkey == null ) { return null; }
1200
1201                String  key = attkey ;
1202                final GUIInfo gui ;
1203
1204                int spc = key.indexOf( ' ' );           // " " があるかどうか
1205                if( spc > 0 ) {
1206                        key = attkey.substring( 0,spc );
1207                        String id = attkey.substring( spc+1 );
1208                        if( id.charAt(0) == '@' ) { id = getRequestValue( id.substring( 1 ) ); }
1209
1210                        gui = getUser().getGUIInfo( id );
1211                }
1212                else {
1213                        if( guiInfo == null ) {
1214                                guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
1215                        }
1216                        gui = guiInfo;
1217                }
1218                if( gui == null ) { return "Not Found[" + attkey + "]"; }
1219                if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); }
1220
1221                return gui.getAttribute( key );
1222        }
1223
1224        /**
1225         * {&#064;NVL.XXX 値} で、XXXが NULLの場合、値を返します。
1226         *
1227         * ORACLE等の COALESCE ( expr_list ) 処理に近い結果を返します。
1228         * NVL ( expr1 , expr2 ) は、expr1 が NULL の場合、expr2 を返しますが、
1229         * COALESCE は、第一引数が NULLなら、次の引数、それも NULL なら、さらに次と
1230         * 引数リストを順次処理していきます。
1231         * それと同じく、XXX が NULL なら、その次・・と順次評価していき、NULL でない
1232         * 値が返ってきたところで、その値を返します。
1233         * これは、{&#064;NVL.XXX &#064;YYY ZZZ ・・・} 形式を処理します。
1234         * これは、パラメータ XXX が NULLの場合、次の値を使います。(&#064;YYY) 
1235         * &#064;YYY は、YYY パラメータの事で、これも NULL の場合は、ZZZ を使います。
1236         * 最後まで NULL の場合は、 ゼロ文字列が返されます。
1237         *
1238         * @og.rev 5.6.4.0 (2013/05/02) 新規追加
1239         *
1240         * @param    attkey NVL情報を取り出すパラメータ
1241         *
1242         * @return   NULL以外の値が出てくるまで、順次評価した結果
1243         */
1244        protected String getNVLAttri( final String attkey ) {
1245                if( attkey == null ) { return null; }
1246
1247                String[]  keys = attkey.split( " " );                   // スペースで、パラメータを分解する。
1248                String    val  = getRequestValue( keys[0] );    // 第一パラメータは、そのままのキーで検索
1249
1250                // val が null の間は、チェックする。
1251                if( val == null || val.isEmpty() ) {
1252                        for( int i=1; i<keys.length; i++ ) {
1253                                val = keys[i];
1254                                // 先頭が @ の場合は、リクエスト変数のキーとして、値を判定
1255                                if( val.charAt(0) == '@' ) { val = getRequestValue( val.substring( 1 ) ); }
1256                                if( val != null && val.length() > 0 ) { break; }
1257                        }
1258                }
1259
1260                if( val == null ) { val = ""; }         // NULL の場合は、 ゼロ文字列を返す。
1261
1262                return val;
1263        }
1264
1265        /**
1266         * {&#064;LAST.XXX} で、XXXが 最後に使われた値を返します。
1267         *
1268         * XXX は、command="NEW" でセットされたリクエスト値です。通常、{&#064;MEM.XXX} は
1269         * 画面単位に、既存のキャッシュから値を取り出しますが、{&#064;LAST.XXX} は、
1270         * 画面に関係なく、ユーザー単位に管理しています。
1271         * また、値は、データベース(GE20)に保管されますので、次回ログイン時にも有効です。
1272         * この処理が呼び出されたときに、リクエスト変数に、XXXX が存在した場合は、そちらを優先に
1273         * 使います。その場合は、command に関係なく、値を設定しておきます。
1274         *
1275         * command="NEW"の場合のリクエスト変数の値の設定は、RequestCacheTag で行います。
1276         * 
1277         * ※ データベースには、画面アクセス情報のセーブ時に行われます。
1278         * valueタグのsave属性の様に、リアルタイムではありませんので、Tomcatが
1279         * 異常終了した場合は、セーブされません。
1280         *
1281         * @og.rev 5.6.8.1 (2013/09/13) 新規追加
1282         *
1283         * @param    attkey 最後に使われた値をを取り出すパラメータ
1284         *
1285         * @return   XXXが 最後に使われた値
1286         * @see         org.opengion.hayabusa.taglib.RequestCacheTag#commandExec( String ,ServletRequest )
1287         * @see         org.opengion.hayabusa.resource.UserInfo#getLastRequestValue( String )
1288         */
1289        protected String getLASTAttri( final String attkey ) {
1290                if( attkey == null ) { return null; }
1291
1292                // 最新のリクエスト変数をチェック
1293                String[] vals = getRequest().getParameterValues( attkey );
1294
1295                String val = null;
1296                if( vals == null ) {
1297                        val = getUser().getLastRequestValue( attkey );          // なければ、取得
1298                }
1299                else {
1300                        for( int i=0; i<vals.length; i++ ) {
1301                                val = vals[i];
1302                                if( ! "0".equals( val ) ) { break; }                    // チェックボックス対応
1303                        }
1304                        getUser().setLastRequestValue( attkey,val );            // あれば、最新の値をセット
1305                }
1306
1307                return val ;
1308        }
1309
1310        /**
1311         * 予約語に関する情報の文字列を取得します。
1312         *
1313         * @og.rev 5.5.4.0 (2012/07/02) 予約語部分のみ分離
1314         * @og.rev 5.6.4.0 (2013/05/02) NVL 追加
1315         * @og.rev 5.6.8.1 (2013/09/13) LAST 追加
1316         * @og.rev 5.8.2.3 (2014/12/27) USEREDIT追加
1317         *
1318         * @param    key キー
1319         *
1320         * @return   リクエスト情報の文字列
1321         */
1322        protected String getReservedValue( final String key ) {
1323                if( key == null ) { isReqNull = true; return ""; }              // 3.4.0.3 (2003/09/10)
1324
1325                String rtn ;
1326                int adrs = key.indexOf( '.' );
1327                if( adrs > 0 ) {
1328                        String subKey = key.substring( adrs+1 );
1329                        if( key.startsWith( "USER." ) ) {
1330                                rtn = getUserInfo( subKey );
1331                        }
1332                        else if( key.startsWith( "USEREDIT." ) ) {
1333                                rtn = getUserEditInfo( subKey );        // 5.8.2.3 (2014/12/27)
1334                        }
1335                        else if( key.startsWith( "GUI." ) ) {
1336                                rtn = getGUIInfoAttri( subKey );        // 4.0.0 (2005/01/31)
1337                        }
1338                        else if( key.startsWith( "SYS." ) ) {
1339                                rtn = sys( subKey );            // 3.5.6.6 (2004/08/23)
1340                        }
1341                        else if( key.startsWith( "SESSION." ) ) {               // 3.5.5.3 (2004/04/09)
1342                                rtn = String.valueOf( getSessionAttribute( subKey ) );
1343                        }
1344                        // 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。
1345                        else if( key.startsWith( "MEM." ) ) {
1346                                // 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正
1347                                rtn = getRequestCacheData( subKey );
1348                        }
1349                        // 3.8.0.2 (2005/07/11) MSG.XXXX で、メッセージリソースの値を取得できるように追加。
1350                        // 3.8.0.2 (2005/07/11) LBL.XXXX で、ラベルリソースの値を取得できるように追加。
1351                        else if( key.startsWith( "LBL." ) ) {
1352                                rtn = getLabel( subKey );
1353                        }
1354                        // 3.8.0.2 (2005/07/11) DATE.XXXX で、日付関係の値を取得できるように追加。
1355                        else if( key.startsWith( "DATE." ) ) {
1356                                rtn = getDateFormat( subKey );
1357                        }
1358                        // 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。
1359                        // NVAR. を取り除いた XXXX で再度、リクエスト値を取得し、それを Escape変換します。
1360                        else if( key.startsWith( "NVAR." ) ) {
1361                                rtn = StringUtil.getUnicodeEscape( getRequestValue( subKey ) );
1362                        }
1363                        // 4.3.6.0 (2009/04/01) メールモジュール用の予約語
1364                        else if( key.startsWith( "MAIL." ) ) {
1365                                rtn = ( String )getSessionAttribute( key );
1366                        }
1367                        // 4.3.7.0 (2009/06/01) DB関数名の取得
1368                        else if( key.startsWith( "DBF." ) ) {
1369                                rtn = getDBFunctionName( subKey );
1370                        }
1371                        // 4.4.0.0 (2009/08/02) データロールに基づく条件式の取得
1372                        else if( key.startsWith( "SEC." ) ) {
1373                                rtn = getDataCondition( subKey );
1374                        }
1375                        // 5.3.9.0 (2011/09/01) URLエンコード変換
1376                        else if( key.startsWith( "URL." ) ) {
1377                                rtn = StringUtil.urlEncode( getRequestValue( subKey ) );
1378                        }
1379                        // 5.5.1.3 (2012/04/09) エスケープ変換
1380                        else if( key.startsWith( "ESC." ) ) {
1381                                rtn = StringUtil.htmlFilter( getRequestValue(subKey,false) );
1382                        }
1383                        // 5.6.4.0 (2013/05/02) NVL 追加
1384                        else if( key.startsWith( "NVL." ) ) {
1385                                rtn = getNVLAttri( subKey );
1386                        }
1387                        // 5.6.8.1 (2013/09/13) LAST 追加
1388                        else if( key.startsWith( "LAST." ) ) {
1389                                rtn = getLASTAttri( subKey );
1390                        }
1391                        // 4.0.0 (2007/06/12) DB.XXXX は、直接取り出すように変更します。
1392                        else { // 4.0.0.0 (2007/11/16)
1393                                rtn = (String)getRequestAttribute( key );               // ※ 取り出しは、key で
1394                        }
1395                }
1396                else{
1397                        rtn = "{@" + key + "}"; // 予約語以外は括弧を付けて書き戻します。
1398                }
1399                return rtn;
1400        }
1401
1402        /**
1403         * リクエスト情報の文字列を取得します。
1404         *
1405         * @og.rev 5.0.0.2 (2009/09/15) XSS対策
1406         *
1407         * @param    key キー
1408         *
1409         * @return   リクエスト情報の文字列
1410         */
1411        protected String getRequestValue( final String key ) {
1412                return getRequestValue( key, xssCheck);
1413        }
1414
1415        /**
1416         * リクエスト情報の文字列を取得します。
1417         *
1418         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1419         * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
1420         * @og.rev 3.0.0.0 (2002/12/25) ValueTag追加の為、指定の scope の Attributeより取得
1421         * @og.rev 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の所得優先順位を、request が優先されるように変更。
1422         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。
1423         * @og.rev 3.1.5.0 (2003/04/22) SYS.XXXX で、システムパラメータ の値を取得できるように修正。
1424         * @og.rev 3.1.7.0 (2003/05/02) リクエスト情報の取得順序を、Request、キャッシュ、Value の順に変更。
1425         * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
1426         * @og.rev 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。
1427         * @og.rev 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正
1428         * @og.rev 3.5.5.3 (2004/04/09) {&#064;SESSION.XXXX} で、session.getAttribute( "XXXX" ) の値を取得するように修正
1429         * @og.rev 3.5.6.6 (2004/08/23) SYS.XXXX の処理を getSystemParameter( String key ) メソッドへ移動
1430         * @og.rev 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。
1431         * @og.rev 3.8.0.2 (2005/07/11) MSG.XXXX , LBL.XXXX の処理を追加
1432         * @og.rev 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1433         * @og.rev 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。
1434         * @og.rev 4.0.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策
1435         * @og.rev 4.0.0.0 (2005/08/31) getSystemParameter を sys に名称変更
1436         * @og.rev 4.0.0.0 (2007/04/02) Valueタグの値と、キャッシュでは、Valueタグの値を優先するように変更
1437         * @og.rev 4.0.0.0 (2007/11/16) "."付きのパラメータのエラー処理をなくし、getRequestAttributeで取得する。
1438         * @og.rev 4.3.0.0 (2008/07/04) DB.XXXX は、必ずStringオブジェクトとし、String.valueOf しない。
1439         * @og.rev 4.3.6.0 (2009/04/01) メールモジュール用の予約語MAIL.XXXXの取得対応
1440         * @og.rev 4.4.0.0 (2009/08/02) データロール対応(SEC.xxxの取得対応)
1441         * @og.rev 5.0.0.2 (2009/09/15) XSS対策用にメソッドにフラグを追加
1442         * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止
1443         * @og.rev 5.3.9.0 (2011/09/01) URL.XXXX処理を追加
1444         * @og.rev 5.5.1.3 (2012/04/09) ESC.XXXX処理を追加
1445         * @og.rev 5.5.4.0 (2012/07/01) 予約語の処理を分離
1446         * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。
1447         *
1448         * @param       key     キー
1449         * @param       xssCheckFlg     XSS対策用
1450         *
1451         * @return   リクエスト情報の文字列
1452         */
1453        protected String getRequestValue( final String key, final boolean xssCheckFlg ) {
1454                if( key == null ) { isReqNull = true; return ""; }              // 3.4.0.3 (2003/09/10)
1455
1456                String rtn ;
1457                int adrs = key.indexOf( '.' );
1458
1459                if( adrs > 0 ) {
1460                        rtn = getReservedValue( key ); // 5.5.4.0 (2012/07/02)
1461                }
1462                else {
1463                        rtn = getRequest().getParameter( key );
1464
1465                        // 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。
1466                        if( isSanitized ) {
1467                                if( rtn != null && rtn.indexOf( '[' ) >= 0 ) {
1468                                        rtn = rtn.replace( "[", "\\]\\" );
1469                                }
1470                        }
1471
1472                        // 5.0.0.2 (2009/09/15) tagCheck によるthan signチェック Parameterのみにかけるためこの位置
1473                        if( rtn != null && rtn.length() > 0 && xssCheckFlg && ( rtn.indexOf( '<' ) >= 0 || rtn.indexOf( '>' ) >= 0 ) ) {
1474                                String errMsg = "リクエスト引数に Less/Greater than sign(<,>)を含むことは出来ません。" + HybsSystem.CR
1475                                                        + " 処理が正しい場合は、xssCheck 属性を false にセットしてください。" + HybsSystem.CR
1476                                                        + " key=[" + key + "]"
1477                                                        + " val=[" + rtn + "]"
1478                                                        + " tag=[" + getTagName() + "]" ;
1479                                throw new HybsSystemException( errMsg );
1480                        }
1481
1482                        // 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。
1483                        // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1484                        // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。
1485                        if( "0".equals(rtn) ) {
1486                                boolean backFlag = isReqNull ;
1487                                String[] vals = getRequestValues( key );
1488                                if( vals != null && vals.length > 1 ) {
1489                                        for( int i=0; i<vals.length; i++ ) {
1490                                                if( "1".equals( vals[i] ) ) { rtn = "1"; break; }
1491                                        }
1492                                }
1493                                isReqNull = backFlag;   // 3.8.8.8 (2007/05/11) getRequestValues での NULLセット解除
1494                        }
1495
1496                        // 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の取得優先順位を、
1497                        // request が優先されるように変更。
1498                        if( ( rtn == null || rtn.length() == 0 ) && requestCache != null ) {
1499                                String[] str = requestCache.get( key );
1500                                if( str != null && str.length > 0 ) {
1501                                        rtn = str[0];
1502                                }
1503                        }
1504                        // 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止
1505//                      if( ( rtn == null || rtn.length() == 0 ) && useValue ) {
1506                        if( ( rtn == null || rtn.length() == 0 ) ) {
1507                                Object obj = pageContext.findAttribute( key );
1508                                if( obj != null ) {
1509                                        rtn = obj.toString();
1510                                }
1511                        }
1512                }
1513                if( rtn == null || rtn.length() == 0 ) {
1514                        isReqNull = true;
1515                        rtn    = "";
1516                }
1517                // 4.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策
1518                else if( quotCheck && rtn.indexOf( "'" ) >= 0 && !key.startsWith( "SEC." ) ) {
1519                        String errMsg = "リクエスト引数に、クォーティション(')を含むことは出来ません。" + HybsSystem.CR
1520                                                + " 処理が正しい場合は、quotCheck 属性を false にセットしてください。" + HybsSystem.CR
1521                                                + " key=[" + key + "]"
1522                                                + " val=[" + rtn + "]"
1523                                                + " tag=[" + getTagName() + "]" ;
1524                        throw new HybsSystemException( errMsg );
1525                }
1526
1527                // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1528                // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。
1529//              if( "0".equals(rtn) ) {
1530//                      String[] vals = getRequestValues( key );
1531//                      if( vals != null ) {
1532//                              for( int i=0; i<vals.length; i++ ) {
1533//                                      if( "1".equals( vals[i] ) ) { rtn = "1"; break; }
1534//                              }
1535//                      }
1536//              }
1537
1538                return rtn ;
1539        }
1540
1541        /**
1542         * リクエスト情報の文字列を取得します。
1543         *
1544         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1545         * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
1546         * @og.rev 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。
1547         * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。
1548         *
1549         * @param    key キー
1550         *
1551         * @return   リクエスト情報の文字列
1552         */
1553        protected String[] getRequestValues( final String key ) {
1554                String[] rtn = getRequest().getParameterValues( key );
1555
1556                // 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。
1557                if( ( rtn == null || rtn.length == 0 ) && requestCache != null ) {
1558                        rtn =requestCache.get( key );
1559                }
1560
1561                // 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。
1562                if( rtn == null || rtn.length == 0 ) {
1563                        String tmp = getRequestValue( key );
1564                        if( tmp != null && tmp.length() > 0 ) {
1565                                rtn = new String[]{ tmp };
1566                        }
1567                }
1568
1569                if( rtn == null || rtn.length == 0 ) { isReqNull = true; }
1570                return rtn ;
1571        }
1572
1573        /**
1574         * リクエスト情報の文字列のキー集合を取得します。
1575         *
1576         * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応
1577         *
1578         * @return   リクエスト情報の文字列のキー集合
1579         */
1580        protected Enumeration<?> getParameterNames() {            // 4.3.3.6 (2008/11/15) Generics警告対応
1581                String[] names = (String[])getRequestAttribute( HybsSystem.PARAM_NAMES_KEY );
1582                return ( names == null ? getRequest().getParameterNames() : Collections.enumeration( Arrays.asList( names ) ) );
1583        }
1584
1585        /**
1586         * リクエスト情報の文字列のキー集合をセットします。
1587         *
1588         * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応
1589         *
1590         * @param names リクエスト情報の文字列のキー配列
1591         */
1592        protected void setParameterNames( final String[] names ) {
1593                setRequestAttribute( HybsSystem.PARAM_NAMES_KEY, names );
1594        }
1595
1596        /**
1597         * リクエスト情報の文字列に NULL が存在していたかどうかを取得します。
1598         *
1599         * これは、getRequestParameter( String ) の呼出し毎に設定されます。
1600         * つまり、上記メソッドの実行直後の値を取り出す必要があります。
1601         * NULL が含まれていた(true)/含まれていなかった。(false)
1602         *
1603         * @return      NULLが含まれていた(true)/含まれていなかった。(false)
1604         */
1605        protected boolean isNull() {
1606                return isReqNull;
1607        }
1608
1609        /**
1610         * リクエスト情報の文字列値取得時に、value値の使用可否を指定します。
1611         *
1612         * value 値は、通常、ValueTag等によりセットされますが、ValueTag自身がリクエスト
1613         * 情報から値を取得する場合に、リクエスト情報が無い場合に、自分自身の値を
1614         * 取得してしまい、予想しない動きをすることを避けるため、使用します。
1615         * 初期値は、true(使用する)です。
1616         *
1617         * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
1618         * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、メソッド廃止
1619         *
1620         * @param  flag value値の使用可否(true:使用化/false:使用不可)
1621         */
1622//      protected void setUseValue( final boolean flag ) {
1623//              useValue = flag;
1624//      }
1625
1626        /**
1627         * セッションに登録されているオブジェクトを取得します。
1628         *
1629         * @param   key キー
1630         *
1631         * @return   セッションに登録されているオブジェクト
1632         */
1633        protected Object getSessionAttribute( final String key ) {
1634                if( session == null ) { session = pageContext.getSession(); }
1635                return session.getAttribute( key );
1636        }
1637
1638        /**
1639         * セッションに 指定のキーでオブジェクトをセットします。
1640         *
1641         * @param   key キー
1642         * @param   object セッションに登録するオブジェクト
1643         */
1644        protected void setSessionAttribute( final String key ,final Object object ) {
1645                if( session == null ) { session = pageContext.getSession(); }
1646                session.setAttribute( key,object );
1647        }
1648
1649        /**
1650         * セッションに指定のキーで登録されているオブジェクトを 削除します。
1651         *
1652         * @param   key キー
1653         */
1654        protected void removeSessionAttribute( final String key ) {
1655                if( session == null ) { session = pageContext.getSession(); }
1656                session.removeAttribute( key );
1657        }
1658
1659        /**
1660         * リクエストに登録されているオブジェクトを取得します。
1661         *
1662         * @param   key キー
1663         *
1664         * @return   リクエストンに登録されているオブジェクト
1665         */
1666        protected Object getRequestAttribute( final String key ) {
1667                return getRequest().getAttribute( key );
1668        }
1669
1670        /**
1671         * リクエストに 指定のキーでオブジェクトをセットします。
1672         *
1673         * @param   key キー
1674         * @param   object リクエストに登録するオブジェクト
1675         */
1676        protected void setRequestAttribute( final String key ,final Object object ) {
1677                getRequest().setAttribute( key,object );
1678        }
1679
1680        /**
1681         * リクエストに指定のキーで登録されているオブジェクトを 削除します。
1682         *
1683         * @param   key キー
1684         */
1685        protected void removeRequestAttribute( final String key ) {
1686                getRequest().removeAttribute( key );
1687        }
1688
1689        /**
1690         * コンテキスト(applicaton)に登録されているオブジェクトを取得します。
1691         *
1692         * scope属性に、"applicaton" が指定された場合に、実行されます。
1693         *
1694         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1695         *
1696         * @param   key キー
1697         *
1698         * @return   コンテキスト(applicaton)に登録されているオブジェクト
1699         */
1700        protected Object getContextAttribute( final String key ) {
1701                ServletContext applicaton = pageContext.getServletContext();
1702                return applicaton.getAttribute( key );
1703        }
1704
1705        /**
1706         * コンテキスト(applicaton)指定のキーでオブジェクトをセットします。
1707         *
1708         * scope属性に、"applicaton" が指定された場合に、実行されます。
1709         *
1710         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1711         *
1712         * @param   key キー
1713         * @param   object コンテキスト(applicaton)に登録するオブジェクト
1714         */
1715        protected void setContextAttribute( final String key ,final Object object ) {
1716                ServletContext applicaton = pageContext.getServletContext();
1717                applicaton.setAttribute( key,object );
1718        }
1719
1720        /**
1721         * コンテキスト(applicaton)指定のキーで登録されているオブジェクトを 削除します。
1722         *
1723         * scope属性に、"applicaton" が指定された場合に、実行されます。
1724         *
1725         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1726         *
1727         * @param   key キー
1728         */
1729        protected void removeContextAttribute( final String key ) {
1730                ServletContext applicaton = pageContext.getServletContext();
1731                applicaton.removeAttribute( key );
1732        }
1733
1734        /**
1735         * アプリケーションサーバーのコンテキストパスのURLを返します。
1736         *
1737         * @return   コンテキストパス
1738         */
1739        protected String getContextPath() {
1740                return ((HttpServletRequest)getRequest()).getContextPath();
1741        }
1742
1743        /**
1744         * スコープに応じて登録されているオブジェクトを取得します。
1745         *
1746         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1747         *
1748         * @param   key キー
1749         *
1750         * @return   スコープに応じて登録されているオブジェクト
1751         */
1752        protected Object getObject( final String key ) {
1753                if( "session".equals( scope ) ) { return getSessionAttribute( key ); }
1754                else if( "request".equals( scope ) ) { return getRequestAttribute( key ); }
1755                else if( "applicaton".equals( scope ) ) { return getContextAttribute( key ); }
1756                else {
1757                        String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1758                        throw new IllegalArgumentException( errMsg );
1759                }
1760        }
1761
1762        /**
1763         * スコープに応じて登録されているオブジェクトを指定のキーでセットします。
1764         *
1765         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1766         *
1767         * @param   key キー
1768         * @param   object リクエストに登録するオブジェクト
1769         * @see     #setObject( String ,Object ,String )
1770         */
1771        protected void setObject( final String key ,final Object object ) {
1772                setObject( key,object,scope );
1773//              if( "session".equals( scope ) ) { setSessionAttribute( key,object ); }
1774//              else if( "request".equals( scope ) ) { setRequestAttribute( key,object ); }
1775//              else if( "applicaton".equals( scope ) ) { setContextAttribute( key,object ); }
1776//              else {
1777//                      String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1778//                      throw new IllegalArgumentException( errMsg );
1779//              }
1780        }
1781
1782        /**
1783         * スコープに応じて登録されているオブジェクトを指定のキーでセットします。
1784         *
1785         * 引数にスコープを指定します。スコープが null の場合は、オリジナルの
1786         * スコープを使用します。
1787         *
1788         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
1789         *
1790         * @param   key キー
1791         * @param   object リクエストに登録するオブジェクト
1792         * @param   scp スコープ
1793         * @see     #setObject( String ,Object )
1794         */
1795        protected void setObject( final String key ,final Object object ,final String scp ) {
1796                String inScp = (scp == null) ? scope : scp ;
1797
1798                if(      "session".equals( inScp        ) ) { setSessionAttribute( key,object ); }
1799                else if( "request".equals( inScp        ) ) { setRequestAttribute( key,object ); }
1800                else if( "applicaton".equals( inScp ) ) { setContextAttribute( key,object ); }
1801                else {
1802                        String errMsg = "このスコープはサポートされていません。[" + inScp + "]";
1803                        throw new IllegalArgumentException( errMsg );
1804                }
1805        }
1806
1807        /**
1808         * スコープに応じて登録されているオブジェクトを指定のキーで削除します。
1809         *
1810         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1811         *
1812         * @param   key キー
1813         */
1814        protected void removeObject( final String key ) {
1815                if( "session".equals( scope ) ) { removeSessionAttribute( key ); }
1816                else if( "request".equals( scope ) ) { removeRequestAttribute( key ); }
1817                else if( "applicaton".equals( scope ) ) { removeContextAttribute( key ); }
1818                else {
1819                        String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1820                        throw new IllegalArgumentException( errMsg );
1821                }
1822        }
1823
1824        /**
1825         * リクエストオブジェクトを取得します。
1826         *
1827         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1828         * @og.rev 2.2.0.0 (2002/12/17) 文字化け対策 setCharacterEncoding が効いていないので削除
1829         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。
1830         * @og.rev 3.4.0.3 (2003/09/10) 冗長な個所や、無意味な個所を、等価な内容のロジックに置き換える。
1831         * @og.rev 3.5.5.0 (2004/03/12) command=RESET 時にも、キャッシュを取り出すように変更します。
1832         *
1833         * @return   リクエストオブジェクト
1834         */
1835        @SuppressWarnings(value={"unchecked"})
1836        protected ServletRequest getRequest() {
1837                if( request == null ) {
1838                        request = pageContext.getRequest();
1839                        // リクエストキャッシュ機能
1840                        String cmd =request.getParameter( "command" );
1841                        if( "RENEW".equals( cmd ) || "RESET".equals( cmd ) ) {  // 3.5.5.0
1842                                requestCache = (Map<String,String[]>)getSessionAttribute( HybsSystem.REQ_CACHE_KEY );
1843                        }
1844                }
1845                return request;
1846        }
1847
1848        /**
1849         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1850         *
1851         * 処理としては、getRequestParameter() によるパラメータ処理も含みます。
1852         * このメソッドは、必ず doAfterBody() から呼び出してください。それ以外(例えば、
1853         * doEndTag()等)では、すでに Body情報が破棄/再利用されている可能性があり、
1854         * 正常に動作しなくなる可能性があります。
1855         *
1856         * @og.rev 3.1.1.0 (2003/03/28) BodyContent オブジェクトを取得して、ボディの内容を取得する処理を追加
1857         *
1858         * @return   ボディ文字列
1859         */
1860        protected String getBodyString() {
1861                BodyContent body = getBodyContent();
1862                return getRequestParameter( body.getString() );
1863        }
1864
1865        /**
1866         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1867         *
1868         * {&#064;XXXX}を変換しない生のBODY文を返します
1869         *
1870         * @og.rev 4.3.6.0 (2009/04/01) 新規作成
1871         *
1872         * @return   ボディ文字列
1873         */
1874        protected String getBodyRawString() {
1875                BodyContent body = getBodyContent();
1876                return body.getString();
1877        }
1878
1879        /**
1880         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1881         *
1882         * {&#064;XXXX}の変換を行いますが、その変換結果に、"["が含まれる場合は、
1883         * "\\]\\"に変換して、フォーマット処理されないようにサニタイズします。
1884         *
1885         * @og.rev 5.1.7.0 (2010/06/01) 新規作成
1886         * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。
1887         *
1888         * @return   ボディ文字列
1889         */
1890        protected String getSanitizedBodyString() {
1891                isSanitized = true;
1892                String rtn = getBodyString();
1893                isSanitized = false;                            // 一連の処理の中だけ、有効とします。
1894
1895                return rtn;
1896
1897                // 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。
1898//              BodyContent body = getBodyContent();
1899//              String rawBodyString = body.getString();
1900//              if( rawBodyString.indexOf( "{@" ) >= 0 ) {
1901//                      SystemParameter sysParam = new SystemParameter( rawBodyString );
1902//                      String[] clms = sysParam.getColumns();
1903//                      if( clms != null ) {
1904//                              for( int i=0; i<clms.length; i++ ) {
1905//                                      String key = "{@" + clms[i] + "}";
1906//                                      String parsedVal = getRequestParameter( key );
1907//                                      if( parsedVal != null && parsedVal.indexOf( '[' ) >= 0 ) {
1908//                                              rawBodyString = rawBodyString.replace( key, parsedVal.replace( "[", "\\]\\" ) );
1909//                                      }
1910//                              }
1911//                      }
1912//              }
1913//
1914//              return getRequestParameter( rawBodyString );
1915        }
1916
1917        /**
1918         * JspWriter を使用した画面出力です。
1919         *
1920         * @param msg 画面に出力する文字列
1921         */
1922        protected void jspPrint( final String msg ) {
1923                if( msg == null ) { return ; }
1924                try {
1925                        JspWriter out = pageContext.getOut();
1926                        out.print( msg );
1927                } catch(IOException ex) {
1928                        String errMsg = "画面出力時の PageContext の取得時にエラーが発生しました。"
1929                                                        + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
1930                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
1931                }
1932        }
1933
1934        /**
1935         * デバッグ用の文字列を JspWriter を使用して画面に出力します。
1936         * このメソッドは、debugFlag=true の場合のみ動作します。
1937         *
1938         * 出力内容は,各オブジェクトの toString() 文字列です。
1939         *
1940         * @og.rev 4.0.0.0 (2005/02/28) debugFlag の条件式を追加。
1941         * @og.rev 4.0.0.0 (2005/02/28) 簡易リファレンスへのリンクを追加。
1942         */
1943        protected void debugPrint() {
1944                if( debugFlag ) {
1945                        try {
1946                                JspWriter out = pageContext.getOut();
1947                                out.println( getDocumentLink() );               // 4.0.0 (2005/02/28)
1948                                out.println( "<pre>" );
1949                                out.println( toString() );
1950                                out.println( "</pre>" );
1951                        } catch(IOException ex) {
1952                                String errMsg = "デバッグ画面出力時の PageContext の取得時にエラーが発生しました。"
1953                                                        + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
1954                                throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
1955                        }
1956                }
1957        }
1958
1959        /**
1960         * GAMENID付のリクエストキャッシュ情報を取り出します。
1961         *
1962         * @og.rev 3.5.4.7 (2004/02/06) 新規作成
1963         *
1964         * @param key リクエストキャッシュのキー情報
1965         *
1966         * @return リクエスト情報(存在しない場合は、null)
1967         */
1968        protected String getRequestCacheData( final String key ) {
1969                String rtn = null;
1970
1971                String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
1972//              Map mem = (Map)getSessionAttribute( memKey );
1973                Map<?,?> mem = (Map<?,?>)getSessionAttribute( memKey );             // 4.3.3.6 (2008/11/15) Generics警告対応
1974
1975                if( mem != null ) {
1976                        String[] vals = (String[])mem.get( key );
1977                        if( vals != null && vals.length > 0 ) {
1978                                rtn = vals[0];
1979                        }
1980                }
1981                return rtn ;
1982        }
1983
1984        /**
1985         * GAMENID付のリクエストキャッシュ情報を取り出します。
1986         *
1987         * @og.rev 3.5.4.7 (2004/02/06) 新規作成
1988         *
1989         * @param key  リクエストキャッシュのキー情報
1990         * @param value リクエストキャッシュに登録する値
1991         */
1992        @SuppressWarnings(value={"unchecked"})
1993        protected void setRequestCacheData( final String key,final String value ) {
1994                String[] vals = new String[] { value } ;
1995
1996                String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
1997                Map<String,String[]> mem = (Map<String,String[]>)getSessionAttribute( memKey );
1998                if( mem != null ) {
1999                        mem.put( key,vals );
2000                }
2001        }
2002
2003        /**
2004         * カンマ区切り引数(CSV引数)を配列に分解して返します。
2005         *
2006         * カンマ区切り引数(CSV引数)で複数指定されたリクエストパラメータを
2007         * 文字列配列に分解して、返します。
2008         * 引数は、{&#064;XXXX} 変数も使用できます。
2009         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
2010         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
2011         *
2012         * @og.rev 3.5.6.2 (2004/07/05) 新規作成
2013         *
2014         * @param       csvKey カンマ区切り引数(CSV引数)
2015         *
2016         * @return      配列に分解されたリクエストパラメータ値
2017         */
2018        protected String[] getCSVParameter( final String csvKey ) {
2019                String[] keys = StringUtil.csv2Array( csvKey );
2020                String[] vals = new String[keys.length];
2021                for( int i=0; i<keys.length; i++ ) {
2022                        vals[i] = getRequestParameter( keys[i] ) ;
2023                }
2024                return vals ;
2025        }
2026
2027        /**
2028         * リクエスト変数 {&#064;SYS.XXXX} に対する値の取得を行います。
2029         *
2030         * 本来は、システムパラメータ の値を取得できますが、
2031         * システム的な共有値も取得できるように機能追加しています。
2032         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2033         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2034         * ここで、引数に、&#064;変数が使用できます。具体的には、{&#064;SYS.&#064;XXXX}
2035         * で、&#064;XXXX をリクエスト変数から取得した値を利用します。
2036         * この中で、&#064;GUIID だけが、さらに特殊で、実行中の画面IDを割り当てます。
2037         * この &#064;GUIID は、ここまでの文字列を画面IDに置き換えるとともに、それ以降の
2038         * 文字列を、画面IDに連結させます。
2039         * {&#064;SYS.&#064;GUIID_XXXX} ⇒ 画面ID_XXXX 文字列で、システムパラメータ の値を取得します。
2040         *
2041         *      SERVER_NAME     このTomcatが実行しているサーバー名             localhost 等
2042         *      SERVER_URL      Portも含むURLアドレス                          http://localhost:8823/
2043         *      CONTEXT_URL     実行しているコンテキストのURLアドレス          http://localhost:8823/dbdef2/
2044         *      REAL_PATH       / ルートに対応する物理ディレクトリ             d:/webapps/dbdef2/ 等
2045         *      CONTEXT_NAME    コンテキスト名(webapps 直下の仮想フォルダ名)   dbdef 等
2046         *      DATE            YMDH とほぼ同じですが、'yyyy/MM/dd HH:mm:ss' の形式で取得できます。
2047         *      HOSTNAME                スペース区切りで指定したIPアドレスからホスト名を逆引きします
2048         *      任意            ユーザーパラメータ(GE16) の値/システムパラメータ(GE12)の値を取得
2049         *        &#064;GUIID_XXXX  既存の画面IDに、_XXXX を追加した文字列
2050         *        &#064;XXXX        XXXX でリクエスト変数から取得した文字列
2051         *        XXXX              XXXX の文字列
2052         *
2053         * @og.rev 3.5.6.6 (2004/08/23) 新規作成
2054         * @og.rev 3.7.0.3 (2005/03/01) クッキー取得機能を追加
2055         * @og.rev 4.0.0.0 (2005/11/30) ユーザーパラメータは、システムパラメータとして取得します。
2056         * @og.rev 5.1.6.0 (2010/05/01) システムパラメータに、&#064;GUIID という特殊パラメータが使用できるように対応します。
2057         * @og.rev 5.6.6.2 (2013/07/19) SYS.HOSTNAMEに対応します。
2058         *
2059         * @param       key     {&#064;SYS.XXXX} の XXXX 部分の文字列(キー)
2060         *
2061         * @return   キーに対する値。なければ、null
2062         */
2063        protected String sys( final String key ) {
2064                final String rtn;
2065
2066                if( key.startsWith( "COOKIE." ) ) {             // 3.7.0.3 (2005/03/01)
2067                        rtn = getCookie( key.substring( "COOKIE.".length() ) );
2068                }
2069                else if( key.startsWith( "DATE" ) ) {
2070                        int idx = key.indexOf( ' ' );
2071                        if( idx >= 0 ) {
2072                                rtn = HybsSystem.getDate( key.substring( idx+1 ) );
2073                        }
2074                        else {
2075                                rtn = HybsSystem.getDate();
2076                        }
2077                }
2078                else if( key.startsWith( "HOSTNAME" ) ) { // 5.6.6.2 (2013/07/19)
2079                        int idx = key.indexOf( ' ' );
2080                        if( idx >= 0 ) {
2081                                String key2 = key.substring( idx+1 ) ;
2082                                if( key2.startsWith( "@" ) ) {
2083                                        rtn = getHostName( getRequestValue( key2.substring( 1 ) ) );
2084                                }
2085                                else{
2086                                        rtn = getHostName( key2 );
2087                                }
2088                        }
2089                        else{
2090                                rtn = getUser().getParameter( key );
2091                        }
2092                }
2093                // 5.1.6.0 (2010/05/01) {@SYS.@GUIID_XXXX} パラメータ対応
2094                else if( key.startsWith( "@GUIID" ) ) {
2095                        String key2 = getGUIInfoAttri( "ID" ) +  key.substring( "@GUIID".length() );
2096                        rtn = getUser().getParameter( key2 );
2097                }
2098                // 5.1.6.0 (2010/05/01) {@SYS.@XXXX} パラメータ対応
2099                else if( key.startsWith( "@" ) ) {
2100                        String key2 = getRequestValue( key.substring( 1 ) );
2101                        rtn = getUser().getParameter( key2 );
2102                }
2103                else {
2104                        rtn = getUser().getParameter( key );
2105                }
2106
2107                return rtn ;
2108        }
2109
2110        /**
2111         * システムパラメータの値を、boolean 型に変換して返します。
2112         *
2113         * 本来は、システムパラメータ の値を取得できますが、
2114         * システム的な共有値も取得できるように機能追加しています。
2115         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2116         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2117         *
2118         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
2119         *
2120         * @param       key システム設定 キー
2121         *
2122         * @return      システム設定値(boolean型)
2123         */
2124        protected boolean sysBool( final String key ) {
2125                return Boolean.valueOf( sys( key ) ).booleanValue();
2126        }
2127
2128        /**
2129         * システムパラメータの値を、int 型に変換して返します。
2130         *
2131         * 本来は、システムパラメータ の値を取得できますが、
2132         * システム的な共有値も取得できるように機能追加しています。
2133         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2134         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2135         *
2136         * ※ システムパラメータの値が数字でない場合、HybsSystemException が throw されます。
2137         * ※ キーの値が nullの場合、HybsSystemException が throw されます。
2138         *
2139         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
2140         *
2141         * @param       key システム設定 キー
2142         *
2143         * @return      システム設定値(int型)
2144         */
2145        protected int sysInt( final String key ) {
2146                String tmp = null;
2147                int rtn ;
2148                try {
2149                        tmp = sys( key );
2150                        rtn = Integer.parseInt( tmp );
2151                }
2152                catch( NumberFormatException ex ) {
2153                        String errMsg = "システムパラメータの値が数字ではありません。" + HybsSystem.CR
2154                                        + "  Resource key=[" + key + "] val=[" + tmp + "]"  ;
2155                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2156                }
2157                catch( IllegalArgumentException ex ) {
2158                        String errMsg = "キーの値が null です。key=[" + key + "] val=[" + tmp + "]";
2159                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2160                }
2161
2162                return rtn;
2163        }
2164
2165        /**
2166         * session に、処理開始時刻を設定します。
2167         * これは、DBTableModel を登録する場合に、一連の処理が連続であるかどうかを
2168         * 判断する時に使用します。
2169         * 処理が一連でない(start 時のタイムスタンプが書き換えられている)場合は、
2170         * DBTableModel の登録処理を行いません。
2171         * なお、判断処理を行うのは、scope が session の場合のみです。
2172         * 判定は、commitTableObject( String ,DBTableModel ) で行います。
2173         *
2174         * @og.rev 3.6.0.8 (2004/11/19) 新規追加
2175         * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。
2176         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
2177         *
2178         * @param   tableId キー
2179         * @see     #commitTableObject( String ,DBTableModel )
2180         */
2181        protected void startQueryTransaction( final String tableId ) {
2182                if( "session".equals( scope ) ) {
2183                        startTransaction = Long.valueOf( System.currentTimeMillis() );
2184                        setSessionAttribute( tableId+"_TRANSACTION", startTransaction );
2185                }
2186
2187                // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
2188                if( useTrans ) {
2189                        // 4.3.0.0 (2008/07/04) fileUD 対応
2190                        removeSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );   // 無条件削除
2191                }
2192        }
2193
2194        /**
2195         * スコープに応じて登録されている DBTableModel を指定のキーでセットします。
2196         * これは、startQueryTransaction( String ) でセッションに登録した処理開始時刻と、
2197         * このオブジェクト自身が持っている(セッションに登録した開始時刻そのもの)を
2198         * 比較し、異なる場合は、DBTableModel の登録を行いません。
2199         * これにより、検索処理の開始順にしか登録しないようなロジックを入れています。
2200         * 検索処理時間が掛かるSQLを実行した場合、先に検索した結果があとから登録される
2201         * ケースがあるためです。
2202         * また、判断処理を行うのは、scope が session の場合のみです。
2203         *
2204         * @og.rev 3.6.0.8 (2004/11/19) 新規追加
2205         * @og.rev 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
2206         * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。
2207         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
2208         *
2209         * @param   tableId キー
2210         * @param   table   登録するDBTableModelオブジェクト
2211         *
2212         * @return  正常に登録(true) / 一連でないため登録していない(false)
2213         * @see     #startQueryTransaction( String )
2214         */
2215        protected boolean commitTableObject( final String tableId ,final DBTableModel table ) {
2216                // 登録しないケースをピックアップします。
2217                if( "session".equals( scope ) ) {
2218                        String key = tableId+"_TRANSACTION";
2219                        Long endTime = (Long)getSessionAttribute( key );
2220                        removeSessionAttribute( key );
2221                        if( endTime == null ||
2222                                startTransaction == null ||
2223                                endTime.compareTo( startTransaction ) != 0 ) {
2224                                        String msg = "CommonTagSupport Query処理が割り込まれました。DBTableModel は登録しません。"
2225                                                                + "[" + getUser().getUserID() + "],"
2226                                                                + "[" + getGUIInfoAttri( "KEY" ) + "]"  // 4.0.0 (2005/01/31)
2227                                                                + "[" + startTransaction + "]"                          // 4.0.0 (2005/01/31)
2228                                                                + "[" + endTime + "]";                                          // 4.0.0 (2005/01/31)
2229                                        System.out.println( msg );
2230                                        return false;
2231                        }
2232                        // 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
2233                        if( table != null && HybsSystem.TBL_MDL_KEY.equals( tableId ) ) {
2234                                String consisKey = table.getConsistencyKey();
2235                                setSessionAttribute( HybsSystem.TBL_MDL_CONKEY,consisKey );
2236                        }
2237                }
2238
2239                // 4.3.0.0 (2008/07/04) fileUD 対応
2240                // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
2241                if( useTrans && table != null ) {
2242                        String guikey = getGUIInfoAttri( "KEY" );
2243                        DBLastSql lastSql = new DBLastSql( scope,guikey,table.isOverflow(),tableId );
2244                        setSessionAttribute( HybsSystem.DB_LAST_SQL_KEY,lastSql );
2245                }
2246
2247                setObject( tableId,table );
2248                return true;
2249        }
2250
2251        /**
2252         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行番号の
2253         * 配列を返します。
2254         * 配列情報は、行番号でソートされて返されます。
2255         * なにも選ばれていない場合は、サイズ0の配列を返します。
2256         *
2257         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2258         *
2259         * @return      (選ばれていない場合は、サイズ0の配列を返す)
2260         */
2261        protected int[] getParameterRows() {
2262                if( rowNo != null ) { return rowNo; }
2263
2264                rowNo = (int[])getRequestAttribute( HybsSystem.ROW_SEL_KEY );
2265                if( rowNo != null ) { return rowNo; }
2266
2267                String[] selected = getRequestValues( HybsSystem.ROW_SEL_KEY ) ;
2268                if( selected != null && selected.length != 0 ) {
2269                        rowNo = new int[ selected.length ];
2270                        for( int i=0; i<selected.length; i++ ) {
2271                                if( selected[i] != null && selected[i].length() > 0 ) {
2272                                        rowNo[i] = Integer.parseInt( selected[i] );
2273                                }
2274                        }
2275                        Arrays.sort( rowNo );
2276                }
2277                else {
2278                        rowNo = new int[0];
2279                }
2280
2281                return rowNo;
2282        }
2283
2284        /**
2285         * 表示データの HybsSystem.ROW_SEL_KEY に対して、選ばれた 行番号の
2286         * 配列を設定します。
2287         * ここで設定した選択配列は、getParameterRows() メソッドで取得する場合、優先されます。
2288         *
2289         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2290         *
2291         * @param       rowNo   行番号配列
2292         */
2293        protected void setParameterRows( final int[] rowNo ) {
2294                setRequestAttribute(  HybsSystem.ROW_SEL_KEY , rowNo );
2295        }
2296
2297        /**
2298         * 指定のクッキーをセットします。
2299         * これは、従来,各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、
2300         * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを
2301         * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。
2302         *
2303         * @og.rev 3.7.0.3 (2005/03/01) 新規登録
2304         *
2305         * @param   key         クッキーのキー
2306         * @param   value       クッキーの設定値
2307         * @param       maxage  最長存続期間を秒単位で設定(負の値は Cookie を保存しない、 0 なら Cookie を削除する)
2308         */
2309        protected void setCookie( final String key,final String value,final int maxage ) {
2310                HttpServletResponse res = (HttpServletResponse)pageContext.getResponse();
2311                Cookie ck = new Cookie( key, value );
2312                ck.setMaxAge( maxage );         // 有効秒
2313                res.addCookie( ck );
2314        }
2315
2316        /**
2317         * 指定のクッキーを取得します。
2318         * 見つからない場合は、null を返します。
2319         *
2320         * @og.rev 3.7.0.3 (2005/03/01) 新規登録
2321         *
2322         * @param       key     クッキーのキー
2323         *
2324         * @return      クッキーの設定値
2325         */
2326        protected String getCookie( final String key ) {
2327                HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
2328                Cookie[] cks = req.getCookies();
2329
2330                String val = null;
2331                for( int i=0; i<cks.length; i++ ) {
2332                        Cookie ck = cks[i];
2333                        if( ck.getName().equals( key ) ) {
2334                                val = ck.getValue();
2335                                break;
2336                        }
2337                }
2338                return val ;
2339        }
2340
2341        /**
2342         * リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します
2343         *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。
2344         *
2345         * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに
2346         * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。
2347         * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、
2348         * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、
2349         * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。
2350         * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
2351         * (初期値:システム定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。
2352         *
2353         * @og.rev 4.0.0.0 (2005/08/31) 新規追加
2354         *
2355         * @param       flag    クォーティションチェック  [true:する/:falseしない]
2356         * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
2357         */
2358        protected void useQuotCheck( final boolean flag ) {
2359                quotCheck = flag;
2360        }
2361
2362        /**
2363         * リクエスト情報の HTMLTag開始/終了文字(&gt;&lt;) 存在チェックを実施するかどうか[true/false]を設定します
2364         *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。
2365         *
2366         * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。
2367         * (&gt;&lt;) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
2368         * 現在の実装としてはリクエストパラメータのみチェックして、attributesに対しては行いません。
2369         * (初期値:システム定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。
2370         *
2371         * @og.rev 5.0.0.2 (2009/09/15) 新規追加
2372         *
2373         * @param       flag    XSSチェック [true:する/false:しない]
2374         * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
2375         */
2376        protected void useXssCheck( final boolean flag ) {
2377                xssCheck = flag;
2378        }
2379
2380        /**
2381         * 日付関係の情報を簡易的に取り出す処理を行います。
2382         *
2383         * これは、{&#064;DATE.XXXX AA BB CC} 引数処理をおこなうための、サポートメソッドです。
2384         * XXXX は結果のフォーマット、AA が基準時刻で省略した場合は、現在時刻が利用されます。
2385         * BB 引数は、日付についての加減算処理を行うためのコマンドです。
2386         * CC 引数は、BB引数のコマンドに付属するパラメータです。加減算処理の数値を指定できます。
2387         * AA,BB,CC 引数については、先頭に、@ を付ける事で、リクエスト変数が使用できます。
2388         *
2389         * 引数は、"XXXX AA BB" という状態で受け取ります。(DATE. ははずした形)
2390         * "XXXX" は、日付処理を行うキー文字列で予約語になっています。
2391         * ・YMD  :8文字の4-2-2年月日データ(yyyyMMdd)を扱います。
2392         * ・Y2MD  :6文字の2-2-2年月日データ(yyMMdd)を扱います。
2393         * ・YM   :6文字の4-2年月データ(yyyyMM)を扱います。
2394         * ・HMS  :6文字の2-2-2時分秒データ(HHmmss)を扱います。
2395         * ・YMDHMS :14文字の4-2-2-2-2-2年月日時分秒データ(yyyyMMddHHmmss)を扱います。
2396         * ・EEE  :曜日をデフォルトロケール(EEE)で表示します。
2397         *
2398         * F付きは、フォーマットされた日付を返します。
2399         * ・YMDF  :10文字の日付表現(yyyy/MM/dd)を扱います。
2400         * ・Y2MDF :8文字の日付表現(yy/MM/dd)を扱います。
2401         * ・YMF  :7文字の日付表現(yyyy/MM)を扱います。
2402         * ・HMSF  :8文字の時刻表現(HH:mm:ss)を扱います。
2403         * ・YMDHMSF:19文字の日付表現(yyyy/MM/dd HH:mm:ss)を扱います。
2404         * ・MDF  :5文字の月日表現(MM/dd)を扱います。
2405         * ・MDEF  :5文字+曜日の月日表現(MM/dd(EEE))を扱います。
2406         * ・MD2F  :和暦の月日表現(MM月dd日)を扱います。(5.5.5.2 追加)
2407         * ・GYMDF :和暦の年月日表現(GGGGyyyy年MM月dd日)を扱います。
2408         * ・G2YMDF :和暦の日付表現(Gyyyy/MM/dd)を扱います。
2409         * ・GYMF  :和暦の年月表現(GGGGyyyy年MM月)を扱います。
2410         * ・GYF  :和暦の年表現(GGGGyyyy)を扱います。
2411         *
2412         * なお、上記以外のフォーマットを指定する場合は、XXXX部分に直接記述できます。(5.5.5.2 追加)
2413         * ただし、スペースで分解するため、フォーマットにスペースを含む場合は、ダブルコーテーション等で
2414         * くくる等の処理が必要です。基本的には、自由フォーマットは、エラーチェックがない為、使わないでください。
2415         *
2416         * 第二引数 AA は、基準となる日付を、yyyyMMdd形式で指定します。nullの場合は、現在時刻を使用します。
2417         * 指定できる日付は、yyyyMMdd形式を推奨しますが、'/' , '-' , ' ' , ':' を削除して使います。
2418         * 6桁の場合は、yyyyMM + 01 とし、8ケタの場合は、yyyyMMdd とし、14ケタ以上の場合は、前半14文字を
2419         * yyyyMMddHHmmss として処理します。それ以外の桁数の場合は、エラーになります。
2420         * たとえば、"2012/09/05 16:52:36" のようなフォーマットデータの場合、'/' , '-' , ' ' , ':' を削除して
2421         * "20120905165236" に変換後、日付オブジェクトに変換されます。
2422         *
2423         * AA には、数字で始まる(20050701など)実日付と&#064;で始まるパラメータが使用できます。
2424         * &#064;AA と記述することで、{&#064;AA}で指定する場合と同様のリクエストパラメータが使用できます。
2425         * このパラメータの値の解析結果が、null の場合は、現在時刻が使用されます。
2426         * 数字以外の場合は、省略されたと判断して、コマンド(BB引数)として使用されます。
2427         *
2428         * BB 引数は、日付についての加減算処理を行います。
2429         * 省略すると、なにも加減算処理を行いません。
2430         * この引数もパラメータ(&#064;BB)指定で、リクエストパラメータが使用できます。
2431         * 加減算処理のパラメータが使用できるのは、"H" , "D" , "M" の1文字パラメータの場合のみです。
2432         * それ以外のコマンドで、加減算処理する場合は、独立した CC 引数 を使用してください。
2433         * ・SD :当月の最初の日付にセットします。(当月1日)。CC引数は、-N:N月前、0:当月(=SD)、N:N月後、-1:BSD と同じ、1:ASD と同じ
2434         * ・ED :当月の最後の日付にセットします。(当月月末)。CC引数は、-N:N月前、0:当月(=ED)、N:N月後、-1:BED と同じ、1:AED と同じ
2435         * ・SW :日付処理の週初め(月曜日)にセットします。日付は当日より前に移動します。CC引数は、-N:N週前、0:今週(=SW)、N:N週後
2436         * ・EW :日付処理の週末(日曜日)にセットします。日付は当日より後ろに移動します。CC引数は、-N:N週前、0:今週(=EW)、N:N週後
2437         * ・H1 〜 HXXX :時を指定の分だけ進めます。H1なら1時間後、H24 なら24時間後(5.5.5.6 (2012/08/31) 追加)
2438         * ・D1 〜 DXXX :日を指定の分だけ進めます。D1なら翌日、D200 なら200日後
2439         * ・M1 〜 MXXX :月を指定の分だけ進めます。M1なら翌月、M6 なら半年後
2440         * ・BSD :(有閑)先月の最初の日付にセットします。(先月1日)(5.5.5.2 追加)。SD -1 と同等
2441         * ・BED :(有閑)先月の最後の日付にセットします。(先月月末)(5.5.5.2 追加)。ED -1 と同等
2442         * ・ASD :(有閑)翌月の最初の日付にセットします。(翌月1日)(5.5.5.2 追加)。SD 1  と同等
2443         * ・AED :(有閑)翌月の最後の日付にセットします。(翌月月末)(5.5.5.2 追加)。ED 1  と同等
2444         *
2445         * CC 引数は、特別な処理で、BB 引数に対して、加算、減算のための数字を指定できます。(5.7.4.1 (2014/03/14) 追加)
2446         * 従来は、BB 引数が、"H" , "D" , "M" の 1文字パラメータの場合のみ利用可能でした。
2447         * これは、"H15" と指定するのと、"H" "15" と指定するのと同じ意味になります。
2448         * 異なるのは、CC 引数も、(&#064;CC)指定で、リクエストパラメータが使用できます。
2449         * 従来は、文字列として結合された状態でしか、BB 引数を渡せませんでしたが、この、CC 引数の
2450         * 追加で、日付の加減算を、パラメータ指定できるようになります。
2451         * 数字以外の文字が指定されたり、パラメータの解析結果が NULL の場合には、BB引数自体も無視されます。
2452         * 注意点は、各 BB 引数に応じて、数字の意味が異なるという事です。
2453         *
2454         * HXXX,DXXX,MXXX 形式に、CC 引数を付けた場合は、XXX にさらに加算されます。
2455         * prmB に、数字を使用した場合、(コマンドでない場合)にも、CC 引数は、加算されます。
2456         *
2457         * @og.rev 3.8.0.2 (2005/07/11) 新規追加
2458         * @og.rev 5.4.0.1 (2011/11/01) 日付処理の機能追加(BB 引数に、リクエストパラメータ対応)
2459         * @og.rev 5.5.0.2 (2012/03/09) 和暦対応
2460         * @og.rev 5.5.5.2 (2012/08/18) XXXXフォーマット追加、自由フォーマット対応、BB引数追加、/,-削除機能追加、SM,EM廃止
2461         * @og.rev 5.5.5.6 (2012/08/31) H1 〜 HXXX 追加。時間の加算を指定できる。
2462         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
2463         * @og.rev 5.5.8.2 (2012/11/09) prmA の判定に、null と ゼロ文字列を判定する。
2464         * @og.rev 5.6.0.1 (2013/01/11) 5.5.7.2でyyyyMMddしか取っていないため、HHmmssを追加します
2465         * @og.rev 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。
2466         * @og.rev 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。
2467         *
2468         * @param   value       パラメータ
2469         *
2470         * @return   メッセージ情報
2471         * @see         org.opengion.fukurou.util.HybsDateUtil#getDateFormat( String,String,String,int )
2472         */
2473        protected String getDateFormat( final String value ) {
2474                // {@DATE.XXXX AA BB CC} を分割
2475                String[] vals = StringUtil.csv2Array( value,' ' );              // ダブルクオート内は保持される。
2476
2477                String key = vals[0] ;
2478
2479                // 5.7.4.1 (2014/03/14) 初期化時に、vals を設定しておきます。
2480                String prmA = (vals.length >= 2) ? vals[1] : null ;
2481                String prmB = (vals.length >= 3) ? vals[2] : null ;
2482                String prmC = (vals.length >= 4) ? vals[vals.length-1] : null ;              // 互換性。最後の値が、CC引数
2483
2484                if( prmA != null && prmA.startsWith( "@" ) ) {
2485                        prmA = getRequestValue( prmA.substring(1) );
2486                }
2487
2488                if( prmB != null && prmB.startsWith( "@" ) ) {
2489                        prmB = getRequestValue( prmB.substring(1) );
2490                }
2491
2492                if( prmC != null && prmC.startsWith( "@" ) ) {
2493                        prmC = getRequestValue( prmC.substring(1) );
2494                }
2495
2496                // 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。
2497                if( prmA != null && prmA.length() > 0 ) {
2498                        char chA = prmA.charAt(0);
2499                        if( chA < '0' || chA > '9' ) {            // 先頭が、数字以外の場合は、コマンドなので、一つずつずらす。
2500                                prmC = prmB;
2501                                prmB = prmA;
2502                                prmA = null;
2503                        }
2504                }
2505
2506                // 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。
2507                int intC = 0;
2508                if( prmC != null && prmC.length() > 0 ) {
2509                        try { 
2510                                intC = Integer.parseInt( prmC );
2511                        }
2512                        catch( NumberFormatException ex ) {
2513                                String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 
2514                                                                + ex.getMessage() ;
2515                                System.err.println( errMsg );
2516                        }
2517                }
2518
2519                // prmA が null か、isEmpty() の場合は、現在時刻が使用される。
2520                return HybsDateUtil.getDateFormat( key,prmA,prmB,intC );        // 5.7.4.1 (2014/03/14) CC 引数を拡張します。
2521
2522//              // {@DATE.XXXX AA BB} を分割
2523//              String[] vals = StringUtil.csv2Array( value,' ' );
2524//
2525//              String key = vals[0] ;
2526//
2527//              String prmA = null;                             // 5.5.7.2 (2012/10/09) 引数として渡すので上位で初期化しておく。
2528//              String prmB = null;
2529////            if( vals.length == 3 ) {
2530//              if( vals.length >= 3 ) {
2531//                      prmB = vals[2];
2532//                      // 5.4.0.1 (2011/11/01) BB引数も、リクエストパラメータ処理できるように修正
2533//                      if( prmB.startsWith( "@" ) ) {
2534//                              prmB = getRequestValue( prmB.substring(1) );
2535//                      }
2536//              }
2537//
2538//              if( vals.length > 1 ) {
2539////                    String prmA = vals[1];
2540//                      prmA = vals[1];
2541//                      if( prmA.startsWith( "@" ) ) {
2542//                              prmA = getRequestValue( prmA.substring(1) );
2543//                      }
2544//
2545//                      // prmA の@解析後、8ケタ以下の場合は、コマンドとみなし、prmB にセットし、自身は、null をセットする。
2546//                      if( prmA != null && prmA.length() < 8 ) {
2547//                              prmB = prmA;
2548//                              prmA = null;
2549//                      }
2550//              }
2551//
2552////            if( prmA == null ) {
2553//              if( prmA == null || prmA.isEmpty() ) {          // 5.5.8.2 (2012/11/09) null と ゼロ文字列を判定する。
2554////                    if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMdd" ); }       // 現在時刻を文字列化しておく。
2555//                      if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMddHHmmss" ); } // 5.6.0.1 (2013/01/11) HHmmss
2556//
2557//                      prmA = rightNow;                                // 5.5.7.2 (2012/10/09) 初期値として、設定する。
2558//              }
2559//
2560//              // 5.5.7.2 (2012/10/09) CC 引数の処理。
2561//              // BB 引数が、"H" , "D" , "M" 一文字の単独の場合のみ、最終引数の数字が利用できます。
2562//              if( "H".equals( prmB ) || "D".equals( prmB ) || "M".equals( prmB ) ) {
2563//                      String prmC = vals[vals.length-1];              // 一番最後の文字
2564//                      if( prmC.startsWith( "@" ) ) {
2565//                              prmC = getRequestValue( prmC.substring(1) );
2566//                      }
2567//                      if( prmC != null && !prmC.isEmpty() ) {
2568//                              try { 
2569//                                      prmB = prmB + Integer.parseInt( prmC );         // 文字列の連結。
2570//                              }
2571//                              catch( NumberFormatException ex ) {
2572//                                      prmB = null;            // CC引数が不正な場合は、BB引数も無効化する。
2573//                                      String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 
2574//                                                                      + ex.getMessage() ;
2575//                                      System.err.println( errMsg );
2576//                              }
2577//                      }
2578//                      else {
2579//                              prmB = null;            // CC引数が不正な場合は、BB引数も無効化する。
2580//                      }
2581//              }
2582//
2583//              return HybsDateUtil.getDateFormat( key,prmA,prmB );             // 5.5.7.2 (2012/10/09) HybsDateUtil を利用する
2584        }
2585
2586        /**
2587         * debug や エラー時に参考にする、簡易リファレンスへのリンクを作成します。
2588         * リンクを行うタグの名称は、getTagName() メソッドより取得します。
2589         *
2590         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2591         * @og.rev 4.2.1.0 (2008/04/11) URLを相対パスに変更
2592         *
2593         * @return  簡易リファレンスへのリンク
2594         * @see  #getTagName()
2595         */
2596        protected String getDocumentLink() {
2597                String name    = getTagName();
2598
2599        //      try {
2600        //              Field fld = getClass().getDeclaredField( "VERSION" ) ;
2601        //              version = (String)fld.get( null );
2602        //      }
2603        //      catch( Exception ex ) {
2604        //              version = ex.toString();
2605        //      }
2606
2607                // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。
2608                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
2609                buf.append( "<br /><a href=\"../common/documents.html#VAL_" );
2610                buf.append( name );
2611                buf.append( "\" target=\"_brank\" >簡易リファレンス[" );
2612                buf.append( name );
2613                buf.append( "] " );
2614        //      buf.append( version );
2615                buf.append( "</a>" ).append( HybsSystem.BR );
2616
2617                return buf.toString();
2618        }
2619
2620        /**
2621         * タグの名称を、返します。
2622         * これは、debug や エラー時に参考にする、簡易リファレンスへのリンクを作成する場合に
2623         * 使用します。
2624         * 通常は、org.opengion.hayabusa.taglib.AbcdTag という自分自身のクラス名より、
2625         * abcd の部分を取り出し、返します。
2626         * クラス名とタグ名が、上記変換ルールと異なる場合は、このメソッドを
2627         * 使用して、直接 abcd の部分に相当する文字列を返すようにしてください。
2628         *
2629         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2630         *
2631         * @return  タグの名称
2632         * @see  #getDocumentLink()
2633         */
2634        protected String getTagName() {
2635                String name = getClass().getName();
2636                int adrs = name.lastIndexOf('.');
2637
2638                // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。
2639                return name.substring( adrs+1,adrs+2 ).toLowerCase(Locale.JAPAN)
2640                                + name.substring( adrs+2,name.length()-3 ) ;
2641        }
2642
2643        /**
2644         * リクエストに対して、画面遷移なしモードを有効にします[true/false]。
2645         * この情報は画面IDをキーにセッションに保存されるため、
2646         * 各タグで共有することができます。
2647         *
2648         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
2649         * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更(名称も変更)
2650         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2651         *
2652         * @param       flg     画面遷移なしモードを使用するか [true:有効/false:無効]
2653         */
2654        protected void setNoTransitionRequest( final boolean flg ) {
2655//      protected void setNoTransitionSession( final boolean flg ) {
2656                setRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY, String.valueOf( flg ));
2657//              setSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) );
2658        }
2659
2660        /**
2661         * リクエストで画面遷移なしモードが有効になっているかを返します。
2662         * この情報はセッションから画面IDをキーに取得します。
2663         * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、
2664         * falseを返します。
2665         *
2666         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
2667         * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更
2668         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2669         *
2670         * @return 画面遷移なしモードが有効
2671         */
2672        protected boolean isNoTransitionRequest() {
2673//      protected boolean isNoTransitionSession() {
2674                return StringUtil.nval( (String)getRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY ), false );
2675//              return StringUtil.nval( (String)getSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false );
2676        }
2677
2678        /**
2679         * リクエストに対して、AjaxSubmitモードを使用するかどうか指定します[true/false]。
2680         * この情報は画面IDをキーにセッションに保存されるため、
2681         * 各タグで共有することができます。
2682         *
2683         * @og.rev 4.3.8.0 (2009/08/01) 新規作成
2684         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2685         *
2686         * @param       flg     AjaxSubmitモードを使用するか [true:使用する/false:使用しない]
2687         */
2688        protected void setAjaxSubmitRequest( final boolean flg ) {
2689//      protected void setAjaxSubmitSession( final boolean flg ) {
2690                setRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY, String.valueOf( flg ));
2691//              setSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) );
2692        }
2693
2694        /**
2695         * リクエストでAjaxSubmitモードが有効になっているかを返します。
2696         * この情報はセッションから画面IDをキーに取得します。
2697         * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、
2698         * falseを返します。
2699         *
2700         * @og.rev 4.3.8.0 (2009/08/01) 新規作成
2701         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2702         *
2703         * @return AjaxSubmitモードが有効
2704         */
2705        protected boolean isAjaxSubmitRequest() {
2706//      protected boolean isAjaxSubmitSession() {
2707                return StringUtil.nval( (String)getRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY ), false );
2708//              return StringUtil.nval( (String)getSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false );
2709        }
2710
2711        /**
2712         * シリアライズ用のカスタムシリアライズ書き込みメソッド
2713         *
2714         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2715         * @serialData 一部のオブジェクトは、シリアライズされません。
2716         *
2717         * @param       strm    ObjectOutputStreamオブジェクト
2718         */
2719        private void writeObject( final ObjectOutputStream strm ) throws IOException {
2720                strm.defaultWriteObject();
2721        }
2722
2723        /**
2724         * シリアライズ用のカスタムシリアライズ読み込みメソッド
2725         *
2726         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
2727         *
2728         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2729         * @serialData 一部のオブジェクトは、シリアライズされません。
2730         *
2731         * @param       strm    ObjectInputStreamオブジェクト
2732         * @see #release2()
2733         */
2734        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
2735                strm.defaultReadObject();
2736                attri = new Attributes();
2737        }
2738
2739        /**
2740         * アクセスログ取得の為,ApplicationInfoオブジェクトを返します。
2741         * 見つからない場合は、null が返ります。(暫定対応)
2742         *
2743         * @og.rev 3.8.7.0 (2006/12/15) 新規追加
2744         *
2745         * @return      アクセスログ取得の為の管理オブジェクト
2746         */
2747        protected ApplicationInfo getApplicationInfo() {
2748                String gamenId = getGUIInfoAttri( "KEY" );
2749                String jspId   = (String)getSessionAttribute( "JSPID" );
2750
2751                return getUser().getApplicationInfo( gamenId,jspId );
2752        }
2753
2754        /**
2755         * イベントカラムの実行に必要なカラム情報をマップに登録します。
2756         *
2757         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
2758         *
2759         * @param col DBカラム
2760         */
2761        protected void addEventColumn( final DBColumn col ) {
2762                addEventColumn( col.getName(), col.getEventColumn(), col.getEventURL()
2763                                                , col.getRenderer(), col.getEditor(), col.getRawRendParam(), col.getRawEditParam() );
2764        }
2765
2766        /**
2767         * イベントカラムの実行に必要なカラム情報をマップに登録します。
2768         *
2769         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
2770         *
2771         * @param name カラム名
2772         * @param evCol イベントカラム名
2773         * @param url イベントURL
2774         * @param renderer カラムのレンデラー
2775         * @param editor カラムのエディター
2776         * @param rendParam カラムの表示パラメーター
2777         * @param editParam カラムの編集パラメーター
2778         */
2779        @SuppressWarnings(value={"unchecked"})
2780        protected void addEventColumn( final String name, final String evCol, final String url, final String renderer, final String editor, final String rendParam, final String editParam ) {
2781                if( evCol == null || evCol.length() == 0 ){ return; }
2782
2783                String key = (String)getRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY );
2784                if( key == null || key.length() == 0 ) {
2785//                      key = HybsSystem.USE_EVENT_COLUMN_KEY + String.valueOf( System.currentTimeMillis() );
2786                        key = HybsSystem.USE_EVENT_COLUMN_KEY + System.currentTimeMillis();
2787                        setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, key );
2788                }
2789
2790                Map<String, DBEventColumn> evColMap = (Map<String, DBEventColumn>)( getSessionAttribute( key ) );
2791                if( evColMap == null ){
2792                        evColMap = new HashMap<String,DBEventColumn>();
2793                }
2794                if( evColMap.get( name ) == null ) {
2795                        evColMap.put( name, new DBEventColumn( name, evCol, url, renderer, editor, rendParam, editParam ) );
2796                }
2797                setSessionAttribute( key, evColMap );
2798        }
2799
2800//      /**
2801//       * キーを画面ID_xxx.jspでnameとparamのマップを追加します。
2802//       * 又、リクエスト変数のUSE_EVENT_COLUMN_KEYをtrueにします。
2803//       * 一応複数セッションの対応としてsynchronizedする。
2804//       *
2805//       * @og.rev 4.3.6.0 (2009/04/01) 新規追加
2806//       *
2807//       */
2808//      @SuppressWarnings(value={"unchecked"})
2809//      protected void addEventColumnSQL( final String name, final String param ) {
2810//              if( session == null ) { session = pageContext.getSession(); }
2811//              synchronized( session.toString().intern() ){
2812//                      Map<String, String> ecSql = (Map<String, String>)( getSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ) ) );
2813//                      if( ecSql == null ){ ecSql = new HashMap<String,String>(); }
2814//                      ecSql.put( name, param );
2815//                      setSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ), ecSql );
2816//              }
2817//              setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, "true" ); // 利用フラグを立てる
2818//      }
2819
2820        /**
2821         * 各データベースに対応するファンクション名を返します。
2822         *
2823         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
2824         * @og.rev 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索するようにします。
2825         *
2826         * @param   key ファンクション名(定義文字)
2827         *
2828         * @return  実ファンクション名
2829         */
2830        protected String getDBFunctionName( final String key ) {
2831                int idx = key.indexOf( ' ' );
2832                String func = null;
2833                String dbid = null;
2834                if( idx >= 0 ) {
2835                        func = key.substring( 0, idx );
2836                        dbid = key.substring( idx+1, key.length() );
2837                        if( dbid.charAt(0) == '@' ) { dbid = getRequestValue( dbid.substring( 1 ) ); }
2838                }
2839                else {
2840                        func = key;
2841                }
2842//              return DBFunctionName.getFunctionName( func, ConnectionFactory.getDBFullName( dbid ) );
2843                // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索する。
2844                return DBFunctionName.getFunctionName( func, dbid );
2845        }
2846
2847        /**
2848         * データロールの設定に基づき、キー(カラム名)に対応する条件式を返します。
2849         *
2850         * @og.rev 4.4.0.0 (2009/08/02) 新規作成
2851         *
2852         * @param   key カラム名
2853         *
2854         * @return  条件式
2855         */
2856        protected String getDataCondition( final String key ) {
2857                return getUser().getDataCondition( key );
2858        }
2859        
2860        /**
2861         * 与えたIPアドレスからホスト名を取得して返します。
2862         * 取得できなかった場合は空文字を返します。
2863         * IPアドレスが解決できない場合や、セキュリティマネージャーで
2864         * 許可されていない場合はエラーを返します。
2865         *
2866         * @og.rev 5.6.6.2 (2013/07/19) 新規作成
2867         *
2868         * @param   ip IPアドレス
2869         *
2870         * @return  ホスト名(取得できない場合は空文字)
2871         */
2872        protected String getHostName( final String ip ) {
2873                String hostname = "";
2874                try{
2875                        hostname =  InetAddress.getByName(ip).getHostName();
2876                }
2877                catch(UnknownHostException ex){
2878                        String errMsg = "IPアドレスが解決できません。"
2879                                + ex.getMessage();                      
2880                        throw new HybsSystemException( errMsg,ex );             
2881                }
2882                catch(SecurityException ex){
2883                        String errMsg = "この操作はセキュリティ上許可されていません。"
2884                                + ex.getMessage();                      
2885                        throw new HybsSystemException( errMsg,ex );
2886                }
2887                return hostname;
2888        }
2889
2890        /**
2891         * このオブジェクトの文字列表現を返します。
2892         * 基本的にデバッグ目的に使用します。
2893         *
2894         * @return このクラスの文字列表現
2895         */
2896        @Override
2897        public String toString() {
2898                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
2899                                .println( "Other..."    ,getAttributes().getAttribute() )
2900                                .fixForm().toString() ;
2901        }
2902}