/* * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * Licensed Materials - Property of IBM * RMI-IIOP v1.0 * Copyright IBM Corp. 1998 1999 All Rights Reserved * */ package com.sun.corba.se.impl.protocol; import java.io.IOException; import java.util.Iterator; import java.rmi.RemoteException; import java.nio.ByteBuffer; import java.security.AccessController; import java.security.PrivilegedAction; import javax.rmi.CORBA.Util; import javax.rmi.CORBA.Tie; import org.omg.CORBA.COMM_FAILURE; import org.omg.CORBA.INTERNAL; import org.omg.CORBA.SystemException; import org.omg.CORBA.CompletionStatus; import org.omg.CORBA.WrongTransaction; import org.omg.CORBA.Request; import org.omg.CORBA.NamedValue; import org.omg.CORBA.NVList; import org.omg.CORBA.Context; import org.omg.CORBA.ContextList; import org.omg.CORBA.ExceptionList; import org.omg.CORBA.TypeCode; import org.omg.CORBA.DATA_CONVERSION; import org.omg.CORBA.UNKNOWN; import org.omg.CORBA.portable.RemarshalException; import org.omg.CORBA_2_3.portable.InputStream; import org.omg.CORBA_2_3.portable.OutputStream; import org.omg.CORBA.portable.Delegate; import org.omg.CORBA.portable.ServantObject; import org.omg.CORBA.portable.ApplicationException; import org.omg.CORBA.portable.UnknownException; import org.omg.IOP.TAG_CODE_SETS; import com.sun.org.omg.SendingContext.CodeBase; import com.sun.corba.se.pept.broker.Broker; import com.sun.corba.se.pept.encoding.InputObject; import com.sun.corba.se.pept.encoding.OutputObject; import com.sun.corba.se.pept.protocol.ClientRequestDispatcher; import com.sun.corba.se.pept.protocol.MessageMediator; import com.sun.corba.se.pept.transport.Connection; import com.sun.corba.se.pept.transport.ConnectionCache; import com.sun.corba.se.pept.transport.ContactInfo; import com.sun.corba.se.spi.ior.IOR; import com.sun.corba.se.spi.ior.iiop.GIOPVersion; import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate; import com.sun.corba.se.spi.ior.iiop.CodeSetsComponent; import com.sun.corba.se.spi.oa.OAInvocationInfo; import com.sun.corba.se.spi.oa.ObjectAdapterFactory; import com.sun.corba.se.spi.orb.ORB; import com.sun.corba.se.spi.orb.ORBVersion; import com.sun.corba.se.spi.orb.ORBVersionFactory; import com.sun.corba.se.spi.protocol.CorbaMessageMediator; import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry; import com.sun.corba.se.spi.transport.CorbaContactInfo ; import com.sun.corba.se.spi.transport.CorbaContactInfoList ; import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator ; import com.sun.corba.se.spi.transport.CorbaConnection; import com.sun.corba.se.spi.servicecontext.ServiceContext; import com.sun.corba.se.spi.servicecontext.ServiceContexts; import com.sun.corba.se.spi.servicecontext.UEInfoServiceContext; import com.sun.corba.se.spi.servicecontext.CodeSetServiceContext; import com.sun.corba.se.spi.servicecontext.MaxStreamFormatVersionServiceContext; import com.sun.corba.se.spi.servicecontext.SendingContextServiceContext; import com.sun.corba.se.impl.encoding.ByteBufferWithInfo; import com.sun.corba.se.impl.encoding.CDRInputObject; import com.sun.corba.se.impl.encoding.CDROutputObject; import com.sun.corba.se.impl.encoding.CDROutputStream; import com.sun.corba.se.impl.encoding.CodeSetComponentInfo; import com.sun.corba.se.impl.encoding.CodeSetConversion; import com.sun.corba.se.impl.encoding.MarshalOutputStream; import com.sun.corba.se.impl.encoding.MarshalInputStream; import com.sun.corba.se.impl.orbutil.ORBUtility; import com.sun.corba.se.impl.orbutil.ORBConstants; import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage; import com.sun.corba.se.impl.protocol.giopmsgheaders.KeyAddr; import com.sun.corba.se.impl.protocol.giopmsgheaders.ProfileAddr; import com.sun.corba.se.impl.protocol.giopmsgheaders.ReferenceAddr; import com.sun.corba.se.impl.transport.CorbaContactInfoListIteratorImpl; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; import com.sun.corba.se.impl.util.JDKBridge; /** * ClientDelegate is the RMI client-side subcontract or representation * It implements RMI delegate as well as our internal ClientRequestDispatcher * interface. */ public class SharedCDRClientRequestDispatcherImpl extends CorbaClientRequestDispatcherImpl { // REVISIT: // Rather than have separate CDR subcontract, // use same CorbaClientRequestDispatcherImpl but have // different MessageMediator finishSendingRequest and waitForResponse // handle what is done below. // Benefit: then in ContactInfo no need to do a direct new // of subcontract - does not complicate subcontract registry. public InputObject marshalingComplete(java.lang.Object self, OutputObject outputObject) throws ApplicationException, org.omg.CORBA.portable.RemarshalException { ORB orb = null; CorbaMessageMediator messageMediator = null; try { messageMediator = (CorbaMessageMediator) outputObject.getMessageMediator(); orb = (ORB) messageMediator.getBroker(); if (orb.subcontractDebugFlag) { dprint(".marshalingComplete->: " + opAndId(messageMediator)); } CDROutputObject cdrOutputObject = (CDROutputObject) outputObject; // // Create server-side input object. // ByteBufferWithInfo bbwi = cdrOutputObject.getByteBufferWithInfo(); cdrOutputObject.getMessageHeader().setSize(bbwi.byteBuffer, bbwi.getSize()); final ORB inOrb = orb; final ByteBuffer inBuffer = bbwi.byteBuffer; final Message inMsg = cdrOutputObject.getMessageHeader(); CDRInputObject cdrInputObject = AccessController .doPrivileged(new PrivilegedAction<CDRInputObject>() { @Override public CDRInputObject run() { return new CDRInputObject(inOrb, null, inBuffer, inMsg); } }); messageMediator.setInputObject(cdrInputObject); cdrInputObject.setMessageMediator(messageMediator); // // Dispatch // // REVISIT: Impl cast. ((CorbaMessageMediatorImpl)messageMediator).handleRequestRequest( messageMediator); // InputStream must be closed on the InputObject so that its // ByteBuffer can be released to the ByteBufferPool. We must do // this before we re-assign the cdrInputObject reference below. try { cdrInputObject.close(); } catch (IOException ex) { // No need to do anything since we're done with the input stream // and cdrInputObject will be re-assigned a new client-side input // object, (i.e. won't result in a corba error). if (orb.transportDebugFlag) { dprint(".marshalingComplete: ignoring IOException - " + ex.toString()); } } // // Create client-side input object // cdrOutputObject = (CDROutputObject) messageMediator.getOutputObject(); bbwi = cdrOutputObject.getByteBufferWithInfo(); cdrOutputObject.getMessageHeader().setSize(bbwi.byteBuffer, bbwi.getSize()); final ORB inOrb2 = orb; final ByteBuffer inBuffer2 = bbwi.byteBuffer; final Message inMsg2 = cdrOutputObject.getMessageHeader(); cdrInputObject = AccessController .doPrivileged(new PrivilegedAction<CDRInputObject>() { @Override public CDRInputObject run() { return new CDRInputObject(inOrb2, null, inBuffer2, inMsg2); } }); messageMediator.setInputObject(cdrInputObject); cdrInputObject.setMessageMediator(messageMediator); cdrInputObject.unmarshalHeader(); InputObject inputObject = cdrInputObject; return processResponse(orb, messageMediator, inputObject); } finally { if (orb.subcontractDebugFlag) { dprint(".marshalingComplete<-: " + opAndId(messageMediator)); } } } protected void dprint(String msg) { ORBUtility.dprint("SharedCDRClientRequestDispatcherImpl", msg); } } // End of file.