1. /*
  2. * @(#)SharedCDRClientRequestDispatcherImpl.java 1.13 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. /*
  8. * Licensed Materials - Property of IBM
  9. * RMI-IIOP v1.0
  10. * Copyright IBM Corp. 1998 1999 All Rights Reserved
  11. *
  12. * US Government Users Restricted Rights - Use, duplication or
  13. * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  14. */
  15. package com.sun.corba.se.impl.protocol;
  16. import java.io.IOException;
  17. import java.util.Iterator;
  18. import java.rmi.RemoteException;
  19. import java.nio.ByteBuffer;
  20. import javax.rmi.CORBA.Util;
  21. import javax.rmi.CORBA.Tie;
  22. import org.omg.CORBA.COMM_FAILURE;
  23. import org.omg.CORBA.INTERNAL;
  24. import org.omg.CORBA.SystemException;
  25. import org.omg.CORBA.CompletionStatus;
  26. import org.omg.CORBA.WrongTransaction;
  27. import org.omg.CORBA.Request;
  28. import org.omg.CORBA.NamedValue;
  29. import org.omg.CORBA.NVList;
  30. import org.omg.CORBA.Context;
  31. import org.omg.CORBA.ContextList;
  32. import org.omg.CORBA.ExceptionList;
  33. import org.omg.CORBA.TypeCode;
  34. import org.omg.CORBA.DATA_CONVERSION;
  35. import org.omg.CORBA.UNKNOWN;
  36. import org.omg.CORBA.portable.RemarshalException;
  37. import org.omg.CORBA_2_3.portable.InputStream;
  38. import org.omg.CORBA_2_3.portable.OutputStream;
  39. import org.omg.CORBA.portable.Delegate;
  40. import org.omg.CORBA.portable.ServantObject;
  41. import org.omg.CORBA.portable.ApplicationException;
  42. import org.omg.CORBA.portable.UnknownException;
  43. import org.omg.IOP.TAG_CODE_SETS;
  44. import com.sun.org.omg.SendingContext.CodeBase;
  45. import com.sun.corba.se.pept.broker.Broker;
  46. import com.sun.corba.se.pept.encoding.InputObject;
  47. import com.sun.corba.se.pept.encoding.OutputObject;
  48. import com.sun.corba.se.pept.protocol.ClientRequestDispatcher;
  49. import com.sun.corba.se.pept.protocol.MessageMediator;
  50. import com.sun.corba.se.pept.transport.Connection;
  51. import com.sun.corba.se.pept.transport.ConnectionCache;
  52. import com.sun.corba.se.pept.transport.ContactInfo;
  53. import com.sun.corba.se.spi.ior.IOR;
  54. import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
  55. import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate;
  56. import com.sun.corba.se.spi.ior.iiop.CodeSetsComponent;
  57. import com.sun.corba.se.spi.oa.OAInvocationInfo;
  58. import com.sun.corba.se.spi.oa.ObjectAdapterFactory;
  59. import com.sun.corba.se.spi.orb.ORB;
  60. import com.sun.corba.se.spi.orb.ORBVersion;
  61. import com.sun.corba.se.spi.orb.ORBVersionFactory;
  62. import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
  63. import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
  64. import com.sun.corba.se.spi.transport.CorbaContactInfo ;
  65. import com.sun.corba.se.spi.transport.CorbaContactInfoList ;
  66. import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator ;
  67. import com.sun.corba.se.spi.transport.CorbaConnection;
  68. import com.sun.corba.se.spi.servicecontext.ServiceContext;
  69. import com.sun.corba.se.spi.servicecontext.ServiceContexts;
  70. import com.sun.corba.se.spi.servicecontext.UEInfoServiceContext;
  71. import com.sun.corba.se.spi.servicecontext.CodeSetServiceContext;
  72. import com.sun.corba.se.spi.servicecontext.MaxStreamFormatVersionServiceContext;
  73. import com.sun.corba.se.spi.servicecontext.SendingContextServiceContext;
  74. import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
  75. import com.sun.corba.se.impl.encoding.CDRInputObject;
  76. import com.sun.corba.se.impl.encoding.CDROutputObject;
  77. import com.sun.corba.se.impl.encoding.CDROutputStream;
  78. import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;
  79. import com.sun.corba.se.impl.encoding.CodeSetConversion;
  80. import com.sun.corba.se.impl.encoding.MarshalOutputStream;
  81. import com.sun.corba.se.impl.encoding.MarshalInputStream;
  82. import com.sun.corba.se.impl.orbutil.ORBUtility;
  83. import com.sun.corba.se.impl.orbutil.ORBConstants;
  84. import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
  85. import com.sun.corba.se.impl.protocol.giopmsgheaders.KeyAddr;
  86. import com.sun.corba.se.impl.protocol.giopmsgheaders.ProfileAddr;
  87. import com.sun.corba.se.impl.protocol.giopmsgheaders.ReferenceAddr;
  88. import com.sun.corba.se.impl.transport.CorbaContactInfoListIteratorImpl;
  89. import com.sun.corba.se.impl.util.JDKBridge;
  90. /**
  91. * ClientDelegate is the RMI client-side subcontract or representation
  92. * It implements RMI delegate as well as our internal ClientRequestDispatcher
  93. * interface.
  94. */
  95. public class SharedCDRClientRequestDispatcherImpl
  96. extends
  97. CorbaClientRequestDispatcherImpl
  98. {
  99. // REVISIT:
  100. // Rather than have separate CDR subcontract,
  101. // use same CorbaClientRequestDispatcherImpl but have
  102. // different MessageMediator finishSendingRequest and waitForResponse
  103. // handle what is done below.
  104. // Benefit: then in ContactInfo no need to do a direct new
  105. // of subcontract - does not complicate subcontract registry.
  106. public InputObject marshalingComplete(java.lang.Object self,
  107. OutputObject outputObject)
  108. throws
  109. ApplicationException,
  110. org.omg.CORBA.portable.RemarshalException
  111. {
  112. ORB orb = null;
  113. CorbaMessageMediator messageMediator = null;
  114. try {
  115. messageMediator = (CorbaMessageMediator)
  116. outputObject.getMessageMediator();
  117. orb = (ORB) messageMediator.getBroker();
  118. if (orb.subcontractDebugFlag) {
  119. dprint(".marshalingComplete->: " + opAndId(messageMediator));
  120. }
  121. CDROutputObject cdrOutputObject = (CDROutputObject) outputObject;
  122. //
  123. // Create server-side input object.
  124. //
  125. ByteBufferWithInfo bbwi = cdrOutputObject.getByteBufferWithInfo();
  126. cdrOutputObject.getMessageHeader().setSize(bbwi.byteBuffer, bbwi.getSize());
  127. CDRInputObject cdrInputObject =
  128. new CDRInputObject(orb, null, bbwi.byteBuffer,
  129. cdrOutputObject.getMessageHeader());
  130. messageMediator.setInputObject(cdrInputObject);
  131. cdrInputObject.setMessageMediator(messageMediator);
  132. //
  133. // Dispatch
  134. //
  135. // REVISIT: Impl cast.
  136. ((CorbaMessageMediatorImpl)messageMediator).handleRequestRequest(
  137. messageMediator);
  138. // InputStream must be closed on the InputObject so that its
  139. // ByteBuffer can be released to the ByteBufferPool. We must do
  140. // this before we re-assign the cdrInputObject reference below.
  141. try { cdrInputObject.close(); }
  142. catch (IOException ex) {
  143. // No need to do anything since we're done with the input stream
  144. // and cdrInputObject will be re-assigned a new client-side input
  145. // object, (i.e. won't result in a corba error).
  146. if (orb.transportDebugFlag) {
  147. dprint(".marshalingComplete: ignoring IOException - " + ex.toString());
  148. }
  149. }
  150. //
  151. // Create client-side input object
  152. //
  153. cdrOutputObject = (CDROutputObject) messageMediator.getOutputObject();
  154. bbwi = cdrOutputObject.getByteBufferWithInfo();
  155. cdrOutputObject.getMessageHeader().setSize(bbwi.byteBuffer, bbwi.getSize());
  156. cdrInputObject =
  157. new CDRInputObject(orb, null, bbwi.byteBuffer,
  158. cdrOutputObject.getMessageHeader());
  159. messageMediator.setInputObject(cdrInputObject);
  160. cdrInputObject.setMessageMediator(messageMediator);
  161. cdrInputObject.unmarshalHeader();
  162. InputObject inputObject = cdrInputObject;
  163. return processResponse(orb, messageMediator, inputObject);
  164. } finally {
  165. if (orb.subcontractDebugFlag) {
  166. dprint(".marshalingComplete<-: " + opAndId(messageMediator));
  167. }
  168. }
  169. }
  170. protected void dprint(String msg)
  171. {
  172. ORBUtility.dprint("SharedCDRClientRequestDispatcherImpl", msg);
  173. }
  174. }
  175. // End of file.