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 }