    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.resource;
    017
    018import static org.opengion.fukurou.util.StringUtil.nval2;
    019
    020/**
    021 * systemId に対応したカラムデータを作成します。
    022 *
    023 * カラムデータは、項目(CLM)に対して、各種カラム情報を持っています。
    024 * エンジン内部で使用している DBColumn オブジェクトは、RENDERER や EDITOR など
    025 * 実際にはオブジェクトで管理していますが、この ColumnData では、それらのキーとなる
    026 * 文字列を持っています。実際に DBColumn オブジェクトの構築時に、各属性オブジェクトを
    027 * 生成(または、キャッシュから取り出し)ます。
    028 *
    029 * カラムデータを作成する場合は、同一カラムで、作成区分(KBSAKU)違いの場合は、
    030 * 最も大きな作成区分を持つコードを使用します。
    031 * 作成区分(KBSAKU)は、0:システム予約、1:アプリ設定、2:ユーザー設定 という具合に
    032 * カスタマイズの度合いに応じて大きな数字を割り当てることで、キー情報を上書き修正
    033 * することが可能になります。(削除することは出来ません。)
    034 *
    035 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
    036 * @og.group リソース管理
    037 *
    038 * @version  4.0
    039 * @author   Kazuhiko Hasegawa
    040 * @since    JDK5.0,
    041 */
    042public final class ColumnData {
    043
    044        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    045        public static final int CLM                             = 0 ;
    046        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    047        public static final int CLS_NAME                = 1 ;
    048        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    049        public static final int USE_LENGTH              = 2 ;
    050        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    051        public static final int VIEW_LENGTH             = 3 ;
    052        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    053        public static final int RENDERER                = 4 ;
    054        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    055        public static final int EDITOR                  = 5 ;
    056        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    057        public static final int DBTYPE                  = 6 ;
    058        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    059        public static final int DATA_DEFAULT    = 7 ;
    060        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    061        public static final int LABEL_CLM               = 8 ;
    062        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    063        public static final int CODE_CLM                = 9 ;
    064        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    065        public static final int CLM_PARAM               = 10 ;
    066        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    067        public static final int RENDERER_PARAM  = 11 ;
    068        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    069        public static final int EDITOR_PARAM    = 12 ;
    070        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    071        public static final int TYPE_PARAM              = 13 ;
    072        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    073        public static final int ROLES                   = 14 ;
    074        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    075        public static final int FIELD_SIZE              = 15 ;                  // 6.2.0.0 (2015/02/27) フィールドサイズ 追加
    076
    077        /** 内部データのカラム数 {@value} */
    078        public static final int DATA_SIZE               = 16 ;                  // 6.2.0.0 (2015/02/27) 件数を増やす
    079
    080        /** リソース読み込みのために一時利用 4.3.5.7 (2009/03/22) */
    081        /* default */ static final int FG_LOAD                  = 16 ;                  // 6.2.0.0 (2015/02/27) 位置をずらす
    082        /** FGLOAD の読み込み済み設定用のUNIQ 6.3.1.1 (2015/07/10) */
    083        /* default */ static final int UNIQ                             = 17 ;
    084        /** FGLOAD の読み込み済み設定用のSYSTEM_ID 6.3.1.1 (2015/07/10) */
    085        /* default */ static final int SYSTEM_ID                = 18 ;
    086
    087        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    088        public static final int SNO                             = 19 ;  // 7.2.6.1 (2020/07/17) 内部的に使ってないが定義しておく
    089
    090        private final String    name                    ;               // カラム名
    091        private final String    className               ;               // データの属性(VARCHAR2,NUMBER...)
    092        private final String    maxlength               ;               // 最大桁数
    093        private final String    viewLength              ;               // 表示桁数
    094        private final String    fieldSize               ;               // 6.2.0.0 (2015/02/27) 入力枠サイズ
    095        private final String    renderer                ;               // 表示種別
    096        private final String    editor                  ;               // 編集種別
    097        private final String    dbType                  ;               // 文字種別(S9,X...)
    098        private final String    dataDef                 ;               // データのデフォルト値
    099        private final String    labelClm                ;               // ラベルカラム
    100        private final String    codeClm                 ;               // コードカラム
    101        private final String    columnPrm               ;               // カラムパラメータ
    102        private final String    rendererPrm             ;               // 表示パラメータ
    103        private final String    editorPrm               ;               // 編集パラメータ
    104        private final String    dbTypePrm               ;               // 文字パラメータ
    105        private final String    roles                   ;               // カラムロール
    106        private final RoleMode  roleMode                ;               // 4.3.0.0 (2008/07/04) ロールズとモードを管理するオブジェクト
    107
    108        private final int               totalSize               ;               // 総桁数(小数点も含む)
    109        private final int               sizeX                   ;               // カラムの文字桁数(整数部)
    110        private final int               sizeY                   ;               // カラムの文字桁数(小数部)
    111        private final boolean   official                ;               // リソースＤＢから作成されたかどうか
    112
    113        /**
    114         * 配列文字列のデータを元に、ColumnDataオブジェクトを構築します。
    115         * このコンストラクタは、他のパッケージから呼び出せないように、
    116         * パッケージプライベートにしておきます。
    117         * このコンストラクタは、ＤＢリソースファイルを想定しています。
    118         *
    119         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    120         * @og.rev 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします。
    121         * @og.rev 5.2.2.0 (2010/11/01) パラメーターもVer3互換のためNVAL2で処理します。
    122         * @og.rev 5.5.8.5 (2012/11/27) 編集パラメータで、"=" と記述されている場合は、表示パラメータを利用する。
    123         * @og.rev 6.1.0.0 (2014/12/26) カラムの表示桁数(小数部)対応
    124         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
    125         *
    126         * @param       data    CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,
    127         *                      RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,
    128         *                      CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES,FIELD_SIZE
    129         *
    130         */
    131        public ColumnData( final String[] data ) {
    132                name            = data[CLM].intern() ;                                          // カラム名
    133                className       = data[CLS_NAME].intern() ;                                     // データの属性
    134                maxlength       = data[USE_LENGTH].replace( '.',',' ).intern();         // 最大桁数
    135                renderer        = nval2( data[RENDERER]          , null ) ;             // 表示種別
    136                editor          = nval2( data[EDITOR]            , null ) ;             // 編集種別
    137                dbType          = nval2( data[DBTYPE]            , "XK" ) ;             // 文字種別  5.1.6.0 (2010/05/01)
    138                dataDef         = nval2( data[DATA_DEFAULT]      , ""   ) ;             // データのデフォルト値
    139                labelClm        = nval2( data[LABEL_CLM]         , name ) ;             // ラベルカラム
    140                codeClm         = nval2( data[CODE_CLM]          , name ) ;             // コードカラム
    141                columnPrm       = nval2( data[CLM_PARAM]         , null ) ;             // カラムパラメータ
    142                rendererPrm     = nval2( data[RENDERER_PARAM], null ) ;         // 表示パラメータ
    143                dbTypePrm       = nval2( data[TYPE_PARAM]        , null ) ;             // 文字パラメータ
    144                roles           = nval2( data[ROLES]             , null ) ;             // カラムロール
    145                fieldSize       = nval2( data[FIELD_SIZE]        , null ) ;             // 6.2.0.0 (2015/02/27) 入力枠サイズ
    146                official        = true;                                                                         // リソースＤＢから作成されたかどうか
    147
    148                // 6.1.0.0 (2014/12/26) カラムの表示桁数(小数部)対応と、カンマ置換処理
    149                final String viewLen = nval2( data[VIEW_LENGTH] , null ) ;
    150                viewLength = viewLen == null ? null : viewLen.replace( '.',',' ).intern();
    151
    152        //      // 7.2.7.0 (2020/08/07) fieldSize には、viewLength を設定する(昔に戻る)。
    153        //      if( viewLength != null && viewLength.indexOf( ',' ) > 0 ) {             // ｶﾝﾏを含む場合は、10桁固定にします。
    154        //              fieldSize = "10" ;
    155        //      }
    156        //      else {
    157        //              fieldSize = viewLength;
    158        //      }
    159
    160                // 5.5.8.5 (2012/11/27) 編集パラメータで、"=" と記述されている場合は、表示パラメータを利用する。
    161                final String tempEditPrm = nval2( data[EDITOR_PARAM], null ) ;
    162                if( "=".equals( tempEditPrm ) ) {
    163                        editorPrm = rendererPrm ;
    164                }
    165                else {
    166                        editorPrm = tempEditPrm ;
    167                }
    168
    169                roleMode        = RoleMode.newInstance( roles );        // ロールモード
    170
    171                // x,y 形式の場合、x + 2 桁で表されます。(マイナス記号と小数点記号)
    172                // 7,3 は、 xxxx,yyy のフォーマットで、データ長は、9 になります。
    173                final int ch = maxlength.indexOf( ',' ) ;
    174                if( ch > 0 ) {
    175                        sizeY = Integer.parseInt( maxlength.substring( ch+1 ) );
    176                        sizeX = Integer.parseInt( maxlength.substring( 0,ch ) ) - sizeY;
    177                        totalSize = sizeX + sizeY+ 2;
    178                }
    179                else {
    180                        sizeY = 0;
    181                        sizeX = Integer.parseInt( maxlength );
    182                        if( "S9".equals( dbType ) ) {
    183                                totalSize = sizeX + 1;  // 数字型の場合は、マイナス記号分を加える。
    184                        }
    185                        else {
    186                                totalSize = sizeX ;
    187                        }
    188                }
    189        }
    190
    191        /**
    192         * カラム名を返します。
    193         *
    194         * @return  カラム名
    195         */
    196        public String getName() { return name; }
    197
    198        /**
    199         * カラムのデータの属性を返します。
    200         *
    201         * @return  カラムのデータの属性
    202         */
    203        public String getClassName() { return className; }
    204
    205        /**
    206         * フィールドの使用桁数を返します。
    207         * 小数指定の場合は、"7,3" のようなカンマで整数部、小数部を区切った書式になります。
    208         * 7,3 は、 xxxx,yyy のフォーマットで、整数部４桁、小数部３桁を意味します。
    209         *
    210         * @return  使用桁数
    211         */
    212        public String getMaxlength() { return maxlength; }
    213
    214        /**
    215         * フィールドのデータ長を返します。
    216         * 通常は、整数型の文字列とデータ長は同じですが,小数点を表すデータ長は
    217         * x.y 形式の場合、x + 1 桁で表されます。
    218         * 6.2 は、 xxxx.yy のフォーマットです。
    219         *
    220         * @return  データ長定義文字列
    221         */
    222        public int getTotalSize() { return totalSize; }
    223
    224        /**
    225         * フィールドの整数部のデータ長を返します。
    226         *
    227         * @return  データ長定義文字列
    228         */
    229        public int getSizeX() { return sizeX ; }
    230
    231        /**
    232         * フィールドの小数部のデータ長を返します。
    233         *
    234         * @return  データ長定義文字列
    235         */
    236        public int getSizeY() { return sizeY ; }
    237
    238        /**
    239         * 文字列の表示文字数を返します。
    240         *
    241         * これは、テキストフィールドのサイズではなく、Renderer系の表示に使用する
    242         * 文字数指定に使われます。
    243         * 無指定の場合は、null が返されます。
    244         *
    245         * @return  表示文字数
    246         */
    247        public String getViewLength() { return viewLength; }
    248
    249        /**
    250         * フィールドの入力枠サイズを返します。
    251         *
    252         * テキストフィールドのサイズに該当します。
    253         * 何も指定しない場合は、null が返ります。
    254         * その場合の、入力枠サイズは、maxlength が使用されます。
    255         * ただし、桁数が大きい場合は、システム定数の HTML_COLUMNS_MAXSIZE や、
    256         * HTML_VIEW_COLUMNS_MAXSIZE で指定された値が使われます。
    257         * それらの値よりも、ここで取得 した fieldSize が優先されます。
    258         *
    259         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
    260         *
    261         * @return  入力枠サイズ
    262         */
    263        public String getFieldSize() { return fieldSize; }
    264
    265        /**
    266         * 表示種別を返します。
    267         *
    268         * @return  表示種別の文字列
    269         */
    270        public String getRenderer() { return renderer; }
    271
    272        /**
    273         * 編集種別を返します。
    274         *
    275         * @return  編集種別
    276         */
    277        public String getEditor() { return editor; }
    278
    279        /**
    280         * 文字種別を返します。
    281         *
    282         * @return  文字種別
    283         */
    284        public String getDbType() { return dbType; }
    285
    286        /**
    287         * ラベルカラムを返します。
    288         *
    289         * @return  ラベルカラム
    290         */
    291        public String getLabelColumn() { return labelClm; }
    292
    293        /**
    294         * コードカラムを返します。
    295         *
    296         * @return  コードカラム
    297         */
    298        public String getCodeColumn() { return codeClm; }
    299
    300        /**
    301         * データのデフォルト値を返します。
    302         *
    303         * @return  データのデフォルト値
    304         */
    305        public String getDefault() { return dataDef; }
    306
    307        /**
    308         * カラムのパラメータを取得します。
    309         *
    310         * @return      カラムパラメータ
    311         */
    312        public String getColumnParam() { return columnPrm; }
    313
    314        /**
    315         * 表示用レンデラーのパラメータを取得します。
    316         *
    317         * @return      表示パラメータ
    318         */
    319        public String getRendererParam() { return rendererPrm; }
    320
    321        /**
    322         * 編集用エディターのパラメータを取得します。
    323         *
    324         * @return      編集パラメータ
    325         */
    326        public String getEditorParam() { return editorPrm; }
    327
    328        /**
    329         * データタイプのパラメータを取得します。
    330         *
    331         * @return      データタイプのパラメータ
    332         */
    333        public String getDbTypeParam() { return dbTypePrm; }
    334
    335        /**
    336         * カラムロールを取得します。
    337         *
    338         * @return      カラムロール
    339         */
    340        public String getRoles() { return roles; }
    341
    342        /**
    343         * カラムオブジェクトのロールモードを返します。
    344         *
    345         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    346         *
    347         * @return カラムオブジェクトのロールモード
    348         */
    349        public RoleMode getRoleMode() { return roleMode; }
    350
    351        /**
    352         * リソースＤＢから作成されたかどうかを返します。
    353         * 正式な場合は、true / リソースになく、独自に作成された場合は、false になります。
    354         *
    355         * @return      リソースＤＢから作成されたかどうか
    356         *
    357         */
    358        public boolean isOfficial() { return official; }
    359
    360        /**
    361         * 内部データの文字列配列を返します。
    362         *
    363         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
    364         *
    365         * @return      内部データの文字列配列
    366         */
    367        public String[] getColumnData() {
    368                String[] data = new String[DATA_SIZE];
    369
    370                data[CLM                        ] = name                ;
    371                data[CLS_NAME           ] = className   ;
    372                data[USE_LENGTH         ] = maxlength   ;
    373                data[VIEW_LENGTH        ] = viewLength  ;
    374                data[RENDERER           ] = renderer    ;
    375                data[EDITOR             ] = editor              ;
    376                data[DBTYPE             ] = dbType              ;
    377                data[DATA_DEFAULT       ] = dataDef             ;
    378                data[LABEL_CLM          ] = labelClm    ;
    379                data[CODE_CLM           ] = codeClm             ;
    380                data[CLM_PARAM          ] = columnPrm   ;
    381                data[RENDERER_PARAM     ] = rendererPrm ;
    382                data[EDITOR_PARAM       ] = editorPrm   ;
    383                data[TYPE_PARAM         ] = dbTypePrm   ;
    384                data[ROLES                      ] = roles               ;
    385                data[FIELD_SIZE         ] = fieldSize   ;                       // 6.2.0.0 (2015/02/27)
    386
    387                return data ;
    388        }
    389}