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.fukurou.db.Transaction;
019    import org.opengion.fukurou.db.TransactionImpl;
020    
021    import java.io.ObjectOutputStream;
022    import java.io.ObjectInputStream;
023    import java.io.IOException;
024    
025    /**
026     * コネクションをå?有して、トランザクションを実現しますã?
027     *
028     * 通常のタグでは、コネクションプã?ルより、その時ã?のコネクションを取りå?して利用するためã€?
029     * タグごとに異なるコネクションで処ç�?�•れますã?
030     * またã?commit ã‚?rollback などもそれぞれã?タグで行われるためã€??続å?ç�?™‚にエラーã�?
031     * 発生してもã?中途半端な状態になりますã?
032     * ここでは、各 DBID 単位にコネクションをå?有し、このタグの間ã?、同じオブジェクトを
033     * commit ã‚??rollback せずに使ã�?�¾わすようにしますã?
034     * これにより、è¤?•°タグ間ã?トランザクションã‚??異なã‚?DBID 間ã?トランザクションã‚?
035     * 実現しますã?
036     *
037     * こã?タグは、doEndTag() メソãƒ?ƒ‰が正常に呼び出されることで、トランザクションがæ?立しますã?
038     * つまりã?途中で、JSP出力が、SKIP_PAGE されたå?合ã?、commit もされませんã€?
039     * これは、データベã?スエラー以外ã?エラーでもã?トランザクション処ç�?�•れることを意味しますã?
040     *
041     * @og.formSample
042     * ●形式ï¼?lt;og:transaction > ... </og:transaction >
043     * ●body?šあã‚?EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
044     *
045     * ●Tag定義??
046     *   <og:transaction
047     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
048     *   >   ... Body ...
049     *   </og:transaction>
050     *
051     * ●使用ä¾?
052     *     <og:transaction >
053     *         <og:query command="NEW" dbid="SERVER1" >
054     *             insert into XX01 (aa,bb,cc) values ('AA','BB','CC') />
055     *         </og:query >
056     *         <og:query command="NEW" dbid="SERVER2" >
057     *             update YY02 set aa='AA',bb='BB',cc='CC' where uniq='00001' />
058     *         </og:query >
059     *     </og:transaction >
060     *
061     * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
062     * @og.group ?¤?¢登録
063     *
064     * @version  5.0
065     * @author       Kazuhiko Hasegawa
066     * @since    JDK6.0,
067     */
068    public class TransactionTag extends CommonTagSupport {
069            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
070            private static final String VERSION = "5.1.9.0 (2010/08/01)" ;
071            private static final long serialVersionUID = 519020100801L ;
072    
073            // TransactionTag では、Transaction インターフェースではなくã?実è£?‚¯ラスで管ç�?�—ますã?
074            private TransactionImpl tran = null;
075    
076            /**
077             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
078             *
079             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_INCLUDE )
080             */
081            @Override
082            public int doStartTag() {
083                    tran = new TransactionImpl( getApplicationInfo() );
084    
085                    return( EVAL_BODY_INCLUDE );    // Body インクルーãƒ? extends TagSupport æ™?
086            }
087    
088            /**
089             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
090             *
091             * @return      後続å?ç�??æŒ?¤º
092             */
093            @Override
094            public int doEndTag() {
095                    debugPrint();           // 4.0.0 (2005/02/28)
096    
097                    // finish() は、TransactionImpl のメソãƒ?ƒ‰ですã?
098                    if( tran != null ) { tran.finish(); }
099    
100                    return(EVAL_PAGE);              // ペã?ジの残りを評価するã€?
101            }
102    
103            /**
104             * タグリブオブジェクトをリリースしますã?
105             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
106             *
107             */
108            @Override
109            protected void release2() {
110                    super.release2();
111    
112                    // realClose() は、TransactionImpl のメソãƒ?ƒ‰ですã?
113                    if( tran != null ) { tran.realClose(); }
114                    tran = null;
115            }
116    
117            /**
118             * Transactionオブジェクトを返しますã?
119             *
120             * @return      Transactionオブジェクãƒ?
121             */
122            protected Transaction getTransaction() {
123                    return tran ;
124            }
125    
126            /**
127             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
128             *
129             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
130             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
131             *
132             * @param       strm    ObjectOutputStreamオブジェクãƒ?
133             * @throws IOException  入出力エラーが発生したå?å�?
134             */
135            private void writeObject( final ObjectOutputStream strm ) throws IOException {
136                    strm.defaultWriteObject();
137            }
138    
139            /**
140             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
141             *
142             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
143             *
144             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
145             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
146             *
147             * @param       strm    ObjectInputStreamオブジェクãƒ?
148             * @see #release2()
149             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
150             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
151             */
152            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
153                    strm.defaultReadObject();
154            }
155    
156            /**
157             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
158             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
159             *
160             * @return こã?クラスのæ–?­—å?表現
161             */
162            @Override
163            public String toString() {
164                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
165                                    .println( "VERSION"             ,VERSION        )
166                                    .println( "Other..."    ,getAttributes().getAttribute() )
167                                    .fixForm().toString() ;
168            }
169    }