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.fukurou.util.StringUtil; 019import org.opengion.hayabusa.db.AbstractTableFilter; 020import org.opengion.hayabusa.db.DBTableModel; 021 022import java.util.Map; 023 024/** 025 * TableFilter_BIKO2CODE は、TableFilter インターフェースを継承した、DBTableModel 処理用の 026 * 実装クラスです。 027 * 028 * ここでは、DB定義書情報の備考欄を分解し、コードリソースとして登録可能な形に再構築します。 029 * 入力カラムとしてBIKOが、出力カラムとして、CODE,CODENAME,SEQが必要です。 030 * それぞれのカラム名は、keys,valsの引数としても指定可能です。 031 * 032 * 分解方法としては、まず備考欄を' '(スペース)区切りに分解します。 033 * その上で、さらに取り出した値を':'で分解してコードとコード名称に分離します。 034 * 順番(SEQ)については、備考欄に記載されている順番になります。 035 * 「キー:ラベル キー:ラベル」で、ラベル にスペースを含ませる場合は、ダブルクォーテーションで 036 * 囲ってください。 037 * 038 * また、BIKO,CODE,CODENAME,SEQ で指定したカラムが DBTableModel に存在しない場合は、 039 * 処理そのものを無視します。その場合は、警告も出力されませんので、ご注意ください。 040 * 041 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。 042 * 【パラメータ】 043 * { 044 * BIKO : 入力カラム ; 備考情報を格納している入力カラム名。 045 * CODE : 出力カラム ; コードを格納する出力カラム名。 046 * CODENAME : 出力カラム ; コード名称を格納する出力カラム名。 047 * SEQ : 出力カラム ; 並び順を格納する出力カラム名。備考欄に記載されている順番になります。 048 * } 049 * 050 * @og.formSample 051 * ●形式: 052 * select TABLE_NAME,CLM,NAME_JA,EDITOR,RENDERER,DBTYPE,BIKO,0 SEQ,'' CODE,'' CODENAME,UNIQ,SYSTEM_ID from GF05 053 * @ <og:tableFilter classId="BIKO2CODE" keys="BIKO,CODE," vals='"TABLE_NAME,CLM"' /> 054 * 055 * A <og:tableFilter classId="BIKO2CODE" > 056 * { 057 * BIKO : 入力カラム ; 備考情報を格納している入力カラム名。 058 * CODE : 出力カラム ; コードを格納する出力カラム名。 059 * CODENAME : 出力カラム ; コード名称を格納する出力カラム名。 060 * SEQ : 出力カラム ; 並び順を格納する出力カラム名。備考欄に記載されている順番になります。 061 * } 062 * </og:tableFilter> 063 * 064 * @og.rev 4.1.0.0(2008/01/18) 新規作成 065 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加 066 * 067 * @version 0.9.0 2000/10/17 068 * @author Hiroki Nakamura 069 * @since JDK1.1, 070 */ 071public class TableFilter_BIKO2CODE extends AbstractTableFilter { 072 //* このプログラムのVERSION文字列を設定します。 {@value} */ 073 private static final String VERSION = "5.6.6.1 (2013/07/12)" ; 074 075 /** 076 * keys の整合性チェックを行うための初期設定を行います。 077 * 078 * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェック対応 079 * 080 * @param keysMap keys の整合性チェックを行うための Map 081 */ 082 @Override 083 protected void init( final Map<String,String> keysMap ) { 084 keysMap.put( "BIKO" , "備考情報を格納している入力カラム名" ); 085 keysMap.put( "CODE" , "コードを格納する出力カラム名" ); 086 keysMap.put( "CODENAME" , "コード名称を格納する出力カラム名" ); 087 keysMap.put( "SEQ" , "並び順を格納する出力カラム名" ); 088 } 089 090 /** 091 * DBTableModel処理を実行します。 092 * 093 * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更 094 * @og.rev 5.5.8.5 (2012/11/27) スペースで分割し、":" が存在する箇所のみ、コードリソース化します。 095 * 096 * @return 処理結果のDBTableModel 097 */ 098 public DBTableModel execute() { 099 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加 100 101 int bikoNo = table.getColumnNo( StringUtil.nval( getValue( "BIKO" ), "BIKO" ), false ); // 存在しない場合は、-1 を返す。 102 int codeNo = table.getColumnNo( StringUtil.nval( getValue( "CODE" ), "CODE" ), false ); 103 int nameNo = table.getColumnNo( StringUtil.nval( getValue( "CODENAME" ),"CODENAME" ), false ); 104 int seqNo = table.getColumnNo( StringUtil.nval( getValue( "SEQ" ), "SEQ" ), false ); 105 106 char sep = ' '; 107 108 if( bikoNo >= 0 && codeNo >= 0 && nameNo >= 0 && seqNo >= 0 ) { 109 String[] data = null; 110 String[] nData = null; 111 String[] clmValArr = null; 112 int addRows = 0; 113 int rowCnt = table.getRowCount(); 114 for( int row=0; row<rowCnt; row++ ) { 115 addRows = 0; 116 data = table.getValues( row ); 117 // タグがあった場合は無視 118 if( data[bikoNo].indexOf( "/>" ) < 0 && data[bikoNo].indexOf( "</" ) < 0 ) { 119 clmValArr = StringUtil.csv2Array( data[bikoNo], sep ); 120// for ( int i = 0; i < clmValArr.length; i++ ) { 121// addRows++; 122// nData = new String[data.length]; 123// System.arraycopy( data, 0, nData, 0, data.length ); 124// int clnIdx = clmValArr[i].indexOf( ':' ); 125// if( clnIdx < 0 ) { 126// nData[codeNo] = clmValArr[i]; 127// nData[nameNo] = ""; 128// } 129// else { 130// nData[codeNo] = clmValArr[i].substring( 0, clmValArr[i].indexOf( ':' ) ); 131// nData[nameNo] = clmValArr[i].substring( clmValArr[i].indexOf( ':' ) + 1 ); 132// } 133// nData[seqNo] = String.valueOf( i ); 134// table.addValues( nData, row+addRows, false ); 135// } 136 // 5.5.8.5 (2012/11/27) スペースで分割し、":" が存在する箇所のみ、コードリソース化します。 137 int seq = 0; 138 for ( int i = 0; i < clmValArr.length; i++ ) { 139 String clmVal = clmValArr[i]; 140 int clnIdx = clmVal.indexOf( ':' ); 141 if( clnIdx >= 0 ) { 142 nData = new String[data.length]; 143 System.arraycopy( data, 0, nData, 0, data.length ); 144 145 nData[codeNo] = clmVal.substring( 0, clnIdx ); 146 nData[nameNo] = clmVal.substring( clnIdx + 1 ); 147 nData[seqNo] = String.valueOf( seq++ ); 148 149 addRows++; 150 table.addValues( nData, row+addRows, false ); 151 } 152 } 153 154 if( addRows > 0 ) { 155 table.removeValue( row ); 156 addRows--; 157 } 158 159 row += addRows; 160 rowCnt += addRows; 161 } 162 } 163 } 164 165 return table; 166 } 167}