    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.db;
    017
    018import org.opengion.fukurou.util.Attributes;
    019import org.opengion.hayabusa.common.HybsSystem;
    020import org.opengion.hayabusa.resource.CodeData;
    021import org.opengion.hayabusa.resource.ColumnData;
    022import org.opengion.hayabusa.resource.LabelData;
    023
    024/**
    025 * DBColumnオブジェクトを構築する為の 引数を持っているデータクラスです。
    026 * このクラス自身は、書き換え可能ですが、DBColumnオブジェクトは、読込み専用の
    027 * オブジェクトのため、別のオブジェクトを作成したい場合は,このクラスを
    028 * DBColumnオブジェクトより取得し、内容を書き換えて、再度 DBColumnオブジェクトを
    029 * 構築することになります。
    030 *
    031 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
    032 * @og.group テーブル管理
    033 *
    034 * @version  4.0
    035 * @author       Kazuhiko Hasegawa
    036 * @since    JDK5.0,
    037 */
    038public final class DBColumnConfig {
    039        private String[]  clmData       ;       // カラム配列データ
    040        private LabelData labelData     ;       // ラベルデータ
    041        private CodeData  codeData      ;       // コードデータ
    042
    043        // 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
    044        private final Attributes        rendAttri = new Attributes();                   // 表示用レンデラー追加用属性
    045        private final Attributes        editAttri = new Attributes();                   // 編集用エディター追加用属性
    046
    047        private String          lang            ;                       // 言語
    048        private String          writable        = "true";       // カラムが書き込み可能かどうか
    049        private boolean         addNoValue      ;                       // メニューに空の選択リストを追加するかどうか        // 3.5.5.7 (2004/05/10)
    050        private String          addKeyLabel     ;                       // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか
    051        private boolean         writeKeyLabel   ;               // 6.2.3.0 (2015/05/01)
    052        private String          dbid            ;                       // データベース接続先ID
    053        private boolean         official ;                              // カラムリソースから作成されたかどうか(再設定可能)            // 5.4.3.4 (2012/01/12)
    054
    055        private String eventColumn              ;                       // 4.3.6.0 (2009/04/01) イベントカラム
    056        private String eventValue               ;                       // 6.3.3.0 (2015/07/25) eventValue 追加
    057        private String rawEditParameter ;                       // 4.3.6.0 (2009/04/01) {@XXXX}を変換していないパラメータ
    058        private String rawRendParameter ;                       // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
    059        private String eventURL                 ;                       // 5.1.9.0 (2010/08/01) 動的プルダウン不具合対応
    060
    061        private String  useSLabel               = "auto";       // 5.5.1.0 (2012/04/03)  MENU系でSLABELを利用するかどうか
    062        private String  noDisplayVal    ;                       // 5.6.2.3 (2013/03/22) 非表示文字の設定
    063
    064        // 6.0.4.0 (2014/11/28) codeKeyVal は、KBMENU として、param にセットする為、廃止
    065
    066        private boolean stringOutput    = HybsSystem.sysBool( "USE_STRING_EXCEL_OUTPUT" );      // 5.7.6.3 (2013/05/23) ファイルレンデラ出力時のフラグ
    067        private boolean writeCtrl               ;                       // 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
    068
    069        /**
    070         * コンストラクター
    071         * 引数は、すべて文字列型で渡します。
    072         *
    073         * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
    074         * @og.rev 3.5.5.7 (2004/05/10) CodeSelection を、codeName を元に構築できるように設定します。
    075         * @og.rev 3.6.0.3 (2004/10/05) dbTypePrm は、editorPrm と無関係に設定します。
    076         * @og.rev 3.6.0.7 (2004/11/06) カラムリソースから作成されたかどうか(official属性追加)
    077         * @og.rev 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします。
    078         * @og.rev 5.7.3.0 (2014/02/07) labelData の null 対応
    079         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
    080         *
    081         * @param       lang            言語
    082         * @param       name            カラム名
    083         * @param       labelData       カラムのラベルデータオブジェクト
    084         * @param       className       カラムのクラスを文字列にした名称
    085         * @param       fieldSize       入力枠サイズ                                                  // 6.2.0.0 (2015/02/27)
    086         * @param       viewLength      カラムの表示文字数                                               // 6.2.0.0 (2015/02/27)
    087         * @param       maxlength       カラムの最大桁数
    088         * @param       writable        カラムが書き込み可能かどうか
    089         * @param       renderer        データの表示用レンデラー
    090         * @param       editor          データの編集用エディター
    091         * @param       codeData        メニューの項目オブジェクト
    092         * @param       dbType          データのタイプ
    093         * @param       dataDef         データのデフォルト値
    094         * @param       rendererPrm     表示用レンデラーのパラメータ
    095         * @param       editorPrm       編集用エディターのパラメータ
    096         * @param       dbTypePrm       データのタイプのパラメータ
    097         * @param       roles           カラムロール
    098         * @param       official        正規カラムかどうか
    099         * @param       dbid            データベース接続先ID
    100         */
    101        public DBColumnConfig(  final String    lang            ,
    102                                                        final String    name            ,
    103                                                        final LabelData labelData       ,               // 4.0.0 (2005/01/31)
    104                                                        final String    className       ,
    105                                                        final String    fieldSize       ,               // 6.2.0.0 (2015/02/27)
    106                                                        final String    viewLength      ,               // 6.2.0.0 (2015/02/27)
    107                                                        final String    maxlength       ,               // 3.5.5.5 (2004/04/23)
    108                                                        final String    writable        ,
    109                                                        final String    renderer        ,
    110                                                        final String    editor          ,
    111                                                        final CodeData  codeData        ,               // 4.0.0 (2005/01/31)
    112                                                        final String    dbType          ,
    113                                                        final String    dataDef         ,
    114                                                        final String    rendererPrm     ,
    115                                                        final String    editorPrm       ,
    116                                                        final String    dbTypePrm       ,
    117                                                        final String    roles           ,               // 4.0.0 (2005/11/30)
    118                                                        final boolean   official        ,               // 3.6.0.7 (2004/11/06)
    119                                                        final String    dbid ) {
    120                clmData = new String[ColumnData.DATA_SIZE];
    121                clmData[ColumnData.CLM           ] = name               ;
    122                clmData[ColumnData.CLS_NAME      ] = className  ;
    123                clmData[ColumnData.FIELD_SIZE    ] = fieldSize  ;               // 6.2.0.0 (2015/02/27)
    124                clmData[ColumnData.VIEW_LENGTH   ] = viewLength ;               // 6.2.0.0 (2015/02/27)
    125                clmData[ColumnData.USE_LENGTH    ] = maxlength  ;
    126                clmData[ColumnData.RENDERER      ] = renderer   ;
    127                clmData[ColumnData.EDITOR        ] = editor             ;
    128                clmData[ColumnData.DBTYPE        ] = dbType             ;
    129                clmData[ColumnData.DATA_DEFAULT  ] = dataDef    ;
    130                clmData[ColumnData.RENDERER_PARAM] = rendererPrm;
    131                clmData[ColumnData.TYPE_PARAM    ] = dbTypePrm  ;
    132                clmData[ColumnData.ROLES         ] = roles              ;               // 4.0.0 (2005/11/30)
    133
    134                this.lang               = lang          ;
    135                // 5.7.3.0 (2014/02/07) labelData の null 対応
    136                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    137                this.labelData  = labelData == null ? new LabelData( name ) : labelData ;
    138                this.writable   = writable      ;
    139                this.codeData   = codeData      ;               // 4.0.0 (2005/01/31)
    140                this.dbid               = dbid          ;               // 4.0.0 (2005/01/31)
    141
    142                if( "=".equals(editorPrm) ) {
    143                        clmData[ColumnData.EDITOR_PARAM  ] = rendererPrm        ;
    144                }
    145                else {
    146                        clmData[ColumnData.EDITOR_PARAM  ] = editorPrm  ;
    147                }
    148
    149                // 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします。
    150                if( dbType == null ) {
    151                        clmData[ColumnData.DBTYPE        ] = DBType.DEF_TYPE;
    152                }
    153
    154                this.official = official;               // 3.6.0.7 (2004/11/06)
    155        }
    156
    157        /**
    158         * 簡易コンストラクター
    159         * キーのみを設定して作成する、簡易的な DBColumnConfig オブジェクトを
    160         * 作成します。
    161         *
    162         * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
    163         * @og.rev 3.6.0.7 (2004/11/06) カラムリソースから作成されたかどうか(official属性追加)
    164         * @og.rev 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします。
    165         * @og.rev 5.7.3.0 (2014/02/07) labelData の null 対応
    166         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
    167         * @og.rev 6.2.3.0 (2015/05/01) もう一つのコンストラクタを呼びように変更。
    168         *
    169         * @param       name                    カラム名
    170         */
    171        public DBColumnConfig( final String name ) {
    172                this(   "ja"                                    ,       // lang
    173                                name                                    ,       // name
    174                                new LabelData( name )   ,       // labelData
    175                                "VARCHAR2"                              ,       // className
    176                                null                                    ,       // fieldSize    入力枠サイズ
    177                                null                                    ,       // viewLength   カラムの表示文字数
    178                                "60"                                    ,       // maxlength    カラムの最大桁数
    179                                "true"                                  ,       // writable
    180                                null                                    ,       // renderer
    181                                null                                    ,       // editor
    182                                null                                    ,       // codeData
    183                                DBType.DEF_TYPE                 ,       // dbType
    184                                ""                                              ,       // dataDef
    185                                ""                                              ,       // rendererPrm
    186                                ""                                              ,       // editorPrm
    187                                ""                                              ,       // dbTypePrm
    188                                null                                    ,       // roles
    189                                false                                   ,       // official
    190                                null                                            // dbid
    191                        );
    192        }
    193
    194        /**
    195         * 言語を返します。
    196         *
    197         * @return      言語
    198         */
    199        public String getLang() {
    200                return lang;
    201        }
    202
    203        /**
    204         * 言語を設定します。
    205         *
    206         * @param       lang 言語
    207         */
    208        public void setLang( final String lang ) {
    209                this.lang = lang;
    210        }
    211
    212        /**
    213         * カラム名を返します。
    214         *
    215         * @return      カラム名
    216         */
    217        public String getName() {
    218                return clmData[ColumnData.CLM];
    219        }
    220
    221        /**
    222         * カラム名を設定します。
    223         *
    224         * @param       name カラム名
    225         */
    226        public void setName( final String name ) {
    227                clmData[ColumnData.CLM] = name;
    228        }
    229
    230        /**
    231         * ラベル名を返します。
    232         *
    233         * @return      ラベル名
    234         */
    235        public String getLabel() {
    236                return ( labelData == null ) ? clmData[ColumnData.CLM] : labelData.getLabel() ;
    237        }
    238
    239        /**
    240         * カラムのクラスを文字列にした名称を返します。
    241         *
    242         * @return      カラムのクラスを文字列にした名称
    243         */
    244        public String getClassName() {
    245                return clmData[ColumnData.CLS_NAME];
    246        }
    247
    248        /**
    249         * 現在の値と、新しい値をチェックして、条件に応じて新しい値を返します。
    250         *
    251         * "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    252         * 上位で、val が null チェックを入れていますが、汎用的に、こちらでも入れておきます。
    253         *
    254         * @og.rev 6.4.1.1 (2016/01/16) "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    255         *
    256         * @param       now 現在の値
    257         * @param       val 新しい値（"既存値:設定値" と指定可能)
    258         * @return      新しい値
    259         */
    260        private String oldNewSplit( final String now , final String val ) {
    261                final String rtn ;
    262
    263                if( val == null || val.length() == 0 ) {
    264                        rtn = now;
    265                }
    266                else {
    267                        final int ad = val.indexOf( ':' );
    268                        if( ad < 0 ) {                                                  // コロンがない。通常処理
    269                                rtn = val;
    270                        }
    271                        else if( ad == 0 ) {                                    // コロンが先頭。コロンをはずして、セット
    272                                rtn = val.substring(1);
    273                        }
    274                        else {                                                                  // コロンがある。OLD:NEW 形式なので、コロンで分割
    275                                final String old = val.substring( 0,ad );
    276                                if( old.equals( now ) ) {                       // 一致した。
    277                                        rtn = val.substring( ad+1 );
    278                                }
    279                                else {
    280                                        rtn = now ;
    281                                }
    282                        }
    283                }
    284
    285                return rtn ;
    286        }
    287
    288        /**
    289         * カラムのクラスを文字列にした名称を設定します。
    290         *
    291         * "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    292         *
    293         * @og.rev 6.4.1.1 (2016/01/16) "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    294         *
    295         * @param       className カラムのクラス名
    296         */
    297        public void setClassName( final String className ) {
    298                clmData[ColumnData.CLS_NAME] = oldNewSplit( clmData[ColumnData.CLS_NAME] , className );         // 6.4.1.1 (2016/01/16)
    299        }
    300
    301        /**
    302         * カラムの入力枠サイズ(横幅)を文字数で取得します。
    303         * fieldSize は、設定した場合のみ、使用できます。通常は、null が返ります。
    304         *
    305         * @og.rev 6.2.0.0 (2015/02/27) fieldSize 属性の追加
    306         *
    307         * @return      カラムの入力枠サイズ
    308         */
    309        public String getFieldSize() {
    310                return clmData[ColumnData.FIELD_SIZE];
    311        }
    312
    313        /**
    314         * カラムの入力枠サイズ(横幅)を文字数で設定します。
    315         *
    316         * 従来の #setViewLength(String) で指定していた値です。
    317         *
    318         * @og.rev 6.2.0.0 (2015/02/27) fieldSize 属性の追加
    319         *
    320         * @param       fieldSize カラムの入力枠サイズ
    321         */
    322        public void setFieldSize( final String fieldSize ) {
    323                clmData[ColumnData.FIELD_SIZE] = fieldSize;
    324        }
    325
    326        /**
    327         * カラムの表示桁数を返します。
    328         * viewLength は、設定した場合のみ、使用できます。通常は、null が返ります。
    329         *
    330         * @og.rev 4.0.0.0 (2005/01/31) メソッド名変更 getSize() → getViewLength()
    331         *
    332         * @return      カラムの表示桁数
    333         */
    334        public String getViewLength() {
    335                return clmData[ColumnData.VIEW_LENGTH];
    336        }
    337
    338        /**
    339         * カラムの表示桁数を設定します。
    340         *
    341         * @og.rev 4.0.0.0 (2005/01/31) メソッド名変更 setSize() → setViewLength()
    342         *
    343         * @param       viewLength カラムの表示桁数
    344         */
    345        public void setViewLength( final String viewLength ) {
    346                clmData[ColumnData.VIEW_LENGTH] = viewLength;
    347        }
    348
    349        /**
    350         * カラムの文字桁数を返します。
    351         *
    352         * @og.rev 3.5.5.5 (2004/04/23) 新規追加
    353         *
    354         * @return      カラムの文字桁数
    355         */
    356        public String getMaxlength() {
    357                return clmData[ColumnData.USE_LENGTH];
    358        }
    359
    360        /**
    361         * カラムの文字桁数を設定します。
    362         *
    363         * @og.rev 3.5.5.5 (2004/04/23) 新規追加
    364         *
    365         * @param       maxlength カラムの文字桁数
    366         */
    367        public void setMaxlength( final String maxlength ) {
    368                clmData[ColumnData.USE_LENGTH] = maxlength;
    369        }
    370
    371        /**
    372         * カラムが書き込み可能かどうか[true/false]を返します。
    373         *
    374         * @return      カラムが書き込み可能かどうか[true/false]
    375         */
    376        public boolean isWritable() {
    377                return "true".equalsIgnoreCase( writable ) ;
    378        }
    379
    380        /**
    381         * カラムが書き込み可能かどうか[true/false]を設定します。
    382         *
    383         * @param       writable 書き込み可能かどうか[true/false]
    384         */
    385        public void setWritable( final String writable ) {
    386                this.writable = writable;
    387        }
    388
    389        /**
    390         * データの表示用レンデラーを返します。
    391         *
    392         * @og.rev 3.1.0.0 (2003/03/20) Renderer をキーのみ返すように変更
    393         *
    394         * @return      データの表示用レンデラー
    395         */
    396        public String getRenderer() {
    397                return clmData[ColumnData.RENDERER];
    398        }
    399
    400        /**
    401         * データの表示用レンデラーを設定します。
    402         *
    403         * "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    404         *
    405         * @og.rev 6.4.1.1 (2016/01/16) "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    406         *
    407         * @param       renderer 表示用レンデラー
    408         */
    409        public void setRenderer( final String renderer ) {
    410                clmData[ColumnData.RENDERER] = oldNewSplit( clmData[ColumnData.RENDERER] , renderer );          // 6.4.1.1 (2016/01/16)
    411        }
    412
    413        /**
    414         * データの編集用エディターを返します。
    415         *
    416         * @og.rev 3.1.0.0 (2003/03/20) Editor をキーのみ返すように変更
    417         *
    418         * @return      データの編集用エディター
    419         */
    420        public String getEditor() {
    421                return clmData[ColumnData.EDITOR];
    422        }
    423
    424        /**
    425         * データの編集用エディターを設定します。
    426         *
    427         * "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    428         *
    429         * @og.rev 6.4.1.1 (2016/01/16) "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    430         *
    431         * @param       editor 編集用エディター
    432         */
    433        public void setEditor( final String editor ) {
    434                clmData[ColumnData.EDITOR] = oldNewSplit( clmData[ColumnData.EDITOR] , editor );                // 6.4.1.1 (2016/01/16)
    435        }
    436
    437        /**
    438         * 文字種別名を返します。
    439         *
    440         * @return  データの文字種別
    441         */
    442        public String getDbType() {
    443                return clmData[ColumnData.DBTYPE];
    444        }
    445
    446        /**
    447         * データのタイプを設定します。
    448         *
    449         * "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    450         *
    451         * @og.rev 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします。
    452         * @og.rev 6.4.1.1 (2016/01/16) "既存値:設定値" という指定を行えば、既存値を持っている場合のみ、設定値に置き換えます。
    453         *
    454         * @param       dbType 文字種別
    455         */
    456        public void setDbType( final String dbType ) {
    457                clmData[ColumnData.DBTYPE] = oldNewSplit( clmData[ColumnData.DBTYPE] , (dbType == null) ? DBType.DEF_TYPE : dbType );           // 6.4.1.1 (2016/01/16)
    458        }
    459
    460        /**
    461         * カラムロールを返します。
    462         *
    463         * @return  カラムロール
    464         */
    465        public String getRoles() {
    466                return clmData[ColumnData.ROLES];
    467        }
    468
    469        /**
    470         * カラムロールを設定します。
    471         *
    472         * @param       roles カラムロール
    473         */
    474        public void setRoles( final String roles ) {
    475                clmData[ColumnData.ROLES] = roles;
    476        }
    477
    478        /**
    479         * データのデフォルト値を返します。
    480         *
    481         * @og.rev 5.1.8.0 (2010/07/01) メソッド名変更(getDefValue ⇒ getDefault)
    482         *
    483         * @return      データのデフォルト値
    484         */
    485        public String getDefault() {
    486                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    487                return ( clmData[ColumnData.DATA_DEFAULT] == null ) ? "" : clmData[ColumnData.DATA_DEFAULT];
    488        }
    489
    490        /**
    491         * データのデフォルト値を設定します。
    492         *
    493         * @og.rev 5.1.8.0 (2010/07/01) メソッド名変更(setDefValue ⇒ setDefault)
    494         *
    495         * @param       dataDef デフォルト値
    496         */
    497        public void setDefault( final String dataDef ) {
    498                clmData[ColumnData.DATA_DEFAULT] = dataDef;
    499        }
    500
    501        /**
    502         * 表示用レンデラーの追加属性を返します。
    503         *
    504         * @return   属性リスト
    505         * @og.rtnNotNull
    506         */
    507        public Attributes getRendererAttributes() {
    508                return rendAttri ;
    509        }
    510
    511        /**
    512         * 表示用レンデラーの追加属性を設定します。
    513         *
    514         * 元のrendAttriが、何も設定されていない場合は、引数のAttributesに
    515         * 置き換えます。
    516         * すでに、設定済みの場合は、putAll で、すべての属性を追加します。
    517         * 既存の属性は、そのまま残りますので、クリアしたい場合は、
    518         * 先に、getRendererAttributes() で取り出した Attributes を、
    519         * clear() してから、セットしてください。
    520         *
    521         * @og.rev 6.4.5.2 (2016/05/06) Attributesは、既存のAttributesに、ADDする。
    522         *
    523         * @param   attri       属性リスト
    524         */
    525        public void setRendererAttributes( final Attributes attri ) {
    526                rendAttri.set( attri );
    527        }
    528
    529        /**
    530         * 編集用エディター用の追加属性を返します。
    531         *
    532         * @return       追加属性
    533         * @og.rtnNotNull
    534         */
    535        public Attributes getEditorAttributes() {
    536                return editAttri;
    537        }
    538
    539        /**
    540         * 編集用エディター用の追加属性を設定します。
    541         *
    542         * 元のrendAttriが、何も設定されていない場合は、引数のAttributesに
    543         * 置き換えます。
    544         * すでに、設定済みの場合は、putAll で、すべての属性を追加します。
    545         * 既存の属性は、そのまま残りますので、クリアしたい場合は、
    546         * 先に、getEditorAttributes() で取り出した Attributes を、
    547         * clear() してから、セットしてください。
    548         *
    549         * @og.rev 6.4.5.2 (2016/05/06) Attributesは、既存のAttributesに、ADDする。
    550         *
    551         * @param   attri       属性リスト
    552         */
    553        public void setEditorAttributes( final Attributes attri ) {
    554                editAttri.set( attri );
    555        }
    556
    557        /**
    558         * 編集用エディター用の属性を削除します。
    559         *
    560         * 属性を、入れ替えではなく、追加したことで、削除が困難になりました。
    561         * そこで、属性の削除が出来るようにします。
    562         * キーとなる設定値から、値の文字列を切り取ります。
    563         * class 属性など、スペース連結の場合は、問題はありませんが、カンマ連結では
    564         * カンマが連続で並びますので、うまく対応できません。
    565         * 属性値が、一致する場合と、val がnullの場合は、そのキー自体を削除します。
    566         *
    567         * @og.rev 6.8.1.4 (2017/08/25) must="false"で、setEditorAttributes の属性の取り消しが出来ないための対応。
    568         *
    569         * @param   key 属性キー
    570         * @param   val 属性値
    571         */
    572        public void removeEditorAttributes( final String key , final String val ) {
    573                final String oldval = editAttri.get( key );
    574                // Attributes は、ConcurrentHashMap で管理しているので、oldval に null は、含みません。(が、チェックしておきます)
    575                if( val != null && oldval != null && oldval.contains( val ) ) {
    576                        final String newval = oldval.replace( val , "" );               // val の削除
    577                        if( newval.trim().isEmpty() ) {
    578                                editAttri.remove( key );
    579                        }
    580                        else {
    581                                editAttri.set( key,newval );
    582                        }
    583                }
    584        }
    585
    586        /**
    587         * パラメータを設定します。
    588         * ここで設定された値は、すべて(表示、編集、文字)のパラメータにセットされます。
    589         *
    590         * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
    591         *
    592         * @param       inParam 入力パラメータ
    593         */
    594        public void setParameter( final String inParam ) {
    595                clmData[ColumnData.RENDERER_PARAM]      = inParam ;
    596                clmData[ColumnData.EDITOR_PARAM]        = inParam ;
    597                clmData[ColumnData.TYPE_PARAM]          = inParam ;
    598        }
    599
    600        /**
    601         * 表示用レンデラーのパラメータを取得します。
    602         *
    603         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    604         *
    605         * @return      表示用レンデラーのパラメータ
    606         */
    607        public String getRendererParam() {
    608                return clmData[ColumnData.RENDERER_PARAM];
    609        }
    610
    611        /**
    612         * 表示用レンデラーのパラメータを設定します。
    613         *
    614         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    615         *
    616         * @param       inParam 表示用レンデラーのパラメータ
    617         */
    618        public void setRendererParam( final String inParam ) {
    619                clmData[ColumnData.RENDERER_PARAM] = inParam;
    620        }
    621
    622        /**
    623         * 編集用エディターのパラメータを取得します。
    624         *
    625         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    626         *
    627         * @return      編集用エディターのパラメータ
    628         */
    629        public String getEditorParam() {
    630                return clmData[ColumnData.EDITOR_PARAM];
    631        }
    632
    633        /**
    634         * 編集用エディターのパラメータを設定します。
    635         *
    636         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    637         *
    638         * @param       inParam 編集用エディターのパラメータ
    639         */
    640        public void setEditorParam( final String inParam ) {
    641                clmData[ColumnData.EDITOR_PARAM] = inParam      ;
    642        }
    643
    644        /**
    645         * データタイプのパラメータを取得します。
    646         *
    647         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    648         *
    649         * @return      データタイプのパラメータ
    650         */
    651        public String getDbTypeParam() {
    652                return clmData[ColumnData.TYPE_PARAM];
    653        }
    654
    655        /**
    656         * データタイプのパラメータをします。
    657         *
    658         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
    659         *
    660         * @param       inParam データタイプのパラメータ
    661         */
    662        public void setDbTypeParam( final String inParam ) {
    663                clmData[ColumnData.TYPE_PARAM] = inParam ;
    664        }
    665
    666        /**
    667         * メニューに空の選択リストを追加するかどうかを取得します。
    668         *
    669         * @og.rev 3.5.5.7 (2004/05/10) 新規追加
    670         *
    671         * @return      選択リストを追加するかどうか(true:追加する/false:追加しない)
    672         */
    673        public boolean isAddNoValue() {
    674                return addNoValue ;
    675        }
    676
    677        /**
    678         * メニューに空の選択リストを追加するかどうかを設定します。
    679         *
    680         * @og.rev 3.5.5.7 (2004/05/10) 新規追加
    681         *
    682         * @param       add     [true:追加する/false:追加しない]
    683         */
    684        public void setAddNoValue( final boolean add ) {
    685                this.addNoValue = add   ;
    686        }
    687
    688        /**
    689         * セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を指定します(初期値:null)。
    690         *
    691         * カラムがプルダウンメニュー形式の場合、キー:ラベル形式で表示するか、ラベルだけで表示するかを
    692         * 選択できます。
    693         * true を指定すると、「強制的に」キー:ラベル形式で表示します。
    694         * false の場合は、「強制的に」ラベルのみで表示されます。
    695         * 初期値の null の場合、コードリソースや、SQL文に準拠した指定通りの形式で表示します。
    696         *
    697         * &lt;og:column name="CDC" addKeyLabel="true" /&gt;
    698         *
    699         * @og.rev 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか。新規追加
    700         *
    701         * @param   addKeyLbl  [true:キー:ラベル形式/false:ラベルのみ/null:指定通り]
    702         * @see         #getAddKeyLabel()
    703         */
    704        public void setAddKeyLabel( final String addKeyLbl ) {
    705                addKeyLabel = addKeyLbl;
    706        }
    707
    708        /**
    709         * セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を返します。
    710         *
    711         * これは、上位入れ子のタグの OptionTag で、addKeyLabel を取り出して、
    712         * true であれば、キー:ラベル形式 のオプションを、#addOption( String ) で
    713         * 登録させます。
    714         *
    715         * @og.rev 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか。新規追加
    716         *
    717         * @return      true:キー:ラベル形式/false:ラベルのみ/null:指定通り
    718         * @see         #setAddKeyLabel( String )
    719         */
    720        public String getAddKeyLabel() {
    721                return addKeyLabel;
    722        }
    723
    724        /**
    725         * セレクトメニューの場合、キーとラベルを分けて出力するかどうか[true/false]を指定します(初期値:false)。
    726         *
    727         * カラムがプルダウンメニュー形式の場合、ファイル出力時に、キーとラベルを分離して出力する事ができます。
    728         * この属性と、addKeyLabel とは、微妙に関連していて、addKeyLabel="true" のみの場合は、
    729         * キー:ラベル形式で、出力されますが、writeKeyLabel="true" も指定されている場合は、こちらが優先されます。
    730         * なお、この指定が有効なのは、セレクトメニューのカラムのみです。
    731         * 初期値は、false です。
    732         *
    733         * @og.rev 6.2.3.0 (2015/05/01) キー／ラベルで分離して出力するかどうか。
    734         *
    735         * @param   flag  キー／ラベル分離出力するかどうか [true:分離出力/false:通常]
    736         */
    737        public void setWriteKeyLabel( final boolean flag ) {
    738                writeKeyLabel = flag;
    739        }
    740
    741        /**
    742         * セレクトメニューの場合、キーとラベルを分けて出力するかどうか[true/false]を取得します。
    743         *
    744         * カラムがプルダウンメニュー形式の場合、ファイル出力時に、キーとラベルを分離して出力する事ができます。
    745         * この属性と、addKeyLabel とは、微妙に関連していて、addKeyLabel="true" のみの場合は、
    746         * キー:ラベル形式で、出力されますが、writeKeyLabel="true" も指定されている場合は、こちらが優先されます。
    747         * なお、この指定が有効なのは、セレクトメニューのカラムのみです。
    748         *
    749         * @og.rev 6.2.3.0 (2015/05/01) キー／ラベルで分離して出力するかどうか。
    750         *
    751         * @return      キー／ラベル分離出力するかどうか[true:分離出力/false:通常]
    752         */
    753        public boolean isWriteKeyLabel() {
    754                return writeKeyLabel ;
    755        }
    756
    757        /**
    758         * このカラムオブジェクトがカラムリソースより正式に作られたかどうかを取得します。
    759         * カラムリソースが無い場合は、仮オブジェクトかデータベースメタデータより作成されます。
    760         * その場合は、チェック機能が緩くなるため、正式なカラムオブジェクトと区別する為に
    761         * この属性を持ちます。
    762         *
    763         * @og.rev 3.6.0.7 (2004/11/06) 新規追加
    764         *
    765         * @return      カラムリソースより正式に作られたかどうか(true:正式/false:暫定)
    766         */
    767        public boolean isOfficial() {
    768                return official;
    769        }
    770
    771        /**
    772         * このカラムオブジェクトがカラムリソースより正式に作られたかどうかを設定します。
    773         * 従来は、自動判定で、再セット不可能でしたが、動的カラムを実現する場合に、
    774         * エラーチェックで引っかかるため、再設定可能にします。
    775         *
    776         * @og.rev 5.4.3.4 (2012/01/12) 新規追加
    777         *
    778         * @param       official 正式かどうか [true:正式/false:暫定]
    779         */
    780        public void setOfficial( final boolean official ) {
    781                this.official = official ;
    782        }
    783
    784        /**
    785         * 接続先IDを設定します。
    786         *
    787         * @param dbid 接続先ID
    788         */
    789        public void setDbid( final String dbid ) {
    790                this.dbid = dbid;
    791        }
    792
    793        /**
    794         * 接続先IDを返します。
    795         *
    796         * @return      接続先ID
    797         */
    798        public String getDbid() {
    799                return dbid;
    800        }
    801
    802        /**
    803         * カラムデータオブジェクトを取得します。
    804         *
    805         * @return      カラムデータオブジェクト
    806         * @og.rtnNotNull
    807         */
    808        public ColumnData getColumnData() {
    809                return new ColumnData( clmData );
    810        }
    811
    812        /**
    813         * カラムデータオブジェクトを設定します。
    814         * ここでは、オブジェクトその物を持つのではなく、設定された値のみ持ちます。
    815         *
    816         * @param       clmDt カラムデータオブジェクト
    817         */
    818        public void setColumnData( final ColumnData clmDt ) {
    819                clmData = clmDt.getColumnData();
    820        }
    821
    822        /**
    823         * コードデータオブジェクトを取得します。
    824         *
    825         * @og.rev 4.0.0.0 (2005/01/31)  新規作成
    826         *
    827         * @return      コードデータオブジェクト
    828         */
    829        public CodeData getCodeData() {
    830                return codeData;
    831        }
    832
    833        /**
    834         * コードデータオブジェクトを設定します。
    835         *
    836         * @og.rev 4.0.0.0 (2005/01/31)  新規作成
    837         *
    838         * @param       codeData コードデータオブジェクト
    839         */
    840        public void setCodeData( final CodeData codeData ) {
    841                this.codeData = codeData;
    842        }
    843
    844        /**
    845         * ラベルデータオブジェクトを取得します。
    846         *
    847         * @return      ラベルデータオブジェクト
    848         */
    849        public LabelData getLabelData() {
    850                return labelData;
    851        }
    852
    853        /**
    854         * ラベルデータオブジェクトを設定します。
    855         *
    856         * @param       labelData ラベルデータオブジェクト
    857         */
    858        public void setLabelData( final LabelData labelData ) {
    859                this.labelData = labelData;
    860        }
    861
    862        /**
    863         * イベントカラム(親カラム)のセット
    864         *
    865         * イベントカラムをセットします。
    866         *
    867         * @og.rev 4.3.6.0 (2009/04/01)
    868         * @param       col     親カラムID
    869         */
    870        public void setEventColumn( final String col ) {
    871                this.eventColumn = col;
    872        }
    873
    874        /**
    875         * イベントカラム(親カラム)の取得
    876         *
    877         * イベントカラムを取得します。
    878         *
    879         * @og.rev 4.3.6.0 (2009/04/01)
    880         *
    881         * @return  イベントカラム
    882         */
    883        public String getEventColumn() {
    884                return eventColumn;
    885        }
    886
    887        /**
    888         * イベントカラムの子カラムの値を出力するためのSQL文のセット
    889         *
    890         * イベントカラムの子カラムの値を出力するためのSQL文をセットします。
    891         *
    892         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
    893         *
    894         * @param       val     イベントカラムの値SQL文
    895         */
    896        public void setEventValue( final String val ) {
    897                this.eventValue = val;
    898        }
    899
    900        /**
    901         * イベントカラムの子カラムの値を出力するためのSQL文の取得
    902         *
    903         * イベントカラムの子カラムの値を出力するためのSQL文を取得します。
    904         *
    905         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
    906         *
    907         * @return  イベントカラムの値SQL文
    908         */
    909        public String getEventValue() {
    910                return eventValue;
    911        }
    912
    913        /**
    914         * {&#064;XXXX}を変換していない状態の編集パラメータ
    915         *
    916         * 生のパラメータを取得します。
    917         *
    918         * @og.rev 4.3.6.0 (2009/04/01)
    919         *
    920         * @return  生編集パラメータ
    921         */
    922        public String getRawEditParameter() {
    923                return rawEditParameter;
    924        }
    925
    926        /**
    927         * {&#064;XXXX}を変換していない状態の表示パラメータ
    928         *
    929         * 生のパラメータを取得します。
    930         *
    931         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
    932         *
    933         * @return  生表示パラメータ
    934         */
    935        public String getRawRendParameter() {
    936                return rawRendParameter;
    937        }
    938
    939        /**
    940         * {&#064;XXXX}を変換していない状態のparameterセット用
    941         *
    942         * 編集種別・表示種別
    943         * 生のパラメータをセットします。(編集種別・表示種別の両方に適用されます。)
    944         *
    945         * @og.rev 4.3.6.0 (2009/04/01)
    946         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
    947         *
    948         * @param param パラメータ
    949         */
    950        public void setRawParameter( final String param ) {
    951                rawEditParameter = param;
    952                rawRendParameter = param;
    953        }
    954
    955        /**
    956         * {&#064;XXXX}を変換していない状態の編集種別 parameterセット用
    957         *
    958         * DBColumn とのデータ変換のため、内部変数として、編集種別・表示種別を分けて管理します。
    959         *
    960         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
    961         *
    962         * @param param パラメータ
    963         */
    964        public void setRawEditParameter( final String param ) {
    965                rawEditParameter = param;
    966        }
    967
    968        /**
    969         * {&#064;XXXX}を変換していない状態の表示種別 parameterセット用
    970         *
    971         * DBColumn とのデータ変換のため、内部変数として、編集種別・表示種別を分けて管理します。
    972         *
    973         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
    974         *
    975         * @param param パラメータ
    976         */
    977        public void setRawRendParameter( final String param ) {
    978                rawRendParameter = param;
    979        }
    980
    981        /**
    982         * イベントURLのセット。
    983         *
    984         * イベントカラム利用時にコールされるURLのセット
    985         *
    986         * @og.rev 4.3.6.0 (2009/04/01)
    987         * @param url イベントURL
    988         */
    989        public void setEventURL( final String url ) {
    990                this.eventURL = url;
    991        }
    992
    993        /**
    994         * イベントURLの取得。
    995         *
    996         * eventColumn利用時のJSから呼び出すためのURL取得
    997         *
    998         * @og.rev 4.3.6.0 (2009/04/01)
    999         *
    1000         * @return  イベントURL
    1001         */
    1002        public String getEventURL() {
    1003                return eventURL;
    1004        }
    1005
    1006        /**
    1007         * MENU時にラベル短ベースで表示するかどうか[auto/true/その他]のコントロール
    1008         *
    1009         * auto/trueが有効。それ以外はfalse扱いとする。標準auto
    1010         *
    1011         * @og.rev 5.5.1.0 (2012/04/03)
    1012         * @param use 表示するかどうか[auto/true/その他]
    1013         */
    1014        public void setUseSLabel( final String use ) {
    1015                this.useSLabel = use;
    1016        }
    1017
    1018        /**
    1019         * MENU時にラベル短ベースで表示するかどうかのコントロール。
    1020         *
    1021         * @og.rev 5.5.1.0 (2012/04/03)
    1022         *
    1023         * @return  イベントURL
    1024         */
    1025        public String getUseSLabel() {
    1026                return useSLabel;
    1027        }
    1028
    1029        /**
    1030         * 非表示文字列を設定します。
    1031         *
    1032         * これは、例えば、数字型の場合は、0 がデフォルトなどの場合、
    1033         * あえて表示したくないなどのケースに使います。
    1034         * そのような状況が設定されていない場合は、null を設定してください。
    1035         * 初期値は、null です。
    1036         *
    1037         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
    1038         *
    1039         * @param val 非表示にする文字列
    1040         */
    1041        public void setNoDisplayVal( final String val ) {
    1042                this.noDisplayVal = val;
    1043        }
    1044
    1045        /**
    1046         * 非表示文字列を返します。
    1047         *
    1048         * これは、例えば、数字型の場合は、0 がデフォルトなどの場合、
    1049         * あえて表示したくないなどのケースに使います。
    1050         * そのような状況が設定されていない場合は、null が返されます。
    1051         * 初期値は、null です。
    1052         *
    1053         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
    1054         *
    1055         * @return 非表示文字
    1056         */
    1057        public String getNoDisplayVal() {
    1058                return noDisplayVal;
    1059        }
    1060
    1061        /**
    1062         * レンデラー利用ファイル出力時に数値等も文字タイプ固定にするかどうかを設定します
    1063         *              (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
    1064         *
    1065         * これは、レンデラーでのExcel出力時のセルタイプに影響します。
    1066         * trueの場合は数値も全て文字として出力します。
    1067         * falseの場合はDBTYPEに従った出力になりるため、数値型の DBTYPE では、doubleに一度変換されます。
    1068         * (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
    1069         *
    1070         * @og.rev 5.7.6.3 (2014/05/23) 新規追加
    1071         *
    1072         * @param flag レンデラー利用時の出力方法 (true:String出力/false:DBTYPEに従う)
    1073         */
    1074        public void setStringOutput( final boolean flag ) {
    1075                stringOutput = flag;
    1076        }
    1077
    1078        /**
    1079         * レンデラー利用ファイル出力時に数値等も文字タイプ固定にするかどうか
    1080         *              (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
    1081         *
    1082         * これは、レンデラーでのExcel出力時のセルタイプに影響します。
    1083         * trueの場合は数値も全て文字として出力します。
    1084         * falseの場合はDBTYPEに従った出力になりるため、数値型の DBTYPE では、doubleに一度変換されます。
    1085         * (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
    1086         *
    1087         * @og.rev 5.7.6.3 (2014/05/23) 新規追加
    1088         *
    1089         * @return レンデラー利用時の出力方法 (true:String出力/false:DBTYPEに従う)
    1090         */
    1091        public boolean isStringOutput() {
    1092                return stringOutput;
    1093        }
    1094
    1095        /**
    1096         * 設定値に "_" が含まれる書込み禁止カラムでかどうかを指定します。
    1097         *
    1098         * true に設定された場合は、#getWriteValue( String ) で、先頭のアンダーバーを
    1099         * 削除して返します。
    1100         * 初期値は、false:使わないです。
    1101         *
    1102         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
    1103         *
    1104         * @param flag writableControlを使うかどうか [true:使う/false:使わない]
    1105         */
    1106        public void setWriteControl( final boolean flag ) {
    1107                writeCtrl = flag;
    1108        }
    1109
    1110        /**
    1111         * 設定値に "_" が含まれる書込み禁止カラムかどうかを返します。
    1112         *
    1113         * true に設定された場合は、#getWriteValue( String ) で、先頭のアンダーバーを
    1114         * 削除して返します。
    1115         * 初期値は、false:使わないです。
    1116         *
    1117         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
    1118         *
    1119         * @return writableControlを使うかどうか [true:使う/false:使わない]
    1120         */
    1121        public boolean isWriteControl() {
    1122                return writeCtrl;
    1123        }
    1124}