    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:一般(_)   ＤＢ関連図では省略可能です
    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   : {&#064;COM_CLMS}  ; 共通カラムとして指定するCSV形式のカラム名
    055 *  }
    056 *
    057 * @og.formSample
    058 * ●形式：
    059 *      ① &lt;og:tableFilter classId="KBCLM" keys="COM_CLMS" vals="{&#064;COM_CLMS}" /&gt;
    060 *
    061 *      ② &lt;og:tableFilter classId="KBCLM" &gt;
    062 *               {
    063 *                   COM_CLMS   : {&#064;COM_CLMS}   ;
    064 *               }
    065 *         &lt;/og:tableFilter&gt;
    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:一般(_)   ＤＢ関連図では省略可能です              既存が 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}