    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 KBSAKU                  = 19 ;                  // 7.4.2.0 (2021/05/18) 内部的に使ってないが定義しておく
    089        /** 内部ﾃﾞｰﾀのｶﾗﾑ番号 {@value}       */
    090        public static final int SNO                             = 20 ;                  // 7.2.6.1 (2020/07/17) 内部的に使ってないが定義しておく
    091
    092        private final String    name                    ;                               // ｶﾗﾑ名
    093        private final String    className               ;                               // ﾃﾞｰﾀの属性(VARCHAR2,NUMBER...)
    094        private final String    maxlength               ;                               // 最大桁数
    095        private final String    viewLength              ;                               // 表示桁数
    096        private final String    fieldSize               ;                               // 6.2.0.0 (2015/02/27) 入力枠ｻｲｽﾞ
    097        private final String    renderer                ;                               // 表示種別
    098        private final String    editor                  ;                               // 編集種別
    099        private final String    dbType                  ;                               // 文字種別(S9,X...)
    100        private final String    dataDef                 ;                               // ﾃﾞｰﾀのﾃﾞﾌｫﾙﾄ値
    101        private final String    labelClm                ;                               // ﾗﾍﾞﾙｶﾗﾑ
    102        private final String    codeClm                 ;                               // ｺｰﾄﾞｶﾗﾑ
    103        private final String    columnPrm               ;                               // ｶﾗﾑﾊﾟﾗﾒｰﾀ
    104        private final String    rendererPrm             ;                               // 表示ﾊﾟﾗﾒｰﾀ
    105        private final String    editorPrm               ;                               // 編集ﾊﾟﾗﾒｰﾀ
    106        private final String    dbTypePrm               ;                               // 文字ﾊﾟﾗﾒｰﾀ
    107        private final String    roles                   ;                               // ｶﾗﾑﾛｰﾙ
    108        private final RoleMode  roleMode                ;                               // 4.3.0.0 (2008/07/04) ﾛｰﾙｽﾞとﾓｰﾄﾞを管理するｵﾌﾞｼﾞｪｸﾄ
    109
    110        private final int               totalSize               ;                               // 総桁数(小数点も含む)
    111        private final int               sizeX                   ;                               // ｶﾗﾑの文字桁数(整数部)
    112        private final int               sizeY                   ;                               // ｶﾗﾑの文字桁数(小数部)
    113        private final boolean   official                ;                               // ﾘｿｰｽDBから作成されたかどうか
    114
    115        /**
    116         * 配列文字列のﾃﾞｰﾀを元に､ColumnDataｵﾌﾞｼﾞｪｸﾄを構築します｡
    117         * このｺﾝｽﾄﾗｸﾀは､他のﾊﾟｯｹｰｼﾞから呼び出せないように､
    118         * ﾊﾟｯｹｰｼﾞﾌﾟﾗｲﾍﾞｰﾄにしておきます｡
    119         * このｺﾝｽﾄﾗｸﾀは､DBﾘｿｰｽﾌｧｲﾙを想定しています｡
    120         *
    121         * @og.rev 4.3.0.0 (2008/07/04) ﾛｰﾙﾓｰﾄﾞﾏﾙﾁ対応
    122         * @og.rev 5.1.6.0 (2010/05/01) DBTypeの初期値を "XK" とします｡
    123         * @og.rev 5.2.2.0 (2010/11/01) ﾊﾟﾗﾒｰﾀｰもVer3互換のためNVAL2で処理します｡
    124         * @og.rev 5.5.8.5 (2012/11/27) 編集ﾊﾟﾗﾒｰﾀで､"=" と記述されている場合は､表示ﾊﾟﾗﾒｰﾀを利用する｡
    125         * @og.rev 6.1.0.0 (2014/12/26) ｶﾗﾑの表示桁数(小数部)対応
    126         * @og.rev 6.2.0.0 (2015/02/27) ﾌｨｰﾙﾄﾞｻｲｽﾞ 追加(VIEW_LENGTHと分離して､役割を明確にする)
    127         * @og.rev 8.3.1.0 (2022/10/14) 入力枠ｻｲｽﾞの復活(※RELEASE-NOTES_7.txtに7.2.7.0の対応が「一旦保留」とｺﾒﾝﾄされている為)
    128         *
    129         * @param       data    CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,
    130         *                      RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,
    131         *                      CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES,FIELD_SIZE
    132         *
    133         */
    134        public ColumnData( final String[] data ) {
    135                name            = data[CLM].intern() ;                                                                          // ｶﾗﾑ名
    136                className       = data[CLS_NAME].intern() ;                                                                     // ﾃﾞｰﾀの属性
    137                maxlength       = data[USE_LENGTH].replace( '.',',' ).intern();                         // 最大桁数
    138                renderer        = nval2( data[RENDERER]          , null ) ;                                             // 表示種別
    139                editor          = nval2( data[EDITOR]            , null ) ;                                             // 編集種別
    140                dbType          = nval2( data[DBTYPE]            , "XK" ) ;                                             // 文字種別 5.1.6.0 (2010/05/01)
    141                dataDef         = nval2( data[DATA_DEFAULT]      , ""   ) ;                                             // ﾃﾞｰﾀのﾃﾞﾌｫﾙﾄ値
    142                labelClm        = nval2( data[LABEL_CLM]         , name ) ;                                             // ﾗﾍﾞﾙｶﾗﾑ
    143                codeClm         = nval2( data[CODE_CLM]          , name ) ;                                             // ｺｰﾄﾞｶﾗﾑ
    144                columnPrm       = nval2( data[CLM_PARAM]         , null ) ;                                             // ｶﾗﾑﾊﾟﾗﾒｰﾀ
    145                rendererPrm     = nval2( data[RENDERER_PARAM], null ) ;                                         // 表示ﾊﾟﾗﾒｰﾀ
    146                dbTypePrm       = nval2( data[TYPE_PARAM]        , null ) ;                                             // 文字ﾊﾟﾗﾒｰﾀ
    147                roles           = nval2( data[ROLES]             , null ) ;                                             // ｶﾗﾑﾛｰﾙ
    148//              fieldSize       = nval2( data[FIELD_SIZE]        , null ) ;                                             // 6.2.0.0 (2015/02/27) 入力枠ｻｲｽﾞ 8.3.1.0 (2022/10/14) Delete
    149                official        = true;                                                                                                         // ﾘｿｰｽDBから作成されたかどうか
    150
    151                // 6.1.0.0 (2014/12/26) ｶﾗﾑの表示桁数(小数部)対応と､ｶﾝﾏ置換処理
    152                final String viewLen = nval2( data[VIEW_LENGTH] , null ) ;
    153                viewLength = viewLen == null ? null : viewLen.replace( '.',',' ).intern();
    154
    155        //      // 7.2.7.0 (2020/08/07) fieldSize には、viewLength を設定する(昔に戻る)。
    156        //      if( viewLength != null && viewLength.indexOf( ',' ) > 0 ) {             // ｶﾝﾏを含む場合は、10桁固定にします。
    157        //              fieldSize = "10" ;
    158        //      }
    159        //      else {
    160        //              fieldSize = viewLength;
    161        //      }
    162                // 8.3.1.0 (2022/10/14) 入力枠ｻｲｽﾞの復活(※RELEASE-NOTES_7.txtに一旦保留とｺﾒﾝﾄされている)
    163                final String fSize;
    164                if( viewLength != null && viewLength.indexOf( ',' ) > 0 ) {                             // ｶﾝﾏを含む場合
    165                        final String[] fSizeAry = viewLength.split(",");
    166                        fSize = String.valueOf(Integer.parseInt(fSizeAry[0]) + Integer.parseInt(fSizeAry[1]) +1);
    167                }
    168                else {
    169                        fSize = viewLength;
    170                }
    171                fieldSize       = nval2( data[FIELD_SIZE] , fSize ) ;                                           // 入力枠サイズ
    172
    173                // 5.5.8.5 (2012/11/27) 編集ﾊﾟﾗﾒｰﾀで､"=" と記述されている場合は､表示ﾊﾟﾗﾒｰﾀを利用する｡
    174                final String tempEditPrm = nval2( data[EDITOR_PARAM], null ) ;
    175                if( "=".equals( tempEditPrm ) ) {
    176                        editorPrm = rendererPrm ;
    177                }
    178                else {
    179                        editorPrm = tempEditPrm ;
    180                }
    181
    182                roleMode        = RoleMode.newInstance( roles );        // ロールモード
    183
    184                // x,y 形式の場合､x + 2 桁で表されます｡(ﾏｲﾅｽ記号と小数点記号)
    185                // 7,3 は､ xxxx,yyy のﾌｫｰﾏｯﾄで､ﾃﾞｰﾀ長は､9 になります｡
    186                final int ch = maxlength.indexOf( ',' ) ;
    187                if( ch > 0 ) {
    188                        sizeY = Integer.parseInt( maxlength.substring( ch+1 ) );
    189                        sizeX = Integer.parseInt( maxlength.substring( 0,ch ) ) - sizeY;
    190                        totalSize = sizeX + sizeY+ 2;
    191                }
    192                else {
    193                        sizeY = 0;
    194                        sizeX = Integer.parseInt( maxlength );
    195                        if( "S9".equals( dbType ) ) {
    196                                totalSize = sizeX + 1;          // 数字型の場合は､ﾏｲﾅｽ記号分を加える｡
    197                        }
    198                        else {
    199                                totalSize = sizeX;
    200                        }
    201                }
    202        }
    203
    204        /**
    205         * ｶﾗﾑ名を返します｡
    206         *
    207         * @return      ｶﾗﾑ名
    208         */
    209        public String getName() { return name; }
    210
    211        /**
    212         * ｶﾗﾑのﾃﾞｰﾀの属性を返します｡
    213         *
    214         * @return      ｶﾗﾑのﾃﾞｰﾀの属性
    215         */
    216        public String getClassName() { return className; }
    217
    218        /**
    219         * ﾌｨｰﾙﾄﾞの使用桁数を返します｡
    220         * 小数指定の場合は､"7,3" のようなｶﾝﾏで整数部､小数部を区切った書式になります｡
    221         * 7,3 は､ xxxx,yyy のﾌｫｰﾏｯﾄで､整数部４桁､小数部３桁を意味します｡
    222         *
    223         * @return      使用桁数
    224         */
    225        public String getMaxlength() { return maxlength; }
    226
    227        /**
    228         * ﾌｨｰﾙﾄﾞのﾃﾞｰﾀ長を返します｡
    229         * 通常は､整数型の文字列とﾃﾞｰﾀ長は同じですが、小数点を表すﾃﾞｰﾀ長は
    230         * x.y 形式の場合､x + 1 桁で表されます｡
    231         * 6.2 は､ xxxx.yy のﾌｫｰﾏｯﾄです｡
    232         *
    233         * @return      ﾃﾞｰﾀ長定義文字列
    234         */
    235        public int getTotalSize() { return totalSize; }
    236
    237        /**
    238         * ﾌｨｰﾙﾄﾞの整数部のﾃﾞｰﾀ長を返します｡
    239         *
    240         * @return      ﾃﾞｰﾀ長定義文字列
    241         */
    242        public int getSizeX() { return sizeX ; }
    243
    244        /**
    245         * ﾌｨｰﾙﾄﾞの小数部のﾃﾞｰﾀ長を返します｡
    246         *
    247         * @return      ﾃﾞｰﾀ長定義文字列
    248         */
    249        public int getSizeY() { return sizeY ; }
    250
    251        /**
    252         * 文字列の表示文字数を返します｡
    253         *
    254         * これは､ﾃｷｽﾄﾌｨｰﾙﾄﾞのｻｲｽﾞではなく､Renderer系の表示に使用する
    255         * 文字数指定に使われます｡
    256         * 無指定の場合は､null が返されます｡
    257         *
    258         * @return      表示文字数
    259         */
    260        public String getViewLength() { return viewLength; }
    261
    262        /**
    263         * ﾌｨｰﾙﾄﾞの入力枠ｻｲｽﾞを返します｡
    264         *
    265         * ﾃｷｽﾄﾌｨｰﾙﾄﾞのｻｲｽﾞに該当します｡
    266         * 何も指定しない場合は､null が返ります｡
    267         * その場合の､入力枠ｻｲｽﾞは､maxlength が使用されます｡
    268         * ただし､桁数が大きい場合は､ｼｽﾃﾑ定数の HTML_COLUMNS_MAXSIZE や､
    269         * HTML_VIEW_COLUMNS_MAXSIZE で指定された値が使われます｡
    270         * それらの値よりも､ここで取得 した fieldSize が優先されます｡
    271         *
    272         * @og.rev 6.2.0.0 (2015/02/27) ﾌｨｰﾙﾄﾞｻｲｽﾞ 追加(VIEW_LENGTHと分離して､役割を明確にする)
    273         *
    274         * @return      入力枠ｻｲｽﾞ
    275         */
    276        public String getFieldSize() { return fieldSize; }
    277
    278        /**
    279         * 表示種別を返します｡
    280         *
    281         * @return      表示種別の文字列
    282         */
    283        public String getRenderer() { return renderer; }
    284
    285        /**
    286         * 編集種別を返します｡
    287         *
    288         * @return      編集種別
    289         */
    290        public String getEditor() { return editor; }
    291
    292        /**
    293         * 文字種別を返します｡
    294         *
    295         * @return      文字種別
    296         */
    297        public String getDbType() { return dbType; }
    298
    299        /**
    300         * ﾗﾍﾞﾙｶﾗﾑを返します｡
    301         *
    302         * @return      ﾗﾍﾞﾙｶﾗﾑ
    303         */
    304        public String getLabelColumn() { return labelClm; }
    305
    306        /**
    307         * ｺｰﾄﾞｶﾗﾑを返します｡
    308         *
    309         * @return      ｺｰﾄﾞｶﾗﾑ
    310         */
    311        public String getCodeColumn() { return codeClm; }
    312
    313        /**
    314         * ﾃﾞｰﾀのﾃﾞﾌｫﾙﾄ値を返します｡
    315         *
    316         * @return      ﾃﾞｰﾀのﾃﾞﾌｫﾙﾄ値
    317         */
    318        public String getDefault() { return dataDef; }
    319
    320        /**
    321         * ｶﾗﾑのﾊﾟﾗﾒｰﾀを取得します｡
    322         *
    323         * @return      ｶﾗﾑﾊﾟﾗﾒｰﾀ
    324         */
    325        public String getColumnParam() { return columnPrm; }
    326
    327        /**
    328         * 表示用ﾚﾝﾃﾞﾗｰのﾊﾟﾗﾒｰﾀを取得します｡
    329         *
    330         * @return      表示ﾊﾟﾗﾒｰﾀ
    331         */
    332        public String getRendererParam() { return rendererPrm; }
    333
    334        /**
    335         * 編集用ｴﾃﾞｨﾀｰのﾊﾟﾗﾒｰﾀを取得します｡
    336         *
    337         * @return      編集ﾊﾟﾗﾒｰﾀ
    338         */
    339        public String getEditorParam() { return editorPrm; }
    340
    341        /**
    342         * ﾃﾞｰﾀﾀｲﾌﾟのﾊﾟﾗﾒｰﾀを取得します｡
    343         *
    344         * @return      ﾃﾞｰﾀﾀｲﾌﾟのﾊﾟﾗﾒｰﾀ
    345         */
    346        public String getDbTypeParam() { return dbTypePrm; }
    347
    348        /**
    349         * ｶﾗﾑﾛｰﾙを取得します｡
    350         *
    351         * @return      ｶﾗﾑﾛｰﾙ
    352         */
    353        public String getRoles() { return roles; }
    354
    355        /**
    356         * ｶﾗﾑｵﾌﾞｼﾞｪｸﾄのﾛｰﾙﾓｰﾄﾞを返します｡
    357         *
    358         * @og.rev 4.3.0.0 (2008/07/04) ﾛｰﾙﾓｰﾄﾞﾏﾙﾁ対応
    359         *
    360         * @return      ｶﾗﾑｵﾌﾞｼﾞｪｸﾄのﾛｰﾙﾓｰﾄﾞ
    361         */
    362        public RoleMode getRoleMode() { return roleMode; }
    363
    364        /**
    365         * ﾘｿｰｽDBから作成されたかどうかを返します｡
    366         * 正式な場合は､true / ﾘｿｰｽになく､独自に作成された場合は､false になります｡
    367         *
    368         * @return      ﾘｿｰｽDBから作成されたかどうか
    369         */
    370        public boolean isOfficial() { return official; }
    371
    372        /**
    373         * 内部ﾃﾞｰﾀの文字列配列を返します｡
    374         *
    375         * @og.rev 6.2.0.0 (2015/02/27) ﾌｨｰﾙﾄﾞｻｲｽﾞ 追加(VIEW_LENGTHと分離して､役割を明確にする)
    376         *
    377         * @return      内部ﾃﾞｰﾀの文字列配列
    378         */
    379        public String[] getColumnData() {
    380                String[] data = new String[DATA_SIZE];
    381
    382                data[CLM                        ] = name                ;
    383                data[CLS_NAME           ] = className   ;
    384                data[USE_LENGTH         ] = maxlength   ;
    385                data[VIEW_LENGTH        ] = viewLength  ;
    386                data[RENDERER           ] = renderer    ;
    387                data[EDITOR             ] = editor              ;
    388                data[DBTYPE             ] = dbType              ;
    389                data[DATA_DEFAULT       ] = dataDef             ;
    390                data[LABEL_CLM          ] = labelClm    ;
    391                data[CODE_CLM           ] = codeClm             ;
    392                data[CLM_PARAM          ] = columnPrm   ;
    393                data[RENDERER_PARAM     ] = rendererPrm ;
    394                data[EDITOR_PARAM       ] = editorPrm   ;
    395                data[TYPE_PARAM         ] = dbTypePrm   ;
    396                data[ROLES                      ] = roles               ;
    397                data[FIELD_SIZE         ] = fieldSize   ;                                                                       // 6.2.0.0 (2015/02/27)
    398
    399                return data ;
    400        }
    401}