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}