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