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