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