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