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.hayabusa.resource.ResourceFactory; 022import org.opengion.hayabusa.resource.ResourceManager; 023 024import org.opengion.fukurou.util.ErrorMessage; 025import org.opengion.fukurou.util.StringUtil; 026 027/** 028 * TableFilter_LABEL は、TableFilter インターフェースを継承した、DBTableModel 処理用の 029 * 実装クラスです。 030 * 031 * ここでは、キーのCLM,LBL と、LANG より、ラベルリソースに変換した値を設定します。 032 * ラベルの設定は、設定先の値が NULL/空文字か、カラム名と同じ(無変換セット)の場合のみセットされます。 033 * 034 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。 035 * 【パラメータ】 036 * { 037 * SYSTEM_ID : ラベルリソースの作成システムIDを指定します。無指定時は、ログイン時のリソースになります。 038 * LANG : ラベルリソースの言語を指定します。無指定時は、日本語になります。 039 * CLM : ラベルリソースのキーとなる値が設定されているカラム名を指定します。 040 * LBL : CLMで指定されたカラム名から値を取り出し、ラベルリソースに変換した結果をセットします。 041 * LLBL : 同上(ラベル長) 7.2.9.0 (2020/10/12) 042 * SLBL : 同上(ラベル短) 7.2.9.0 (2020/10/12) 043 * DISC : 同上(概要) 7.2.9.0 (2020/10/12) 044 * LRAW : 同上(長生ラベル) 7.2.9.0 (2020/10/12) 045 * SRAW : 同上(短生ラベル) 7.2.9.0 (2020/10/12) 046 * MSG : 同上(引数付きラベル) 7.2.9.1 (2020/10/23) 047 * } 048 * 049 * 5.7.8.0 (2014/07/04) 解除 050 * CLM と LBL に同じカラムを指定すると、このフィルターを通過するたびに、変換後のラベルが 051 * 再びキーとして変換しようと試みることになります。不測の事態に陥る可能性があるため、 052 * その様な設定は出来なくなっています。 053 * 054 * 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定する事ができます。 055 * 056 * また、CLM または LBL で指定したカラムが DBTableModel に存在しない場合は、処理そのものを 057 * 無視します。その場合は、警告も出力されませんので、ご注意ください。 058 * 059 * 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加。 060 * 061 * 7.2.9.1 (2020/10/23) MSG 属性追加。 062 * 引数付きなので、VALS 指定時に、セットするカラム名に引数として渡したいパラメータをスペースで繋げます。 063 * パラメータは、@カラム名 か、そのままの値で指定します。 064 * 065 * @og.formSample 066 * ●形式: 067 * ① <og:tableFilter classId="LABEL" keys="CLM,LBL" vals="COLUMN,LABEL_CLM" /> 068 * 069 * ② <og:tableFilter classId="LABEL" > 070 * { 071 * SYSTEM_ID : GF ; 072 * LANG : ja ; 073 * CLM : COLUMN ; 074 * LBL : LABEL_CLM ; 075 * } 076 * </og:tableFilter> 077 * 078 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加 079 * 080 * @version 0.9.0 2000/10/17 081 * @author Kazuhiko Hasegawa 082 * @since JDK1.1, 083 */ 084public class TableFilter_LABEL extends AbstractTableFilter { 085 /** このプログラムのVERSION文字列を設定します。 {@value} */ 086 private static final String VERSION = "7.2.9.1 (2020/10/23)" ; 087 088 /** 089 * デフォルトコンストラクター 090 * 091 * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。 092 */ 093 public TableFilter_LABEL() { 094 super(); 095 initSet( "SYSTEM_ID" , "システムIDを指定します(初期値:ログイン時のリソース)" ); 096 initSet( "LANG" , "言語を指定(初期値:日本語)" ); 097 initSet( "CLM" , "キーとなる値が設定されているカラム名を指定" ); 098 initSet( "LBL" , "ラベルリソースに変換した結果をセットするカラム名を指定" ); 099 initSet( "LLBL" , "同上(ラベル長)" ); // 7.2.9.0 (2020/10/12) 100 initSet( "SLBL" , "同上(ラベル短)" ); // 7.2.9.0 (2020/10/12) 101 initSet( "DISC" , "同上(概要) " ); // 7.2.9.0 (2020/10/12) 102 initSet( "LRAW" , "同上(長生ラベル)" ); // 7.2.9.0 (2020/10/12) 103 initSet( "SRAW" , "同上(短生ラベル)" ); // 7.2.9.0 (2020/10/12) 104 initSet( "MSG" , "同上(引数付きラベル)" ); // 7.2.9.1 (2020/10/23) 105 } 106 107 /** 108 * DBTableModel処理を実行します。 109 * 110 * @og.rev 5.5.2.2 (2012/05/09) SYSTEM_ID を受け取るように変更 111 * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更 112 * @og.rev 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更 113 * @og.rev 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、リソースから、そうでない場合は、LBLの値を使用します。 114 * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 115 * @og.rev 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加 116 * @og.rev 7.2.9.1 (2020/10/23) MSG 属性追加 117 * 118 * @return 処理結果のDBTableModel 119 */ 120 public DBTableModel execute() { 121 final DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加 122 123 if( table == null ) { return table; } // 6.4.0.5 (2016/01/09) 124 125 final String systemId = getValue( "SYSTEM_ID" ); // 5.5.2.2 (2012/05/09) 126 final String lang = getValue( "LANG" ); 127 final ResourceManager resource = ResourceFactory.newInstance( systemId,lang,false ); // 5.5.2.2 (2012/05/09) 128 129 final String clm = getValue( "CLM" ); 130 final String lbl = getValue( "LBL" ); 131 final String llbl = getValue( "LLBL" ); // 7.2.9.0 (2020/10/12) 132 final String slbl = getValue( "SLBL" ); // 7.2.9.0 (2020/10/12) 133 final String disc = getValue( "DISC" ); // 7.2.9.0 (2020/10/12) 134 final String lraw = getValue( "LRAW" ); // 7.2.9.0 (2020/10/12) 135 final String sraw = getValue( "SRAW" ); // 7.2.9.0 (2020/10/12) 136 137 final int clmNo = table.getColumnNo( clm,false ); // 存在しない場合は、-1 を返す。 138 final int lblNo = table.getColumnNo( lbl,false ); 139 final int llblNo = table.getColumnNo( llbl,false ); // 7.2.9.0 (2020/10/12) 140 final int slblNo = table.getColumnNo( slbl,false ); // 7.2.9.0 (2020/10/12) 141 final int discNo = table.getColumnNo( disc,false ); // 7.2.9.0 (2020/10/12) 142 final int lrawNo = table.getColumnNo( lraw,false ); // 7.2.9.0 (2020/10/12) 143 final int srawNo = table.getColumnNo( sraw,false ); // 7.2.9.0 (2020/10/12) 144 145 // 7.2.9.1 (2020/10/23) MSGの値は、セットするカラム名の後ろに、パラメータをスペースで繋げています。 146 final String msg_prm = getValue( "MSG" ); 147 final int msgNo ; 148 final int[] prmNo ; 149 final String[] prmVal ; 150 151 if( msg_prm != null ) { 152 final String[] msgs = msg_prm.split( "[\\s]+" ); // 連続スペース、タブを区切り文字にする。 153 msgNo = table.getColumnNo( msgs[0],false ); 154 prmNo = new int[msgs.length-1]; 155 prmVal = new String[msgs.length-1]; 156 for( int i=1; i<msgs.length; i++ ) { 157 prmVal[i-1] = msgs[i]; // 元の引数をそのまま使う可能性があるので、セットしておく。 158 159 if( '@' == msgs[i].charAt(0) ) { // カラム指定の意味 160 prmNo[i-1] = table.getColumnNo( msgs[i].substring(1),false ); 161 } 162 else { 163 prmNo[i-1] = -1; 164 } 165 } 166 } 167 else { 168 msgNo = -1; 169 prmNo = null; 170 prmVal = null; 171 } 172 173 // 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更 174// if( clmNo >= 0 && lblNo >= 0 ) { 175// if( clmNo >= 0 && ( lblNo >= 0 || llblNo >= 0 || slblNo >= 0 || discNo >= 0 || lrawNo >= 0 || srawNo >= 0 ) ) { // 7.2.9.0 (2020/10/12) 176 if( clmNo >= 0 && ( lblNo >= 0 || llblNo >= 0 || slblNo >= 0 || discNo >= 0 || lrawNo >= 0 || srawNo >= 0 || msgNo >= 0 ) ) { // 7.2.9.1 (2020/10/23) 177 String[] data = null; 178 final int rowCnt = table.getRowCount(); 179 for( int row=0; row<rowCnt; row++ ) { 180 String clmVal = null; 181 try { 182 data = table.getValues( row ); 183 clmVal = data[clmNo]; // 変換する元のカラム名 184 185 if( lblNo >= 0 ) { 186 final String lblVal = data[lblNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 187 // 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、リソースから、そうでない場合は、LBLの値を使用します。 188 // つまり、上記の条件が成立した場合は、LBLを書き換えないということです。 189 if( StringUtil.isNull( lblVal ) || lblVal.equals( clmVal ) ) { 190 data[lblNo] = resource.getLabel( clmVal ) ; 191 } 192 } 193 194 // 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加 195 if( llblNo >= 0 ) { 196 final String llblVal = data[llblNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 197 if( StringUtil.isNull( llblVal ) || llblVal.equals( clmVal ) ) { 198 data[llblNo] = resource.getLongLabel( clmVal ) ; 199 } 200 } 201 202 if( slblNo >= 0 ) { 203 final String slblVal = data[slblNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 204 if( StringUtil.isNull( slblVal ) || slblVal.equals( clmVal ) ) { 205 data[slblNo] = resource.getShortLabel( clmVal ) ; 206 } 207 } 208 209 // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加 210 if( discNo >= 0 ) { 211 final String discVal = data[discNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 212 if( StringUtil.isNull( discVal ) || discVal.equals( clmVal ) ) { 213 data[discNo] = resource.getDescription( clmVal ) ; 214 } 215 } 216 217 // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加 218 if( lrawNo >= 0 ) { 219 final String lrawVal = data[lrawNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 220 if( StringUtil.isNull( lrawVal ) || lrawVal.equals( clmVal ) ) { 221 final String val = resource.getRawLongLabel( clmVal ) ; 222 data[lrawNo] = val == null || val.equals( clmVal ) ? "" : val ; // null時はkeyが返ってくるので 空文字 を返す。 223 } 224 } 225 226 // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加 227 if( srawNo >= 0 ) { 228 final String srawVal = data[srawNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 229 if( StringUtil.isNull( srawVal ) || srawVal.equals( clmVal ) ) { 230 final String val = resource.getRawShortLabel( clmVal,false ) ; // null時は 空文字 を返す。 231 data[srawNo] = val == null || val.equals( clmVal ) ? "" : val; // null時は 空文字 を返す。 232 233// data[srawNo] = resource.getRawShortLabel( clmVal,false ) ; // null時は 空文字 を返す。 234 } 235 } 236 237 // 7.2.9.1 (2020/10/23) MSG 属性追加 238 if( msgNo >= 0 ) { 239 final String msgVal = data[msgNo]; 240 if( StringUtil.isNull( msgVal ) || msgVal.equals( clmVal ) ) { 241 final String[] prmVals = new String[prmNo.length]; 242 for( int i=0; i<prmNo.length; i++ ) { 243 if( prmNo[i] >= 0 ) { 244 prmVals[i] = StringUtil.nval( data[prmNo[i]] , "" ); 245 } 246 else { 247 prmVals[i] = prmVal[i]; 248 } 249 } 250 251 data[msgNo] = resource.getLabel( clmVal,prmVals ) ; 252 } 253 } 254 } 255 catch( final RuntimeException ex ) { 256 // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 257 makeErrorMessage( "TableFilter_LABEL Error",ErrorMessage.NG ) 258 .addMessage( row+1,ErrorMessage.NG,"LABEL" 259 , "CLM=[" + clm + "],VAL=[" + clmVal + "]" 260 , StringUtil.array2csv( data ) 261 ) 262 .addMessage( ex ); 263 } 264 } 265 } 266 267 return table; 268 } 269}