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.hayabusa.taglib; 017 018 import org.opengion.hayabusa.common.HybsSystem; 019 import org.opengion.hayabusa.common.HybsSystemException; 020 import org.opengion.hayabusa.db.DBTableModel; 021 import org.opengion.hayabusa.db.Query; 022 import org.opengion.hayabusa.resource.GUIInfo; 023 024 import org.opengion.fukurou.util.StringUtil ; 025 import static org.opengion.fukurou.util.StringUtil.nval ; 026 027 /** 028 * ã€å»?¢ã€‘SQLæ–?‚’直接æŒ?®šã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ã?スã«è¿½åŠ?æ›´æ–°/削除を行ã„ã¾ã?queryType="JDBCPrepared")ã€? 029 * 030 * å˜åœ¨ãƒã‚§ãƒ?‚¯ã‚’行ã†å ´åˆã?ã€tableExist ã‚¿ã‚°ã¨ä½µç”¨ã—ã¦ãã ã•ã„ã€? 031 * è¤?›‘ãªå‡¦ç?Œå¿?¦ãªå ´åˆã?ã€å¾“æ¥ã‚ˆã‚Šä½¿ç”¨ã—ã¦ã?¾ã™ã?PLSQLã‚’CALLã™ã‚‹ã€? 032 * plsqlUpdateタグを使用ã—ã¦ãã ã•ã„ã€? 033 * 034 * ※ ã“ã?ã‚¿ã‚°ã¯ã€Transaction ã‚¿ã‚°ã®å¯¾è±¡ã§ã™ã? 035 * 036 * @og.formSample 037 * â—å½¢å¼ï¼?lt;og:update command="…" names="…" queryType="JDBCPrepared" > 038 * {@SQL} 039 * </og:update> 040 * â—body?šã‚ã‚?EVAL_BODY_BUFFERED:BODYを評価ã—ã?{@XXXX} ã‚’è§£æžã—ã¾ã? 041 * 042 * â—Tag定義?? 043 * <og:update 044 * queryType ã€å»?¢ã€‘Query を発行ã™ã‚‹ç‚ºã®ã‚¯ãƒ©ã‚¹IDを指定ã—ã¾ã?åˆæœŸå€¤:JDBCPrepared) 045 * command ã€TAG】コマンãƒ?NEW,RENEW)ã‚’ã‚»ãƒ?ƒˆã—ã¾ã?PlsqlUpdateTag,UpdateTag ã®å ´åˆã?ã€ENTRY) 046 * scope ã€TAG】ã‚ャãƒ?‚·ãƒ¥ã™ã‚‹å ´åˆã?スコープ[request/page/session/applicaton]を指定ã—ã¾ã?åˆæœŸå€¤:session) 047 * displayMsg ã€TAGã€‘æ¤œç´¢çµæžœã‚’ç”»é¢ä¸Šã«è¡¨ç¤ºã™ã‚‹ãƒ¡ãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹IDを指定ã—ã¾ã?(åˆæœŸå€¤:VIEW_DISPLAY_MSG[=]) 048 * names ã€TAG】PL/SQLを利用ã™ã‚‹å ´åˆã?引数ã«ã‚»ãƒ?ƒˆã™ã¹ã?ãƒ??ã‚¿ã®åç§°ã‚’CSVå½¢å¼ã§è¤?•°æŒ?®šã—ã¾ã? 049 * quotCheck ã€TAGã€‘ãƒªã‚¯ã‚¨ã‚¹ãƒˆæƒ…å ±ã® ã‚¯ã‚©ãƒ¼ãƒ?‚£ã‚·ãƒ§ãƒ³(') å˜åœ¨ãƒã‚§ãƒ?‚¯ã‚’実施ã™ã‚‹ã‹ã©ã?‹[true/false]ã‚’è¨å®šã—ã¾ã?åˆæœŸå€¤:USE_SQL_INJECTION_CHECK) 050 * tableId ã€TAGã€?通常ã¯ä½¿ã?¾ã›ã‚“)çµæžœã®DBTableModelã‚’ã?sessionã«ç™»éŒ²ã™ã‚‹ã¨ãã?ã‚ーを指定ã—ã¾ã? 051 * dbid ã€TAGã€?通常ã¯ä½¿ã?¾ã›ã‚“)Queryオブジェクトを作æ?ã™ã‚‹æ™‚ã?DB接続IDを指定ã—ã¾ã? 052 * xssCheck ã€TAGã€‘ãƒªã‚¯ã‚¨ã‚¹ãƒˆæƒ…å ±ã® HTMLTagé–‹å§?終äº?–‡å?><) å˜åœ¨ãƒã‚§ãƒ?‚¯ã‚’実施ã™ã‚‹ã‹ã©ã?‹[true/false]ã‚’è¨å®šã—ã¾ã?(åˆæœŸå€¤:USE_XSS_CHECK[=true]) 053 * debug ã€TAG】デãƒãƒƒã‚°æƒ??ã‚’å?力ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false) 054 * > ... Body ... 055 * </og:update> 056 * 057 * â—使用ä¾? 058 * ・引数/プãƒã‚·ã‚¸ãƒ£ãƒ¼ã‚’ä»–ã?JSPã‹ã‚‰æ¸¡ã™å?å? 059 * ã€copy.jspã€? 060 * <og:value scope="session" key="names" value="CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG" /> 061 * <og:value scope="session" key="SQL" > 062 * INSERT INTO GE41 063 * (CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG, 064 * FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD) 065 * VALUES 066 * (?,?,?,?,?,?, 067 * '1','{@USER.YMDH}','{@USER.YMDH}','{@USER.ID}','{@USER.ID}','{@GUI.KEY}') 068 * </og:value> 069 * 070 * ã€entry.jspã€? 071 * <og:update 072 * command = "{@command}" 073 * queryType = "JDBCPrepared" 074 * names = "{@names}" > 075 * {@SQL} 076 * </og:update> 077 * 078 * <!-- å‰ç”»é¢ã§æŒ?®šã?SQLæ–?‚’削除ã—ã¾ã™ã?(scope="session"ãªã®ã§å‰Šé™¤ãŒå¿?¦ã?) --> 079 * <og:value scope="session" key="names" command="REMOVE" /> 080 * <og:value scope="session" key="SQL" command="REMOVE" /> 081 * 082 * ・引数/プãƒã‚·ã‚¸ãƒ£ãƒ¼ã‚’直接書ãå?å? 083 * ã€entry.jspã€? 084 * <og:update 085 * command = "{@command}" 086 * queryType = "JDBCPrepared" 087 * names = "CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG" 088 * > 089 * INSERT INTO GE41 090 * (CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG, 091 * FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD) 092 * VALUES 093 * (?,?,?,?,?,?, 094 * '1','{@USER.YMDH}','{@USER.YMDH}','{@USER.ID}','{@USER.ID}','{@GUI.KEY}') 095 * </og:update> 096 * 097 * @og.rev 4.0.0.0 (2005/01/31) å»?¢ 098 * @og.group (å»?¢)?¤?¢ç™»éŒ² 099 * 100 * @deprecated 4.0.0 (2005/01/31) å»?¢ã€‚tableUpdate を利用ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„ã€? 101 * @version 4.0 102 * @author Kazuhiko Hasegawa 103 * @since JDK5.0, 104 */ 105 @Deprecated public class UpdateTag extends QueryTag { 106 //* ã“ã?プãƒã‚°ãƒ©ãƒ??VERSIONæ–?—å?ã‚’è¨å®šã—ã¾ã™ã? {@value} */ 107 private static final String VERSION = "4.0.0.0 (2005/01/31)" ; 108 109 private static final long serialVersionUID = 400020050131L ; 110 111 /** command å¼•æ•°ã«æ¸¡ã™äº‹ã?出æ¥ã‚?コマンãƒ? 登録{@value} */ 112 public static final String CMD_ENTRY = "ENTRY" ; 113 /** command å¼•æ•°ã«æ¸¡ã™äº‹ã?出æ¥ã‚?コマンãƒ?リスãƒ? */ 114 private static final String COMMAND_LIST = CMD_ENTRY; 115 116 /** 117 * Taglibã®é–‹å§‹ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doStartTag() ã‚?オーãƒã?ライドã—ã¾ã™ã? 118 * 119 * @return 後続å?ç??æŒ?¤º 120 */ 121 @Override 122 public int doStartTag() { 123 dyStart = System.currentTimeMillis(); 124 125 table = (DBTableModel)getObject( tableId ); 126 if( table == null || table.getRowCount() == 0 || 127 ! check( command, COMMAND_LIST ) ) { return(SKIP_BODY); } 128 return( EVAL_BODY_BUFFERED ); // Body を評価ã™ã‚‹ã€? extends BodyTagSupport æ™? 129 } 130 131 /** 132 * Taglibã®çµ‚äº?‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doEndTag() ã‚?オーãƒã?ライドã—ã¾ã™ã? 133 * 134 * @og.rev 3.5.5.8 (2004/05/20) ErrorMessage ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ£å¸¸çµ‚äº?™‚ã€ã‚¯ãƒªã‚¢ 135 * 136 * @return 後続å?ç??æŒ?¤º 137 */ 138 @Override 139 public int doEndTag() { 140 debugPrint(); // 4.0.0 (2005/02/28) 141 142 if( check( command, COMMAND_LIST ) ) { 143 removeSessionAttribute( errMsgId ); 144 } 145 146 executeCount = getParameterRows().length ; // ãƒã‚§ãƒ?‚¯è¡Œã?æ•°ãŒç™»éŒ²ä»¶æ•°ã¨ä»®å®? 147 148 // 4.0.0 (2005/01/31) 処ç?™‚間集è¨? 149 long dyTime = System.currentTimeMillis()-dyStart; 150 151 // 4.0.0 (2005/01/31) ã‚»ã‚ュリãƒ?‚£ãƒã‚§ãƒ?‚¯(ãƒ??タアクセス件数登録) 152 GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY ); 153 if( guiInfo != null ) { guiInfo.addWriteCount( executeCount,dyTime,sql ); } 154 155 return(EVAL_PAGE); 156 } 157 158 /** 159 * Query を実行ã—ã¾ã™ã? 160 * 161 * @og.rev 2.1.2.3 (2002/12/02) ãƒ??タベã?ス更新時ã«ã€æ›´æ–°ãƒ•ラグをセãƒ?ƒˆã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ 162 * @og.rev 3.4.0.0 (2003/09/01) 登録エラー時ã?ã‚ーã¨å€¤ã‚’表示ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€? 163 * @og.rev 3.5.0.0 (2003/09/17) カラãƒ?ã§ã¯ãªãã?カラãƒ?•ªå·ã‚’å?ã«æ±‚ã‚ã¦ãŠãæ–¹å¼ã«å¤‰æ›´ã€? 164 * @og.rev 3.5.6.0 (2004/06/18) DBRowHeader ã®ãƒ‘ッケージプライベã?ト化ã«ä¼´ãªã?¤‰æ›´ 165 * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ 166 * 167 * @param query オブジェクãƒ? 168 */ 169 @Override 170 protected void execute( final Query query ) { 171 // long st = System.currentTimeMillis(); 172 String[] values = null; 173 int row = 0; 174 try { 175 if( names == null ) { 176 query.execute( null ); 177 } 178 else { 179 int[] rowNo = getParameterRows(); // 4.0.0 (2005/01/31) 180 if( rowNo.length > 0 ) { 181 int[] clmNo = getTableColumnNo( StringUtil.csv2Array( names ) ); 182 values = null; 183 // é€??ã«DELETEã—ãªã?¨ã€è¡Œç•ªå·ãŒãšã‚Œã¦ã—ã¾ã?? 184 for( int j=rowNo.length-1; j>=0; j-- ) { 185 row = rowNo[j]; 186 values = getTableModelData( clmNo,row ); // 3.5.0.0 187 query.execute( values ); 188 if( DBTableModel.DELETE_TYPE.equals( table.getModifyType( row ) ) ) { 189 table.removeValue( row ); 190 } 191 else { 192 table.resetModify( row ); 193 } 194 } 195 } 196 } 197 // if( query.getUpdateFlag() ) { query.commit(); } 198 if( query.isUpdate() ) { query.commit(); } 199 } 200 catch( HybsSystemException ex ) { 201 query.rollback(); 202 // 3.4.0.0 (2003/09/01) 登録エラー時ã?ã‚ーã¨å€¤ã‚’表示ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€? 203 String errMsg = "DATABASE ERROR! " 204 + "rowNo=[" + ( row ) + "] " + HybsSystem.CR 205 + "nameArray=[" + names + "]" + HybsSystem.CR 206 + "values=[" + StringUtil.array2csv( values ) + "]" + HybsSystem.CR ; 207 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数ã®ä¸¦ã³é ?¤‰æ›´ 208 } 209 finally { 210 if( query != null ) { query.close(); } 211 } 212 // System.out.println( ( System.currentTimeMillis() - st ) + " ms" ); 213 } 214 215 /** 216 * カラãƒ?é…å?(String[])よりã€å¯¾å¿œã™ã‚‹ã‚«ãƒ©ãƒ?oé…å?(int[])を作æ?ã—ã¾ã™ã? 217 * 218 * @og.rev 3.5.0.0 (2003/09/17) æ–°è¦è¿½åŠ? 219 * 220 * @param nameArray カラãƒ?é…å? 221 * 222 * @return カラãƒ?oé…å? 223 */ 224 private int[] getTableColumnNo( final String[] nameArray ) { 225 int[] clmNo = new int[ nameArray.length ]; 226 for( int i=0; i<clmNo.length; i++ ) { 227 clmNo[i] = table.getColumnNo( nameArray[i] ); 228 } 229 return clmNo; 230 } 231 232 /** 233 * æŒ?®šã?行番å·ã®ã€ã‚«ãƒ©ãƒ?oé…å?(int[])ã«å¯¾å¿œã—ãŸå?ã®é…å?ã‚’è¿”ã—ã¾ã™ã? 234 * 235 * 表示ãƒ??ã‚¿ã® HybsSystem.ROW_SEL_KEY ã‚’å?ã«ã€?¸ã°ã‚ŒãŸ 行を 236 * 処ç??対象ã¨ã—ã¾ã™ã? 237 * 238 * @og.rev 3.5.0.0 (2003/09/17) カラãƒ?ã§ã¯ãªãã?カラãƒ?•ªå·ã‚’å—ã‘å–るよã?«ä¿®æ£ã€? 239 * 240 * @param clmNo カラãƒ?oé…å? 241 * @param row è¡Œç•ªå· 242 * 243 * @return 行番å·ã¨ã‚«ãƒ©ãƒ?oé…å?ã«å¯¾å¿œã—ãŸã?値ã®é…å? 244 */ 245 private String[] getTableModelData( final int[] clmNo,final int row ) { 246 String[] values = new String[ clmNo.length ]; 247 for( int i=0; i<values.length; i++ ) { 248 values[i] = table.getValue( row,clmNo[i] ) ; 249 } 250 return values; 251 } 252 253 /** 254 * ã€å»?¢ã€‘Query を発行ã™ã‚‹ç‚ºã®ã‚¯ãƒ©ã‚¹IDを指定ã—ã¾ã?{@og.doc03Link queryType åˆæœŸå€¤:JDBCPrepared})ã€? 255 * 256 * @og.tag 257 * 登録を実行ã™ã‚‹æ‰‹æ®µã¯ã€Query インターフェースã®å®Ÿè£?‚¯ãƒ©ã‚¹ã«ãªã‚Šã¾ã™ã? 258 * ã“ã?ã‚¿ã‚°ã§ã¯ã€Query.execute( String[] ) メソãƒ?ƒ‰ãŒè¤?•°å›žå‘¼ã°ã‚Œã¾ã™ã? 259 * ã“れã¯ã€DBTableModelã®é¸æŠžã•れãŸè¡Œã«å¯¾ã—ã¦ã€ç¹°ã‚Šè¿”ã—呼ã°ã‚Œã¾ã™ã? 260 * 261 * 通常ã€ã“ã®ã‚¿ã‚°ã‚’使用ã™ã‚‹å ´åˆã?ã€queryType="JDBCPrepared" を指定ã—ã¾ã™ã? 262 * 263 * ã‚¿ã‚°ã«ã‚ˆã‚Šä½¿ç”¨ã§ãã‚‹?å?æ¥ãªã?Œã‚りã¾ã™ãŒã€ã“れã?ã€org.opengion.hayabusa.db 264 * 以下ã? Query_**** クラス㮠**** を与ãˆã¾ã™ã? 265 * ã“れらã?ã€Query インターフェースを継承ã—ãŸã‚µãƒ–クラスã§ã™ã? 266 * {@og.doc03Link queryType Query_**** クラス} 267 * 268 * @og.rev 3.5.4.2 (2003/12/15) JavaDocコメント用ã«ãƒ¡ã‚½ãƒ?ƒ‰è¿½åŠ?? 269 * 270 * @param id Query を発行ã™ã‚‹ç‚ºã®å®Ÿã‚¯ãƒ©ã‚¹ ID 271 * @see org.opengion.hayabusa.db.Query Queryã®ã‚µãƒ–クラス 272 * @see org.opengion.hayabusa.db.Query#execute( String[] ) 273 * @deprecated クラスãŒå»?¢ 274 */ 275 @Deprecated public void setQueryType( final String id ) { 276 super.setQueryType( nval( id,"JDBCPrepared" ) ); 277 } 278 }