    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.develop;
    017
    018import java.util.Locale;
    019import java.util.regex.Pattern;
    020import java.util.regex.Matcher;
    021
    022import static org.opengion.fukurou.util.StringUtil.isNull;
    023
    024/**
    025 * GF91.GF92テーブルとJSPの変換オブジェクト
    026 *
    027 *
    028 * @author Takeshi.Takada
    029 *
    030 */
    031public final class JspConvertEntity {
    032        // 5.5.2.6 (2012/05/25) findbugs対応
    033        private static final String[] DBKEY = {"SYSTEM_ID","PGID","NMSYORI","SEQ","CLM","CLM_NAME","KBACCS",
    034                                                                                        "MUST","DEFAULT_VAL","TABLE_NAME","ZOKUSEI","SETU",
    035                                                                                        "NMSYS","NMPG","HPGID","USE_ORDER","AS_CLM","JOINTYPE","AS_TABLE","CLS_NAME"};
    036
    037        // 5.1.1.0 (2009/12/01) データのアクセス用の配列番号のID
    038        private static final int PGID                   = 1;            // COMMENTのみ
    039        private static final int NMSYORI                = 2;
    040 //     private static final int SEQ                    = 3;            // 未使用
    041        private static final int CLM                    = 4;
    042        private static final int CLM_NAME               = 5;            // 5.6.4.4 (2013/05/31) カラム名 追加
    043 //     private static final int KBACCS                 = 6;            // 未使用
    044        private static final int MUST                   = 7;
    045        private static final int DEFAULT_VAL    = 8;
    046        private static final int TABLE_NAME             = 9;
    047        private static final int ZOKUSEI                = 10;
    048 //     private static final int SETU                   = 11;           // 未使用
    049        private static final int NMSYS                  = 12;           // COMMENTのみ
    050        private static final int NMPG                   = 13;           // COMMENTのみ
    051 //     private static final int HPGID                  = 14;           // 未使用
    052        private static final int USE_ORDER              = 15;
    053        private static final int AS_CLM                 = 16;
    054        private static final int JOINTYPE               = 17;
    055        private static final int AS_TABLE               = 18;
    056        private static final int CLS_NAME               = 19;
    057
    058        private final String _type;                             // GF92.NMSYORI
    059        private final String _column_name;              // GF92.CLM
    060        private final String _clm_name_ja;              // 5.6.4.4 (2013/05/31) カラム名 追加(GF92にはなく、リソースから変換した名称)
    061        private final String _table_name;               // GF92.TABLE_NAME GF91.TABLE_NAME
    062        private final String _as_table_name;    // GF91.AS_TABLE
    063        private final String _as_column_name;   // GF92.AS_CLM
    064        private final String _default_value;    // GF92.DEFAULT_VAL
    065        private final String _remarks;                  // GF92.ZOKUSEI
    066        private final String _must;                             // GF92.MUST
    067
    068        private final String _nmsys;                    // GF90.NMSYS
    069        private final String _pgid;                             // GF92.PGID
    070        private final String _nmpg      ;                       // GF90.NMPG
    071
    072        private final String _use_order;                // GF92.USE_ORDER
    073        private final boolean _is_number;               //
    074        private final String _join_type;                // GF92.JOIN_TYPE
    075
    076        private final JspConvertEntity _join_column;
    077
    078        /**
    079         * ファクトリクラス
    080         * QUERY、JOIN、CONST は、ZOKUSEIデータが 存在しないとき、作成しません。
    081         * ここでは、null を返します。
    082         *
    083         * @param       data    (GF92.NMSYORI)
    084         * @param       clmNo   カラム番号配列
    085         *
    086         * @return 新しく作成された JspConvertEntity
    087         */
    088        public static JspConvertEntity newInstance( final String[] data, final int[] clmNo ) {
    089                String nmSyori = data[clmNo[NMSYORI]];
    090                String zokusei = data[clmNo[ZOKUSEI]];
    091
    092                if( isNull( zokusei ) ) {
    093                        if( "QUERY".equals(nmSyori) ||
    094                                "JOIN".equals(nmSyori)  ||
    095                                "CONST".equals(nmSyori) ) { return null; }
    096                }
    097
    098                return new JspConvertEntity( data, clmNo ) ;
    099        }
    100
    101        /**
    102         * コンストラクタ
    103         *
    104         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    105         *
    106         * @param       data    データ配列
    107         * @param       clmNo   カラムの配列番号
    108         */
    109        private JspConvertEntity( final String[] data, final int[] clmNo ) {
    110                _type                   =       data[clmNo[NMSYORI]];           // GF92.NMSYORI
    111                _table_name             =       data[clmNo[TABLE_NAME]];        // GF92.TABLE_NAME GF91.TABLE_NAME
    112                _as_table_name  =       data[clmNo[AS_TABLE]];          // GF91.AS_TABLE
    113                _column_name    =       data[clmNo[CLM]];                       // GF92.CLM
    114                _clm_name_ja    =       data[clmNo[CLM_NAME]];          // 5.6.4.4 (2013/05/31) カラム名
    115                _as_column_name =       data[clmNo[AS_CLM]];            // GF92.AS_CLM
    116                _default_value  =       data[clmNo[DEFAULT_VAL]];       // GF92.DEFAULT_VAL
    117                _remarks                =       data[clmNo[ZOKUSEI]];           // GF92.ZOKUSEI
    118                _must                   =       data[clmNo[MUST]];                      // GF92.MUST
    119                _use_order              =       data[clmNo[USE_ORDER]];         // GF92.USE_ORDER
    120                _is_number              =       "NUMBER".equals( data[clmNo[CLS_NAME]]);                //
    121                _join_type              =       data[clmNo[JOINTYPE]];          // GF92.JOIN_TYPE
    122
    123                _nmsys                  =       data[clmNo[NMSYS]];                     // GF90.NMSYS
    124                _pgid                   =       data[clmNo[PGID]];                      // GF92.PGID
    125                _nmpg                   =       data[clmNo[NMPG]];                      // GF90.NMPG
    126
    127                if( "JOIN".equals(_type) ) {
    128                        _join_column = createLeftTable( _remarks );
    129                }
    130                else {
    131                        _join_column = null;
    132                }
    133        }
    134
    135        /**
    136         * コンストラクタ(通常利用していない)
    137         * createLeftTable( String zokusei ) から呼び出す、内部だけで利用しているコンストラクタ
    138         *
    139         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    140         *
    141         * @param       type                    処理名(GF92.NMSYORI)
    142         * @param       table_name              テーブル名(GF92.TABLE_NAME,GF91.TABLE_NAME)
    143         * @param       as_table_name   テーブル別名(GF91.AS_TABLE)
    144         * @param       column_name             カラム名(GF92.CLM)
    145         */
    146        private JspConvertEntity( final String type, final String table_name, final String as_table_name, final String column_name ) {
    147                _type                   =       type;                           // GF92.NMSYORI
    148                _table_name             =       table_name;                     // GF92.TABLE_NAME GF91.TABLE_NAME
    149                _as_table_name  =       as_table_name;          // GF91.AS_TABLE
    150                _column_name    =       column_name;            // GF92.CLM
    151                _clm_name_ja    =       null;                           // 5.6.4.4 (2013/05/31) カラム名
    152                _as_column_name =       null;                           // GF92.AS_CLM
    153                _default_value  =       null;                           // GF92.DEFAULT_VAL
    154                _remarks                =       null;                           // GF92.ZOKUSEI
    155                _must                   =       null;                           // GF92.MUST
    156                _use_order              =       null;                           // GF92.USE_ORDER
    157                _is_number              =       false;                          //
    158                _join_type              =       null;                           // GF92.JOIN_TYPE
    159                _join_column    =       null;
    160                _nmsys                  =       null;                           // GF90.NMSYS
    161                _pgid                   =       null;                           // GF92.PGID
    162                _nmpg                   =       null;                           // GF90.NMPG
    163        }
    164
    165        /**
    166         * データのアクセス用のカラム名配列を返します。
    167         * これを利用して、カラム名の番号を取得し、JspConvertEntity#newInstance( String[],int[] ) の
    168         * ２番目の引数に指定します。
    169         *
    170         * @og.rev 5.5.2.6 (2012/05/25) findbugs対応。JspConvertEntity.DBKEY を、JspConvertEntity.getDBKEY() に変更。
    171         *
    172         * @return      DBKEY配列のクローン
    173         */
    174        public static String[] getDBKEY() {
    175                return DBKEY.clone();
    176        }
    177
    178        /**
    179         * データのタイプを取得。(GF92.NMSYORI)
    180         *
    181         * @return      データのタイプ
    182         */
    183        public String getType(){
    184                return _type;
    185        }
    186
    187        /**
    188         * テーブル名を取得。(GF92.TABLE_NAME GF91.TABLE_NAME)
    189         *
    190         * @return      テーブル名
    191         */
    192        public String getTableName(){
    193                return _table_name;
    194        }
    195
    196        /**
    197         * カラム名を取得。(GF92.CLM)
    198         *
    199         * @return      カラム名
    200         */
    201        public String getColumnName(){
    202                return _column_name;
    203        }
    204
    205        /**
    206         * カラム名称を取得。
    207         *
    208         * カラム名称は、GF92.CLM をキーにリソースを検索した結果の日本語になります。SELECT文のコメントに使います。
    209         *
    210         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    211         *
    212         * @return      カラム名称
    213         */
    214        public String getColumnCommentName(){
    215                return _clm_name_ja;
    216        }
    217
    218        /**
    219         * テーブル名が先頭に付いたカラム名を取得。
    220         *
    221         * @return      カラム名(テーブル名付き)
    222         */
    223        public String getFullColumnName(){
    224                String preffix = "";
    225
    226                if ( isNull( _as_table_name ) ) {
    227                        preffix = _table_name;
    228                }
    229                else {
    230                        preffix = _as_table_name;
    231                }
    232                //集計関数が利用されている場合は、関数別に特別な処理を実装する必要がある。
    233                //現在は、テーブル名やテーブル別名を付加せずにスルーする様に実装してあります。
    234                Matcher matcher = null;
    235                for (JspEnumeration.TREATS_STRING_FUNCTIONS func : JspEnumeration.TREATS_STRING_FUNCTIONS.values()){
    236                        String k = func.toString();
    237                        matcher = Pattern.compile("(((\\s*?)|\\()" + k + "(\\s+?))|(((\\s*?)|\\()"  + k.toLowerCase( Locale.JAPAN ) + "(\\s+?))").matcher( _column_name );
    238                        if (matcher.find()){
    239                                return func.update( _column_name ,  new String[]{ } );
    240                        }
    241                }
    242                return preffix + "." + _column_name;
    243        }
    244
    245        /**
    246         * 結合先のカラム情報を取得。
    247         *
    248         * @return      結合先のカラム
    249         */
    250        public JspConvertEntity getJoinColumn(){
    251                return _join_column;
    252        }
    253
    254        /**
    255         * テーブルに付ける別名を取得(GF91.AS_TABLE)
    256         *
    257         * @return      テーブルに付ける別名
    258         */
    259        public String getAsTableName(){
    260                return _as_table_name;
    261        }
    262
    263        /**
    264         * カラムに付ける別名を取得(GF92.AS_CLM)
    265         *
    266         * @return      カラムに付ける別名
    267         */
    268        public String getAsColumnName(){
    269                return _as_column_name;
    270        }
    271
    272        /**
    273         * Select句ですぐに利用可能なカラム名を取得。
    274         *
    275         * @return      カラム名
    276         */
    277        public String getSelectPartColumnName(){
    278                if( isNull( _remarks ) || "DISP".equalsIgnoreCase( _remarks ) ) {
    279                        if( isNull( _as_column_name ) ) {
    280                                return getFullColumnName();
    281                        }
    282                        else {
    283                                return getFullColumnName() + " as " + _as_column_name;
    284                        }
    285                }
    286                else {
    287                        if( isNull( _as_column_name ) ) {
    288                                return _remarks + "(" + getFullColumnName() + ")";
    289                        }
    290                        else {
    291                                return _remarks + "(" + getFullColumnName() + ") as " + _as_column_name;
    292                        }
    293                }
    294        }
    295
    296        /**
    297         * From句ですぐに利用可能なカラム名を取得。
    298         *
    299         * @return      別名のついたテーブル名
    300         */
    301        public String getFromPartTableName(){
    302                if( isNull( _as_table_name ) ) {
    303                        return _table_name;
    304                }else{
    305                        return _table_name + " " + _as_table_name;
    306                }
    307        }
    308
    309        /**
    310         * 初期値を取得。(GF92.DEFAULT_VAL)
    311         *
    312         * @return      初期値
    313         */
    314        public String getDefaultValue(){
    315                return _default_value;
    316        }
    317
    318        /**
    319         * 属性内容を取得。(GF92.ZOKUSEI)
    320         *
    321         * @return      属性内容
    322         */
    323        public String getRemarks(){
    324                return _remarks;
    325        }
    326
    327        /**
    328         * 必須を取得。(GF92.MUST)
    329         *
    330         * @return      必須
    331         */
    332        public String getMust(){
    333                return _must;
    334        }
    335
    336        /**
    337         * 並び替え設定か否かを判定(GF92.USE_ORDER)
    338         *
    339         * @return      判定結果
    340         */
    341        public String getUseOrder(){
    342                return _use_order;
    343        }
    344
    345        /**
    346         * 数値項目か否かを判定
    347         *
    348         * @return      判定結果
    349         */
    350        public boolean isNumber(){
    351                return _is_number;
    352        }
    353
    354        /**
    355         * システムの名称を取得します。(GF90.NMSYS)
    356         *
    357         * @return      名称
    358         */
    359        public String getNmSys(){
    360                return _nmsys;
    361        }
    362
    363        /**
    364         * プログラムIDを取得します。(GF92.PGID)
    365         *
    366         * @return      プログラムID
    367         */
    368        public String getPgid(){
    369                return _pgid;
    370        }
    371
    372        /**
    373         * プログラムの名称を取得します。(GF90.NMPG)
    374         *
    375         * @return      名称
    376         */
    377        public String getNmpg(){
    378                return _nmpg;
    379        }
    380
    381        /**
    382         * 外部結合かを判定(GF92.JOIN_TYPE)
    383         *
    384         * @return      判定結果
    385         */
    386        public String getJoinType(){
    387                return _join_type;
    388        }
    389
    390        /**
    391         * 外部結合かを判定(GF92.JOIN_TYPE)
    392         *
    393         * @param       zokusei 属性情報
    394         *
    395         * @return      外部結合のJspConvertEntityオブジェクト
    396         */
    397        private JspConvertEntity createLeftTable( final String zokusei ){
    398                JspConvertEntity rgt = null;
    399
    400                String[] rgt_data = zokusei.split( "__" );
    401                if( rgt_data.length == 3 ){
    402                        String rgt_tbl          = rgt_data[1];
    403                        String rgt_as_tbl       = rgt_data[2].substring( 0 , rgt_data[2].indexOf('.') );
    404                        String rgt_clm          = rgt_data[2].substring( rgt_data[2].indexOf('.') + 1 );
    405
    406                        rgt = new JspConvertEntity( "JOIN",rgt_tbl,rgt_as_tbl,rgt_clm );
    407                }
    408
    409                return rgt;
    410        }
    411}