001: /*
002: * @(#) JTAServerTransactionInterceptor
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: JTAServerTransactionInterceptor.java,v 1.9 2005/02/24 04:34:56 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.JServerRequestInfo;
045: import org.objectweb.carol.rmi.jrmp.interceptor.JServerRequestInterceptor;
046: import org.objectweb.jotm.Current;
047: import org.objectweb.jotm.TransactionContext;
048:
049: /**
050: * Class <code>JTAServerTransactionInterceptor</code> is a JRMP Transaction server interceptor for
051: * Transaction Context propagation
052: *
053: * @author Guillaume Riviere (Guillaume.Riviere@inrialpes.fr)
054: *
055: */
056: public class JTAServerTransactionInterceptor implements
057: JServerRequestInterceptor {
058:
059: // Commented out all the tracing in this module, generated
060: // warnings when integrated with JONAS at JONAS START.
061: // Need to resolve whenever JONAS uses log4j.
062: // private static Log log =
063: // LogFactory.getLog("org.objectweb.jotm.jta.rmi.server");
064:
065: /**
066: * transaction context id
067: */
068: public static int TX_CTX_ID = 0;
069:
070: /**
071: * current object
072: */
073: private static Current current = null;
074:
075: /**
076: * interceptor name
077: */
078: private static String interceptorName = "JTAServerTransactionInterceptor";
079:
080: /**
081: * constructor
082: */
083: public JTAServerTransactionInterceptor() {
084: // log.trace("default constructor");
085: }
086:
087: /**
088: * Receive request
089: * @param jri JServerRequestInfo the jrmp server request information
090: * @exception IOException if an exception occur with the ObjectOutput
091: */
092: public void receive_request(JServerRequestInfo jri)
093: throws IOException {
094: // log.trace("--> receive request");
095: if (current == null)
096: current = Current.getCurrent();
097: if (current != null) {
098: JTATransactionServiceContext jtasc = (JTATransactionServiceContext) jri
099: .get_request_service_context(TX_CTX_ID);
100: if (jtasc != null) {
101: // put into the the Current object (true for client side context
102: current.setPropagationContext(jtasc
103: .getTransactionContext(), false);
104: }
105: }
106: }
107:
108: /**
109: * send reply with context
110: * @param jri JServerRequestInfo the jrmp server request information
111: * @exception IOException if an exception occur with the ObjectOutput
112: */
113: public void send_reply(JServerRequestInfo jri) throws IOException {
114: if (current == null)
115: current = Current.getCurrent();
116: if (current != null) {
117: // get the Transaction Context (null if there is no transaction)
118: TransactionContext txCtx = current
119: .getPropagationContext(false);
120: if (txCtx != null) {
121: JTATransactionServiceContext jtasc = new JTATransactionServiceContext();
122: jtasc.setContext(txCtx, true);
123: jri.add_reply_service_context(jtasc);
124: current.setPropagationContext(null, false);
125: }
126: }
127: // log.trace("<-- sent reply");
128: }
129:
130: /**
131: * get the name of this interceptor
132: * @return name
133: */
134: public String name() {
135: return interceptorName;
136: }
137:
138: public void send_exception(JServerRequestInfo jri)
139: throws IOException {
140: if (current == null)
141: current = Current.getCurrent();
142: if (current != null) {
143: // get the Transaction Context (null if there is no transaction)
144: TransactionContext txCtx = current
145: .getPropagationContext(false);
146: if (txCtx != null) {
147: JTATransactionServiceContext jtasc = new JTATransactionServiceContext();
148: jtasc.setContext(txCtx, true);
149: jri.add_reply_service_context(jtasc);
150: current.setPropagationContext(null, false);
151: }
152: }
153: // log.trace("<-- sent exception");
154: }
155:
156: public void send_other(JServerRequestInfo jri) throws IOException {
157: if (current == null)
158: current = Current.getCurrent();
159: if (current != null) {
160: // get the Transaction Context (null if there is no transaction)
161: TransactionContext txCtx = current
162: .getPropagationContext(false);
163: if (txCtx != null) {
164: JTATransactionServiceContext jtasc = new JTATransactionServiceContext();
165: jtasc.setContext(txCtx, true);
166: jri.add_reply_service_context(jtasc);
167: current.setPropagationContext(null, false);
168: }
169: }
170: // log.trace("<-- sent other");
171: }
172: }
|