blob: 9f9a5f65e27bd95930f119e2861d5624c6d5959a [file] [log] [blame]
/*
* 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.