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.plugin.table;
017
018import org.opengion.hayabusa.db.AbstractTableFilter;
019import org.opengion.hayabusa.db.DBTableModel;
020
021import org.opengion.fukurou.util.ErrorMessage;
022import org.opengion.fukurou.util.StringUtil;
023
024/**
025 * TableFilter_KBCLM は、TableFilter インターフェースを継承した、DBTableModel 処理用の
026 * 実装クラスです。
027 *
028 * ここでは、キーは、GF80(DB定義書マスタ)のカラムを元に、カラム区分(KBCLM)を設定します。
029 * SELECTするテーブルもカラムも固定です。設定するカラムは、KBCLM 固定です。
030 * 最低限必要なのは、CLM,UK,LUK,IXA,IXB,IXC,IXD,IXE,IXF,IXG,IXH,IXI,IXJ,IXK,NOT_NULL と KBCLM です。
031 * 唯一の引数は、共通カラムとして指定するCSV形式のカラム名です。keys="COM_CLMS" に、設定します。
032 *
033 * 具体的には、KBCLM に設定する値は、下記のとおりです。
034 *
035 * KBCLM
036 * 0:初期(未)  区分未設定の初期状態です
037 * 1:UK  (◎)  物理ユニークカラムです
038 * 2:LUK (〇)  論理ユニークカラムです
039 * 3:IDX (+)   インデックスカラムです
040 * 4:NN  (*)   Not Nullカラムです
041 * 5:一般(_)   DB関連図では省略可能です
042 * 6:除外(-)   リソース反映除外カラムです
043 * 7:共通(C)   全テーブル共通属性です
044 * 8:有閑(Y)   存在しますが未使用カラムです
045 * 9:削除(X)   実態は削除済みです
046 * 
047 * 設定する値の優先順位は、7:共通,1:UK,2:LUK,3:IDX,4:NN になります。
048 *
049 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。
050 * 【パラメータ】
051 *  {
052 *       COM_CLMS   : {@COM_CLMS}  ; 共通カラムとして指定するCSV形式のカラム名
053 *  }
054 *
055 * @og.formSample
056 * ●形式:
057 *      ① <og:tableFilter classId="KBCLM" keys="COM_CLMS" vals="{@COM_CLMS}" />
058 *
059 *      ② <og:tableFilter classId="KBCLM" >
060 *               {
061 *                   COM_CLMS   : {@COM_CLMS}   ;
062 *               }
063 *         </og:tableFilter>
064 *
065 * @og.rev 5.7.6.2 (2014/05/16) 新規追加
066 *
067 * @version  6.0  2014/05/02
068 * @author   Kazuhiko Hasegawa
069 * @since    JDK1.7,
070 */
071public class TableFilter_KBCLM extends AbstractTableFilter {
072        /** このプログラムのVERSION文字列を設定します。   {@value} */
073        private static final String VERSION = "6.5.0.1 (2016/10/21)" ;
074
075        /**
076         * デフォルトコンストラクター
077         *
078         * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。
079         */
080        public TableFilter_KBCLM() {
081                super();
082                initSet( "COM_CLMS"             , "共通カラムとして指定するCSV形式のカラム名"      );
083        }
084
085        /**
086         * DBTableModel処理を実行します。
087         *
088         * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
089         *
090         * @return 処理結果のDBTableModel
091         */
092        public DBTableModel execute() {
093                final DBTableModel table = getDBTableModel();           // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加
094
095                final String comClms = StringUtil.nval( getValue( "COM_CLMS" ) ,null );
096
097                final int clmNo  = table.getColumnNo( "CLM",false );            // 存在しない場合は、-1 を返す。
098                final int ukNo   = table.getColumnNo( "UK" ,false );
099                final int lukNo  = table.getColumnNo( "LUK",false );
100                final int ixaNo  = table.getColumnNo( "IXA",false );
101                final int ixbNo  = table.getColumnNo( "IXB",false );
102                final int ixcNo  = table.getColumnNo( "IXC",false );
103                final int ixdNo  = table.getColumnNo( "IXD",false );
104                final int ixeNo  = table.getColumnNo( "IXE",false );
105                final int ixfNo  = table.getColumnNo( "IXF",false );
106                final int ixgNo  = table.getColumnNo( "IXG",false );
107                final int ixhNo  = table.getColumnNo( "IXH",false );
108                final int ixiNo  = table.getColumnNo( "IXI",false );
109                final int ixjNo  = table.getColumnNo( "IXJ",false );
110                final int ixkNo  = table.getColumnNo( "IXK",false );
111                final int nnNo   = table.getColumnNo( "NOT_NULL",false );
112
113                final int kbclmNo = table.getColumnNo( "KBCLM",false ); // 計算結果の値を書き出すカラム
114
115                if( kbclmNo >= 0 ) {
116                        String[] data  = null;
117                        final int rowCnt = table.getRowCount();
118                        // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
119                        // KBCLMに変更がなければ、レコードを削除します。よって、逆順にチェックします。
120                        for( int row=rowCnt-1; row>=0; row-- ) {
121                                try {
122                                        data   = table.getValues( row );
123                                        // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
124                                        final boolean isUK   = ukNo  >= 0 && data[ukNo]  != null && data[ukNo].trim().length()  > 0 ;
125                                        final boolean isLUK  = lukNo >= 0 && data[lukNo] != null && data[lukNo].trim().length() > 0 ;
126                                        final boolean isNN   = nnNo  >= 0 && data[nnNo]  != null && data[nnNo].trim().length()  > 0 ;
127                                        final boolean isCOM  = clmNo >= 0 && data[clmNo] != null && comClms != null
128                                                                && comClms.indexOf( "'" + data[clmNo].trim() + "'" ) >= 0 ;
129                                        final boolean isIDX  = ixaNo >= 0 && data[ixaNo] != null && data[ixaNo].trim().length() > 0
130                                                                                || ixbNo >= 0 && data[ixbNo] != null && data[ixbNo].trim().length() > 0
131                                                                                || ixcNo >= 0 && data[ixcNo] != null && data[ixcNo].trim().length() > 0
132                                                                                || ixdNo >= 0 && data[ixdNo] != null && data[ixdNo].trim().length() > 0
133                                                                                || ixeNo >= 0 && data[ixeNo] != null && data[ixeNo].trim().length() > 0
134                                                                                || ixfNo >= 0 && data[ixfNo] != null && data[ixfNo].trim().length() > 0
135                                                                                || ixgNo >= 0 && data[ixgNo] != null && data[ixgNo].trim().length() > 0
136                                                                                || ixhNo >= 0 && data[ixhNo] != null && data[ixhNo].trim().length() > 0
137                                                                                || ixiNo >= 0 && data[ixiNo] != null && data[ixiNo].trim().length() > 0
138                                                                                || ixjNo >= 0 && data[ixjNo] != null && data[ixjNo].trim().length() > 0
139                                                                                || ixkNo >= 0 && data[ixkNo] != null && data[ixkNo].trim().length() > 0 ;
140
141                                        // KBCLM の値をチェックします。
142                                        final String kbclm =makeKBCLM( isUK , isLUK , isIDX , isNN , isCOM , data[kbclmNo] ) ;
143                                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
144                                        if( kbclm == null ) {
145                                                table.removeValue( row );               // kbclm に変更がなければ、null なので、レコード削除
146                                        }
147                                        else {
148                                                data[kbclmNo] = kbclm ;                 // 値の書き戻し
149                                        }
150                                }
151                                catch( final RuntimeException ex ) {
152                                        // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
153                                        makeErrorMessage( "TableFilter_KBCLM Error",ErrorMessage.NG )
154                                                .addMessage( row+1,ErrorMessage.NG,"KBCLM"
155                                                        , "comClms=[" + comClms + "]"
156                                                        , StringUtil.array2csv( data )
157                                                )
158                                                .addMessage( ex );
159                                }
160                        }
161                }
162                return table;
163        }
164
165        /**
166         * UK,LUK,インデックス,NotNull,共通カラム から、カラム区分(KBCLM) を作成します。
167         * KBCLM に変更がなければ、null を返します。
168         *
169         * 0:初期(未)  区分未設定の初期状態です                        (ここでは設定されません。)
170         * 1:UK  (◎)  物理ユニークカラムです                       isUK=true の場合の第2優先
171         * 2:LUK (〇)  論理ユニークカラムです                       isLUK=true の場合の第3優先
172         * 3:IDX (+)   インデックスカラムです                      isIDX=true の場合の第4優先
173         * 4:NN  (*)   Not Nullカラムです                            isNN=true の場合の第5優先
174         * 5:一般(_)   DB関連図では省略可能です              既存が 0,1,2,3,4,7 で該当しない場合、5:一般 に設定します。
175         * 6:除外(-)   リソース反映除外カラムです              (ここでは設定されません。)
176         * 7:共通(C)   全テーブル共通属性です                        isCOM=true の場合の第1優先
177         * 8:有閑(Y)   存在しますが未使用カラムです             (ここでは設定されません。)
178         * 9:削除(X)   実態は削除済みです                          (ここでは設定されません。)
179         *
180         * @og.rev 5.7.6.2 (2014/05/16) 新規追加
181         *
182         * @param  isUK 物理ユニークキーかどうか(true/false)
183         * @param  isLUK 論理ユニークキーかどうか(true/false)
184         * @param  isIDX インデックスカラムかどうか(true/false)
185         * @param  isNN  NOT NULL制約が設定されているかどうか(true/false)
186         * @param  isCOM 共通カラム名と一致しているかどうか(true/false)
187         * @param  kbclm 現在のカラム区分(KBCLM)の値
188         * @return 対応する カラム区分(KBCLM)の値(変更がなければ、nullを返す)
189         */
190        private String makeKBCLM( final boolean isUK , final boolean isLUK , final boolean isIDX
191                                                         , final boolean isNN , final boolean isCOM , final String kbclm ) {
192
193                // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
194                final String rtn;
195
196                if(     isCOM )         { rtn = "7"; }
197                else if( isUK )         { rtn = "1"; }
198                else if( isLUK )        { rtn = "2"; }
199                else if( isIDX )        { rtn = "3"; }
200                else if( isNN  )        { rtn = "4"; }
201                else if( "0,1,2,3,4,7".contains( kbclm ) ) { rtn = "5"; }       // 5:一般 に設定
202                else                            { rtn = null; }
203
204                return rtn != null && rtn.equals( kbclm ) ? null : rtn ;        // 同じ値の場合は、null に戻す。
205        }
206}