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         *
1195         * @param    attkey 画面情報を取り出すキー
1196         *
1197         * @return   画面情報文字列
1198         */
1199        protected String getGUIInfoAttri( final String attkey ) {
1200                if( attkey == null ) { return null; }
1201
1202                String  key = attkey ;
1203                final GUIInfo gui ;
1204
1205                int spc = key.indexOf( ' ' );           // " " があるかどうか
1206                if( spc > 0 ) {
1207                        key = attkey.substring( 0,spc );
1208                        String id = attkey.substring( spc+1 );
1209                        if( id.charAt(0) == '@' ) { id = getRequestValue( id.substring( 1 ) ); }
1210
1211                        gui = getUser().getGUIInfo( id );
1212                }
1213                else {
1214                        if( guiInfo == null ) {
1215                                guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
1216                        }
1217                        gui = guiInfo;
1218                }
1219                if( gui == null ) { return "Not Found[" + attkey + "]"; }
1220                if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); }
1221
1222                return gui.getAttribute( key );
1223        }
1224
1225        /**
1226         * {&#064;NVL.XXX 値} で、XXXが NULLの場合、値を返します。
1227         *
1228         * ORACLE等の COALESCE ( expr_list ) 処理に近い結果を返します。
1229         * NVL ( expr1 , expr2 ) は、expr1 が NULL の場合、expr2 を返しますが、
1230         * COALESCE は、第一引数が NULLなら、次の引数、それも NULL なら、さらに次と
1231         * 引数リストを順次処理していきます。
1232         * それと同じく、XXX が NULL なら、その次・・と順次評価していき、NULL でない
1233         * 値が返ってきたところで、その値を返します。
1234         * これは、{&#064;NVL.XXX &#064;YYY ZZZ ・・・} 形式を処理します。
1235         * これは、パラメータ XXX が NULLの場合、次の値を使います。(&#064;YYY) 
1236         * &#064;YYY は、YYY パラメータの事で、これも NULL の場合は、ZZZ を使います。
1237         * 最後まで NULL の場合は、 ゼロ文字列が返されます。
1238         *
1239         * @og.rev 5.6.4.0 (2013/05/02) 新規追加
1240         *
1241         * @param    attkey NVL情報を取り出すパラメータ
1242         *
1243         * @return   NULL以外の値が出てくるまで、順次評価した結果
1244         */
1245        protected String getNVLAttri( final String attkey ) {
1246                if( attkey == null ) { return null; }
1247
1248                String[]  keys = attkey.split( " " );                   // スペースで、パラメータを分解する。
1249                String    val  = getRequestValue( keys[0] );    // 第一パラメータは、そのままのキーで検索
1250
1251                // val が null の間は、チェックする。
1252                if( val == null || val.isEmpty() ) {
1253                        for( int i=1; i<keys.length; i++ ) {
1254                                val = keys[i];
1255                                // 先頭が @ の場合は、リクエスト変数のキーとして、値を判定
1256                                if( val.charAt(0) == '@' ) { val = getRequestValue( val.substring( 1 ) ); }
1257                                if( val != null && val.length() > 0 ) { break; }
1258                        }
1259                }
1260
1261                if( val == null ) { val = ""; }         // NULL の場合は、 ゼロ文字列を返す。
1262
1263                return val;
1264        }
1265
1266        /**
1267         * {&#064;LAST.XXX} で、XXXが 最後に使われた値を返します。
1268         *
1269         * XXX は、command="NEW" でセットされたリクエスト値です。通常、{&#064;MEM.XXX} は
1270         * 画面単位に、既存のキャッシュから値を取り出しますが、{&#064;LAST.XXX} は、
1271         * 画面に関係なく、ユーザー単位に管理しています。
1272         * また、値は、データベース(GE20)に保管されますので、次回ログイン時にも有効です。
1273         * この処理が呼び出されたときに、リクエスト変数に、XXXX が存在した場合は、そちらを優先に
1274         * 使います。その場合は、command に関係なく、値を設定しておきます。
1275         *
1276         * command="NEW"の場合のリクエスト変数の値の設定は、RequestCacheTag で行います。
1277         * 
1278         * ※ データベースには、画面アクセス情報のセーブ時に行われます。
1279         * valueタグのsave属性の様に、リアルタイムではありませんので、Tomcatが
1280         * 異常終了した場合は、セーブされません。
1281         *
1282         * @og.rev 5.6.8.1 (2013/09/13) 新規追加
1283         *
1284         * @param    attkey 最後に使われた値をを取り出すパラメータ
1285         *
1286         * @return   XXXが 最後に使われた値
1287         * @see         org.opengion.hayabusa.taglib.RequestCacheTag#commandExec( String ,ServletRequest )
1288         * @see         org.opengion.hayabusa.resource.UserInfo#getLastRequestValue( String )
1289         */
1290        protected String getLASTAttri( final String attkey ) {
1291                if( attkey == null ) { return null; }
1292
1293                // 最新のリクエスト変数をチェック
1294                String[] vals = getRequest().getParameterValues( attkey );
1295
1296                String val = null;
1297                if( vals == null ) {
1298                        val = getUser().getLastRequestValue( attkey );          // なければ、取得
1299                }
1300                else {
1301                        for( int i=0; i<vals.length; i++ ) {
1302                                val = vals[i];
1303                                if( ! "0".equals( val ) ) { break; }                    // チェックボックス対応
1304                        }
1305                        getUser().setLastRequestValue( attkey,val );            // あれば、最新の値をセット
1306                }
1307
1308                return val ;
1309        }
1310
1311        /**
1312         * {&#064;REQ.XXX} で、XXXの リクエストオブジェクトのメソッドの値を取得します。
1313         *
1314         * HttpServletRequest のメソッドを実行します。
1315         * それ以外に、ROWCOUNT というキーワードで、選択された行数を返します。
1316         *
1317         * <table border="2" frame="box" rules="all" >
1318         *   <caption>{&#064;REQ.XXX}の説明</caption>
1319         *   <tr><th>KEY</th><th>VALUE</th></tr>
1320         *   <tr><td>ROWCOUNT           </td><td style="white-space: normal">チェックされた件数</td></tr>
1321         *   <tr><td>RequestURL         </td><td style="white-space: normal">request.getRequestURL()</td></tr>
1322         *   <tr><td>AuthType           </td><td style="white-space: normal">request.getAuthType()</td></tr>
1323         *   <tr><td>ContextPath        </td><td style="white-space: normal">request.getContextPath()</td></tr>
1324         *   <tr><td>Method             </td><td style="white-space: normal">request.getMethod()</td></tr>
1325         *   <tr><td>PathInfo           </td><td style="white-space: normal">request.getPathInfo()</td></tr>
1326         *   <tr><td>PathTranslated     </td><td style="white-space: normal">request.getPathTranslated()</td></tr>
1327         *   <tr><td>QueryString        </td><td style="white-space: normal">request.getQueryString()</td></tr>
1328         *   <tr><td>RemoteUser         </td><td style="white-space: normal">request.getRemoteUser()</td></tr>
1329         *   <tr><td>RequestURI         </td><td style="white-space: normal">request.getRequestURI()</td></tr>
1330         *   <tr><td>ServletPath        </td><td style="white-space: normal">request.getServletPath()</td></tr>
1331         *   <tr><td>RemoteAddr         </td><td style="white-space: normal">request.getRemoteAddr()</td></tr>
1332         *   <tr><td>RemoteHost         </td><td style="white-space: normal">request.getRemoteHost()</td></tr>
1333         *   <tr><td>Scheme             </td><td style="white-space: normal">request.getScheme()</td></tr>
1334         *   <tr><td>ServerName         </td><td style="white-space: normal">request.getServerName()</td></tr>
1335         *   <tr><td>ServerPort         </td><td style="white-space: normal">request.getServerPort()</td></tr>
1336         * </table>
1337         *
1338         * @og.rev 5.9.9.1 (2016/06/10) REQ追加
1339         *
1340         * @param    attkey 最後に使われた値を取り出すパラメータ
1341         *
1342         * @return   XXXに対応したリクエストメソッドの実行結果
1343         */
1344        protected String getRequestMethod(final String attkey){
1345                if( attkey == null ) { return null; }
1346                
1347                final HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
1348                
1349                String rtn = "";
1350                if(     "ROWCOUNT"        .equalsIgnoreCase( attkey )){
1351                        final String[] vals = req.getParameterValues( HybsSystem.ROW_SEL_KEY );
1352                        rtn = vals == null ? "0" : String.valueOf( vals.length );
1353                }else if("RequestURL"     .equalsIgnoreCase( attkey )){
1354                        rtn = req.getRequestURL().toString();
1355                }else if("AuthType"       .equalsIgnoreCase( attkey )){
1356                        rtn = req.getAuthType();
1357                }else if("ContextPath"    .equalsIgnoreCase( attkey )){
1358                        rtn = req.getContextPath();
1359                }else if("Method"         .equalsIgnoreCase( attkey )){
1360                        rtn = req.getMethod();
1361                }else if("PathInfo"       .equalsIgnoreCase( attkey )){
1362                        rtn = req.getPathInfo();
1363                }else if("PathTranslated" .equalsIgnoreCase( attkey )){
1364                        rtn = req.getPathTranslated();
1365                }else if("QueryString"    .equalsIgnoreCase( attkey )){
1366                        rtn = req.getQueryString();
1367                }else if("RemoteUser"     .equalsIgnoreCase( attkey )){
1368                        rtn = req.getRemoteUser();
1369                }else if("RequestURI"     .equalsIgnoreCase( attkey )){
1370                        rtn = req.getRequestURI();
1371                }else if("ServletPath"     .equalsIgnoreCase( attkey )){
1372                        rtn = req.getServletPath();
1373                }else if("RemoteAddr"     .equalsIgnoreCase( attkey )){
1374                        rtn = req.getRemoteAddr();
1375                }else if("RemoteHost"     .equalsIgnoreCase( attkey )){
1376                        rtn = req.getRemoteHost();
1377                }else if("Scheme"         .equalsIgnoreCase( attkey )){
1378                        rtn = req.getScheme();
1379                }else if("ServerName"     .equalsIgnoreCase( attkey )){
1380                        rtn = req.getServerName();
1381                }else if("ServerPort"     .equalsIgnoreCase( attkey )){
1382                        rtn = String.valueOf( req.getServerPort() );
1383                }
1384                
1385                if( rtn == null ){ rtn = ""; }
1386                
1387                return rtn;
1388        }
1389
1390        /**
1391         * 予約語に関する情報の文字列を取得します。
1392         *
1393         * @og.rev 5.5.4.0 (2012/07/02) 予約語部分のみ分離
1394         * @og.rev 5.6.4.0 (2013/05/02) NVL 追加
1395         * @og.rev 5.6.8.1 (2013/09/13) LAST 追加
1396         * @og.rev 5.8.2.3 (2014/12/27) USEREDIT追加
1397         * @og.rev 5.9.9.1 (2016/06/10) REQ追加
1398         * @og.rev 5.9.13.0 (2016/10/07) VAL追加。value値とリクエスト変数では、リクエスト変数が上位なので、value値を取り出したい場合に使用します。
1399         *
1400         * @param    key キー
1401         *
1402         * @return   リクエスト情報の文字列
1403         */
1404        protected String getReservedValue( final String key ) {
1405                if( key == null ) { isReqNull = true; return ""; }              // 3.4.0.3 (2003/09/10)
1406
1407                String rtn ;
1408                int adrs = key.indexOf( '.' );
1409                if( adrs > 0 ) {
1410                        String subKey = key.substring( adrs+1 );
1411                        if( key.startsWith( "USER." ) ) {
1412                                rtn = getUserInfo( subKey );
1413                        }
1414                        else if( key.startsWith( "USEREDIT." ) ) {
1415                                rtn = getUserEditInfo( subKey );        // 5.8.2.3 (2014/12/27)
1416                        }
1417                        else if( key.startsWith( "GUI." ) ) {
1418                                rtn = getGUIInfoAttri( subKey );        // 4.0.0 (2005/01/31)
1419                        }
1420                        else if( key.startsWith( "SYS." ) ) {
1421                                rtn = sys( subKey );            // 3.5.6.6 (2004/08/23)
1422                        }
1423                        else if( key.startsWith( "SESSION." ) ) {               // 3.5.5.3 (2004/04/09)
1424                                rtn = String.valueOf( getSessionAttribute( subKey ) );
1425                        }
1426                        // 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。
1427                        else if( key.startsWith( "MEM." ) ) {
1428                                // 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正
1429                                rtn = getRequestCacheData( subKey );
1430                        }
1431                        // 3.8.0.2 (2005/07/11) MSG.XXXX で、メッセージリソースの値を取得できるように追加。
1432                        // 3.8.0.2 (2005/07/11) LBL.XXXX で、ラベルリソースの値を取得できるように追加。
1433                        else if( key.startsWith( "LBL." ) ) {
1434                                rtn = getLabel( subKey );
1435                        }
1436                        // 3.8.0.2 (2005/07/11) DATE.XXXX で、日付関係の値を取得できるように追加。
1437                        else if( key.startsWith( "DATE." ) ) {
1438                                rtn = getDateFormat( subKey );
1439                        }
1440                        // 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。
1441                        // NVAR. を取り除いた XXXX で再度、リクエスト値を取得し、それを Escape変換します。
1442                        else if( key.startsWith( "NVAR." ) ) {
1443                                rtn = StringUtil.getUnicodeEscape( getRequestValue( subKey ) );
1444                        }
1445                        // 4.3.6.0 (2009/04/01) メールモジュール用の予約語
1446                        else if( key.startsWith( "MAIL." ) ) {
1447                                rtn = ( String )getSessionAttribute( key );
1448                        }
1449                        // 4.3.7.0 (2009/06/01) DB関数名の取得
1450                        else if( key.startsWith( "DBF." ) ) {
1451                                rtn = getDBFunctionName( subKey );
1452                        }
1453                        // 4.4.0.0 (2009/08/02) データロールに基づく条件式の取得
1454                        else if( key.startsWith( "SEC." ) ) {
1455                                rtn = getDataCondition( subKey );
1456                        }
1457                        // 5.3.9.0 (2011/09/01) URLエンコード変換
1458                        else if( key.startsWith( "URL." ) ) {
1459                                rtn = StringUtil.urlEncode( getRequestValue( subKey ) );
1460                        }
1461                        // 5.5.1.3 (2012/04/09) エスケープ変換
1462                        else if( key.startsWith( "ESC." ) ) {
1463                                rtn = StringUtil.htmlFilter( getRequestValue(subKey,false) );
1464                        }
1465                        // 5.6.4.0 (2013/05/02) NVL 追加
1466                        else if( key.startsWith( "NVL." ) ) {
1467                                rtn = getNVLAttri( subKey );
1468                        }
1469                        // 5.6.8.1 (2013/09/13) LAST 追加
1470                        else if( key.startsWith( "LAST." ) ) {
1471                                rtn = getLASTAttri( subKey );
1472                        }
1473                        // 5.9.9.1 (2016/06/10) REQ 追加
1474                        else if( key.startsWith( "REQ." ) ) {
1475                                rtn = getRequestMethod( subKey );
1476                        }
1477                        //5.9.13.0 (2016/10/07) 追加
1478                        else if( key.startsWith( "VAL." ) ) {
1479                                rtn = (String)getRequestAttribute( subKey );    // ※ 取り出しは、subKey で
1480                        }
1481                        // 4.0.0 (2007/06/12) DB.XXXX は、直接取り出すように変更します。
1482                        else { // 4.0.0.0 (2007/11/16)
1483                                rtn = (String)getRequestAttribute( key );               // ※ 取り出しは、key で
1484                        }
1485                }
1486                else{
1487                        rtn = "{@" + key + "}"; // 予約語以外は括弧を付けて書き戻します。
1488                }
1489                return rtn;
1490        }
1491
1492        /**
1493         * リクエスト情報の文字列を取得します。
1494         *
1495         * @og.rev 5.0.0.2 (2009/09/15) XSS対策
1496         *
1497         * @param    key キー
1498         *
1499         * @return   リクエスト情報の文字列
1500         */
1501        protected String getRequestValue( final String key ) {
1502                return getRequestValue( key, xssCheck);
1503        }
1504
1505        /**
1506         * リクエスト情報の文字列を取得します。
1507         *
1508         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1509         * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
1510         * @og.rev 3.0.0.0 (2002/12/25) ValueTag追加の為、指定の scope の Attributeより取得
1511         * @og.rev 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の所得優先順位を、request が優先されるように変更。
1512         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。
1513         * @og.rev 3.1.5.0 (2003/04/22) SYS.XXXX で、システムパラメータ の値を取得できるように修正。
1514         * @og.rev 3.1.7.0 (2003/05/02) リクエスト情報の取得順序を、Request、キャッシュ、Value の順に変更。
1515         * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
1516         * @og.rev 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。
1517         * @og.rev 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正
1518         * @og.rev 3.5.5.3 (2004/04/09) {&#064;SESSION.XXXX} で、session.getAttribute( "XXXX" ) の値を取得するように修正
1519         * @og.rev 3.5.6.6 (2004/08/23) SYS.XXXX の処理を getSystemParameter( String key ) メソッドへ移動
1520         * @og.rev 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。
1521         * @og.rev 3.8.0.2 (2005/07/11) MSG.XXXX , LBL.XXXX の処理を追加
1522         * @og.rev 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1523         * @og.rev 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。
1524         * @og.rev 4.0.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策
1525         * @og.rev 4.0.0.0 (2005/08/31) getSystemParameter を sys に名称変更
1526         * @og.rev 4.0.0.0 (2007/04/02) Valueタグの値と、キャッシュでは、Valueタグの値を優先するように変更
1527         * @og.rev 4.0.0.0 (2007/11/16) "."付きのパラメータのエラー処理をなくし、getRequestAttributeで取得する。
1528         * @og.rev 4.3.0.0 (2008/07/04) DB.XXXX は、必ずStringオブジェクトとし、String.valueOf しない。
1529         * @og.rev 4.3.6.0 (2009/04/01) メールモジュール用の予約語MAIL.XXXXの取得対応
1530         * @og.rev 4.4.0.0 (2009/08/02) データロール対応(SEC.xxxの取得対応)
1531         * @og.rev 5.0.0.2 (2009/09/15) XSS対策用にメソッドにフラグを追加
1532         * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止
1533         * @og.rev 5.3.9.0 (2011/09/01) URL.XXXX処理を追加
1534         * @og.rev 5.5.1.3 (2012/04/09) ESC.XXXX処理を追加
1535         * @og.rev 5.5.4.0 (2012/07/01) 予約語の処理を分離
1536         * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。
1537         * @og.rev 5.9.25.2 (2017/10/27) xssCheck及びquotCheckのエラーメッセージをラベルリソース化
1538         *
1539         * @param       key     キー
1540         * @param       xssCheckFlg     XSS対策用
1541         *
1542         * @return   リクエスト情報の文字列
1543         */
1544        protected String getRequestValue( final String key, final boolean xssCheckFlg ) {
1545                if( key == null ) { isReqNull = true; return ""; }              // 3.4.0.3 (2003/09/10)
1546
1547                String rtn ;
1548                int adrs = key.indexOf( '.' );
1549
1550                if( adrs > 0 ) {
1551                        rtn = getReservedValue( key ); // 5.5.4.0 (2012/07/02)
1552                }
1553                else {
1554                        rtn = getRequest().getParameter( key );
1555
1556                        // 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。
1557                        if( isSanitized ) {
1558                                if( rtn != null && rtn.indexOf( '[' ) >= 0 ) {
1559                                        rtn = rtn.replace( "[", "\\]\\" );
1560                                }
1561                        }
1562
1563                        // 5.0.0.2 (2009/09/15) tagCheck によるthan signチェック Parameterのみにかけるためこの位置
1564                        if( rtn != null && rtn.length() > 0 && xssCheckFlg && ( rtn.indexOf( '<' ) >= 0 || rtn.indexOf( '>' ) >= 0 ) ) {
1565//                              String errMsg = "リクエスト引数に Less/Greater than sign(<,>)を含むことは出来ません。" + HybsSystem.CR
1566//                                                      + " 処理が正しい場合は、xssCheck 属性を false にセットしてください。" + HybsSystem.CR
1567//                                                      + " key=[" + key + "]"
1568//                                                      + " val=[" + rtn + "]"
1569//                                                      + " tag=[" + getTagName() + "]" ;
1570//                              throw new HybsSystemException( errMsg );
1571                                
1572                                // 5.9.25.2 (2017/10/27)
1573                                getResource();
1574                                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1575                                buf.append( resource.getLabel( "ERR0048.1" ) ).append( HybsSystem.CR );
1576                                buf.append( resource.getLabel( "ERR0048.2",new String[] { key,rtn,getTagName() } ) ).append( HybsSystem.CR );
1577
1578                                throw new HybsSystemException( buf.toString() );
1579                        }
1580
1581                        // 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。
1582                        // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1583                        // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。
1584                        if( "0".equals(rtn) ) {
1585                                boolean backFlag = isReqNull ;
1586                                String[] vals = getRequestValues( key );
1587                                if( vals != null && vals.length > 1 ) {
1588                                        for( int i=0; i<vals.length; i++ ) {
1589                                                if( "1".equals( vals[i] ) ) { rtn = "1"; break; }
1590                                        }
1591                                }
1592                                isReqNull = backFlag;   // 3.8.8.8 (2007/05/11) getRequestValues での NULLセット解除
1593                        }
1594
1595                        // 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の取得優先順位を、
1596                        // request が優先されるように変更。
1597                        if( ( rtn == null || rtn.length() == 0 ) && requestCache != null ) {
1598                                String[] str = requestCache.get( key );
1599                                if( str != null && str.length > 0 ) {
1600                                        rtn = str[0];
1601                                }
1602                        }
1603                        // 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止
1604//                      if( ( rtn == null || rtn.length() == 0 ) && useValue ) {
1605                        if( ( rtn == null || rtn.length() == 0 ) ) {
1606                                Object obj = pageContext.findAttribute( key );
1607                                if( obj != null ) {
1608                                        rtn = obj.toString();
1609                                }
1610                        }
1611                }
1612                if( rtn == null || rtn.length() == 0 ) {
1613                        isReqNull = true;
1614                        rtn    = "";
1615                }
1616                // 4.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策
1617                else if( quotCheck && rtn.indexOf( "'" ) >= 0 && !key.startsWith( "SEC." ) ) {
1618//                      String errMsg = "リクエスト引数に、クォーティション(')を含むことは出来ません。" + HybsSystem.CR
1619//                                              + " 処理が正しい場合は、quotCheck 属性を false にセットしてください。" + HybsSystem.CR
1620//                                              + " key=[" + key + "]"
1621//                                              + " val=[" + rtn + "]"
1622//                                              + " tag=[" + getTagName() + "]" ;
1623//                      throw new HybsSystemException( errMsg );
1624                        // 5.9.25.2 (2017/10/27)
1625                        getResource();
1626                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1627                        buf.append( resource.getLabel( "ERR0049.1" ) ).append( HybsSystem.CR );
1628                        buf.append( resource.getLabel( "ERR0049.2",new String[] { key,rtn,getTagName() } ) ).append( HybsSystem.CR );
1629
1630                        throw new HybsSystemException( buf.toString() );
1631                }
1632
1633                // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。
1634                // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。
1635//              if( "0".equals(rtn) ) {
1636//                      String[] vals = getRequestValues( key );
1637//                      if( vals != null ) {
1638//                              for( int i=0; i<vals.length; i++ ) {
1639//                                      if( "1".equals( vals[i] ) ) { rtn = "1"; break; }
1640//                              }
1641//                      }
1642//              }
1643
1644                return rtn ;
1645        }
1646
1647        /**
1648         * リクエスト情報の文字列を取得します。
1649         *
1650         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1651         * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
1652         * @og.rev 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。
1653         * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。
1654         *
1655         * @param    key キー
1656         *
1657         * @return   リクエスト情報の文字列
1658         */
1659        protected String[] getRequestValues( final String key ) {
1660                String[] rtn = getRequest().getParameterValues( key );
1661
1662                // 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。
1663                if( ( rtn == null || rtn.length == 0 ) && requestCache != null ) {
1664                        rtn =requestCache.get( key );
1665                }
1666
1667                // 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。
1668                if( rtn == null || rtn.length == 0 ) {
1669                        String tmp = getRequestValue( key );
1670                        if( tmp != null && tmp.length() > 0 ) {
1671                                rtn = new String[]{ tmp };
1672                        }
1673                }
1674
1675                if( rtn == null || rtn.length == 0 ) { isReqNull = true; }
1676                return rtn ;
1677        }
1678
1679        /**
1680         * リクエスト情報の文字列のキー集合を取得します。
1681         *
1682         * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応
1683         *
1684         * @return   リクエスト情報の文字列のキー集合
1685         */
1686        protected Enumeration<?> getParameterNames() {            // 4.3.3.6 (2008/11/15) Generics警告対応
1687                String[] names = (String[])getRequestAttribute( HybsSystem.PARAM_NAMES_KEY );
1688                return ( names == null ? getRequest().getParameterNames() : Collections.enumeration( Arrays.asList( names ) ) );
1689        }
1690
1691        /**
1692         * リクエスト情報の文字列のキー集合をセットします。
1693         *
1694         * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応
1695         *
1696         * @param names リクエスト情報の文字列のキー配列
1697         */
1698        protected void setParameterNames( final String[] names ) {
1699                setRequestAttribute( HybsSystem.PARAM_NAMES_KEY, names );
1700        }
1701
1702        /**
1703         * リクエスト情報の文字列に NULL が存在していたかどうかを取得します。
1704         *
1705         * これは、getRequestParameter( String ) の呼出し毎に設定されます。
1706         * つまり、上記メソッドの実行直後の値を取り出す必要があります。
1707         * NULL が含まれていた(true)/含まれていなかった。(false)
1708         *
1709         * @return      NULLが含まれていた(true)/含まれていなかった。(false)
1710         */
1711        protected boolean isNull() {
1712                return isReqNull;
1713        }
1714
1715        /**
1716         * リクエスト情報の文字列値取得時に、value値の使用可否を指定します。
1717         *
1718         * value 値は、通常、ValueTag等によりセットされますが、ValueTag自身がリクエスト
1719         * 情報から値を取得する場合に、リクエスト情報が無い場合に、自分自身の値を
1720         * 取得してしまい、予想しない動きをすることを避けるため、使用します。
1721         * 初期値は、true(使用する)です。
1722         *
1723         * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。
1724         * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、メソッド廃止
1725         *
1726         * @param  flag value値の使用可否(true:使用化/false:使用不可)
1727         */
1728//      protected void setUseValue( final boolean flag ) {
1729//              useValue = flag;
1730//      }
1731
1732        /**
1733         * セッションに登録されているオブジェクトを取得します。
1734         *
1735         * @param   key キー
1736         *
1737         * @return   セッションに登録されているオブジェクト
1738         */
1739        protected Object getSessionAttribute( final String key ) {
1740                if( session == null ) { session = pageContext.getSession(); }
1741                return session.getAttribute( key );
1742        }
1743
1744        /**
1745         * セッションに 指定のキーでオブジェクトをセットします。
1746         *
1747         * @param   key キー
1748         * @param   object セッションに登録するオブジェクト
1749         */
1750        protected void setSessionAttribute( final String key ,final Object object ) {
1751                if( session == null ) { session = pageContext.getSession(); }
1752                session.setAttribute( key,object );
1753        }
1754
1755        /**
1756         * セッションに指定のキーで登録されているオブジェクトを 削除します。
1757         *
1758         * @param   key キー
1759         */
1760        protected void removeSessionAttribute( final String key ) {
1761                if( session == null ) { session = pageContext.getSession(); }
1762                session.removeAttribute( key );
1763        }
1764
1765        /**
1766         * リクエストに登録されているオブジェクトを取得します。
1767         *
1768         * @param   key キー
1769         *
1770         * @return   リクエストンに登録されているオブジェクト
1771         */
1772        protected Object getRequestAttribute( final String key ) {
1773                return getRequest().getAttribute( key );
1774        }
1775
1776        /**
1777         * リクエストに 指定のキーでオブジェクトをセットします。
1778         *
1779         * @param   key キー
1780         * @param   object リクエストに登録するオブジェクト
1781         */
1782        protected void setRequestAttribute( final String key ,final Object object ) {
1783                getRequest().setAttribute( key,object );
1784        }
1785
1786        /**
1787         * リクエストに指定のキーで登録されているオブジェクトを 削除します。
1788         *
1789         * @param   key キー
1790         */
1791        protected void removeRequestAttribute( final String key ) {
1792                getRequest().removeAttribute( key );
1793        }
1794
1795        /**
1796         * コンテキスト(applicaton)に登録されているオブジェクトを取得します。
1797         *
1798         * scope属性に、"applicaton" が指定された場合に、実行されます。
1799         *
1800         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1801         *
1802         * @param   key キー
1803         *
1804         * @return   コンテキスト(applicaton)に登録されているオブジェクト
1805         */
1806        protected Object getContextAttribute( final String key ) {
1807                ServletContext applicaton = pageContext.getServletContext();
1808                return applicaton.getAttribute( key );
1809        }
1810
1811        /**
1812         * コンテキスト(applicaton)指定のキーでオブジェクトをセットします。
1813         *
1814         * scope属性に、"applicaton" が指定された場合に、実行されます。
1815         *
1816         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1817         *
1818         * @param   key キー
1819         * @param   object コンテキスト(applicaton)に登録するオブジェクト
1820         */
1821        protected void setContextAttribute( final String key ,final Object object ) {
1822                ServletContext applicaton = pageContext.getServletContext();
1823                applicaton.setAttribute( key,object );
1824        }
1825
1826        /**
1827         * コンテキスト(applicaton)指定のキーで登録されているオブジェクトを 削除します。
1828         *
1829         * scope属性に、"applicaton" が指定された場合に、実行されます。
1830         *
1831         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1832         *
1833         * @param   key キー
1834         */
1835        protected void removeContextAttribute( final String key ) {
1836                ServletContext applicaton = pageContext.getServletContext();
1837                applicaton.removeAttribute( key );
1838        }
1839
1840        /**
1841         * アプリケーションサーバーのコンテキストパスのURLを返します。
1842         *
1843         * @return   コンテキストパス
1844         */
1845        protected String getContextPath() {
1846                return ((HttpServletRequest)getRequest()).getContextPath();
1847        }
1848
1849        /**
1850         * スコープに応じて登録されているオブジェクトを取得します。
1851         *
1852         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1853         *
1854         * @param   key キー
1855         *
1856         * @return   スコープに応じて登録されているオブジェクト
1857         */
1858        protected Object getObject( final String key ) {
1859                if( "session".equals( scope ) ) { return getSessionAttribute( key ); }
1860                else if( "request".equals( scope ) ) { return getRequestAttribute( key ); }
1861                else if( "applicaton".equals( scope ) ) { return getContextAttribute( key ); }
1862                else {
1863                        String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1864                        throw new IllegalArgumentException( errMsg );
1865                }
1866        }
1867
1868        /**
1869         * スコープに応じて登録されているオブジェクトを指定のキーでセットします。
1870         *
1871         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1872         *
1873         * @param   key キー
1874         * @param   object リクエストに登録するオブジェクト
1875         * @see     #setObject( String ,Object ,String )
1876         */
1877        protected void setObject( final String key ,final Object object ) {
1878                setObject( key,object,scope );
1879//              if( "session".equals( scope ) ) { setSessionAttribute( key,object ); }
1880//              else if( "request".equals( scope ) ) { setRequestAttribute( key,object ); }
1881//              else if( "applicaton".equals( scope ) ) { setContextAttribute( key,object ); }
1882//              else {
1883//                      String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1884//                      throw new IllegalArgumentException( errMsg );
1885//              }
1886        }
1887
1888        /**
1889         * スコープに応じて登録されているオブジェクトを指定のキーでセットします。
1890         *
1891         * 引数にスコープを指定します。スコープが null の場合は、オリジナルの
1892         * スコープを使用します。
1893         *
1894         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
1895         *
1896         * @param   key キー
1897         * @param   object リクエストに登録するオブジェクト
1898         * @param   scp スコープ
1899         * @see     #setObject( String ,Object )
1900         */
1901        protected void setObject( final String key ,final Object object ,final String scp ) {
1902                String inScp = (scp == null) ? scope : scp ;
1903
1904                if(      "session".equals( inScp        ) ) { setSessionAttribute( key,object ); }
1905                else if( "request".equals( inScp        ) ) { setRequestAttribute( key,object ); }
1906                else if( "applicaton".equals( inScp ) ) { setContextAttribute( key,object ); }
1907                else {
1908                        String errMsg = "このスコープはサポートされていません。[" + inScp + "]";
1909                        throw new IllegalArgumentException( errMsg );
1910                }
1911        }
1912
1913        /**
1914         * スコープに応じて登録されているオブジェクトを指定のキーで削除します。
1915         *
1916         * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加
1917         *
1918         * @param   key キー
1919         */
1920        protected void removeObject( final String key ) {
1921                if( "session".equals( scope ) ) { removeSessionAttribute( key ); }
1922                else if( "request".equals( scope ) ) { removeRequestAttribute( key ); }
1923                else if( "applicaton".equals( scope ) ) { removeContextAttribute( key ); }
1924                else {
1925                        String errMsg = "このスコープはサポートされていません。[" + scope + "]";
1926                        throw new IllegalArgumentException( errMsg );
1927                }
1928        }
1929
1930        /**
1931         * リクエストオブジェクトを取得します。
1932         *
1933         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
1934         * @og.rev 2.2.0.0 (2002/12/17) 文字化け対策 setCharacterEncoding が効いていないので削除
1935         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。
1936         * @og.rev 3.4.0.3 (2003/09/10) 冗長な個所や、無意味な個所を、等価な内容のロジックに置き換える。
1937         * @og.rev 3.5.5.0 (2004/03/12) command=RESET 時にも、キャッシュを取り出すように変更します。
1938         *
1939         * @return   リクエストオブジェクト
1940         */
1941        @SuppressWarnings(value={"unchecked"})
1942        protected ServletRequest getRequest() {
1943                if( request == null ) {
1944                        request = pageContext.getRequest();
1945                        // リクエストキャッシュ機能
1946                        String cmd =request.getParameter( "command" );
1947                        if( "RENEW".equals( cmd ) || "RESET".equals( cmd ) ) {  // 3.5.5.0
1948                                requestCache = (Map<String,String[]>)getSessionAttribute( HybsSystem.REQ_CACHE_KEY );
1949                        }
1950                }
1951                return request;
1952        }
1953
1954        /**
1955         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1956         *
1957         * 処理としては、getRequestParameter() によるパラメータ処理も含みます。
1958         * このメソッドは、必ず doAfterBody() から呼び出してください。それ以外(例えば、
1959         * doEndTag()等)では、すでに Body情報が破棄/再利用されている可能性があり、
1960         * 正常に動作しなくなる可能性があります。
1961         *
1962         * @og.rev 3.1.1.0 (2003/03/28) BodyContent オブジェクトを取得して、ボディの内容を取得する処理を追加
1963         *
1964         * @return   ボディ文字列
1965         */
1966        protected String getBodyString() {
1967                BodyContent body = getBodyContent();
1968                return getRequestParameter( body.getString() );
1969        }
1970
1971        /**
1972         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1973         *
1974         * {&#064;XXXX}を変換しない生のBODY文を返します
1975         *
1976         * @og.rev 4.3.6.0 (2009/04/01) 新規作成
1977         *
1978         * @return   ボディ文字列
1979         */
1980        protected String getBodyRawString() {
1981                BodyContent body = getBodyContent();
1982                return body.getString();
1983        }
1984
1985        /**
1986         * BodyContent オブジェクトを取得して、ボディの内容を取得します。
1987         *
1988         * {&#064;XXXX}の変換を行いますが、その変換結果に、"["が含まれる場合は、
1989         * "\\]\\"に変換して、フォーマット処理されないようにサニタイズします。
1990         *
1991         * @og.rev 5.1.7.0 (2010/06/01) 新規作成
1992         * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。
1993         *
1994         * @return   ボディ文字列
1995         */
1996        protected String getSanitizedBodyString() {
1997                isSanitized = true;
1998                String rtn = getBodyString();
1999                isSanitized = false;                            // 一連の処理の中だけ、有効とします。
2000
2001                return rtn;
2002
2003                // 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。
2004//              BodyContent body = getBodyContent();
2005//              String rawBodyString = body.getString();
2006//              if( rawBodyString.indexOf( "{@" ) >= 0 ) {
2007//                      SystemParameter sysParam = new SystemParameter( rawBodyString );
2008//                      String[] clms = sysParam.getColumns();
2009//                      if( clms != null ) {
2010//                              for( int i=0; i<clms.length; i++ ) {
2011//                                      String key = "{@" + clms[i] + "}";
2012//                                      String parsedVal = getRequestParameter( key );
2013//                                      if( parsedVal != null && parsedVal.indexOf( '[' ) >= 0 ) {
2014//                                              rawBodyString = rawBodyString.replace( key, parsedVal.replace( "[", "\\]\\" ) );
2015//                                      }
2016//                              }
2017//                      }
2018//              }
2019//
2020//              return getRequestParameter( rawBodyString );
2021        }
2022
2023        /**
2024         * JspWriter を使用した画面出力です。
2025         *
2026         * @param msg 画面に出力する文字列
2027         */
2028        protected void jspPrint( final String msg ) {
2029                if( msg == null ) { return ; }
2030                try {
2031                        JspWriter out = pageContext.getOut();
2032                        out.print( msg );
2033                } catch(IOException ex) {
2034                        String errMsg = "画面出力時の PageContext の取得時にエラーが発生しました。"
2035                                                        + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
2036                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2037                }
2038        }
2039
2040        /**
2041         * デバッグ用の文字列を JspWriter を使用して画面に出力します。
2042         * このメソッドは、debugFlag=true の場合のみ動作します。
2043         *
2044         * 出力内容は,各オブジェクトの toString() 文字列です。
2045         *
2046         * @og.rev 4.0.0.0 (2005/02/28) debugFlag の条件式を追加。
2047         * @og.rev 4.0.0.0 (2005/02/28) 簡易リファレンスへのリンクを追加。
2048         */
2049        protected void debugPrint() {
2050                if( debugFlag ) {
2051                        try {
2052                                JspWriter out = pageContext.getOut();
2053                                out.println( getDocumentLink() );               // 4.0.0 (2005/02/28)
2054                                out.println( "<pre>" );
2055                                out.println( toString() );
2056                                out.println( "</pre>" );
2057                        } catch(IOException ex) {
2058                                String errMsg = "デバッグ画面出力時の PageContext の取得時にエラーが発生しました。"
2059                                                        + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
2060                                throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2061                        }
2062                }
2063        }
2064
2065        /**
2066         * GAMENID付のリクエストキャッシュ情報を取り出します。
2067         *
2068         * @og.rev 3.5.4.7 (2004/02/06) 新規作成
2069         *
2070         * @param key リクエストキャッシュのキー情報
2071         *
2072         * @return リクエスト情報(存在しない場合は、null)
2073         */
2074        protected String getRequestCacheData( final String key ) {
2075                String rtn = null;
2076
2077                String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
2078//              Map mem = (Map)getSessionAttribute( memKey );
2079                Map<?,?> mem = (Map<?,?>)getSessionAttribute( memKey );             // 4.3.3.6 (2008/11/15) Generics警告対応
2080
2081                if( mem != null ) {
2082                        String[] vals = (String[])mem.get( key );
2083                        if( vals != null && vals.length > 0 ) {
2084                                rtn = vals[0];
2085                        }
2086                }
2087                return rtn ;
2088        }
2089
2090        /**
2091         * GAMENID付のリクエストキャッシュ情報を取り出します。
2092         *
2093         * @og.rev 3.5.4.7 (2004/02/06) 新規作成
2094         *
2095         * @param key  リクエストキャッシュのキー情報
2096         * @param value リクエストキャッシュに登録する値
2097         */
2098        @SuppressWarnings(value={"unchecked"})
2099        protected void setRequestCacheData( final String key,final String value ) {
2100                String[] vals = new String[] { value } ;
2101
2102                String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" );    // 4.0.0 (2005/01/31)
2103                Map<String,String[]> mem = (Map<String,String[]>)getSessionAttribute( memKey );
2104                if( mem != null ) {
2105                        mem.put( key,vals );
2106                }
2107        }
2108
2109        /**
2110         * カンマ区切り引数(CSV引数)を配列に分解して返します。
2111         *
2112         * カンマ区切り引数(CSV引数)で複数指定されたリクエストパラメータを
2113         * 文字列配列に分解して、返します。
2114         * 引数は、{&#064;XXXX} 変数も使用できます。
2115         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
2116         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
2117         *
2118         * @og.rev 3.5.6.2 (2004/07/05) 新規作成
2119         *
2120         * @param       csvKey カンマ区切り引数(CSV引数)
2121         *
2122         * @return      配列に分解されたリクエストパラメータ値
2123         */
2124        protected String[] getCSVParameter( final String csvKey ) {
2125                String[] keys = StringUtil.csv2Array( csvKey );
2126                String[] vals = new String[keys.length];
2127                for( int i=0; i<keys.length; i++ ) {
2128                        vals[i] = getRequestParameter( keys[i] ) ;
2129                }
2130                return vals ;
2131        }
2132
2133        /**
2134         * リクエスト変数 {&#064;SYS.XXXX} に対する値の取得を行います。
2135         *
2136         * 本来は、システムパラメータ の値を取得できますが、
2137         * システム的な共有値も取得できるように機能追加しています。
2138         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2139         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2140         * ここで、引数に、&#064;変数が使用できます。具体的には、{&#064;SYS.&#064;XXXX}
2141         * で、&#064;XXXX をリクエスト変数から取得した値を利用します。
2142         * この中で、&#064;GUIID だけが、さらに特殊で、実行中の画面IDを割り当てます。
2143         * この &#064;GUIID は、ここまでの文字列を画面IDに置き換えるとともに、それ以降の
2144         * 文字列を、画面IDに連結させます。
2145         * {&#064;SYS.&#064;GUIID_XXXX} ⇒ 画面ID_XXXX 文字列で、システムパラメータ の値を取得します。
2146         *
2147         *      SERVER_NAME     このTomcatが実行しているサーバー名             localhost 等
2148         *      SERVER_URL      Portも含むURLアドレス                          http://localhost:8823/
2149         *      CONTEXT_URL     実行しているコンテキストのURLアドレス          http://localhost:8823/dbdef2/
2150         *      REAL_PATH       / ルートに対応する物理ディレクトリ             d:/webapps/dbdef2/ 等
2151         *      CONTEXT_NAME    コンテキスト名(webapps 直下の仮想フォルダ名)   dbdef 等
2152         *      DATE            YMDH とほぼ同じですが、'yyyy/MM/dd HH:mm:ss' の形式で取得できます。
2153         *      HOSTNAME                スペース区切りで指定したIPアドレスからホスト名を逆引きします
2154         *      任意            ユーザーパラメータ(GE16) の値/システムパラメータ(GE12)の値を取得
2155         *        &#064;GUIID_XXXX  既存の画面IDに、_XXXX を追加した文字列
2156         *        &#064;XXXX        XXXX でリクエスト変数から取得した文字列
2157         *        XXXX              XXXX の文字列
2158         *
2159         * @og.rev 3.5.6.6 (2004/08/23) 新規作成
2160         * @og.rev 3.7.0.3 (2005/03/01) クッキー取得機能を追加
2161         * @og.rev 4.0.0.0 (2005/11/30) ユーザーパラメータは、システムパラメータとして取得します。
2162         * @og.rev 5.1.6.0 (2010/05/01) システムパラメータに、&#064;GUIID という特殊パラメータが使用できるように対応します。
2163         * @og.rev 5.6.6.2 (2013/07/19) SYS.HOSTNAMEに対応します。
2164         *
2165         * @param       key     {&#064;SYS.XXXX} の XXXX 部分の文字列(キー)
2166         *
2167         * @return   キーに対する値。なければ、null
2168         */
2169        protected String sys( final String key ) {
2170                final String rtn;
2171
2172                if( key.startsWith( "COOKIE." ) ) {             // 3.7.0.3 (2005/03/01)
2173                        rtn = getCookie( key.substring( "COOKIE.".length() ) );
2174                }
2175                else if( key.startsWith( "DATE" ) ) {
2176                        int idx = key.indexOf( ' ' );
2177                        if( idx >= 0 ) {
2178                                rtn = HybsSystem.getDate( key.substring( idx+1 ) );
2179                        }
2180                        else {
2181                                rtn = HybsSystem.getDate();
2182                        }
2183                }
2184                else if( key.startsWith( "HOSTNAME" ) ) { // 5.6.6.2 (2013/07/19)
2185                        int idx = key.indexOf( ' ' );
2186                        if( idx >= 0 ) {
2187                                String key2 = key.substring( idx+1 ) ;
2188                                if( key2.startsWith( "@" ) ) {
2189                                        rtn = getHostName( getRequestValue( key2.substring( 1 ) ) );
2190                                }
2191                                else{
2192                                        rtn = getHostName( key2 );
2193                                }
2194                        }
2195                        else{
2196                                rtn = getUser().getParameter( key );
2197                        }
2198                }
2199                // 5.1.6.0 (2010/05/01) {@SYS.@GUIID_XXXX} パラメータ対応
2200                else if( key.startsWith( "@GUIID" ) ) {
2201                        String key2 = getGUIInfoAttri( "ID" ) +  key.substring( "@GUIID".length() );
2202                        rtn = getUser().getParameter( key2 );
2203                }
2204                // 5.1.6.0 (2010/05/01) {@SYS.@XXXX} パラメータ対応
2205                else if( key.startsWith( "@" ) ) {
2206                        String key2 = getRequestValue( key.substring( 1 ) );
2207                        rtn = getUser().getParameter( key2 );
2208                }
2209                else {
2210                        rtn = getUser().getParameter( key );
2211                }
2212
2213                return rtn ;
2214        }
2215
2216        /**
2217         * システムパラメータの値を、boolean 型に変換して返します。
2218         *
2219         * 本来は、システムパラメータ の値を取得できますが、
2220         * システム的な共有値も取得できるように機能追加しています。
2221         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2222         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2223         *
2224         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
2225         *
2226         * @param       key システム設定 キー
2227         *
2228         * @return      システム設定値(boolean型)
2229         */
2230        protected boolean sysBool( final String key ) {
2231                return Boolean.valueOf( sys( key ) ).booleanValue();
2232        }
2233
2234        /**
2235         * システムパラメータの値を、int 型に変換して返します。
2236         *
2237         * 本来は、システムパラメータ の値を取得できますが、
2238         * システム的な共有値も取得できるように機能追加しています。
2239         * また、ユーザー個別にシステムパラメータを変更できます。この取得は、
2240         * システムパラメータとして取得します。(値はユーザー個別値を返します。)
2241         *
2242         * ※ システムパラメータの値が数字でない場合、HybsSystemException が throw されます。
2243         * ※ キーの値が nullの場合、HybsSystemException が throw されます。
2244         *
2245         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
2246         *
2247         * @param       key システム設定 キー
2248         *
2249         * @return      システム設定値(int型)
2250         */
2251        protected int sysInt( final String key ) {
2252                String tmp = null;
2253                int rtn ;
2254                try {
2255                        tmp = sys( key );
2256                        rtn = Integer.parseInt( tmp );
2257                }
2258                catch( NumberFormatException ex ) {
2259                        String errMsg = "システムパラメータの値が数字ではありません。" + HybsSystem.CR
2260                                        + "  Resource key=[" + key + "] val=[" + tmp + "]"  ;
2261                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2262                }
2263                catch( IllegalArgumentException ex ) {
2264                        String errMsg = "キーの値が null です。key=[" + key + "] val=[" + tmp + "]";
2265                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
2266                }
2267
2268                return rtn;
2269        }
2270
2271        /**
2272         * session に、処理開始時刻を設定します。
2273         * これは、DBTableModel を登録する場合に、一連の処理が連続であるかどうかを
2274         * 判断する時に使用します。
2275         * 処理が一連でない(start 時のタイムスタンプが書き換えられている)場合は、
2276         * DBTableModel の登録処理を行いません。
2277         * なお、判断処理を行うのは、scope が session の場合のみです。
2278         * 判定は、commitTableObject( String ,DBTableModel ) で行います。
2279         *
2280         * @og.rev 3.6.0.8 (2004/11/19) 新規追加
2281         * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。
2282         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
2283         *
2284         * @param   tableId キー
2285         * @see     #commitTableObject( String ,DBTableModel )
2286         */
2287        protected void startQueryTransaction( final String tableId ) {
2288                if( "session".equals( scope ) ) {
2289                        startTransaction = Long.valueOf( System.currentTimeMillis() );
2290                        setSessionAttribute( tableId+"_TRANSACTION", startTransaction );
2291                }
2292
2293                // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
2294                if( useTrans ) {
2295                        // 4.3.0.0 (2008/07/04) fileUD 対応
2296                        removeSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );   // 無条件削除
2297                }
2298        }
2299
2300        /**
2301         * スコープに応じて登録されている DBTableModel を指定のキーでセットします。
2302         * これは、startQueryTransaction( String ) でセッションに登録した処理開始時刻と、
2303         * このオブジェクト自身が持っている(セッションに登録した開始時刻そのもの)を
2304         * 比較し、異なる場合は、DBTableModel の登録を行いません。
2305         * これにより、検索処理の開始順にしか登録しないようなロジックを入れています。
2306         * 検索処理時間が掛かるSQLを実行した場合、先に検索した結果があとから登録される
2307         * ケースがあるためです。
2308         * また、判断処理を行うのは、scope が session の場合のみです。
2309         *
2310         * @og.rev 3.6.0.8 (2004/11/19) 新規追加
2311         * @og.rev 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
2312         * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。
2313         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
2314         *
2315         * @param   tableId キー
2316         * @param   table   登録するDBTableModelオブジェクト
2317         *
2318         * @return  正常に登録(true) / 一連でないため登録していない(false)
2319         * @see     #startQueryTransaction( String )
2320         */
2321        protected boolean commitTableObject( final String tableId ,final DBTableModel table ) {
2322                // 登録しないケースをピックアップします。
2323                if( "session".equals( scope ) ) {
2324                        String key = tableId+"_TRANSACTION";
2325                        Long endTime = (Long)getSessionAttribute( key );
2326                        removeSessionAttribute( key );
2327                        if( endTime == null ||
2328                                startTransaction == null ||
2329                                endTime.compareTo( startTransaction ) != 0 ) {
2330                                        String msg = "CommonTagSupport Query処理が割り込まれました。DBTableModel は登録しません。"
2331                                                                + "[" + getUser().getUserID() + "],"
2332                                                                + "[" + getGUIInfoAttri( "KEY" ) + "]"  // 4.0.0 (2005/01/31)
2333                                                                + "[" + startTransaction + "]"                          // 4.0.0 (2005/01/31)
2334                                                                + "[" + endTime + "]";                                          // 4.0.0 (2005/01/31)
2335                                        System.out.println( msg );
2336                                        return false;
2337                        }
2338                        // 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
2339                        if( table != null && HybsSystem.TBL_MDL_KEY.equals( tableId ) ) {
2340                                String consisKey = table.getConsistencyKey();
2341                                setSessionAttribute( HybsSystem.TBL_MDL_CONKEY,consisKey );
2342                        }
2343                }
2344
2345                // 4.3.0.0 (2008/07/04) fileUD 対応
2346                // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
2347                if( useTrans && table != null ) {
2348                        String guikey = getGUIInfoAttri( "KEY" );
2349                        DBLastSql lastSql = new DBLastSql( scope,guikey,table.isOverflow(),tableId );
2350                        setSessionAttribute( HybsSystem.DB_LAST_SQL_KEY,lastSql );
2351                }
2352
2353                setObject( tableId,table );
2354                return true;
2355        }
2356
2357        /**
2358         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行番号の
2359         * 配列を返します。
2360         * 配列情報は、行番号でソートされて返されます。
2361         * なにも選ばれていない場合は、サイズ0の配列を返します。
2362         *
2363         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2364         *
2365         * @return      (選ばれていない場合は、サイズ0の配列を返す)
2366         */
2367        protected int[] getParameterRows() {
2368                if( rowNo != null ) { return rowNo; }
2369
2370                rowNo = (int[])getRequestAttribute( HybsSystem.ROW_SEL_KEY );
2371                if( rowNo != null ) { return rowNo; }
2372
2373                String[] selected = getRequestValues( HybsSystem.ROW_SEL_KEY ) ;
2374                if( selected != null && selected.length != 0 ) {
2375                        rowNo = new int[ selected.length ];
2376                        for( int i=0; i<selected.length; i++ ) {
2377                                if( selected[i] != null && selected[i].length() > 0 ) {
2378                                        rowNo[i] = Integer.parseInt( selected[i] );
2379                                }
2380                        }
2381                        Arrays.sort( rowNo );
2382                }
2383                else {
2384                        rowNo = new int[0];
2385                }
2386
2387                return rowNo;
2388        }
2389
2390        /**
2391         * 表示データの HybsSystem.ROW_SEL_KEY に対して、選ばれた 行番号の
2392         * 配列を設定します。
2393         * ここで設定した選択配列は、getParameterRows() メソッドで取得する場合、優先されます。
2394         *
2395         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2396         *
2397         * @param       rowNo   行番号配列
2398         */
2399        protected void setParameterRows( final int[] rowNo ) {
2400                setRequestAttribute(  HybsSystem.ROW_SEL_KEY , rowNo );
2401        }
2402
2403        /**
2404         * 指定のクッキーをセットします。
2405         * これは、従来,各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、
2406         * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを
2407         * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。
2408         *
2409         * @og.rev 3.7.0.3 (2005/03/01) 新規登録
2410         *
2411         * @param   key         クッキーのキー
2412         * @param   value       クッキーの設定値
2413         * @param       maxage  最長存続期間を秒単位で設定(負の値は Cookie を保存しない、 0 なら Cookie を削除する)
2414         */
2415        protected void setCookie( final String key,final String value,final int maxage ) {
2416                HttpServletResponse res = (HttpServletResponse)pageContext.getResponse();
2417                Cookie ck = new Cookie( key, value );
2418                ck.setMaxAge( maxage );         // 有効秒
2419                res.addCookie( ck );
2420        }
2421
2422        /**
2423         * 指定のクッキーを取得します。
2424         * 見つからない場合は、null を返します。
2425         *
2426         * @og.rev 3.7.0.3 (2005/03/01) 新規登録
2427         *
2428         * @param       key     クッキーのキー
2429         *
2430         * @return      クッキーの設定値
2431         */
2432        protected String getCookie( final String key ) {
2433                HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
2434                Cookie[] cks = req.getCookies();
2435
2436                String val = null;
2437                for( int i=0; i<cks.length; i++ ) {
2438                        Cookie ck = cks[i];
2439                        if( ck.getName().equals( key ) ) {
2440                                val = ck.getValue();
2441                                break;
2442                        }
2443                }
2444                return val ;
2445        }
2446
2447        /**
2448         * リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します
2449         *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。
2450         *
2451         * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに
2452         * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。
2453         * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、
2454         * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、
2455         * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。
2456         * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
2457         * (初期値:システム定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。
2458         *
2459         * @og.rev 4.0.0.0 (2005/08/31) 新規追加
2460         *
2461         * @param       flag    クォーティションチェック  [true:する/:falseしない]
2462         * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
2463         */
2464        protected void useQuotCheck( final boolean flag ) {
2465                quotCheck = flag;
2466        }
2467
2468        /**
2469         * リクエスト情報の HTMLTag開始/終了文字(&gt;&lt;) 存在チェックを実施するかどうか[true/false]を設定します
2470         *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。
2471         *
2472         * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。
2473         * (&gt;&lt;) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
2474         * 現在の実装としてはリクエストパラメータのみチェックして、attributesに対しては行いません。
2475         * (初期値:システム定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。
2476         *
2477         * @og.rev 5.0.0.2 (2009/09/15) 新規追加
2478         *
2479         * @param       flag    XSSチェック [true:する/false:しない]
2480         * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
2481         */
2482        protected void useXssCheck( final boolean flag ) {
2483                xssCheck = flag;
2484        }
2485
2486        /**
2487         * 日付関係の情報を簡易的に取り出す処理を行います。
2488         *
2489         * これは、{&#064;DATE.XXXX AA BB CC} 引数処理をおこなうための、サポートメソッドです。
2490         * XXXX は結果のフォーマット、AA が基準時刻で省略した場合は、現在時刻が利用されます。
2491         * BB 引数は、日付についての加減算処理を行うためのコマンドです。
2492         * CC 引数は、BB引数のコマンドに付属するパラメータです。加減算処理の数値を指定できます。
2493         * AA,BB,CC 引数については、先頭に、@ を付ける事で、リクエスト変数が使用できます。
2494         *
2495         * 引数は、"XXXX AA BB" という状態で受け取ります。(DATE. ははずした形)
2496         * "XXXX" は、日付処理を行うキー文字列で予約語になっています。
2497         * ・YMD  :8文字の4-2-2年月日データ(yyyyMMdd)を扱います。
2498         * ・Y2MD  :6文字の2-2-2年月日データ(yyMMdd)を扱います。
2499         * ・YM   :6文字の4-2年月データ(yyyyMM)を扱います。
2500         * ・HMS  :6文字の2-2-2時分秒データ(HHmmss)を扱います。
2501         * ・YMDHMS :14文字の4-2-2-2-2-2年月日時分秒データ(yyyyMMddHHmmss)を扱います。
2502         * ・EEE  :曜日をデフォルトロケール(EEE)で表示します。
2503         *
2504         * F付きは、フォーマットされた日付を返します。
2505         * ・YMDF  :10文字の日付表現(yyyy/MM/dd)を扱います。
2506         * ・Y2MDF :8文字の日付表現(yy/MM/dd)を扱います。
2507         * ・YMF  :7文字の日付表現(yyyy/MM)を扱います。
2508         * ・HMSF  :8文字の時刻表現(HH:mm:ss)を扱います。
2509         * ・YMDHMSF:19文字の日付表現(yyyy/MM/dd HH:mm:ss)を扱います。
2510         * ・MDF  :5文字の月日表現(MM/dd)を扱います。
2511         * ・MDEF  :5文字+曜日の月日表現(MM/dd(EEE))を扱います。
2512         * ・MD2F  :和暦の月日表現(MM月dd日)を扱います。(5.5.5.2 追加)
2513         * ・GYMDF :和暦の年月日表現(GGGGyyyy年MM月dd日)を扱います。
2514         * ・G2YMDF :和暦の日付表現(Gyyyy/MM/dd)を扱います。
2515         * ・GYMF  :和暦の年月表現(GGGGyyyy年MM月)を扱います。
2516         * ・GYF  :和暦の年表現(GGGGyyyy)を扱います。
2517         *
2518         * なお、上記以外のフォーマットを指定する場合は、XXXX部分に直接記述できます。(5.5.5.2 追加)
2519         * ただし、スペースで分解するため、フォーマットにスペースを含む場合は、ダブルコーテーション等で
2520         * くくる等の処理が必要です。基本的には、自由フォーマットは、エラーチェックがない為、使わないでください。
2521         *
2522         * 第二引数 AA は、基準となる日付を、yyyyMMdd形式で指定します。nullの場合は、現在時刻を使用します。
2523         * 指定できる日付は、yyyyMMdd形式を推奨しますが、'/' , '-' , ' ' , ':' を削除して使います。
2524         * 6桁の場合は、yyyyMM + 01 とし、8ケタの場合は、yyyyMMdd とし、14ケタ以上の場合は、前半14文字を
2525         * yyyyMMddHHmmss として処理します。それ以外の桁数の場合は、エラーになります。
2526         * たとえば、"2012/09/05 16:52:36" のようなフォーマットデータの場合、'/' , '-' , ' ' , ':' を削除して
2527         * "20120905165236" に変換後、日付オブジェクトに変換されます。
2528         *
2529         * AA には、数字で始まる(20050701など)実日付と&#064;で始まるパラメータが使用できます。
2530         * &#064;AA と記述することで、{&#064;AA}で指定する場合と同様のリクエストパラメータが使用できます。
2531         * このパラメータの値の解析結果が、null の場合は、現在時刻が使用されます。
2532         * 数字以外の場合は、省略されたと判断して、コマンド(BB引数)として使用されます。
2533         *
2534         * BB 引数は、日付についての加減算処理を行います。
2535         * 省略すると、なにも加減算処理を行いません。
2536         * この引数もパラメータ(&#064;BB)指定で、リクエストパラメータが使用できます。
2537         * 加減算処理のパラメータが使用できるのは、"H" , "D" , "M" の1文字パラメータの場合のみです。
2538         * それ以外のコマンドで、加減算処理する場合は、独立した CC 引数 を使用してください。
2539         * ・SD :当月の最初の日付にセットします。(当月1日)。CC引数は、-N:N月前、0:当月(=SD)、N:N月後、-1:BSD と同じ、1:ASD と同じ
2540         * ・ED :当月の最後の日付にセットします。(当月月末)。CC引数は、-N:N月前、0:当月(=ED)、N:N月後、-1:BED と同じ、1:AED と同じ
2541         * ・SW :日付処理の週初め(月曜日)にセットします。日付は当日より前に移動します。CC引数は、-N:N週前、0:今週(=SW)、N:N週後
2542         * ・EW :日付処理の週末(日曜日)にセットします。日付は当日より後ろに移動します。CC引数は、-N:N週前、0:今週(=EW)、N:N週後
2543         * ・H1 〜 HXXX :時を指定の分だけ進めます。H1なら1時間後、H24 なら24時間後(5.5.5.6 (2012/08/31) 追加)
2544         * ・D1 〜 DXXX :日を指定の分だけ進めます。D1なら翌日、D200 なら200日後
2545         * ・M1 〜 MXXX :月を指定の分だけ進めます。M1なら翌月、M6 なら半年後
2546         * ・BSD :(有閑)先月の最初の日付にセットします。(先月1日)(5.5.5.2 追加)。SD -1 と同等
2547         * ・BED :(有閑)先月の最後の日付にセットします。(先月月末)(5.5.5.2 追加)。ED -1 と同等
2548         * ・ASD :(有閑)翌月の最初の日付にセットします。(翌月1日)(5.5.5.2 追加)。SD 1  と同等
2549         * ・AED :(有閑)翌月の最後の日付にセットします。(翌月月末)(5.5.5.2 追加)。ED 1  と同等
2550         *
2551         * CC 引数は、特別な処理で、BB 引数に対して、加算、減算のための数字を指定できます。(5.7.4.1 (2014/03/14) 追加)
2552         * 従来は、BB 引数が、"H" , "D" , "M" の 1文字パラメータの場合のみ利用可能でした。
2553         * これは、"H15" と指定するのと、"H" "15" と指定するのと同じ意味になります。
2554         * 異なるのは、CC 引数も、(&#064;CC)指定で、リクエストパラメータが使用できます。
2555         * 従来は、文字列として結合された状態でしか、BB 引数を渡せませんでしたが、この、CC 引数の
2556         * 追加で、日付の加減算を、パラメータ指定できるようになります。
2557         * 数字以外の文字が指定されたり、パラメータの解析結果が NULL の場合には、BB引数自体も無視されます。
2558         * 注意点は、各 BB 引数に応じて、数字の意味が異なるという事です。
2559         *
2560         * HXXX,DXXX,MXXX 形式に、CC 引数を付けた場合は、XXX にさらに加算されます。
2561         * prmB に、数字を使用した場合、(コマンドでない場合)にも、CC 引数は、加算されます。
2562         *
2563         * @og.rev 3.8.0.2 (2005/07/11) 新規追加
2564         * @og.rev 5.4.0.1 (2011/11/01) 日付処理の機能追加(BB 引数に、リクエストパラメータ対応)
2565         * @og.rev 5.5.0.2 (2012/03/09) 和暦対応
2566         * @og.rev 5.5.5.2 (2012/08/18) XXXXフォーマット追加、自由フォーマット対応、BB引数追加、/,-削除機能追加、SM,EM廃止
2567         * @og.rev 5.5.5.6 (2012/08/31) H1 〜 HXXX 追加。時間の加算を指定できる。
2568         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
2569         * @og.rev 5.5.8.2 (2012/11/09) prmA の判定に、null と ゼロ文字列を判定する。
2570         * @og.rev 5.6.0.1 (2013/01/11) 5.5.7.2でyyyyMMddしか取っていないため、HHmmssを追加します
2571         * @og.rev 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。
2572         * @og.rev 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。
2573         *
2574         * @param   value       パラメータ
2575         *
2576         * @return   メッセージ情報
2577         * @see         org.opengion.fukurou.util.HybsDateUtil#getDateFormat( String,String,String,int )
2578         */
2579        protected String getDateFormat( final String value ) {
2580                // {@DATE.XXXX AA BB CC} を分割
2581                String[] vals = StringUtil.csv2Array( value,' ' );              // ダブルクオート内は保持される。
2582
2583                String key = vals[0] ;
2584
2585                // 5.7.4.1 (2014/03/14) 初期化時に、vals を設定しておきます。
2586                String prmA = (vals.length >= 2) ? vals[1] : null ;
2587                String prmB = (vals.length >= 3) ? vals[2] : null ;
2588                String prmC = (vals.length >= 4) ? vals[vals.length-1] : null ;              // 互換性。最後の値が、CC引数
2589
2590                if( prmA != null && prmA.startsWith( "@" ) ) {
2591                        prmA = getRequestValue( prmA.substring(1) );
2592                }
2593
2594                if( prmB != null && prmB.startsWith( "@" ) ) {
2595                        prmB = getRequestValue( prmB.substring(1) );
2596                }
2597
2598                if( prmC != null && prmC.startsWith( "@" ) ) {
2599                        prmC = getRequestValue( prmC.substring(1) );
2600                }
2601
2602                // 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。
2603                if( prmA != null && prmA.length() > 0 ) {
2604                        char chA = prmA.charAt(0);
2605                        if( chA < '0' || chA > '9' ) {            // 先頭が、数字以外の場合は、コマンドなので、一つずつずらす。
2606                                prmC = prmB;
2607                                prmB = prmA;
2608                                prmA = null;
2609                        }
2610                }
2611
2612                // 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。
2613                int intC = 0;
2614                if( prmC != null && prmC.length() > 0 ) {
2615                        try { 
2616                                intC = Integer.parseInt( prmC );
2617                        }
2618                        catch( NumberFormatException ex ) {
2619                                String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 
2620                                                                + ex.getMessage() ;
2621                                System.err.println( errMsg );
2622                        }
2623                }
2624
2625                // prmA が null か、isEmpty() の場合は、現在時刻が使用される。
2626                return HybsDateUtil.getDateFormat( key,prmA,prmB,intC );        // 5.7.4.1 (2014/03/14) CC 引数を拡張します。
2627
2628//              // {@DATE.XXXX AA BB} を分割
2629//              String[] vals = StringUtil.csv2Array( value,' ' );
2630//
2631//              String key = vals[0] ;
2632//
2633//              String prmA = null;                             // 5.5.7.2 (2012/10/09) 引数として渡すので上位で初期化しておく。
2634//              String prmB = null;
2635////            if( vals.length == 3 ) {
2636//              if( vals.length >= 3 ) {
2637//                      prmB = vals[2];
2638//                      // 5.4.0.1 (2011/11/01) BB引数も、リクエストパラメータ処理できるように修正
2639//                      if( prmB.startsWith( "@" ) ) {
2640//                              prmB = getRequestValue( prmB.substring(1) );
2641//                      }
2642//              }
2643//
2644//              if( vals.length > 1 ) {
2645////                    String prmA = vals[1];
2646//                      prmA = vals[1];
2647//                      if( prmA.startsWith( "@" ) ) {
2648//                              prmA = getRequestValue( prmA.substring(1) );
2649//                      }
2650//
2651//                      // prmA の@解析後、8ケタ以下の場合は、コマンドとみなし、prmB にセットし、自身は、null をセットする。
2652//                      if( prmA != null && prmA.length() < 8 ) {
2653//                              prmB = prmA;
2654//                              prmA = null;
2655//                      }
2656//              }
2657//
2658////            if( prmA == null ) {
2659//              if( prmA == null || prmA.isEmpty() ) {          // 5.5.8.2 (2012/11/09) null と ゼロ文字列を判定する。
2660////                    if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMdd" ); }       // 現在時刻を文字列化しておく。
2661//                      if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMddHHmmss" ); } // 5.6.0.1 (2013/01/11) HHmmss
2662//
2663//                      prmA = rightNow;                                // 5.5.7.2 (2012/10/09) 初期値として、設定する。
2664//              }
2665//
2666//              // 5.5.7.2 (2012/10/09) CC 引数の処理。
2667//              // BB 引数が、"H" , "D" , "M" 一文字の単独の場合のみ、最終引数の数字が利用できます。
2668//              if( "H".equals( prmB ) || "D".equals( prmB ) || "M".equals( prmB ) ) {
2669//                      String prmC = vals[vals.length-1];              // 一番最後の文字
2670//                      if( prmC.startsWith( "@" ) ) {
2671//                              prmC = getRequestValue( prmC.substring(1) );
2672//                      }
2673//                      if( prmC != null && !prmC.isEmpty() ) {
2674//                              try { 
2675//                                      prmB = prmB + Integer.parseInt( prmC );         // 文字列の連結。
2676//                              }
2677//                              catch( NumberFormatException ex ) {
2678//                                      prmB = null;            // CC引数が不正な場合は、BB引数も無効化する。
2679//                                      String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 
2680//                                                                      + ex.getMessage() ;
2681//                                      System.err.println( errMsg );
2682//                              }
2683//                      }
2684//                      else {
2685//                              prmB = null;            // CC引数が不正な場合は、BB引数も無効化する。
2686//                      }
2687//              }
2688//
2689//              return HybsDateUtil.getDateFormat( key,prmA,prmB );             // 5.5.7.2 (2012/10/09) HybsDateUtil を利用する
2690        }
2691
2692        /**
2693         * debug や エラー時に参考にする、簡易リファレンスへのリンクを作成します。
2694         * リンクを行うタグの名称は、getTagName() メソッドより取得します。
2695         *
2696         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2697         * @og.rev 4.2.1.0 (2008/04/11) URLを相対パスに変更
2698         *
2699         * @return  簡易リファレンスへのリンク
2700         * @see  #getTagName()
2701         */
2702        protected String getDocumentLink() {
2703                String name    = getTagName();
2704
2705        //      try {
2706        //              Field fld = getClass().getDeclaredField( "VERSION" ) ;
2707        //              version = (String)fld.get( null );
2708        //      }
2709        //      catch( Exception ex ) {
2710        //              version = ex.toString();
2711        //      }
2712
2713                // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。
2714                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
2715                buf.append( "<br /><a href=\"../common/documents.html#VAL_" );
2716                buf.append( name );
2717                buf.append( "\" target=\"_brank\" >簡易リファレンス[" );
2718                buf.append( name );
2719                buf.append( "] " );
2720        //      buf.append( version );
2721                buf.append( "</a>" ).append( HybsSystem.BR );
2722
2723                return buf.toString();
2724        }
2725
2726        /**
2727         * タグの名称を、返します。
2728         * これは、debug や エラー時に参考にする、簡易リファレンスへのリンクを作成する場合に
2729         * 使用します。
2730         * 通常は、org.opengion.hayabusa.taglib.AbcdTag という自分自身のクラス名より、
2731         * abcd の部分を取り出し、返します。
2732         * クラス名とタグ名が、上記変換ルールと異なる場合は、このメソッドを
2733         * 使用して、直接 abcd の部分に相当する文字列を返すようにしてください。
2734         *
2735         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2736         *
2737         * @return  タグの名称
2738         * @see  #getDocumentLink()
2739         */
2740        protected String getTagName() {
2741                String name = getClass().getName();
2742                int adrs = name.lastIndexOf('.');
2743
2744                // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。
2745                return name.substring( adrs+1,adrs+2 ).toLowerCase(Locale.JAPAN)
2746                                + name.substring( adrs+2,name.length()-3 ) ;
2747        }
2748
2749        /**
2750         * リクエストに対して、画面遷移なしモードを有効にします[true/false]。
2751         * この情報は画面IDをキーにセッションに保存されるため、
2752         * 各タグで共有することができます。
2753         *
2754         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
2755         * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更(名称も変更)
2756         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2757         *
2758         * @param       flg     画面遷移なしモードを使用するか [true:有効/false:無効]
2759         */
2760        protected void setNoTransitionRequest( final boolean flg ) {
2761//      protected void setNoTransitionSession( final boolean flg ) {
2762                setRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY, String.valueOf( flg ));
2763//              setSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) );
2764        }
2765
2766        /**
2767         * リクエストで画面遷移なしモードが有効になっているかを返します。
2768         * この情報はセッションから画面IDをキーに取得します。
2769         * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、
2770         * falseを返します。
2771         *
2772         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
2773         * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更
2774         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2775         *
2776         * @return 画面遷移なしモードが有効
2777         */
2778        protected boolean isNoTransitionRequest() {
2779//      protected boolean isNoTransitionSession() {
2780                return StringUtil.nval( (String)getRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY ), false );
2781//              return StringUtil.nval( (String)getSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false );
2782        }
2783
2784        /**
2785         * リクエストに対して、AjaxSubmitモードを使用するかどうか指定します[true/false]。
2786         * この情報は画面IDをキーにセッションに保存されるため、
2787         * 各タグで共有することができます。
2788         *
2789         * @og.rev 4.3.8.0 (2009/08/01) 新規作成
2790         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2791         *
2792         * @param       flg     AjaxSubmitモードを使用するか [true:使用する/false:使用しない]
2793         */
2794        protected void setAjaxSubmitRequest( final boolean flg ) {
2795//      protected void setAjaxSubmitSession( final boolean flg ) {
2796                setRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY, String.valueOf( flg ));
2797//              setSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) );
2798        }
2799
2800        /**
2801         * リクエストでAjaxSubmitモードが有効になっているかを返します。
2802         * この情報はセッションから画面IDをキーに取得します。
2803         * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、
2804         * falseを返します。
2805         *
2806         * @og.rev 4.3.8.0 (2009/08/01) 新規作成
2807         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2808         *
2809         * @return AjaxSubmitモードが有効
2810         */
2811        protected boolean isAjaxSubmitRequest() {
2812//      protected boolean isAjaxSubmitSession() {
2813                return StringUtil.nval( (String)getRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY ), false );
2814//              return StringUtil.nval( (String)getSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false );
2815        }
2816
2817        /**
2818         * シリアライズ用のカスタムシリアライズ書き込みメソッド
2819         *
2820         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2821         * @serialData 一部のオブジェクトは、シリアライズされません。
2822         *
2823         * @param       strm    ObjectOutputStreamオブジェクト
2824         */
2825        private void writeObject( final ObjectOutputStream strm ) throws IOException {
2826                strm.defaultWriteObject();
2827        }
2828
2829        /**
2830         * シリアライズ用のカスタムシリアライズ読み込みメソッド
2831         *
2832         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
2833         *
2834         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2835         * @serialData 一部のオブジェクトは、シリアライズされません。
2836         *
2837         * @param       strm    ObjectInputStreamオブジェクト
2838         * @see #release2()
2839         */
2840        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
2841                strm.defaultReadObject();
2842                attri = new Attributes();
2843        }
2844
2845        /**
2846         * アクセスログ取得の為,ApplicationInfoオブジェクトを返します。
2847         * 見つからない場合は、null が返ります。(暫定対応)
2848         *
2849         * @og.rev 3.8.7.0 (2006/12/15) 新規追加
2850         *
2851         * @return      アクセスログ取得の為の管理オブジェクト
2852         */
2853        protected ApplicationInfo getApplicationInfo() {
2854                String gamenId = getGUIInfoAttri( "KEY" );
2855                String jspId   = (String)getSessionAttribute( "JSPID" );
2856
2857                return getUser().getApplicationInfo( gamenId,jspId );
2858        }
2859
2860        /**
2861         * イベントカラムの実行に必要なカラム情報をマップに登録します。
2862         *
2863         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
2864         *
2865         * @param col DBカラム
2866         */
2867        protected void addEventColumn( final DBColumn col ) {
2868                addEventColumn( col.getName(), col.getEventColumn(), col.getEventURL()
2869                                                , col.getRenderer(), col.getEditor(), col.getRawRendParam(), col.getRawEditParam() );
2870        }
2871
2872        /**
2873         * イベントカラムの実行に必要なカラム情報をマップに登録します。
2874         *
2875         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
2876         *
2877         * @param name カラム名
2878         * @param evCol イベントカラム名
2879         * @param url イベントURL
2880         * @param renderer カラムのレンデラー
2881         * @param editor カラムのエディター
2882         * @param rendParam カラムの表示パラメーター
2883         * @param editParam カラムの編集パラメーター
2884         */
2885        @SuppressWarnings(value={"unchecked"})
2886        protected void addEventColumn( final String name, final String evCol, final String url, final String renderer, final String editor, final String rendParam, final String editParam ) {
2887                if( evCol == null || evCol.length() == 0 ){ return; }
2888
2889                String key = (String)getRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY );
2890                if( key == null || key.length() == 0 ) {
2891//                      key = HybsSystem.USE_EVENT_COLUMN_KEY + String.valueOf( System.currentTimeMillis() );
2892                        key = HybsSystem.USE_EVENT_COLUMN_KEY + System.currentTimeMillis();
2893                        setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, key );
2894                }
2895
2896                Map<String, DBEventColumn> evColMap = (Map<String, DBEventColumn>)( getSessionAttribute( key ) );
2897                if( evColMap == null ){
2898                        evColMap = new HashMap<String,DBEventColumn>();
2899                }
2900                if( evColMap.get( name ) == null ) {
2901                        evColMap.put( name, new DBEventColumn( name, evCol, url, renderer, editor, rendParam, editParam ) );
2902                }
2903                setSessionAttribute( key, evColMap );
2904        }
2905
2906//      /**
2907//       * キーを画面ID_xxx.jspでnameとparamのマップを追加します。
2908//       * 又、リクエスト変数のUSE_EVENT_COLUMN_KEYをtrueにします。
2909//       * 一応複数セッションの対応としてsynchronizedする。
2910//       *
2911//       * @og.rev 4.3.6.0 (2009/04/01) 新規追加
2912//       *
2913//       */
2914//      @SuppressWarnings(value={"unchecked"})
2915//      protected void addEventColumnSQL( final String name, final String param ) {
2916//              if( session == null ) { session = pageContext.getSession(); }
2917//              synchronized( session.toString().intern() ){
2918//                      Map<String, String> ecSql = (Map<String, String>)( getSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ) ) );
2919//                      if( ecSql == null ){ ecSql = new HashMap<String,String>(); }
2920//                      ecSql.put( name, param );
2921//                      setSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ), ecSql );
2922//              }
2923//              setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, "true" ); // 利用フラグを立てる
2924//      }
2925
2926        /**
2927         * 各データベースに対応するファンクション名を返します。
2928         *
2929         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
2930         * @og.rev 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索するようにします。
2931         *
2932         * @param   key ファンクション名(定義文字)
2933         *
2934         * @return  実ファンクション名
2935         */
2936        protected String getDBFunctionName( final String key ) {
2937                int idx = key.indexOf( ' ' );
2938                String func = null;
2939                String dbid = null;
2940                if( idx >= 0 ) {
2941                        func = key.substring( 0, idx );
2942                        dbid = key.substring( idx+1, key.length() );
2943                        if( dbid.charAt(0) == '@' ) { dbid = getRequestValue( dbid.substring( 1 ) ); }
2944                }
2945                else {
2946                        func = key;
2947                }
2948//              return DBFunctionName.getFunctionName( func, ConnectionFactory.getDBFullName( dbid ) );
2949                // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索する。
2950                return DBFunctionName.getFunctionName( func, dbid );
2951        }
2952
2953        /**
2954         * データロールの設定に基づき、キー(カラム名)に対応する条件式を返します。
2955         *
2956         * @og.rev 4.4.0.0 (2009/08/02) 新規作成
2957         *
2958         * @param   key カラム名
2959         *
2960         * @return  条件式
2961         */
2962        protected String getDataCondition( final String key ) {
2963                return getUser().getDataCondition( key );
2964        }
2965        
2966        /**
2967         * 与えたIPアドレスからホスト名を取得して返します。
2968         * 取得できなかった場合は空文字を返します。
2969         * IPアドレスが解決できない場合や、セキュリティマネージャーで
2970         * 許可されていない場合はエラーを返します。
2971         *
2972         * @og.rev 5.6.6.2 (2013/07/19) 新規作成
2973         *
2974         * @param   ip IPアドレス
2975         *
2976         * @return  ホスト名(取得できない場合は空文字)
2977         */
2978        protected String getHostName( final String ip ) {
2979                String hostname = "";
2980                try{
2981                        hostname =  InetAddress.getByName(ip).getHostName();
2982                }
2983                catch(UnknownHostException ex){
2984                        String errMsg = "IPアドレスが解決できません。"
2985                                + ex.getMessage();                      
2986                        throw new HybsSystemException( errMsg,ex );             
2987                }
2988                catch(SecurityException ex){
2989                        String errMsg = "この操作はセキュリティ上許可されていません。"
2990                                + ex.getMessage();                      
2991                        throw new HybsSystemException( errMsg,ex );
2992                }
2993                return hostname;
2994        }
2995
2996        /**
2997         * このオブジェクトの文字列表現を返します。
2998         * 基本的にデバッグ目的に使用します。
2999         *
3000         * @return このクラスの文字列表現
3001         */
3002        @Override
3003        public String toString() {
3004                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
3005                                .println( "Other..."    ,getAttributes().getAttribute() )
3006                                .fixForm().toString() ;
3007        }
3008}