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