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