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