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    }