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.system.OgBuilder;                                                                   // 6.4.5.0 (2016/04/08)
019import org.opengion.fukurou.model.NativeType;
020import org.opengion.fukurou.util.Attributes;
021import org.opengion.fukurou.util.ErrorMessage;
022import org.opengion.fukurou.util.TagBuffer;
023import org.opengion.fukurou.util.StringUtil;
024import org.opengion.hayabusa.common.HybsSystem;
025import org.opengion.hayabusa.common.HybsSystemException;
026import org.opengion.hayabusa.resource.CodeData;
027import org.opengion.hayabusa.resource.ColumnData;
028import org.opengion.hayabusa.resource.LabelData;
029import org.opengion.hayabusa.resource.RoleMode;
030
031/**
032 * DBType インターフェースを継承した Abstractクラスです。
033 * getRendererValue( String value ) 、getEditorValue( String value ) 、
034 * isValueChack( String ) メソッドを、サブクラスで実装する必要があります。
035 *
036 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
037 * @og.group テーブル管理
038 *
039 * @version  4.0
040 * @author   Kazuhiko Hasegawa
041 * @since    JDK5.0,
042 */
043public final class DBColumn {
044
045        private final ColumnData        columnData;
046        private final LabelData         labelData;
047        private final CodeData          codeData;
048
049        private final CellRenderer      cellRenderer    ;                                                               // 表示用レンデラー
050        private final CellEditor        cellEditor              ;                                                               // 編集用エディター
051        private final DBType            dbType                  ;                                                               // データのタイプ
052
053        private final String            lang                    ;                                                               // 言語
054        private final boolean           writable                ;                                                               // カラムが書き込み可能かどうか
055        private final String            defValue                ;                                                               // データのデフォルト値
056        private final Attributes        rendAttri               ;                                                               // 表示用レンデラー追加用属性
057        private final Attributes        editAttri               ;                                                               // 編集用エディター追加用属性
058        private final boolean           addNoValue              ;                                                               // メニューに空の選択リストを追加するかどうか        // 3.5.5.7 (2004/05/10)
059        private final String            addKeyLabel             ;                                                               // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか
060        private final boolean           writeKeyLabel   ;                                                               // 6.2.3.0 (2015/05/01)
061        private final String            dbid                    ;                                                               // データベース接続先ID
062        private final boolean           official                ;                                                               // カラムリソースから作成されたかどうか           // 3.6.0.7 (2004/11/06)
063
064//      private final int                       checkLevel              ;                                                               // DBColumn の 整合性チェックを行うレベルを規定します。      6.9.5.0 (2018/04/23) 廃止
065
066        // 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。
067
068        private final String            eventColumn             ;                                                               // 4.3.6.0 (2009/04/01) イベントカラム
069        private final String            eventValue              ;                                                               // 6.3.3.0 (2015/07/25) eventValue 追加
070        private final String            rawEditParameter;                                                               // 4.3.6.0 (2009/04/01) {@XXXX}の変換がされていない生パラメータ
071        private final String            rawRendParameter;                                                               // 5.1.7.0 (2009/04/01) {@XXXX}の変換がされていない生パラメータ
072        private final String            eventURL                ;                                                               // 4.3.6.0 (2009/04/01) イベントカラムで利用するURL
073
074        private final String            useSLabel               ;                                                               // 5.5.1.0 (2012/04/03) MENUのベース表示の切り替え
075        private final String            noDisplayVal    ;                                                               // 5.6.2.3 (2013/03/22) 非表示文字の設定
076
077        private final boolean           stringOutput    ;                                                               // 5.7.6.3 (2013/05/23) ファイルレンデラ出力時のフラグ
078        private final boolean           writeCtrl               ;                                                               // 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
079        private final boolean           useDateFeed             ;                                                               // 日付送り戻し機能の有効/無効 8.1.2.3 (2022/05/20)
080
081        // ※ 内部の各属性から作り出す値です。CustomTable等では、毎回呼ばれるため、キャッシュします。
082        private String                          className               ;                                                               // 6.4.5.0 (2016/04/08) キャッシュします。
083
084        private final boolean           isNumber                ;                                                               // 6.4.6.0 (2016/05/27) カラムが数値型がどうか。
085        private final boolean           isDate                  ;                                                               // 6.4.6.0 (2016/05/27) カラムが日付型がどうか。
086
087        /**
088         * DBColumnConfig オブジェクトより作成されるコンストラクター
089         * すべての情報は、インスタンス作成時に設定します。
090         * このオブジェクトは、1度作成されると変更されることはありません。
091         *
092         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
093         * @og.rev 4.0.0.0 (2007/11/07) Selectionオブジェクトをキャッシュする
094         * @og.rev 4.3.6.0 (2009/04/01) eventColumnの対応
095         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
096         * @og.rev 5.5.1.0 (2012/04/03) useSLabel対応
097         * @og.rev 5.6.2.3 (2013/03/22) 非表示文字の設定。noDisplayVal追加
098         * @og.rev 5.7.3.0 (2014/02/07) SelectionFactory 対応
099         * @og.rev 5.7.6.3 (2014/05/23) stringOutput対応
100         * @og.rev 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。
101         * @og.rev 6.0.4.0 (2014/11/28) addKeyLabel 属性を追加
102         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
103         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
104         * @og.rev 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
105         * @og.rev 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
106         * @og.rev 6.9.5.0 (2018/04/23) checkLevel 固定化(officialのみで制御します)
107         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
108         * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加)
109         *
110         * @param   lang    言語
111         * @param   clmData カラムデータオブジェクト
112         * @param   lblData ラベルデータオブジェクト
113         * @param   cdData  コードデータオブジェクト
114         */
115        public DBColumn( final String     lang,
116                                         final ColumnData clmData ,
117                                         final LabelData  lblData ,
118                                         final CodeData   cdData ) {
119                this.lang               = lang ;
120                this.columnData = clmData ;
121                this.labelData  = lblData ;
122                this.codeData   = cdData  ;
123
124                writable                = true ;
125
126                try {
127                        dbType = DBTypeFactory.newInstance( columnData.getDbType() );
128                }
129                catch( final RuntimeException ex ) {
130                        final String errMsg = "dbType の作成に失敗しました。"
131                                                + " name=[" + columnData.getName() + "]"
132                                                + " dbType=[" + columnData.getDbType() + "] "
133                                                + ex.getMessage();
134                        throw new HybsSystemException( errMsg,ex );
135                }
136
137                // 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
138                rendAttri               = new Attributes();                                                                             // 表示用レンデラー追加用属性
139                editAttri               = new Attributes();                                                                             // 編集用エディター追加用属性
140
141                addNoValue              = false;
142                addKeyLabel             = null;                                                                                                 // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか
143                writeKeyLabel   = false;                                                                                                // 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
144                official                = true;                                                                                                 // 3.6.0.7 (2004/11/06)
145//              checkLevel              = -1;
146                dbid                    = null;                                                                                                 // 標準から作成されるカラムオブジェクトは、DEFAULT 接続先を設定する。
147
148                eventColumn             = null;                                                                                                 // 4.3.6.0 (2009/04/01)
149                eventValue              = null;                                                                                                 // 6.3.3.0 (2015/07/25) eventValue 追加
150                rawEditParameter = columnData.getEditorParam();                                                 // 4.3.6.0 (2009/04/01)
151                rawRendParameter = columnData.getRendererParam();                                               // 5.1.7.0 (2010/06/01)
152                eventURL                = null;                                                                                                 // 4.3.6.0 (2009/04/01)
153
154                useSLabel               = "auto";                                                                                               // 5.5.1.0
155                noDisplayVal    = null;                                                                                                 // 5.6.2.3 (2013/03/22) 非表示文字の設定
156
157                stringOutput    = HybsSystem.sysBool( "USE_STRING_EXCEL_OUTPUT" );              // 5.7.6.3 (2014/05/23)
158                writeCtrl               = false;                                                                                                // 7.0.1.5 (2018/12/10) 出力時のアンダーバー削除
159                useDateFeed             = true;                                                                                                 // 日付送り戻し機能の有効/無効 8.1.2.3 (2022/05/20)
160
161                final String def = columnData.getDefault();
162                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
163                defValue = def == null ? dbType.getDefault() : def;
164
165                // 5.7.3.0 (2014/02/07) SelectionFactory 対応
166                // 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。
167
168                try {
169                        cellRenderer = DBCellFactory.newRenderer( columnData.getRenderer(),this );
170                        cellEditor   = DBCellFactory.newEditor(   columnData.getEditor(),  this );
171                }
172                catch( final RuntimeException ex ) {
173                        final String errMsg = "Renderer,Editor の作成に失敗しました。"
174                                                + " name=["             + columnData.getName()          + "]"
175                                                + " Renderer=[" + columnData.getRenderer()      + "]"
176                                                + " Editor=["   + columnData.getEditor()        + "]"
177                                                + ex.getMessage();
178                        throw new HybsSystemException( errMsg,ex );
179                }
180
181                // 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
182                isNumber = StringUtil.contains( columnData.getClassName() , "NUMBER" , "INTEGER" , "DECIMAL" , "INT64" );
183                isDate   = StringUtil.contains( columnData.getClassName() , "DATE" , "TIMESTAMP" );
184        }
185
186        /**
187         * DBColumnConfig オブジェクトより作成されるコンストラクター
188         * すべての情報は、インスタンス作成時に設定します。
189         * このオブジェクトは、1度作成されると変更されることはありません。
190         *
191         * @og.rev 4.0.0.0 (2007/11/07) Selectionオブジェクトをキャッシュする
192         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
193         * @og.rev 5.1.8.0 (2010/07/01) メソッド名変更(getDefValue ⇒ getDefault)
194         * @og.rev 5.5.1.0 (2012/04/03) useSLabel対応
195         * @og.rev 5.6.2.3 (2013/03/22) 非表示文字の設定。noDisplayVal追加
196         * @og.rev 5.6.6.0 (2013/07/05) codeKeyVal 属性を使用した、Selection_KEYVAL オブジェクトの作成
197         * @og.rev 5.7.3.0 (2014/02/07) SelectionFactory 対応
198         * @og.rev 5.7.6.3 (2014/05/23) stringOutput対応
199         * @og.rev 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。
200         * @og.rev 6.0.4.0 (2014/11/28) addKeyLabel 属性を追加
201         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
202         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
203         * @og.rev 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
204         * @og.rev 6.9.5.0 (2018/04/23) checkLevel 固定化(officialのみで制御します)
205         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
206         * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加)
207         *
208         * @param   config DBColumnConfigオブジェクト
209         */
210        public DBColumn( final DBColumnConfig config ) {
211                lang                    = config.getLang();
212
213                columnData              = config.getColumnData();
214                labelData               = config.getLabelData();
215                codeData                = config.getCodeData();
216
217                writable                = config.isWritable();
218                dbType                  = DBTypeFactory.newInstance( columnData.getDbType() );
219                rendAttri               = config.getRendererAttributes();
220                editAttri               = config.getEditorAttributes();
221                addNoValue              = config.isAddNoValue();
222                addKeyLabel             = config.getAddKeyLabel();                                                              // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか
223                writeKeyLabel   = config.isWriteKeyLabel();                                                             // 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
224                official                = config.isOfficial();                                                                  // 3.6.0.7 (2004/11/06)
225                dbid                    = config.getDbid();
226
227                eventColumn             = config.getEventColumn();                                                              // 4.3.6.0 (2009/04/01)
228                eventValue              = config.getEventValue();                                                               // 6.3.3.0 (2015/07/25) eventValue 追加
229                rawEditParameter = config.getRawEditParameter();                                                // 4.3.6.0 (2009/04/01)
230                rawRendParameter = config.getRawRendParameter();                                                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
231                eventURL                = config.getEventURL();                                                                 // 4.3.6.0 (2009/04/01)
232
233                useSLabel               = config.getUseSLabel();                                                                // 5.5.1.0 (2012/04/03)
234                noDisplayVal    = config.getNoDisplayVal();                                                             // 5.6.2.3 (2013/03/22) 非表示文字の設定
235
236                stringOutput    = config.isStringOutput();                                                              // 5.7.6.3 (2014/05/23)
237                writeCtrl               = config.isWriteControl();                                                              // 7.0.1.5 (2018/12/10)
238                useDateFeed             = config.isDateFeed();                                                                  // 8.1.2.3 (2022/05/20)
239//              // 6.9.5.0 (2018/04/23) checkLevel 固定化(officialのみで制御します)
240//              // DBColumn の 整合性チェックを行うレベルを規定します。
241//              final String CHECK_LEVEL = HybsSystem.sys( "DB_OFFICIAL_COLUMN_CHECK_LEVEL" );
242//              if( !official && CHECK_LEVEL != null && CHECK_LEVEL.length() > 0 ) {
243//                      checkLevel = Integer.parseInt( CHECK_LEVEL );
244//              }
245//              else {
246//                      checkLevel = -1;
247//              }
248
249                final String def = config.getDefault();
250                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
251                defValue = def == null ? dbType.getDefault() : def;
252
253                // 5.6.6.0 (2013/07/05) codeKeyVal 属性を使用した、Selection_KEYVAL オブジェクトの作成
254                // 優先順位は、codeData オブジェクトで、codeKeyVal を利用したSelectionは、DBColumnConfig からのみ作成可能
255                // 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。
256
257                cellRenderer = DBCellFactory.newRenderer( columnData.getRenderer(),this );
258                cellEditor   = DBCellFactory.newEditor(   columnData.getEditor(),  this );
259
260                // 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
261                isNumber = StringUtil.contains( columnData.getClassName() , "NUMBER" , "INTEGER" , "DECIMAL" , "INT64" );
262                isDate   = StringUtil.contains( columnData.getClassName() , "DATE" , "TIMESTAMP" );
263        }
264
265        /**
266         * 言語を返します。
267         *
268         * @return  言語
269         */
270        public String getLang() {
271                return lang;
272        }
273
274        /**
275         * カラム名を返します。
276         *
277         * @return  カラム名
278         */
279        public String getName() {
280                return columnData.getName();
281        }
282
283        /**
284         * カラムのラベル名を返します。
285         *
286         * @return  カラムのラベル名
287         */
288        public String getLabel() {
289                return labelData.getLabel();
290        }
291
292        /**
293         * カラムのラベル名を返します。
294         *
295         * @return  カラムのラベル名(名前(短))
296         */
297        public String getShortLabel() {
298                return labelData.getShortLabel();
299        }
300
301        /**
302         * カラムのラベル名を返します。
303         *
304         * @return  カラムのラベル名(名前(長))
305         */
306        public String getLongLabel() {
307                return labelData.getLongLabel();
308        }
309
310        /**
311         * カラムの概要説明を返します。
312         *
313         * @og.rev 6.8.3.1 (2017/12/01) 新規追加。
314         *
315         * @return  カラムの概要説明
316         */
317        public String getDescription() {
318                return labelData.getDescription();
319        }
320
321        /**
322         * このカラムが、数値型かどうかを返します。
323         *
324         * ColumnDataのgetClassName() の値が、"NUMBER" , "INTEGER" , "DECIMAL" , "INT64"
325         * の場合、true:数値型 を返します。
326         *
327         * @return  カラムが、数値型かどうか
328         *
329         * @og.rev 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
330         */
331        public boolean isNumberType() {
332                return isNumber;
333        }
334
335        /**
336         * このカラムが、日付型かどうかを返します。
337         *
338         * ColumnDataのgetClassName() の値が、"DATE" , "TIMESTAMP"
339         * の場合、true:数値型 を返します。
340         *
341         * @return  カラムが、日付型かどうか
342         *
343         * @og.rev 6.4.6.0 (2016/05/27) isNumber , isDate 追加。
344         */
345        public boolean isDateType() {
346                return isDate;
347        }
348
349        /**
350         * カラムのクラスを文字列にした名称を返します。
351         * 内容的には、カラムの className の値と、dbTypeの値をマージした値になります。
352         * さらに、editorAttributesの "class"キーワードの値もマージします。
353         * ただし、この値には、must属性も設定されているため、それだけは除外します。
354         * 各種スタイルを表現するのに使用します。
355         *
356         * @og.rev 6.4.4.2 (2016/04/01) editAttri に clazz属性が設定されている場合は、スペースで連結して返します。
357         * @og.rev 6.4.5.0 (2016/04/08) className , dbType , editAttriのclass属性(除くmust)をスペースで連結して返します。
358         * @og.rev 6.4.5.1 (2016/04/28) class属性の連結で、noinput も除外する。(mustAny,must,noinput が除外)
359         * @og.rev 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
360         * @og.rev 6.4.6.0 (2016/05/27) ColumnDataのclassName は使わない。
361         * @og.rev 6.4.6.1 (2016/06/03) ColumnDataのclassName 復活。BIT などは、残さないと、いけない。
362         *
363         * @return  カラムのクラスを文字列にした名称(X9,X,など)
364         * @see         #getDbType()
365         */
366        public String getClassName() {
367                if( className == null ) {
368                        final String dbTyp = columnData.getDbType();
369                        // 6.4.6.0 (2016/05/27) オリジナルのclassName は使わない。
370                        // 6.4.6.1 (2016/06/03) 復活。BIT などは、残さないと、いけない。
371                        final OgBuilder clsNmBuf = new OgBuilder()
372                                                                                .append( columnData.getClassName() )
373                                                                                .delete( "VARCHAR2" , "NUMBER" );
374
375                        final OgBuilder edtAttBuf = new OgBuilder();
376                        // 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
377        //              if( editAttri != null ) {
378                                edtAttBuf.append( editAttri.get( "class" ) )
379        //                                              .delete( "mustAny" , "must" );                                          // mustAnyが先
380                                                        .delete( "mustAny" , "must"  , "noinput" );                     // mustAnyが先
381        //              }
382
383                        className = new OgBuilder()
384                                                        .join( " " , dbTyp , clsNmBuf , edtAttBuf )                     // 6.4.6.1 (2016/06/03) 復活
385        //                                              .join( " " , dbTyp , edtAttBuf )                                        // 6.4.6.0 (2016/05/27)
386        //                                              .toString();
387                                                        .toString()
388                                                        .trim() ;
389                }
390
391                return className ;
392        }
393
394        /**
395         * フィールドのデータ長を返します。
396         * 通常は、整数型の文字列とデータ長は同じですが、小数点を表すデータ長は
397         * x,y 形式の場合、x + 2 桁で表されます。(マイナス記号と小数点記号)
398         * 7,3 は、 xxxx,yyy のフォーマットで、データ長は、9 になります。
399         *
400         * @og.rev 2.1.1.2 (2002/11/21) 最大桁数入力時の桁数チェックの間違いを訂正。
401         * @og.rev 4.0.0.0 (2005/01/31) メソッド名変更 getMaxlength() → getTotalSize()
402         *
403         * @return  データ長定義文字列
404         */
405        public int getTotalSize() {
406                return columnData.getTotalSize();
407        }
408
409        /**
410         * フィールドの使用桁数を返します。
411         * 小数指定の場合は、"7,3" のようなカンマで整数部、小数部を区切った書式になります。
412         * 7,3 は、 xxxx,yyy のフォーマットで、整数部4桁、小数部3桁を意味します。
413         *
414         * @return  使用桁数
415         */
416        public String getMaxlength() {
417                return columnData.getMaxlength();
418        }
419
420        /**
421         * フィールドの整数部のデータ長を返します。
422         * 通常は、整数型の文字列とデータ長は同じですが、小数点を表すデータ長は
423         * x,y 形式の場合、x - y 桁で表されます。(マイナス記号含まず)
424         * 7,3 は、 xxxx,yyy のフォーマットで、データ長は、4 になります。
425         *
426         * @return  データ長定義文字列
427         */
428        public int getSizeX() {
429                return columnData.getSizeX() ;
430        }
431
432        /**
433         * フィールドの小数部のデータ長を返します。
434         * 通常は、整数型の文字列では、0 になりますが、小数点を表すデータ長は
435         * x,y 形式の場合、y 桁で表されます。
436         * 7,3 は、 xxxx,yyy のフォーマットで、データ長は、3 になります。
437         *
438         * @return  データ長定義文字列
439         */
440        public int getSizeY() {
441                return columnData.getSizeY() ;
442        }
443
444        /**
445         * カラムの表示桁数を返します。
446         * viewLength は、設定した場合のみ、使用できます。通常は、null が返ります。
447         *
448         * @og.rev 3.5.5.5 (2004/04/23) 新規追加
449         * @og.rev 4.0.0.0 (2005/01/31) メソッド名変更 getSize() → getViewLength()
450         *
451         * @return      カラムの文字桁数
452         */
453        public String getViewLength() {
454                return columnData.getViewLength();
455        }
456
457        /**
458         * カラムが書き込み可能かどうかを返します。
459         *
460         * @return  カラムが書き込み可能かどうか
461         */
462        public boolean isWritable() {
463                return writable;
464        }
465
466        /**
467         * データの値そのものではなく、その値のラベル文字を返します。
468         *
469         * @og.rev 3.5.5.4 (2004/04/15) value が null の場合は、""(ゼロストリング)にする。
470         *
471         * @param   value       入力値
472         *
473         * @return  データ表示用の文字列
474         * @og.rtnNotNull
475         */
476        public String getRendererValue( final String value ) {
477                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
478                return cellRenderer.getValue( value == null ? "" : value );
479        }
480
481        /**
482         * データ表示用のHTML文字列を作成します。
483         * 行番号毎に異なる値を返すことの出来る DBCellRenderer を使用することが出来ます。
484         *
485         * @og.rev 3.5.5.7 (2004/05/10) 行番号に無関係に、値を返すように変更します。
486         * @og.rev 4.0.0.0 (2005/11/30) 行番号に対応した値を返すように変更します。
487         *
488         * @param   row         行番号
489         * @param   value       入力値
490         *
491         * @return  データ編集用の文字列
492         * @og.rtnNotNull
493         */
494        public String getRendererValue( final int row,final String value ) {
495                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
496                return cellRenderer.getValue( row,value == null ? "" : value );
497        }
498
499        /**
500         * データ表示用のHTML文字列を作成します。
501         * 行番号毎に異なる値を返すことの出来る DBCellRenderer を使用することが出来ます。
502         * 第3引数に、パラメータを渡すことが出来ます。これは、viewMarker で
503         * [$XXXX param] 形式を渡すことで、行単位に表示形式を変更できます。
504         * AbstractRenderer では、#getValue( String ) を呼び出しています。
505         *
506         * @og.rev 6.8.3.1 (2017/12/01) パラメータを渡せるようにします。
507         *
508         * @param   row         行番号
509         * @param   value       入力値
510         * @param   param パラメータ
511         *
512         * @return  データ編集用の文字列
513         * @og.rtnNotNull
514         */
515        public String getRendererValue( final int row,final String value,final String param ) {
516                return cellRenderer.getValue( row,value == null ? "" : value , param );
517        }
518
519        /**
520         * データ出力用の文字列を作成します。
521         * ファイル等に出力する形式を想定しますので、HTMLタグを含まない
522         * データを返します。
523         *
524         * writeKeyLabel == true かつ addKeyLabel == "true" の場合は、":" で分離して、
525         * ラベルのみを返します。
526         * IO側で、カラムを分けて出力するので、VAL:LBL ではなく、LBL だけ出力します。
527         *
528         * 7.0.1.5 (2018/12/10)
529         *
530         * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラー
531         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
532         * @og.rev 7.0.1.5 (2018/12/10) 問合・トラブル (61200-181210-01) writableControl機能を利用した場合のExcel出力について
533         *
534         * @param   value       入力値
535         *
536         * @return  データ出力用の文字列
537         * @og.rtnNotNull
538         */
539        public String getWriteValue( final String value ) {
540                String rtnStr = value ;
541
542                // 7.0.1.5 (2018/12/10)
543                if( writeCtrl && rtnStr != null && rtnStr.length() > 0 && rtnStr.charAt(0) == '_' ) {
544                        rtnStr = rtnStr.substring(1);           // 先頭の '_' を削除
545                }
546
547//              String rtnStr = cellRenderer.getWriteValue( value );
548                rtnStr = cellRenderer.getWriteValue( rtnStr );                  // 7.0.1.5 (2018/12/10)
549
550                // writeKeyLabel == true かつ addKeyLabel == "true" の場合は、":" で分離して、ラベルのみを返します。
551                if( rtnStr != null && isWriteKeyLabel() && "true".equalsIgnoreCase( addKeyLabel ) ) {
552                        final int ad = rtnStr.indexOf( ':' );
553                        if( ad >= 0 ) { rtnStr = rtnStr.substring( ad+1 ); }
554                }
555
556                return rtnStr ;
557        }
558
559        /**
560         * データ入力用の文字列を作成します。
561         * ファイル等から、読み取る場合に、このメソッド経由で、必要な形式変換を行います。
562         *
563         * 現時点では、KEY:VAL形式の Selection オブジェクト経由でデータを取り込む場合、
564         * KEY に分解処理します。
565         *
566         * @og.rev 6.2.2.0 (2015/03/27) SelectionCellEditor I/Fを追加
567         *
568         * @param   value       入力値
569         *
570         * @return  データ入力用の文字列
571         * @og.rtnNotNull
572         */
573        public String getReaderValue( final String value ) {
574                String rtnVal = value;
575                if( cellEditor instanceof SelectionCellEditor ) {
576                        rtnVal = ((SelectionCellEditor)cellEditor).getReaderValue( rtnVal );
577                }
578
579                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
580                return rtnVal == null ? "" : rtnVal;
581        }
582
583        /**
584         * データ編集用のHTML文字列を作成します。
585         *
586         * @og.rev 3.5.5.4 (2004/04/15) value が null の場合は、""(ゼロストリング)にする。
587         *
588         * @param   value       入力値
589         *
590         * @return  データ編集用の文字列
591         * @og.rtnNotNull
592         */
593        public String getEditorValue( final String value ) {
594                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
595                return cellEditor.getValue( value == null ? "" : value );
596        }
597
598        /**
599         * データ編集用のHTML文字列を作成します。
600         * 行番号付の編集データを作成します。名前_行番号 で登録する為、
601         * リクエスト情報を1つ毎のフィールドで処理できます。
602         *
603         * @param   row         行番号
604         * @param   value       入力値
605         *
606         * @return  データ編集用の文字列
607         * @og.rtnNotNull
608         */
609        public String getEditorValue( final int row,final String value ) {
610                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
611                return cellEditor.getValue( row, value == null ? "" : value );
612        }
613
614        /**
615         * データ出力用の固定長文字列を作成します。
616         * HOST送信用桁数がセットされていれば、そちらを優先します。
617         *
618         * @og.rev 3.5.4.5 (2004/01/23) エンコード指定に変更します。
619         * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラーと名称がかぶるので、変更します。
620         *
621         * @param   value       対象の値
622         * @param   encode      固定長で変換する文字エンコード
623         *
624         * @return  データ編集用の文字列
625         */
626        public String getFixedValue( final String value,final String encode ) {
627                return dbType.valueFill( value ,columnData.getSizeX(), columnData.getSizeY(), encode );
628        }
629
630        /**
631         * データの表示用レンデラーを返します。
632         *
633         * @og.rev 3.8.0.2 (2005/07/11) 新規追加
634         *
635         * @return      データの表示用レンデラー
636         */
637        public String getRenderer() {
638                return columnData.getRenderer() ;
639        }
640
641        /**
642         * データの編集用エディターを返します。
643         *
644         * @og.rev 3.8.0.2 (2005/07/11) 新規追加
645         *
646         * @return      データの編集用エディター
647         */
648        public String getEditor() {
649                return columnData.getEditor() ;
650        }
651
652        /**
653         * 文字種別名を返します。
654         * カラムの文字種別名名称を返します。
655         * これは、HTML上の各種タグにデータベース定義に応じたクラスを
656         * セットし、CSS(Cascading Style Sheet)の class="xxxxx" とする事により
657         * 各種スタイルを表現するのに使用します。
658         *
659         * ここでは、カラムリソースの DBTYPE 属性で指定の文字列(X,S9,KXなど)を返します。
660         *
661         * @return  データの文字種別(X,KX,S9 など)
662         */
663        public String getDbType() {
664                return columnData.getDbType() ;
665        }
666
667        /**
668         * データのNATIVEの型の識別コードを返します。
669         *
670         * @og.rev 4.1.1.2 (2008/02/28) Enum型(fukurou.model.NativeType)に変更
671         *
672         * @return  NATIVEの型の識別コード(DBType で規定)
673         * @see org.opengion.fukurou.model.NativeType
674         */
675        public NativeType getNativeType() {
676                return dbType.getNativeType();
677        }
678
679        /**
680         * そのカラムのデフォルト値の値を返します。
681         *
682         * カラムリソースに デフォルト情報が登録されている場合は、その値を返します。
683         * デフォルト値が設定されていない場合は、null を返します。
684         *
685         * @return  デフォルト値(無ければ null)
686         */
687        public String getDefault() {
688                return defValue;
689        }
690
691        /**
692         * 表示用レンデラーのパラメータを取得します。
693         *
694         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
695         *
696         * @return      表示用レンデラーのパラメータ
697         */
698        public String getRendererParam() {
699                return columnData.getRendererParam();
700        }
701
702        /**
703         * 編集用エディターのパラメータを取得します。
704         *
705         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
706         *
707         * @return      編集用エディターのパラメータ
708         */
709        public String getEditorParam() {
710                return columnData.getEditorParam();
711        }
712
713        /**
714         * データタイプのパラメータを取得します。
715         *
716         * @og.rev 3.4.0.0 (2003/09/01) 新規追加
717         *
718         * @return      データタイプのパラメータ
719         */
720        public String getDbTypeParam() {
721                return columnData.getDbTypeParam();
722        }
723
724        /**
725         * カラムロールを取得します。
726         *
727         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
728         *
729         * @return      カラムロール
730         */
731        public String getRoles() {
732                return columnData.getRoles();
733        }
734
735        /**
736         * カラムオブジェクトのロールモードを返します。
737         *
738         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
739         *
740         * @return カラムオブジェクトのロールモード
741         */
742        public RoleMode getRoleMode() {
743                return columnData.getRoleMode();
744        }
745
746        /**
747         * 接続先IDを返します。
748         *
749         * @return  接続先ID
750         */
751        public String getDbid() {
752                return dbid;
753        }
754
755        /**
756         * String引数の文字列を+1した文字列を返します。
757         * これは、英字の場合(A,B,C など)は、B,C,D のように、最終桁の文字コードを
758         * +1 します。
759         * 文字列が数字タイプの場合は、数字に変換して、+1 します。(桁上がりもあり)
760         * 混在タイプの場合は、最後の桁だけを確認して +1します。
761         * 引数が null の場合と、ゼロ文字列("")の場合は、引数をそのまま返します。
762         *
763         * ※ 機能拡張:第2引数に指定の文字列(数字、日付等)を指定する事で、
764         *    引数の文字列に、任意の値を加算できるようにします。
765         *    ただし、すべての DBTypeではなく、ある程度特定します。
766         *    対象外の DBTypeで、第2引数が null 出ない場合は、Exception を Throwsします。
767         *    第2引数が、null の場合は、従来と同じ+1します。
768         *
769         * @og.rev 5.6.0.3 (2012/01/24) ADD に、引数の値を加算する機能を追加します。
770         *
771         * @param   value  引数の文字列
772         * @param   add    加算する文字列(null の場合は、従来と同じ、+1 します。)
773         *
774         * @return  引数の文字列を+1した文字列。または、任意の値を加算した文字列。
775         */
776        public String valueAdd( final String value,final String add ) {
777                // DBType の実装の関係で、旧メソッドは残しておきます。
778                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
779                return add == null || add.isEmpty() ? dbType.valueAdd( value ) : dbType.valueAdd( value , add );
780        }
781
782        /**
783         * データが登録可能かどうかをチェックします。
784         * データがエラーの場合は、そのエラー内容を返します。
785         *
786         * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数に追加
787         * @og.rev 3.6.0.7 (2004/11/06) official属性がfalseの場合、チェックレベルに対応したチェックを行う。
788         * @og.rev 3.8.0.8 (2005/10/03) 企画改善 61200-050921-02 ラベルからHTMLタグを削除する。
789         * @og.rev 5.2.2.0 (2010/11/01) 内部処理を、#valueCheck( value , true ) に委譲。
790         *
791         * @param   value       チェック対象の値
792         *
793         * @return  エラー内容  正常時は null
794         * @see         #valueCheck( String , boolean )
795         */
796        public ErrorMessage valueCheck( final String value ) {
797                return valueCheck( value , true );
798        }
799
800        /**
801         * データが登録可能かどうかをチェックします。
802         * データがエラーの場合は、そのエラー内容を返します。
803         *
804         * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数に追加
805         * @og.rev 3.6.0.7 (2004/11/06) official属性がfalseの場合、チェックレベルに対応したチェックを行う。
806         * @og.rev 3.8.0.8 (2005/10/03) 企画改善 61200-050921-02 ラベルからHTMLタグを削除する。
807         * @og.rev 5.2.2.0 (2010/11/01) 厳密にチェック(isStrict=true)するフラグを追加
808         * @og.rev 6.9.5.0 (2018/04/23) checkLevel 固定化(officialのみで制御します)
809         * @og.rev 7.3.2.0 (2021/03/19) 厳密にチェック(isStrict=true)時は、official=true でないとエラー
810         *
811         * @param   value               チェック対象の値
812         * @param   isStrict    厳密にチェック(isStrict=true)するかどうか
813         *
814         * @return  エラー内容  正常時は null
815         */
816        public ErrorMessage valueCheck( final String value , final boolean isStrict ) {
817                // 3.8.0.8 (2005/10/03) ラベルからHTMLタグを削除する。
818                String lbl = labelData.getLabel() ;
819                if( lbl.indexOf( '<' ) >= 0 ) {
820                        lbl = lbl.replaceAll( "<[^>]*>","" );
821                }
822
823                // 5.2.2.0 (2010/11/01) 厳密にチェック(isStrict=true)するフラグを追加
824                final ErrorMessage errMsg = dbType.valueCheck( lbl,value,columnData.getSizeX(), columnData.getSizeY(),columnData.getDbTypeParam() , isStrict );
825//              if( checkLevel >= 0 ) {
826//              if( !official ) {
827                if( isStrict && !official ) {           // 7.3.2.0 (2021/03/19) 厳密にチェック(isStrict=true)時は、official=true でないとエラー
828                        // ERR0034:指定のカラムオブジェクトには、カラムリソースが存在しません。name={0} label={1}
829//                      errMsg.addMessage( 0,checkLevel,"ERR0034", columnData.getName(),labelData.getLabel() );
830                        errMsg.addMessage( 0,ErrorMessage.WARNING,"ERR0034", columnData.getName(),labelData.getLabel() );       // 6.9.5.0 (2018/04/23) checkLevel 固定化
831                }
832                return errMsg ;
833        }
834
835        /**
836         * エディターで編集されたデータを登録する場合に、データそのものを
837         * 変換して、実登録データを作成します。
838         * 例えば、大文字のみのフィールドなら、大文字化します。
839         * 実登録データの作成は、DBType オブジェクトを利用しますので、
840         * これと DBCellEditor とがアンマッチの場合は、うまくデータ変換
841         * されない可能性がありますので、注意願います。
842         *
843         * @param   value 一般に編集データとして登録されたデータ
844         *
845         * @return  修正後の文字列(一般にデータベースに登録するデータ)
846         */
847        public String valueSet( final String value ) {
848                return dbType.valueSet( value );
849        }
850
851        /**
852         * action で指定されたコマンドを実行して、値の変換を行います。
853         * oldValue(旧データ)は、元のDBTableModelに設定されていた値です。通常は、
854         * この値を使用してカラム毎に変換を行います。newValue(新データ)は、引数で
855         * 指定された新しい値です。この値には、パラメータを指定して変換方法を
856         * 制御することも可能です。
857         * 指定のアクションがカラムで処理できない場合は、エラーになります。
858         *
859         * @param   action アクションコマンド
860         * @param   oldValue 入力データ(旧データ)
861         * @param   newValue 入力データ(新データ)
862         *
863         * @return      実行後のデータ
864         */
865        public String valueAction( final String action,final String oldValue,final String newValue ) {
866                return dbType.valueAction( action,oldValue,newValue );
867        }
868
869        /**
870         * 内部の設定情報オブジェクトを返します。
871         * このオブジェクトを ローカルで書き換えて、DBColumn を作るようにします。
872         *
873         * @og.rev 3.1.0.0 (2003/03/20) DBColumnConfig 関係の見直し。
874         * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
875         * @og.rev 3.5.5.5 (2004/04/23) size 属性の意味を変更、maxlength 属性を追加。
876         * @og.rev 3.5.5.8 (2004/05/20) codeName 属性を追加。
877         * @og.rev 3.6.0.7 (2004/11/06) カラムリソースから作成されたかどうか(official属性追加)
878         * @og.rev 5.1.8.0 (2010/07/01) すべての属性を設定するようにします。
879         * @og.rev 5.5.1.0 (2012/04/03) useSLabel対応
880         * @og.rev 5.6.2.3 (2013/03/22) 非表示文字の設定。noDisplayVal追加
881         * @og.rev 5.7.6.3 (2014/05/23) stringOutput対応
882         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
883         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
884         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
885         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
886         * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加)
887         *
888         * @return      設定情報オブジェクト
889         */
890        public DBColumnConfig getConfig() {
891                // 互換性確保のため、DBColumnConfig の コンストラクタは修正していません。
892
893                final DBColumnConfig config =
894                        new DBColumnConfig(
895                                                lang                                                    ,
896                                                columnData.getName()                    ,
897                                                labelData                                               ,
898                                                columnData.getClassName()               ,
899                                                columnData.getFieldSize()               ,                                               // 6.2.0.0 (2015/02/27)
900                                                columnData.getViewLength()              ,                                               // 6.2.0.0 (2015/02/27)
901                                                columnData.getMaxlength()               ,
902                                                String.valueOf( writable )              ,
903                                                columnData.getRenderer()                ,
904                                                columnData.getEditor()                  ,
905                                                codeData                                                ,
906                                                columnData.getDbType()                  ,
907                                                defValue                                                ,
908                                                columnData.getRendererParam()   ,
909                                                columnData.getEditorParam()             ,
910                                                columnData.getDbTypeParam()             ,
911                                                columnData.getRoles()                   ,                                               // 4.0.0 (2005/11/30)
912                                                official                                                ,                                               // 3.6.0.7 (2004/11/06)
913                                                dbid    ) ;
914
915                // 5.1.8.0 (2010/07/01) すべての属性を設定するようにします。
916                // コンストラクタは修正していないため、セッターメソッド経由で渡します。
917                config.setRendererAttributes( rendAttri );
918                config.setEditorAttributes( editAttri );
919                config.setAddNoValue( addNoValue );
920                config.setAddKeyLabel( addKeyLabel );                                                                   // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか
921                config.setWriteKeyLabel( writeKeyLabel );                                                               // 6.2.3.0 (2015/05/01)
922                config.setEventColumn( eventColumn );
923                config.setEventValue( eventValue );                                                                             // 6.3.3.0 (2015/07/25) eventValue 追加
924                config.setRawEditParameter( rawEditParameter );
925                config.setRawRendParameter( rawRendParameter );
926                config.setEventURL( eventURL );
927                config.setUseSLabel( useSLabel );                                                                               // 5.5.1.0 (2012/04/03)
928                config.setNoDisplayVal( noDisplayVal );                                                                 // 5.6.2.3 (2013/03/22) 非表示文字の設定
929                config.setStringOutput( stringOutput );                                                                 // 5.7.6.3 (2014/05/23)
930                config.setWriteControl( writeCtrl );                                                                    // 7.0.1.5 (2018/12/10)
931                config.setUseDateFeed( useDateFeed );                                                                   // 8.1.2.3 (2022/05/20)
932
933                return config ;
934        }
935
936        /**
937         * 表示用レンデラーの追加属性を返します。
938         *
939         * @og.rev 3.1.0.0 (2003/03/20) DBColumnConfig オブジェクトの内部キープを廃止
940         *
941         * @return   属性リスト
942         * @og.rtnNotNull
943         */
944        public Attributes getRendererAttributes() {
945                return rendAttri ;
946        }
947
948        /**
949         * 編集用エディター用の追加属性を返します。
950         *
951         * @og.rev 3.1.0.0 (2003/03/20) DBColumnConfig オブジェクトの内部キープを廃止
952         *
953         * @return   属性リスト
954         * @og.rtnNotNull
955         */
956        public Attributes getEditorAttributes() {
957                return editAttri ;
958        }
959
960        /**
961         * メニューに空の選択リストを追加するかどうかを取得します。
962         *
963         * @og.rev 3.5.5.7 (2004/05/10) 新規追加
964         *
965         * @return      空の選択リストを追加するかどうか(true:追加する/false:追加しない)
966         */
967        public boolean isAddNoValue() {
968                return addNoValue ;
969        }
970
971        /**
972         * セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を返します。
973         *
974         * これは、上位入れ子のタグの OptionTag で、addKeyLabel を取り出して、
975         * true であれば、キー:ラベル形式 のオプションを、#addOption( String ) で
976         * 登録させます。
977         *
978         * @og.rev 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか。新規追加
979         *
980         * @return      true:キー:ラベル形式/false:ラベルのみ/null:指定通り
981         */
982        public String getAddKeyLabel() {
983                return addKeyLabel;
984        }
985
986        /**
987         * セレクトメニューの場合、キーとラベルを分けて出力するかどうか[true/false]を取得します。
988         *
989         * カラムがプルダウンメニュー形式の場合、ファイル出力時に、キーとラベルを分離して出力する事ができます。
990         * この属性と、addKeyLabel とは、微妙に関連していて、addKeyLabel="true" のみの場合は、
991         * キー:ラベル形式で、出力されますが、writeKeyLabel="true" も指定されている場合は、こちらが優先されます。
992         * なお、この指定が有効なのは、セレクトメニューのカラムのみです。
993         *
994         * @og.rev 6.2.3.0 (2015/05/01) キー/ラベルで分離して出力するかどうか。
995         *
996         * @return      キー/ラベル分離出力するかどうか[true:分離出力/false:通常]
997         */
998        public boolean isWriteKeyLabel() {
999                return writeKeyLabel ;
1000        }
1001
1002        /**
1003         * このカラムオブジェクトがカラムリソースより正式に作られたかどうかを取得します。
1004         * カラムリソースが無い場合は、仮オブジェクトかデータベースメタデータより作成されます。
1005         * その場合は、チェック機能が緩くなるため、正式なカラムオブジェクトと区別する為に
1006         * この属性を持ちます。
1007         *
1008         * @og.rev 3.6.0.7 (2004/11/06) 新規追加
1009         *
1010         * @return      正式に作られたかどうか(true:正式/false:暫定)
1011         */
1012        public boolean isOfficial() {
1013                return official ;
1014        }
1015
1016        /**
1017         * カラムのラベルデータオブジェクトを返します。
1018         *
1019         * @return  カラムのラベルデータオブジェクト
1020         */
1021        public LabelData getLabelData() {
1022                return labelData;
1023        }
1024
1025        /**
1026         * カラムのコードデータオブジェクトを返します。
1027         * コードデータが存在しない場合は、null を返します。
1028         * 受け取り側で、null かどうか判定してから使用してください。
1029         *
1030         * @og.rev 5.2.1.0 (2010/10/01) codeData が null でも、そのまま返します。
1031         *
1032         * @return  カラムのコードデータオブジェクト
1033         */
1034        public CodeData getCodeData() {
1035                return codeData;
1036        }
1037
1038        /**
1039         * フィールドの入力枠サイズを返します。
1040         *
1041         * これは、設定された値そのものを返しますので、未設定の時は、null が返ります。
1042         *
1043         * テキストフィールドのサイズに該当します。
1044         * 何も指定しない場合は、null が返ります。
1045         * その場合の、入力枠サイズは、maxlength が使用されます。
1046         * ただし、桁数が大きい場合は、システム定数の HTML_COLUMNS_MAXSIZE や、
1047         * HTML_VIEW_COLUMNS_MAXSIZE で指定された値が使われます。
1048         * それらの値よりも、ここで取得 した fieldSize が優先されます。
1049         *
1050         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
1051         *
1052         * @return  入力枠サイズ
1053         */
1054        public String getFieldSize() {
1055                return columnData.getFieldSize();
1056        }
1057
1058        /**
1059         * 引数の最大入力サイズより、実際のフィールドのサイズを求めます。
1060         *
1061         * 計算方法
1062         *    ① fieldSize があれば、その値を返します。
1063         *    ② ColumnData#getTotalSize() を求め、あれば、その値を返す。
1064         *    ③ totalSizeが、引数の最大入力サイズより大きい場合は、引数の最大入力サイズを返す。
1065         *
1066         * 各呼び出すメソッドは、引数の最大入力サイズ のみ指定します。それ以外の値は、内部の値を使います。
1067         * 最大入力サイズは、システム定数の、HTML_COLUMNS_MAXSIZE か、HTML_VIEW_COLUMNS_MAXSIZE が
1068         * 一般的です。
1069         *
1070         * @og.rev 4.0.0.0 (2005/01/31) getFieldSize メソッドを XHTMLTag から DBColumn へ移動
1071         * @og.rev 4.0.0.0 (2007/02/05) ADJUSTMENT 処理を廃止します。(CSSにて対応)
1072         * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする)
1073         * @og.rev 6.2.3.0 (2015/05/01) maxlength 変数は、0 の場合は、無制限になります。
1074         *
1075         * @param maxlength       最大入力サイズ
1076         *
1077         * @return 表示すべきサイズ
1078         * @see #getFieldSize()
1079         */
1080        public int getFieldSize( final int maxlength ) {
1081
1082                // ① fieldSize があれば、その値を返します。
1083                final String fixSize = columnData.getFieldSize();
1084                if( fixSize != null && !fixSize.isEmpty() ) {
1085                        return Integer.parseInt( fixSize );
1086                }
1087
1088                // ② ColumnData#getTotalSize() を求め、あれば、その値を返す。
1089                int size = columnData.getTotalSize();
1090
1091                // ③ totalSizeが、引数の最大入力サイズより大きい場合は、引数の最大入力サイズを返す。
1092                if( maxlength > 0 && ( size <= 0 || size > maxlength ) ) {
1093                        size = maxlength;
1094                }
1095
1096                return size;
1097        }
1098
1099        /**
1100         * イベントカラム(親カラム)。
1101         *
1102         * @og.rev 4.3.6.0 (2009/04/01)
1103         *
1104         * @return イベントカラム
1105         */
1106        public String getEventColumn() {
1107                return eventColumn ;
1108        }
1109
1110        /**
1111         * イベントカラムの子カラムの値を出力するためのSQL文を返します。
1112         *
1113         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
1114         *
1115         * @return イベントカラムの値SQL文
1116         */
1117        public String getEventValue() {
1118                return eventValue ;
1119        }
1120
1121        /**
1122         * {&#064;XXXX}を変換していない状態の編集パラメータを返します。
1123         *
1124         * @og.rev 4.3.6.0 (2009/04/01)
1125         *
1126         * @return 生編集パラメータ
1127         */
1128        public String getRawEditParam() {
1129                return rawEditParameter ;
1130        }
1131
1132        /**
1133         * {&#064;XXXX}を変換していない状態の編集パラメータを返します。
1134         *
1135         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
1136         *
1137         * @return 生表示パラメータ
1138         */
1139        public String getRawRendParam() {
1140                return rawRendParameter ;
1141        }
1142
1143        /**
1144         * eventColumn利用時にJSで利用するURL。
1145         *
1146         * @og.rev 4.3.6.0 (2009/04/01)
1147         *
1148         * @return イベントURL
1149         */
1150        public String getEventURL() {
1151                return eventURL ;
1152        }
1153
1154        /**
1155         * 引数のタグ文字列に対して、イベントカラムの実行に必要なspanタグを付加した
1156         * 文字列を返します。
1157         *
1158         * @param tag タグ文字列
1159         * @param initVal 子カラムの初期値
1160         * @param writable タグの要素が書き込み可能かどうか
1161         *
1162         * @return spanタグを付加したタグ文字列
1163         */
1164        public String getEventColumnTag( final String tag, final String initVal, final boolean writable ) {
1165                return getEventColumnTag( tag, initVal, -1, writable );
1166        }
1167
1168        /**
1169         * 引数のタグ文字列に対して、イベントカラムの実行に必要なspanタグを付加した
1170         * 文字列を返します。
1171         *
1172         * @param tag タグ文字列
1173         * @param initVal 子カラムの初期値
1174         * @param row 行番号
1175         * @param writable タグの要素が書き込み可能かどうか
1176         *
1177         * @return spanタグを付加したタグ文字列
1178         * @og.rtnNotNull
1179         */
1180        public String getEventColumnTag( final String tag, final String initVal, final int row, final boolean writable ) {
1181                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
1182                final String name = columnData.getName()
1183                                                        + ( row < 0 ? "" : HybsSystem.JOINT_STRING + row ) ;
1184
1185                return new TagBuffer( "span" )
1186                                        .add( "class"                                                   , HybsSystem.EVENT_COLUMN_CLASS )
1187                                        .add( HybsSystem.EVENT_COLUMN_ID                , name )
1188                                        .add( HybsSystem.EVENT_COLUMN_INITVAL   , initVal )
1189                                        .add( HybsSystem.EVENT_COLUMN_WRITABLE  , String.valueOf( writable ) )
1190                                        .addBody( tag )
1191                                        .makeTag();
1192        }
1193
1194        /**
1195         * セットされている表示パラメータ、編集パラメータに"{&#064;XXXX}"が含まれているか(パラメーターのパースが必要か)を
1196         * 返します。
1197         *
1198         * @og.rev 6.0.0.1 (2014/04/25) 内部処理変更
1199         *
1200         * @return "{&#064;XXXX}"が含まれているか(含まれている場合true)
1201         */
1202        public boolean isNeedsParamParse() {
1203                return  rawRendParameter != null && rawRendParameter.indexOf( "{@" ) >= 0
1204                        ||      rawEditParameter != null && rawEditParameter.indexOf( "{@" ) >= 0;
1205        }
1206
1207        /**
1208         * ラベル短ベースのメニューにするかどうか。
1209         *
1210         * @og.rev 5.5.1.0 (2012/04/03)
1211         *
1212         * @return イベントカラム
1213         */
1214        public String getUseSLabel() {
1215                return useSLabel ;
1216        }
1217
1218        /**
1219         * 非表示文字列を返します。
1220         *
1221         * これは、例えば、数字型の場合は、0 がデフォルトなどの場合、
1222         * あえて表示したくないなどのケースに使います。
1223         * そのような状況が設定されていない場合は、null が返されます。
1224         *
1225         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
1226         *
1227         * @return 非表示文字
1228         */
1229        public String getNoDisplayVal() {
1230                return noDisplayVal ;
1231        }
1232
1233        /**
1234         * レンデラー利用ファイル出力時に数値等も文字タイプに固定するかどうか
1235         *              (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
1236         *
1237         * これは、レンデラーでのExcel出力時のセルタイプに影響します。
1238         * trueの場合は数値も全て文字として出力します。
1239         * falseの場合はDBTYPEに従った出力になりるため、数値型の DBTYPE では、doubleに一度変換されます。
1240         * (初期値:USE_STRING_EXCEL_OUTPUT[={@og.value SystemData#USE_STRING_EXCEL_OUTPUT}])。
1241         *
1242         * @og.rev 5.7.6.3 (2014/05/23) 新規追加
1243         *
1244         * @return レンデラー利用時の出力方法 (true:String出力/false:DBTYPEに従う)
1245         */
1246        public boolean isStringOutput() {
1247                return stringOutput ;
1248        }
1249
1250        /**
1251         * 日付送り戻し機能を有効にするかどうか[true:有効/false:無効]返します。
1252         *
1253         * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加)
1254         *
1255         * @return      日付送り戻し機能有無 [true:有効/false:無効]
1256         */
1257        public boolean isDateFeed() {
1258                return useDateFeed;
1259        }
1260
1261//      /**
1262//       * マルチ・キーセレクトを使用するかどうかを返します。
1263//       * true:使用する。false:使用しない です。
1264//       * ただし、実際に使用するかどうかは、HTML出力時に決めることが出来ます。
1265//       * ここでは、USE_MULTI_KEY_SELECT が true で、USE_SIZE(=20)以上の場合に
1266//       * true を返します。
1267//       *
1268//       * @og.rev 6.0.4.0 (2014/11/28) Selection 側から移動。
1269//       * @og.rev 6.3.9.1 (2015/11/27) 3項演算子を || or &amp;&amp; で簡素化できる(PMD)。
1270//       * @og.rev 6.9.5.0 (2018/04/23) USE_MULTI_KEY_SELECT 廃止(IE8以降ブラウザ標準)
1271//       *
1272//       * @return  選択リストで、マルチ・キーセレクトを使用するかどうか(true:使用する)
1273//       */
1274//      public boolean useMultiSelect() {
1275//              return codeData != null && codeData.useMultiSelect() ;
1276//      }
1277
1278        /**
1279         * オブジェクトの文字列表現を返します。
1280         *
1281         * n=Name,l=Label,c=ClassName,r=Renderer,e=Editor,d=DbType という形式を作成します。
1282         *
1283         * @og.rev 6.2.2.0 (2015/03/27) DBColumnオブジェクトの文字列表現(#toString())を実装します。
1284         *
1285         * @return      文字列表現
1286         * @og.rtnNotNull
1287         */
1288        @Override
1289        public String toString() {
1290                return "n="     + columnData.getName()
1291                        + ",l=" + labelData.getLabel()
1292                        + ",c=" + columnData.getClassName()
1293                        + ",r=" + columnData.getRenderer()
1294                        + ",e=" + columnData.getEditor()
1295                        + ",d=" + columnData.getDbType()
1296                        + ",b=" + writeCtrl + ","
1297                        + this.hashCode()  ;
1298        }
1299}