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}