/* * 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. */ package com.sun.corba.se.impl.transport; import java.io.InputStream; import java.io.IOException; import java.nio.ByteBuffer; import org.omg.CORBA.INTERNAL; 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.ByteBufferPool; import com.sun.corba.se.pept.transport.ContactInfo; import com.sun.corba.se.pept.transport.ContactInfoList; import com.sun.corba.se.pept.transport.Connection; import com.sun.corba.se.pept.transport.EventHandler; import com.sun.corba.se.pept.transport.OutboundConnectionCache; import com.sun.corba.se.spi.orb.ORB; import com.sun.corba.se.spi.ior.IOR; import com.sun.corba.se.spi.ior.ObjectKeyTemplate; import com.sun.corba.se.spi.ior.iiop.GIOPVersion; import com.sun.corba.se.spi.ior.iiop.IIOPAddress ; import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate; import com.sun.corba.se.spi.ior.iiop.IIOPProfile; import com.sun.corba.se.spi.protocol.CorbaMessageMediator; import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry; import com.sun.corba.se.spi.transport.CorbaConnection; import com.sun.corba.se.spi.transport.CorbaContactInfoList; import com.sun.corba.se.spi.transport.CorbaContactInfo; import com.sun.corba.se.impl.encoding.ByteBufferWithInfo; import com.sun.corba.se.impl.encoding.CDRInputObject; import com.sun.corba.se.impl.encoding.CDRInputStream_1_0; import com.sun.corba.se.impl.encoding.CDROutputObject; import com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl; import com.sun.corba.se.impl.protocol.giopmsgheaders.KeyAddr; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase; import com.sun.corba.se.impl.orbutil.ORBUtility; /** * @author Harold Carr */ public abstract class CorbaContactInfoBase implements CorbaContactInfo { protected ORB orb; protected CorbaContactInfoList contactInfoList; // NOTE: This may be different from same named one in CorbaContactInfoList. protected IOR effectiveTargetIOR; protected short addressingDisposition; protected OutboundConnectionCache connectionCache; //////////////////////////////////////////////////// // // pept.transport.ContactInfo // public Broker getBroker() { return orb; } public ContactInfoList getContactInfoList() { return contactInfoList; } public ClientRequestDispatcher getClientRequestDispatcher() { int scid = getEffectiveProfile().getObjectKeyTemplate().getSubcontractId() ; RequestDispatcherRegistry scr = orb.getRequestDispatcherRegistry() ; return scr.getClientRequestDispatcher( scid ) ; } // Note: not all derived classes will use a connection cache. // These are convenience methods that may not be used. public void setConnectionCache(OutboundConnectionCache connectionCache) { this.connectionCache = connectionCache; } public OutboundConnectionCache getConnectionCache() { return connectionCache; } // Called when client making an invocation. public MessageMediator createMessageMediator(Broker broker, ContactInfo contactInfo, Connection connection, String methodName, boolean isOneWay) { // REVISIT: Would like version, ior, requestid, etc., decisions // to be in client subcontract. Cannot pass these to this // factory method because it breaks generic abstraction. // Maybe set methods on mediator called from subcontract // after creation? CorbaMessageMediator messageMediator = new CorbaMessageMediatorImpl( (ORB) broker, contactInfo, connection, GIOPVersion.chooseRequestVersion( (ORB)broker, effectiveTargetIOR), effectiveTargetIOR, ((CorbaConnection)connection).getNextRequestId(), getAddressingDisposition(), methodName, isOneWay); return messageMediator; } // Called when connection handling a read event. public MessageMediator createMessageMediator(Broker broker,Connection conn) { ORB orb = (ORB) broker; CorbaConnection connection = (CorbaConnection) conn; if (orb.transportDebugFlag) { if (connection.shouldReadGiopHeaderOnly()) { dprint( ".createMessageMediator: waiting for message header on connection: " + connection); } else { dprint( ".createMessageMediator: waiting for message on connection: " + connection); } } Message msg = null; if (connection.shouldReadGiopHeaderOnly()) { // read giop header only msg = MessageBase.readGIOPHeader(orb, connection); } else { // read entire giop message msg = MessageBase.readGIOPMessage(orb, connection); } ByteBuffer byteBuffer = msg.getByteBuffer(); msg.setByteBuffer(null); CorbaMessageMediator messageMediator = new CorbaMessageMediatorImpl(orb, connection, msg, byteBuffer); return messageMediator; } // Called when connection reading message body public MessageMediator finishCreatingMessageMediator(Broker broker, Connection conn, MessageMediator messageMediator) { ORB orb = (ORB) broker; CorbaConnection connection = (CorbaConnection) conn; CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator)messageMediator; if (orb.transportDebugFlag) { dprint( ".finishCreatingMessageMediator: waiting for message body on connection: " + connection); } Message msg = corbaMessageMediator.getDispatchHeader(); msg.setByteBuffer(corbaMessageMediator.getDispatchBuffer()); // read giop body only msg = MessageBase.readGIOPBody(orb, connection, msg); ByteBuffer byteBuffer = msg.getByteBuffer(); msg.setByteBuffer(null); corbaMessageMediator.setDispatchHeader(msg); corbaMessageMediator.setDispatchBuffer(byteBuffer); return corbaMessageMediator; } public OutputObject createOutputObject(MessageMediator messageMediator) { CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator) messageMediator; OutputObject outputObject = sun.corba.OutputStreamFactory.newCDROutputObject(orb, messageMediator, corbaMessageMediator.getRequestHeader(), corbaMessageMediator.getStreamFormatVersion()); messageMediator.setOutputObject(outputObject); return outputObject; } public InputObject createInputObject(Broker broker, MessageMediator messageMediator) { // REVISIT: Duplicate of acceptor code. CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator) messageMediator; return new CDRInputObject((ORB)broker, (CorbaConnection)messageMediator.getConnection(), corbaMessageMediator.getDispatchBuffer(), corbaMessageMediator.getDispatchHeader()); } //////////////////////////////////////////////////// // // spi.transport.CorbaContactInfo // public short getAddressingDisposition() { return addressingDisposition; } public void setAddressingDisposition(short addressingDisposition) { this.addressingDisposition = addressingDisposition; } // REVISIT - remove this. public IOR getTargetIOR() { return contactInfoList.getTargetIOR(); } public IOR getEffectiveTargetIOR() { return effectiveTargetIOR ; } public IIOPProfile getEffectiveProfile() { return effectiveTargetIOR.getProfile(); } //////////////////////////////////////////////////// // // java.lang.Object // public String toString() { return "CorbaContactInfoBase[" + "]"; } //////////////////////////////////////////////////// // // Implementation // protected void dprint(String msg) { ORBUtility.dprint("CorbaContactInfoBase", msg); } } // End of file.