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