1. /*
  2. * @(#)CorbaContactInfoBase.java 1.14 04/06/21
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.corba.se.impl.transport;
  8. import java.io.InputStream;
  9. import java.io.IOException;
  10. import java.nio.ByteBuffer;
  11. import org.omg.CORBA.INTERNAL;
  12. import com.sun.corba.se.pept.broker.Broker;
  13. import com.sun.corba.se.pept.encoding.InputObject;
  14. import com.sun.corba.se.pept.encoding.OutputObject;
  15. import com.sun.corba.se.pept.protocol.ClientRequestDispatcher;
  16. import com.sun.corba.se.pept.protocol.MessageMediator;
  17. import com.sun.corba.se.pept.transport.ByteBufferPool;
  18. import com.sun.corba.se.pept.transport.ContactInfo;
  19. import com.sun.corba.se.pept.transport.ContactInfoList;
  20. import com.sun.corba.se.pept.transport.Connection;
  21. import com.sun.corba.se.pept.transport.EventHandler;
  22. import com.sun.corba.se.pept.transport.OutboundConnectionCache;
  23. import com.sun.corba.se.spi.orb.ORB;
  24. import com.sun.corba.se.spi.ior.IOR;
  25. import com.sun.corba.se.spi.ior.ObjectKeyTemplate;
  26. import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
  27. import com.sun.corba.se.spi.ior.iiop.IIOPAddress ;
  28. import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate;
  29. import com.sun.corba.se.spi.ior.iiop.IIOPProfile;
  30. import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
  31. import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
  32. import com.sun.corba.se.spi.transport.CorbaConnection;
  33. import com.sun.corba.se.spi.transport.CorbaContactInfoList;
  34. import com.sun.corba.se.spi.transport.CorbaContactInfo;
  35. import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
  36. import com.sun.corba.se.impl.encoding.CDRInputObject;
  37. import com.sun.corba.se.impl.encoding.CDRInputStream_1_0;
  38. import com.sun.corba.se.impl.encoding.CDROutputObject;
  39. import com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl;
  40. import com.sun.corba.se.impl.protocol.giopmsgheaders.KeyAddr;
  41. import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
  42. import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
  43. import com.sun.corba.se.impl.orbutil.ORBUtility;
  44. /**
  45. * @author Harold Carr
  46. */
  47. public abstract class CorbaContactInfoBase
  48. implements
  49. CorbaContactInfo
  50. {
  51. protected ORB orb;
  52. protected CorbaContactInfoList contactInfoList;
  53. // NOTE: This may be different from same named one in CorbaContactInfoList.
  54. protected IOR effectiveTargetIOR;
  55. protected short addressingDisposition;
  56. protected OutboundConnectionCache connectionCache;
  57. ////////////////////////////////////////////////////
  58. //
  59. // pept.transport.ContactInfo
  60. //
  61. public Broker getBroker()
  62. {
  63. return orb;
  64. }
  65. public ContactInfoList getContactInfoList()
  66. {
  67. return contactInfoList;
  68. }
  69. public ClientRequestDispatcher getClientRequestDispatcher()
  70. {
  71. int scid =
  72. getEffectiveProfile().getObjectKeyTemplate().getSubcontractId() ;
  73. RequestDispatcherRegistry scr = orb.getRequestDispatcherRegistry() ;
  74. return scr.getClientRequestDispatcher( scid ) ;
  75. }
  76. // Note: not all derived classes will use a connection cache.
  77. // These are convenience methods that may not be used.
  78. public void setConnectionCache(OutboundConnectionCache connectionCache)
  79. {
  80. this.connectionCache = connectionCache;
  81. }
  82. public OutboundConnectionCache getConnectionCache()
  83. {
  84. return connectionCache;
  85. }
  86. // Called when client making an invocation.
  87. public MessageMediator createMessageMediator(Broker broker,
  88. ContactInfo contactInfo,
  89. Connection connection,
  90. String methodName,
  91. boolean isOneWay)
  92. {
  93. // REVISIT: Would like version, ior, requestid, etc., decisions
  94. // to be in client subcontract. Cannot pass these to this
  95. // factory method because it breaks generic abstraction.
  96. // Maybe set methods on mediator called from subcontract
  97. // after creation?
  98. CorbaMessageMediator messageMediator =
  99. new CorbaMessageMediatorImpl(
  100. (ORB) broker,
  101. contactInfo,
  102. connection,
  103. GIOPVersion.chooseRequestVersion( (ORB)broker,
  104. effectiveTargetIOR),
  105. effectiveTargetIOR,
  106. ((CorbaConnection)connection).getNextRequestId(),
  107. getAddressingDisposition(),
  108. methodName,
  109. isOneWay);
  110. return messageMediator;
  111. }
  112. // Called when connection handling a read event.
  113. public MessageMediator createMessageMediator(Broker broker,Connection conn)
  114. {
  115. ORB orb = (ORB) broker;
  116. CorbaConnection connection = (CorbaConnection) conn;
  117. if (orb.transportDebugFlag) {
  118. if (connection.shouldReadGiopHeaderOnly()) {
  119. dprint(
  120. ".createMessageMediator: waiting for message header on connection: "
  121. + connection);
  122. } else {
  123. dprint(
  124. ".createMessageMediator: waiting for message on connection: "
  125. + connection);
  126. }
  127. }
  128. Message msg = null;
  129. if (connection.shouldReadGiopHeaderOnly()) {
  130. // read giop header only
  131. msg = MessageBase.readGIOPHeader(orb, connection);
  132. } else {
  133. // read entire giop message
  134. msg = MessageBase.readGIOPMessage(orb, connection);
  135. }
  136. ByteBuffer byteBuffer = msg.getByteBuffer();
  137. msg.setByteBuffer(null);
  138. CorbaMessageMediator messageMediator =
  139. new CorbaMessageMediatorImpl(orb, connection, msg, byteBuffer);
  140. return messageMediator;
  141. }
  142. // Called when connection reading message body
  143. public MessageMediator finishCreatingMessageMediator(Broker broker,
  144. Connection conn, MessageMediator messageMediator)
  145. {
  146. ORB orb = (ORB) broker;
  147. CorbaConnection connection = (CorbaConnection) conn;
  148. CorbaMessageMediator corbaMessageMediator =
  149. (CorbaMessageMediator)messageMediator;
  150. if (orb.transportDebugFlag) {
  151. dprint(
  152. ".finishCreatingMessageMediator: waiting for message body on connection: "
  153. + connection);
  154. }
  155. Message msg = corbaMessageMediator.getDispatchHeader();
  156. msg.setByteBuffer(corbaMessageMediator.getDispatchBuffer());
  157. // read giop body only
  158. msg = MessageBase.readGIOPBody(orb, connection, msg);
  159. ByteBuffer byteBuffer = msg.getByteBuffer();
  160. msg.setByteBuffer(null);
  161. corbaMessageMediator.setDispatchHeader(msg);
  162. corbaMessageMediator.setDispatchBuffer(byteBuffer);
  163. return corbaMessageMediator;
  164. }
  165. public OutputObject createOutputObject(MessageMediator messageMediator)
  166. {
  167. CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator)
  168. messageMediator;
  169. OutputObject outputObject =
  170. new CDROutputObject(orb, messageMediator,
  171. corbaMessageMediator.getRequestHeader(),
  172. corbaMessageMediator.getStreamFormatVersion());
  173. messageMediator.setOutputObject(outputObject);
  174. return outputObject;
  175. }
  176. public InputObject createInputObject(Broker broker,
  177. MessageMediator messageMediator)
  178. {
  179. // REVISIT: Duplicate of acceptor code.
  180. CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator)
  181. messageMediator;
  182. return new CDRInputObject((ORB)broker,
  183. (CorbaConnection)messageMediator.getConnection(),
  184. corbaMessageMediator.getDispatchBuffer(),
  185. corbaMessageMediator.getDispatchHeader());
  186. }
  187. ////////////////////////////////////////////////////
  188. //
  189. // spi.transport.CorbaContactInfo
  190. //
  191. public short getAddressingDisposition()
  192. {
  193. return addressingDisposition;
  194. }
  195. public void setAddressingDisposition(short addressingDisposition)
  196. {
  197. this.addressingDisposition = addressingDisposition;
  198. }
  199. // REVISIT - remove this.
  200. public IOR getTargetIOR()
  201. {
  202. return contactInfoList.getTargetIOR();
  203. }
  204. public IOR getEffectiveTargetIOR()
  205. {
  206. return effectiveTargetIOR ;
  207. }
  208. public IIOPProfile getEffectiveProfile()
  209. {
  210. return effectiveTargetIOR.getProfile();
  211. }
  212. ////////////////////////////////////////////////////
  213. //
  214. // java.lang.Object
  215. //
  216. public String toString()
  217. {
  218. return
  219. "CorbaContactInfoBase["
  220. + "]";
  221. }
  222. ////////////////////////////////////////////////////
  223. //
  224. // Implementation
  225. //
  226. protected void dprint(String msg)
  227. {
  228. ORBUtility.dprint("CorbaContactInfoBase", msg);
  229. }
  230. }
  231. // End of file.