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 */ 016 package org.opengion.plugin.table; 017 018 import org.opengion.fukurou.db.DBUtil; 019 import org.opengion.fukurou.db.Transaction; // 5.5.2.6 (2012/05/25) 020 import org.opengion.fukurou.model.Formatter; 021 import org.opengion.fukurou.util.ErrorMessage; 022 import org.opengion.fukurou.util.StringUtil; 023 import org.opengion.hayabusa.db.AbstractTableFilter; 024 import org.opengion.hayabusa.db.DBTableModel; 025 026 import java.util.Map; 027 028 /** 029 * TableFilter_DBSELECT は、TableFilter インターフェースを継承した、DBTableModel 処?の 030 * 実?ラスです? 031 * 032 * ここでは、Body部にかかれたSQLを実行した結果を???ブルモ?にセ?します? 033 * SQL?ら取得されるカラ?と??ブルモ?のカラ?は??して??があります? 034 * 検索結果のカラ???ブルモ?に存在して???合?エラーとなります? 035 * 以下?属?を指定しな?、データが存在しな??合?NULLがセ?されます? 036 * また?2行以上検索された?合でも?1行目の??タのみをセ?します? 037 * 038 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか?BODY 部にCSS形式で記述します? 039 * ただし?こ?フィルターは、BODY部に、SQL?記述する為、注意が?です? 040 * ルール?は、???に見つけた "{" と?}" の間???がパラメータと認識します? 041 * よって、SQL?記述する場合?、このパラメータの後ろに記述するか?keys,vals を利用ください? 042 * 【パラメータ? 043 * { 044 * INNER_JOIN : ??タが存在しな??合???ブルの該当行を削除します?(初期値?false) 045 * APPEND : 2行以上検索された?合???タをアペンドします? (初期値?false) 046 * SEPARATOR : APPENDする場合?区??を?します? (初期値?? "スペ?ス) 047 * } 048 * 049 * Body部にかかれたSQLには[XXXX]形式?変数が指定できます? 050 * 051 * @og.formSample 052 * ●形式? 053 * ?<og:tableFilter classId="DBSELECT" > 054 * 055 * </og:tableFilter> 056 * 057 * ② <og:tableFilter classId="DBSELECT" > 058 * { 059 * INNER_JOIN : true ; 060 * } 061 * select AAA,BBB,CCC from XXX 062 * </og:tableFilter> 063 * 064 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を追? 065 * 066 * @version 0.9.0 2000/10/17 067 * @author Hiroki Nakamura 068 * @since JDK1.1, 069 */ 070 public class TableFilter_DBSELECT extends AbstractTableFilter { 071 //* こ?プログラ??VERSION??を設定します? {@value} */ 072 private static final String VERSION = "5.6.6.1 (2013/07/12)" ; 073 074 /** 075 * keys の整合?チェ?を行うための初期設定を行います? 076 * 077 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対? 078 * 079 * @param keysMap keys の整合?チェ?を行うための Map 080 */ 081 @Override 082 protected void init( final Map<String,String> keysMap ) { 083 keysMap.put( "INNER_JOIN" , "??タが存在しな??合???ブルの該当行を削除しま?初期値?false)" ); 084 keysMap.put( "APPEND" , "2行以上検索された?合???タをアペンドしま? (初期値?false)" ); 085 keysMap.put( "SEPARATOR" , "APPENDする場合?区??を?しま? (初期値?\" \"スペ?ス)" ); 086 } 087 088 private DBTableModel table = null; // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 089 090 /** 091 * DBTableModel処?実行します? 092 * 093 * @og.rev 4.3.7.0 (2009/06/01) 実??更 094 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対? 095 * @og.rev 5.5.2.6 (2012/05/25) protected変数を?private化したため?getterメソ?で取得するよ?変更 096 * 097 * @return 処?果のDBTableModel 098 */ 099 public DBTableModel execute() { 100 table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 101 102 boolean innerJoin = StringUtil.nval( getValue("INNER_JOIN"), false ); 103 boolean isAppend = StringUtil.nval( getValue("APPEND"), false ); 104 String separator = StringUtil.nval( getValue("SEPARATOR"), " " ); 105 106 Formatter format = new Formatter( table ); 107 // format.setFormat( sql ); 108 format.setFormat( getSql() ); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 109 int[] sqlClmNo = format.getClmNos(); 110 String query = format.getQueryFormatString(); 111 112 String[] data = null; 113 String[] param = null; 114 int[] clmNo = null; 115 Transaction tran = getTransaction(); // 5.5.2.6 (2012/05/25) 116 String dbid = getDbid(); // 5.5.2.6 (2012/05/25) 117 int[] rowNo = getParameterRows(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 118 int rowCount = rowNo.length; 119 for ( int row = rowCount - 1; row >= 0; row-- ) { 120 try { 121 param = getTableModelData( rowNo[row], sqlClmNo ); 122 123 final String[][] dbData; 124 if ( row == rowCount - 1 ) { 125 // String[][] rtn = DBUtil.dbExecute( query, param, appInfo, dbid, true ); 126 String[][] rtn = DBUtil.dbExecute( query, param, tran, dbid, true ); // 5.1.9.0 (2010/08/01) Transaction 対? 127 clmNo = getTableColumnNo( rtn[0] ); 128 dbData = new String[rtn.length - 1][rtn[0].length]; 129 System.arraycopy( rtn, 1, dbData, 0, dbData.length ); 130 } 131 else { 132 // dbData = DBUtil.dbExecute( query, param, appInfo, dbid, false ); 133 dbData = DBUtil.dbExecute( query, param, tran, dbid, false ); // 5.1.9.0 (2010/08/01) Transaction 対? 134 } 135 136 data = table.getValues( rowNo[row] ); 137 if ( dbData != null && dbData.length > 0 && dbData[0] != null && dbData[0].length > 0 ) { 138 for ( int i = 0; i < clmNo.length; i++ ) { 139 if( isAppend ) { 140 StringBuilder buf = new StringBuilder(); 141 for( int j = 0; j < dbData.length; j++ ) { 142 if( j > 0 ) { 143 buf.append( separator ); 144 } 145 buf.append( dbData[j][i] ); 146 } 147 data[clmNo[i]] = buf.toString(); 148 } 149 else { 150 data[clmNo[i]] = dbData[0][i]; // 副作用を及ぼして?す?注? 151 } 152 } 153 } 154 else if( innerJoin ) { 155 table.removeValue(rowNo[row]); 156 } 157 } 158 catch ( RuntimeException ex ) { 159 ErrorMessage errMessage = makeErrorMessage( "TableFilter_DBSELECT Error", ErrorMessage.NG ); 160 errMessage.addMessage( rowNo[row] + 1, ErrorMessage.NG, ex.getMessage() ); 161 errMessage.addMessage( rowNo[row] + 1, ErrorMessage.NG, StringUtil.array2csv( data ) ); 162 // errMessage.addMessage( rowNo[row] + 1, ErrorMessage.NG, "SQL=[" + sql + "]" ); 163 errMessage.addMessage( rowNo[row] + 1, ErrorMessage.NG, "SQL=[" + getSql() + "]" ); 164 errMessage.addMessage( rowNo[row] + 1, ErrorMessage.NG, StringUtil.array2csv( param ) ); 165 } 166 } 167 168 return table; 169 } 170 171 /** 172 * ??行番号の、カラ?o配?(int[])に対応した?の配?を返します? 173 * 174 * 表示??タの HybsSystem.ROW_SEL_KEY を?に?ばれた 行を 175 * 処??対象とします? 176 * 177 * @param row 行番号 178 * @param clmNo カラ?o配? 179 * 180 * @return 行番号とカラ?o配?に対応した?値の配? 181 */ 182 private String[] getTableModelData( final int row, final int[] clmNo ) { 183 String[] values = new String[clmNo.length]; 184 for( int i = 0; i < values.length; i++ ) { 185 values[i] = table.getValue( row, clmNo[i] ); 186 } 187 return values; 188 } 189 }