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 * 033 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。 034 * 【パラメータ】 035 * { 036 * SYSTEM_ID : ラベルリソースの作成システムIDを指定します。無指定時は、ログイン時のリソースになります。 037 * LANG : ラベルリソースの言語を指定します。無指定時は、日本語になります。 038 * CLM : ラベルリソースのキーとなる値が設定されているカラム名を指定します。 039 * LBL : CLMで指定されたカラム名から値を取り出し、ラベルリソースに変換した結果をセットします。 040 * } 041 * 042 * 5.7.8.0 (2014/07/04) 解除 043 * CLM と LBL に同じカラムを指定すると、このフィルターを通過するたびに、変換後のラベルが 044 * 再びキーとして変換しようと試みることになります。不測の事態に陥る可能性があるため、 045 * その様な設定は出来なくなっています。 046 * 047 * 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定する事ができます。 048 * 049 * また、CLM または LBL で指定したカラムが DBTableModel に存在しない場合は、処理そのものを 050 * 無視します。その場合は、警告も出力されませんので、ご注意ください。 051 * 052 * @og.formSample 053 * ●形式: 054 * ① <og:tableFilter classId="LABEL" keys="CLM,LBL" vals="COLUMN,LABEL_CLM" /> 055 * 056 * ② <og:tableFilter classId="LABEL" > 057 * { 058 * SYSTEM_ID : GF ; 059 * LANG : ja ; 060 * CLM : COLUMN ; 061 * LBL : LABEL_CLM ; 062 * } 063 * </og:tableFilter> 064 * 065 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加 066 * 067 * @version 0.9.0 2000/10/17 068 * @author Kazuhiko Hasegawa 069 * @since JDK1.1, 070 */ 071public class TableFilter_LABEL 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_LABEL() { 081 super(); 082 initSet( "SYSTEM_ID" , "システムIDを指定します(初期値:ログイン時のリソース)" ); 083 initSet( "LANG" , "言語を指定(初期値:日本語)" ); 084 initSet( "CLM" , "キーとなる値が設定されているカラム名を指定" ); 085 initSet( "LBL" , "ラベルリソースに変換した結果をセットするカラム名を指定" ); 086 } 087 088 /** 089 * DBTableModel処理を実行します。 090 * 091 * @og.rev 5.5.2.2 (2012/05/09) SYSTEM_ID を受け取るように変更 092 * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更 093 * @og.rev 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更 094 * @og.rev 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、リソースから、そうでない場合は、LBLの値を使用します。 095 * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 096 * 097 * @return 処理結果のDBTableModel 098 */ 099 public DBTableModel execute() { 100 final DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加 101 102 if( table == null ) { return table; } // 6.4.0.5 (2016/01/09) 103 104 final String systemId = getValue( "SYSTEM_ID" ); // 5.5.2.2 (2012/05/09) 105 final String lang = getValue( "LANG" ); 106 final ResourceManager resource = ResourceFactory.newInstance( systemId,lang,false ); // 5.5.2.2 (2012/05/09) 107 108 final String clm = getValue( "CLM" ); 109 final String lbl = getValue( "LBL" ); 110 111 final int clmNo = table.getColumnNo( clm,false ); // 存在しない場合は、-1 を返す。 112 final int lblNo = table.getColumnNo( lbl,false ); 113 114 // 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更 115 if( clmNo >= 0 && lblNo >= 0 ) { 116 String[] data = null; 117 final int rowCnt = table.getRowCount(); 118 for( int row=0; row<rowCnt; row++ ) { 119 String clmVal = null; 120 String lblVal = null; // 6.4.0.5 (2016/01/09) 121 try { 122 data = table.getValues( row ); 123 clmVal = data[clmNo]; // 変換する元のカラム名 124 lblVal = data[lblNo]; // 変換する元のラベル 6.4.0.5 (2016/01/09) 125 // 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、リソースから、そうでない場合は、LBLの値を使用します。 126 // つまり、上記の条件が成立した場合は、LBLを書き換えないということです。 127 if( StringUtil.isNull( lblVal ) || lblVal.equals( clmVal ) ) { 128 data[lblNo] = resource.getLabel( clmVal ) ; 129 } 130 } 131 catch( final RuntimeException ex ) { 132 // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 133 makeErrorMessage( "TableFilter_LABEL Error",ErrorMessage.NG ) 134 .addMessage( row+1,ErrorMessage.NG,"LABEL" 135 , "CLM=[" + clm + "],VAL=[" + clmVal + "]" 136 , StringUtil.array2csv( data ) 137 ) 138 .addMessage( ex ); 139 } 140 } 141 } 142 143 return table; 144 } 145}