    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                final String nmSyori = data[clmNo[NMSYORI]];
    090                final String zokusei = data[clmNo[ZOKUSEI]];
    091
    092                // 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
    093                return isNull( zokusei ) && ( "QUERY".equals(nmSyori) || "JOIN".equals(nmSyori) || "CONST".equals(nmSyori) )
    094                                        ? null : new JspConvertEntity( data, clmNo ) ;
    095
    096        }
    097
    098        /**
    099         * コンストラクタ
    100         *
    101         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    102         *
    103         * @param       data    データ配列
    104         * @param       clmNo   カラムの配列番号
    105         */
    106        private JspConvertEntity( final String[] data, final int[] clmNo ) {
    107                _type                   =       data[clmNo[NMSYORI]];           // GF92.NMSYORI
    108                _table_name             =       data[clmNo[TABLE_NAME]];        // GF92.TABLE_NAME GF91.TABLE_NAME
    109                _as_table_name  =       data[clmNo[AS_TABLE]];          // GF91.AS_TABLE
    110                _column_name    =       data[clmNo[CLM]];                       // GF92.CLM
    111                _clm_name_ja    =       data[clmNo[CLM_NAME]];          // 5.6.4.4 (2013/05/31) カラム名
    112                _as_column_name =       data[clmNo[AS_CLM]];            // GF92.AS_CLM
    113                _default_value  =       data[clmNo[DEFAULT_VAL]];       // GF92.DEFAULT_VAL
    114                _remarks                =       data[clmNo[ZOKUSEI]];           // GF92.ZOKUSEI
    115                _must                   =       data[clmNo[MUST]];                      // GF92.MUST
    116                _use_order              =       data[clmNo[USE_ORDER]];         // GF92.USE_ORDER
    117                _is_number              =       "NUMBER".equals( data[clmNo[CLS_NAME]]);                //
    118                _join_type              =       data[clmNo[JOINTYPE]];          // GF92.JOIN_TYPE
    119
    120                _nmsys                  =       data[clmNo[NMSYS]];                     // GF90.NMSYS
    121                _pgid                   =       data[clmNo[PGID]];                      // GF92.PGID
    122                _nmpg                   =       data[clmNo[NMPG]];                      // GF90.NMPG
    123
    124                if( "JOIN".equals(_type) ) {
    125                        _join_column = createLeftTable( _remarks );
    126                }
    127                else {
    128                        _join_column = null;
    129                }
    130        }
    131
    132        /**
    133         * コンストラクタ(通常利用していない)
    134         * createLeftTable( String zokusei ) から呼び出す、内部だけで利用しているコンストラクタ
    135         *
    136         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    137         *
    138         * @param       type                    処理名(GF92.NMSYORI)
    139         * @param       table_name              テーブル名(GF92.TABLE_NAME,GF91.TABLE_NAME)
    140         * @param       as_table_name   テーブル別名(GF91.AS_TABLE)
    141         * @param       column_name             カラム名(GF92.CLM)
    142         */
    143        private JspConvertEntity( final String type, final String table_name, final String as_table_name, final String column_name ) {
    144                _type                   =       type;                           // GF92.NMSYORI
    145                _table_name             =       table_name;                     // GF92.TABLE_NAME GF91.TABLE_NAME
    146                _as_table_name  =       as_table_name;          // GF91.AS_TABLE
    147                _column_name    =       column_name;            // GF92.CLM
    148                _clm_name_ja    =       null;                           // 5.6.4.4 (2013/05/31) カラム名
    149                _as_column_name =       null;                           // GF92.AS_CLM
    150                _default_value  =       null;                           // GF92.DEFAULT_VAL
    151                _remarks                =       null;                           // GF92.ZOKUSEI
    152                _must                   =       null;                           // GF92.MUST
    153                _use_order              =       null;                           // GF92.USE_ORDER
    154                _is_number              =       false;                          //
    155                _join_type              =       null;                           // GF92.JOIN_TYPE
    156                _join_column    =       null;
    157                _nmsys                  =       null;                           // GF90.NMSYS
    158                _pgid                   =       null;                           // GF92.PGID
    159                _nmpg                   =       null;                           // GF90.NMPG
    160        }
    161
    162        /**
    163         * データのアクセス用のカラム名配列を返します。
    164         * これを利用して、カラム名の番号を取得し、JspConvertEntity#newInstance( String[],int[] ) の
    165         * ２番目の引数に指定します。
    166         *
    167         * @og.rev 5.5.2.6 (2012/05/25) findbugs対応。JspConvertEntity.DBKEY を、JspConvertEntity.getDBKEY() に変更。
    168         *
    169         * @return      DBKEY配列のクローン
    170         * @og.rtnNotNull
    171         */
    172        public static String[] getDBKEY() {
    173                return DBKEY.clone();
    174        }
    175
    176        /**
    177         * データのタイプを取得。(GF92.NMSYORI)
    178         *
    179         * @return      データのタイプ
    180         */
    181        public String getType(){
    182                return _type;
    183        }
    184
    185        /**
    186         * テーブル名を取得。(GF92.TABLE_NAME GF91.TABLE_NAME)
    187         *
    188         * @return      テーブル名
    189         */
    190        public String getTableName(){
    191                return _table_name;
    192        }
    193
    194        /**
    195         * カラム名を取得。(GF92.CLM)
    196         *
    197         * @return      カラム名
    198         */
    199        public String getColumnName(){
    200                return _column_name;
    201        }
    202
    203        /**
    204         * カラム名称を取得。
    205         *
    206         * カラム名称は、GF92.CLM をキーにリソースを検索した結果の日本語になります。SELECT文のコメントに使います。
    207         *
    208         * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加
    209         *
    210         * @return      カラム名称
    211         */
    212        public String getColumnCommentName(){
    213                return _clm_name_ja;
    214        }
    215
    216        /**
    217         * テーブル名が先頭に付いたカラム名を取得。
    218         *
    219         * @return      カラム名(テーブル名付き)
    220         * @og.rtnNotNull
    221         */
    222        public String getFullColumnName(){
    223                String preffix = "";
    224
    225                if( isNull( _as_table_name ) ) {
    226                        preffix = _table_name;
    227                }
    228                else {
    229                        preffix = _as_table_name;
    230                }
    231                //集計関数が利用されている場合は、関数別に特別な処理を実装する必要がある。
    232                //現在は、テーブル名やテーブル別名を付加せずにスルーする様に実装してあります。
    233                Matcher matcher = null;
    234                for( final JspEnumeration.TREATS_STRING_FUNCTIONS func : JspEnumeration.TREATS_STRING_FUNCTIONS.values()){
    235                        final String k = func.toString();
    236                        matcher = Pattern.compile("(((\\s*?)|\\()" + k + "(\\s+?))|(((\\s*?)|\\()"  + k.toLowerCase( Locale.JAPAN ) + "(\\s+?))").matcher( _column_name );
    237                        if( matcher.find() ) {
    238                                return func.update( _column_name ,  new String[]{ } );
    239                        }
    240                }
    241                return preffix + "." + _column_name;
    242        }
    243
    244        /**
    245         * 結合先のカラム情報を取得。
    246         *
    247         * @return      結合先のカラム
    248         */
    249        public JspConvertEntity getJoinColumn(){
    250                return _join_column;
    251        }
    252
    253        /**
    254         * テーブルに付ける別名を取得(GF91.AS_TABLE)。
    255         *
    256         * @return      テーブルに付ける別名
    257         */
    258        public String getAsTableName(){
    259                return _as_table_name;
    260        }
    261
    262        /**
    263         * カラムに付ける別名を取得(GF92.AS_CLM)。
    264         *
    265         * @return      カラムに付ける別名
    266         */
    267        public String getAsColumnName(){
    268                return _as_column_name;
    269        }
    270
    271        /**
    272         * Select句ですぐに利用可能なカラム名を取得。
    273         *
    274         * @return      カラム名
    275         * @og.rtnNotNull
    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                // 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
    303                return isNull( _as_table_name ) ? _table_name : _table_name + " " + _as_table_name;
    304
    305        }
    306
    307        /**
    308         * 初期値を取得。(GF92.DEFAULT_VAL)
    309         *
    310         * @return      初期値
    311         */
    312        public String getDefaultValue(){
    313                return _default_value;
    314        }
    315
    316        /**
    317         * 属性内容を取得。(GF92.ZOKUSEI)
    318         *
    319         * @return      属性内容
    320         */
    321        public String getRemarks(){
    322                return _remarks;
    323        }
    324
    325        /**
    326         * 必須を取得。(GF92.MUST)
    327         *
    328         * @return      必須
    329         */
    330        public String getMust(){
    331                return _must;
    332        }
    333
    334        /**
    335         * 並び替え設定か否かを判定(GF92.USE_ORDER)。
    336         *
    337         * @return      判定結果
    338         */
    339        public String getUseOrder(){
    340                return _use_order;
    341        }
    342
    343        /**
    344         * 数値項目か否かを判定。
    345         *
    346         * @return      判定結果
    347         */
    348        public boolean isNumber(){
    349                return _is_number;
    350        }
    351
    352        /**
    353         * システムの名称を取得します(GF90.NMSYS)。
    354         *
    355         * @return      名称
    356         */
    357        public String getNmSys(){
    358                return _nmsys;
    359        }
    360
    361        /**
    362         * プログラムIDを取得します。(GF92.PGID)
    363         *
    364         * @return      プログラムID
    365         */
    366        public String getPgid(){
    367                return _pgid;
    368        }
    369
    370        /**
    371         * プログラムの名称を取得します(GF90.NMPG)。
    372         *
    373         * @return      名称
    374         */
    375        public String getNmpg(){
    376                return _nmpg;
    377        }
    378
    379        /**
    380         * 外部結合かを判定(GF92.JOIN_TYPE)。
    381         *
    382         * @return      判定結果
    383         */
    384        public String getJoinType(){
    385                return _join_type;
    386        }
    387
    388        /**
    389         * 外部結合かを判定(GF92.JOIN_TYPE)。
    390         *
    391         * @param       zokusei 属性情報
    392         *
    393         * @return      外部結合のJspConvertEntityオブジェクト
    394         */
    395        private JspConvertEntity createLeftTable( final String zokusei ){
    396                JspConvertEntity rgt = null;
    397
    398                final String[] rgt_data = zokusei.split( "__" );
    399                if( rgt_data.length == 3 ){
    400                        final String rgt_tbl            = rgt_data[1];
    401                        final String rgt_as_tbl = rgt_data[2].substring( 0 , rgt_data[2].indexOf('.') );
    402                        final String rgt_clm            = rgt_data[2].substring( rgt_data[2].indexOf('.') + 1 );
    403
    404                        rgt = new JspConvertEntity( "JOIN",rgt_tbl,rgt_as_tbl,rgt_clm );
    405                }
    406
    407                return rgt;
    408        }
    409}