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