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