001: /*
002: * @(#) OTSServerTransactionInterceptor.java 1.0 02/07/15
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: OTSServerTransactionInterceptor.java,v 1.15 2004/12/13 19:50:05 tonyortiz Exp $
037: * --------------------------------------------------------------------------
038: */
039: package org.objectweb.jotm.ots;
040:
041: // java import
042: import java.util.Collections;
043: import java.util.HashMap;
044: import java.util.Map;
045:
046: import org.objectweb.jotm.Current;
047: import org.objectweb.jotm.InternalTransactionContext;
048: import org.objectweb.jotm.TransactionContext;
049: import org.omg.IOP.ServiceContext;
050: import org.omg.PortableInterceptor.ForwardRequest;
051: import org.omg.PortableInterceptor.ORBInitInfo;
052: import org.omg.PortableInterceptor.ServerRequestInfo;
053: import org.omg.PortableInterceptor.ServerRequestInterceptor;
054:
055: /**
056: * Class <code>OTSServerTransactionInterceptor</code> is a Server Interceptor for OTS Java Server
057: * of JOTM. This Interceptor translate the Standart OTS Propagation Context to a Internal JOTM
058: * Transaction context
059: *
060: * @author Guillaume Riviere (Guillaume.Riviere@inrialpes.fr)
061: * @version 1.0, 13/09/2002
062: */
063: public class OTSServerTransactionInterceptor extends OTSInterceptor
064: implements ServerRequestInterceptor {
065:
066: /**
067: * current object
068: */
069: private static Current current = null;
070:
071: /**
072: * Transaction context
073: */
074: private Map contexts = Collections.synchronizedMap(new HashMap());
075: // private TransactionContext txCtx = null;
076:
077: /**
078: * interceptor name
079: */
080: private String interceptorName = "OTSServerTransactionInteceptor";
081:
082: /**
083: * constructor
084: */
085: public OTSServerTransactionInterceptor(ORBInitInfo info) {
086: super (info);
087: }
088:
089: /**
090: * get the name of this interceptor
091: * @return name
092: */
093: public String name() {
094: return interceptorName;
095: }
096:
097: /**
098: * Receive request context
099: * @param jri JServerRequestInfo the server request information
100: * @exception IOException if an exception occur with the ObjectOutput
101: */
102: public void receive_request_service_contexts(ServerRequestInfo jri)
103: throws ForwardRequest {
104: try {
105: TransactionContext txCtx = decodeCorbaPropagationContext(jri
106: .get_request_service_context(TX_CTX_ID));
107:
108: if (txCtx != null) {
109: Object key = new Integer(jri.request_id());
110: contexts.put(key, txCtx);
111: }
112: } catch (org.omg.CORBA.BAD_PARAM b) {
113: // else we do nothing -> no transaction context for this call
114: } catch (Exception e) {
115: throw new ForwardRequest();
116: }
117: }
118:
119: /**
120: * Receive request
121: * @param jri JServerRequestInfo the server request information
122: * @exception IOException if an exception occur with the ObjectOutput
123: */
124: public void receive_request(ServerRequestInfo jri)
125: throws ForwardRequest {
126: if (current == null) {
127: current = Current.getCurrent();
128: }
129:
130: if (current != null) {
131: Object key = new Integer(jri.request_id());
132: InternalTransactionContext txCtx = (InternalTransactionContext) contexts
133: .remove(key);
134:
135: // put into the the Current object (false for the server side context)
136: current.setPropagationContext(txCtx, false);
137: }
138: }
139:
140: /**
141: * send reply with context
142: * @param jri JServerRequestInfo the server request information
143: * @exception IOException if an exception occur with the ObjectOutput
144: */
145: public void send_reply(ServerRequestInfo jri) {
146:
147: if (current == null) {
148: current = Current.getCurrent();
149: }
150:
151: if (current != null) {
152: try {
153: // get the Transaction Context (null if there is no transaction)
154: TransactionContext txCtx = current
155: .getPropagationContext(true);
156: ServiceContext pContext = null;
157:
158: if (txCtx != null) {
159:
160: // get the TransactionContext and build the Corba PropagtionContext
161: pContext = buildCorbaPropagationContext(txCtx);
162: jri.add_reply_service_context(pContext, true);
163: current.setPropagationContext(null, false);
164: } else {
165:
166: // if no active global transaction, the container does not include a tx context
167: // in the request message
168: }
169: } catch (Exception e) {
170: }
171: }
172: }
173:
174: public void send_exception(ServerRequestInfo jri)
175: throws ForwardRequest {
176: if (current == null) {
177: current = Current.getCurrent();
178: }
179:
180: if (current != null) {
181: try {
182: // get the Transaction Context (null if there is no transaction)
183: TransactionContext txCtx = current
184: .getPropagationContext(true);
185: ServiceContext pContext = null;
186:
187: if (txCtx != null) {
188:
189: // get the TransactionContext and build the Corba PropagtionContext
190: pContext = buildCorbaPropagationContext(txCtx);
191: jri.add_reply_service_context(pContext, true);
192: current.setPropagationContext(null, false);
193: } else {
194:
195: // if no active global transaction, the container does not include a tx context
196: // in the request message
197: }
198: } catch (Exception e) {
199: }
200: }
201: }
202:
203: public void send_other(ServerRequestInfo jri) throws ForwardRequest {
204: }
205:
206: public void destroy() {
207: }
208:
209: }
|