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