CorbaContactInfoBase.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.corba.se.impl.transport;
27
28import java.io.InputStream;
29import java.io.IOException;
30import java.nio.ByteBuffer;
31
32import org.omg.CORBA.INTERNAL;
33
34import com.sun.corba.se.pept.broker.Broker;
35import com.sun.corba.se.pept.encoding.InputObject;
36import com.sun.corba.se.pept.encoding.OutputObject;
37import com.sun.corba.se.pept.protocol.ClientRequestDispatcher;
38import com.sun.corba.se.pept.protocol.MessageMediator;
39import com.sun.corba.se.pept.transport.ByteBufferPool;
40import com.sun.corba.se.pept.transport.ContactInfo;
41import com.sun.corba.se.pept.transport.ContactInfoList;
42import com.sun.corba.se.pept.transport.Connection;
43import com.sun.corba.se.pept.transport.EventHandler;
44import com.sun.corba.se.pept.transport.OutboundConnectionCache;
45
46import com.sun.corba.se.spi.orb.ORB;
47import com.sun.corba.se.spi.ior.IOR;
48import com.sun.corba.se.spi.ior.ObjectKeyTemplate;
49import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
50import com.sun.corba.se.spi.ior.iiop.IIOPAddress ;
51import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate;
52import com.sun.corba.se.spi.ior.iiop.IIOPProfile;
53import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
54import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
55import com.sun.corba.se.spi.transport.CorbaConnection;
56import com.sun.corba.se.spi.transport.CorbaContactInfoList;
57import com.sun.corba.se.spi.transport.CorbaContactInfo;
58
59import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
60import com.sun.corba.se.impl.encoding.CDRInputObject;
61import com.sun.corba.se.impl.encoding.CDRInputStream_1_0;
62import com.sun.corba.se.impl.encoding.CDROutputObject;
63import com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl;
64import com.sun.corba.se.impl.protocol.giopmsgheaders.KeyAddr;
65import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
66import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
67import com.sun.corba.se.impl.orbutil.ORBUtility;
68
69/**
70 * @author Harold Carr
71 */
72public abstract class CorbaContactInfoBase
73    implements
74        CorbaContactInfo
75{
76    protected ORB orb;
77    protected CorbaContactInfoList contactInfoList;
78    // NOTE: This may be different from same named one in CorbaContactInfoList.
79    protected IOR effectiveTargetIOR;
80    protected short addressingDisposition;
81    protected OutboundConnectionCache connectionCache;
82
83    ////////////////////////////////////////////////////
84    //
85    // pept.transport.ContactInfo
86    //
87
88    public Broker getBroker()
89    {
90        return orb;
91    }
92
93    public ContactInfoList getContactInfoList()
94    {
95        return contactInfoList;
96    }
97
98    public ClientRequestDispatcher getClientRequestDispatcher()
99    {
100        int scid =
101            getEffectiveProfile().getObjectKeyTemplate().getSubcontractId() ;
102        RequestDispatcherRegistry scr = orb.getRequestDispatcherRegistry() ;
103        return scr.getClientRequestDispatcher( scid ) ;
104    }
105
106    // Note: not all derived classes will use a connection cache.
107    // These are convenience methods that may not be used.
108    public void setConnectionCache(OutboundConnectionCache connectionCache)
109    {
110        this.connectionCache = connectionCache;
111    }
112
113    public OutboundConnectionCache getConnectionCache()
114    {
115        return connectionCache;
116    }
117
118    // Called when client making an invocation.
119    public MessageMediator createMessageMediator(Broker broker,
120                                                 ContactInfo contactInfo,
121                                                 Connection connection,
122                                                 String methodName,
123                                                 boolean isOneWay)
124    {
125        // REVISIT: Would like version, ior, requestid, etc., decisions
126        // to be in client subcontract.  Cannot pass these to this
127        // factory method because it breaks generic abstraction.
128        // Maybe set methods on mediator called from subcontract
129        // after creation?
130        CorbaMessageMediator messageMediator =
131            new CorbaMessageMediatorImpl(
132                (ORB) broker,
133                contactInfo,
134                connection,
135                GIOPVersion.chooseRequestVersion( (ORB)broker,
136                     effectiveTargetIOR),
137                effectiveTargetIOR,
138                ((CorbaConnection)connection).getNextRequestId(),
139                getAddressingDisposition(),
140                methodName,
141                isOneWay);
142
143        return messageMediator;
144    }
145
146    // Called when connection handling a read event.
147    public MessageMediator createMessageMediator(Broker broker,Connection conn)
148    {
149        ORB orb = (ORB) broker;
150        CorbaConnection connection = (CorbaConnection) conn;
151
152        if (orb.transportDebugFlag) {
153            if (connection.shouldReadGiopHeaderOnly()) {
154                dprint(
155                ".createMessageMediator: waiting for message header on connection: "
156                + connection);
157            } else {
158                dprint(
159                ".createMessageMediator: waiting for message on connection: "
160                + connection);
161            }
162        }
163
164        Message msg = null;
165
166        if (connection.shouldReadGiopHeaderOnly()) {
167            // read giop header only
168            msg = MessageBase.readGIOPHeader(orb, connection);
169        } else {
170            // read entire giop message
171            msg = MessageBase.readGIOPMessage(orb, connection);
172        }
173
174        ByteBuffer byteBuffer = msg.getByteBuffer();
175        msg.setByteBuffer(null);
176        CorbaMessageMediator messageMediator =
177            new CorbaMessageMediatorImpl(orb, connection, msg, byteBuffer);
178
179        return messageMediator;
180    }
181
182    // Called when connection reading message body
183    public MessageMediator finishCreatingMessageMediator(Broker broker,
184                               Connection conn, MessageMediator messageMediator)
185    {
186        ORB orb = (ORB) broker;
187        CorbaConnection connection = (CorbaConnection) conn;
188        CorbaMessageMediator corbaMessageMediator =
189                      (CorbaMessageMediator)messageMediator;
190
191        if (orb.transportDebugFlag) {
192            dprint(
193            ".finishCreatingMessageMediator: waiting for message body on connection: "
194                + connection);
195        }
196
197        Message msg = corbaMessageMediator.getDispatchHeader();
198        msg.setByteBuffer(corbaMessageMediator.getDispatchBuffer());
199
200        // read giop body only
201        msg = MessageBase.readGIOPBody(orb, connection, msg);
202
203        ByteBuffer byteBuffer = msg.getByteBuffer();
204        msg.setByteBuffer(null);
205        corbaMessageMediator.setDispatchHeader(msg);
206        corbaMessageMediator.setDispatchBuffer(byteBuffer);
207
208        return corbaMessageMediator;
209    }
210
211    public OutputObject createOutputObject(MessageMediator messageMediator)
212    {
213        CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator)
214            messageMediator;
215
216        OutputObject outputObject =
217            sun.corba.OutputStreamFactory.newCDROutputObject(orb, messageMediator,
218                                corbaMessageMediator.getRequestHeader(),
219                                corbaMessageMediator.getStreamFormatVersion());
220
221        messageMediator.setOutputObject(outputObject);
222        return outputObject;
223    }
224
225    public InputObject createInputObject(Broker broker,
226                                         MessageMediator messageMediator)
227    {
228        // REVISIT: Duplicate of acceptor code.
229        CorbaMessageMediator corbaMessageMediator = (CorbaMessageMediator)
230            messageMediator;
231        return new CDRInputObject((ORB)broker,
232                                  (CorbaConnection)messageMediator.getConnection(),
233                                  corbaMessageMediator.getDispatchBuffer(),
234                                  corbaMessageMediator.getDispatchHeader());
235    }
236
237    ////////////////////////////////////////////////////
238    //
239    // spi.transport.CorbaContactInfo
240    //
241
242    public short getAddressingDisposition()
243    {
244        return addressingDisposition;
245    }
246
247    public void setAddressingDisposition(short addressingDisposition)
248    {
249        this.addressingDisposition = addressingDisposition;
250    }
251
252    // REVISIT - remove this.
253    public IOR getTargetIOR()
254    {
255        return  contactInfoList.getTargetIOR();
256    }
257
258    public IOR getEffectiveTargetIOR()
259    {
260        return effectiveTargetIOR ;
261    }
262
263    public IIOPProfile getEffectiveProfile()
264    {
265        return effectiveTargetIOR.getProfile();
266    }
267
268    ////////////////////////////////////////////////////
269    //
270    // java.lang.Object
271    //
272
273    public String toString()
274    {
275        return
276            "CorbaContactInfoBase["
277            + "]";
278    }
279
280
281    ////////////////////////////////////////////////////
282    //
283    // Implementation
284    //
285
286    protected void dprint(String msg)
287    {
288        ORBUtility.dprint("CorbaContactInfoBase", msg);
289    }
290}
291
292// End of file.
293