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 }