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         * 2番目の引数に指定します。
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}