001: /*
002: * @(#) JTAClientTransactionInterceptor
003: *
004: * JOTM: Java Open Transaction Manager
005: *
006: * This module was originally developed by
007: * - INRIA inside the ObjectWeb Consortium(http://www.objectweb.org)
008: *
009: * The original code and portions created by INRIA are
010: * Copyright (C) 2002 - INRIA (www.inria.fr)
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * -Redistributions of source code must retain the above copyright notice, this
017: * list of conditions and the following disclaimer.
018: *
019: * -Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
024: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
025: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
026: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
027: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
028: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
029: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
030: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
031: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
032: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
033: * POSSIBILITY OF SUCH DAMAGE.
034: *
035: * --------------------------------------------------------------------------
036: * $Id: JTAClientTransactionInterceptor.java,v 1.9 2005/02/24 04:32:40 tonyortiz Exp $
037: * --------------------------------------------------------------------------
038: */
039: package org.objectweb.jotm.jta.rmi;
040:
041: // java import
042: import java.io.IOException;
043:
044: import org.objectweb.carol.rmi.jrmp.interceptor.JClientRequestInfo;
045: import org.objectweb.carol.rmi.jrmp.interceptor.JClientRequestInterceptor;
046: import org.objectweb.jotm.Current;
047: import org.objectweb.jotm.TransactionContext;
048:
049: /**
050: * Class <code>JTAClientTransactionInterceptor</code> is a JRMP Transaction client interceptor for
051: * Transaction Context propagation
052: *
053: * @author Guillaume Riviere (Guillaume.Riviere@inrialpes.fr)
054: */
055: public class JTAClientTransactionInterceptor implements
056: JClientRequestInterceptor {
057:
058: // Commented out all the tracing in this module, generated
059: // warnings when integrated with JONAS at JONAS START.
060: // Need to resolve whenever JONAS uses log4j.
061: // private static Log log =
062: // LogFactory.getLog("org.objectweb.jotm.jta.rmi.client");
063:
064: /**
065: * transaction context id
066: */
067: public static int TX_CTX_ID = 0;
068:
069: /**
070: * current object
071: */
072: private static Current current = null;
073:
074: /**
075: * interceptor name
076: */
077: private static String interceptorName = "JTAClientTransactionInterceptor";
078:
079: /**
080: * constructor
081: */
082: public JTAClientTransactionInterceptor() {
083: // log.trace("default constructor");
084: }
085:
086: /**
087: * get the name of this interceptor
088: * @return name
089: */
090: public String name() {
091: return interceptorName;
092: }
093:
094: /**
095: * send client context with the request. The sendingRequest method of the JPortableInterceptors
096: * is called prior to marshalling arguments and contexts
097: * @param jri JClientRequestInfo the jrmp client info
098: * @exception IOException if an exception occur with the ObjectOutput
099: */
100: public void send_request(JClientRequestInfo jri) throws IOException {
101: // log.trace("--> send request");
102: try {
103: if (current == null)
104: current = Current.getCurrent();
105: if (current != null) {
106: // get the Transaction Context (null if there is no transaction)
107: TransactionContext txCtx = current
108: .getPropagationContext(true);
109: if (txCtx != null) {
110: JTATransactionServiceContext jtasc = new JTATransactionServiceContext();
111: jtasc.setContext(txCtx, false);
112: jri.add_request_service_context(jtasc);
113: }
114: }
115: } catch (Exception e) {
116: e.printStackTrace();
117: }
118: }
119:
120: /**
121: * Receive reply interception
122: * @param jri JClientRequestInfo the jrmp client info
123: * @exception IOException if an exception occur with the ObjectOutput
124: */
125: public void receive_reply(JClientRequestInfo jri)
126: throws IOException {
127: if (current == null)
128: current = Current.getCurrent();
129: if (current != null) {
130: JTATransactionServiceContext jtasc = (JTATransactionServiceContext) jri
131: .get_reply_service_context(TX_CTX_ID);
132: if (jtasc != null) {
133: // put into the the Current object (true for client side context
134: current.setPropagationContext(jtasc
135: .getTransactionContext(), true);
136: }
137: }
138: // log.trace("<-- received reply");
139: }
140:
141: // empty method
142: public void send_poll(JClientRequestInfo jri) throws IOException {
143: // log.trace("--> send poll");
144: }
145:
146: public void receive_exception(JClientRequestInfo jri)
147: throws IOException {
148: // log.trace("<-- received exception");
149: if (current == null)
150: current = Current.getCurrent();
151: if (current != null) {
152: JTATransactionServiceContext jtasc = (JTATransactionServiceContext) jri
153: .get_reply_service_context(TX_CTX_ID);
154: if (jtasc != null) {
155: // put into the the Current object (true for client side context
156: current.setPropagationContext(jtasc
157: .getTransactionContext(), true);
158: }
159: }
160: }
161:
162: public void receive_other(JClientRequestInfo jri)
163: throws IOException {
164: if (current == null)
165: current = Current.getCurrent();
166: if (current != null) {
167: JTATransactionServiceContext jtasc = (JTATransactionServiceContext) jri
168: .get_reply_service_context(TX_CTX_ID);
169: if (jtasc != null) {
170: // put into the the Current object (true for client side context
171: current.setPropagationContext(jtasc
172: .getTransactionContext(), true);
173: }
174: }
175: // log.trace("<-- received other");
176: }
177: }
|