ReplyMessage_1_0.java revision 608:7e06bf1dcb09
1182918Smarius/*
2182918Smarius * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
3182918Smarius * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4182918Smarius *
5182918Smarius * This code is free software; you can redistribute it and/or modify it
6182918Smarius * under the terms of the GNU General Public License version 2 only, as
7182918Smarius * published by the Free Software Foundation.  Oracle designates this
8182918Smarius * particular file as subject to the "Classpath" exception as provided
9182918Smarius * by Oracle in the LICENSE file that accompanied this code.
10182918Smarius *
11182918Smarius * This code is distributed in the hope that it will be useful, but WITHOUT
12182918Smarius * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13182918Smarius * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14182918Smarius * version 2 for more details (a copy is included in the LICENSE file that
15182918Smarius * accompanied this code).
16182918Smarius *
17182918Smarius * You should have received a copy of the GNU General Public License version
18182918Smarius * 2 along with this work; if not, write to the Free Software Foundation,
19182918Smarius * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20182918Smarius *
21182918Smarius * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22182918Smarius * or visit www.oracle.com if you need additional information or have any
23182918Smarius * questions.
24182918Smarius */
25182918Smarius
26182918Smariuspackage com.sun.corba.se.impl.protocol.giopmsgheaders;
27182918Smarius
28182918Smariusimport org.omg.CORBA.INTERNAL;
29182918Smariusimport org.omg.CORBA.CompletionStatus;
30182918Smariusimport org.omg.CORBA.SystemException;
31182918Smarius
32182918Smariusimport com.sun.corba.se.spi.ior.IOR;
33182918Smariusimport com.sun.corba.se.spi.ior.IORFactories;
34182918Smarius
35182918Smariusimport com.sun.corba.se.spi.orb.ORB;
36182918Smarius
37182918Smariusimport com.sun.corba.se.spi.servicecontext.ServiceContexts;
38182918Smariusimport com.sun.corba.se.spi.ior.iiop.GIOPVersion;
39182918Smariusimport com.sun.corba.se.impl.orbutil.ORBUtility;
40182918Smariusimport com.sun.corba.se.spi.ior.IOR;
41182918Smariusimport com.sun.corba.se.impl.encoding.CDRInputStream;
42182918Smarius
43197164Smariusimport com.sun.corba.se.spi.logging.CORBALogDomains ;
44197164Smariusimport com.sun.corba.se.impl.logging.ORBUtilSystemException ;
45197164Smarius
46197164Smarius/**
47182918Smarius * This implements the GIOP 1.0 Reply header.
48182918Smarius *
49182918Smarius * @author Ram Jeyaraman 05/14/2000
50182918Smarius */
51182918Smarius
52182918Smariuspublic final class ReplyMessage_1_0 extends Message_1_0
53182918Smarius        implements ReplyMessage {
54182918Smarius
55182918Smarius    // Instance variables
56182918Smarius
57182918Smarius    private ORB orb = null;
58182918Smarius    private ORBUtilSystemException wrapper = null ;
59182918Smarius    private ServiceContexts service_contexts = null;
60182918Smarius    private int request_id = (int) 0;
61182918Smarius    private int reply_status = (int) 0;
62182918Smarius    private IOR ior = null;
63182918Smarius    private String exClassName = null;
64182918Smarius    private int minorCode = (int) 0;
65182918Smarius    private CompletionStatus completionStatus = null;
66182918Smarius
67182918Smarius    // Constructors
68182918Smarius
69182918Smarius    ReplyMessage_1_0(ORB orb) {
70182918Smarius        this.orb = orb;
71182918Smarius        this.wrapper = ORBUtilSystemException.get( orb,
72182918Smarius            CORBALogDomains.RPC_PROTOCOL ) ;
73182918Smarius    }
74182918Smarius
75182918Smarius    ReplyMessage_1_0(ORB orb, ServiceContexts _service_contexts,
76182918Smarius            int _request_id, int _reply_status, IOR _ior) {
77182918Smarius        super(Message.GIOPBigMagic, false, Message.GIOPReply, 0);
78182918Smarius        this.orb = orb;
79182918Smarius        this.wrapper = ORBUtilSystemException.get( orb,
80182918Smarius            CORBALogDomains.RPC_PROTOCOL ) ;
81182918Smarius        service_contexts = _service_contexts;
82182918Smarius        request_id = _request_id;
83182918Smarius        reply_status = _reply_status;
84182918Smarius        ior = _ior;
85227848Smarius    }
86182918Smarius
87182918Smarius    // Accessor methods
88182918Smarius
89182918Smarius    public int getRequestId() {
90182918Smarius        return this.request_id;
91182918Smarius    }
92182918Smarius
93182918Smarius    public int getReplyStatus() {
94182918Smarius        return this.reply_status;
95182918Smarius    }
96182918Smarius
97182918Smarius    public short getAddrDisposition() {
98182918Smarius        return KeyAddr.value;
99182918Smarius    }
100182918Smarius
101182918Smarius    public ServiceContexts getServiceContexts() {
102182918Smarius        return this.service_contexts;
103182918Smarius    }
104182918Smarius
105182918Smarius    public void setServiceContexts( ServiceContexts sc ) {
106182918Smarius        this.service_contexts = sc;
107182918Smarius    }
108182918Smarius
109182918Smarius    public SystemException getSystemException(String message) {
110182918Smarius        return MessageBase.getSystemException(
111182918Smarius            exClassName, minorCode, completionStatus, message, wrapper);
112182918Smarius    }
113182918Smarius
114182918Smarius    public IOR getIOR() {
115182918Smarius        return this.ior;
116182918Smarius    }
117182918Smarius
118182918Smarius    public void setIOR( IOR ior ) {
119182918Smarius        this.ior = ior;
120182918Smarius    }
121182918Smarius
122182918Smarius    // IO methods
123182918Smarius
124182918Smarius    public void read(org.omg.CORBA.portable.InputStream istream) {
125182918Smarius        super.read(istream);
126182918Smarius        this.service_contexts
127182918Smarius            = new ServiceContexts((org.omg.CORBA_2_3.portable.InputStream) istream);
128182918Smarius        this.request_id = istream.read_ulong();
129182918Smarius        this.reply_status = istream.read_long();
130182918Smarius        isValidReplyStatus(this.reply_status); // raises exception on error
131182918Smarius
132182918Smarius        // The code below reads the reply body in some cases
133182918Smarius        // SYSTEM_EXCEPTION & LOCATION_FORWARD
134182918Smarius        if (this.reply_status == SYSTEM_EXCEPTION) {
135182918Smarius
136182918Smarius            String reposId = istream.read_string();
137182918Smarius            this.exClassName = ORBUtility.classNameOf(reposId);
138182918Smarius            this.minorCode = istream.read_long();
139182918Smarius            int status = istream.read_long();
140182918Smarius
141182918Smarius            switch (status) {
142182918Smarius            case CompletionStatus._COMPLETED_YES:
143182918Smarius                this.completionStatus = CompletionStatus.COMPLETED_YES;
144182918Smarius                break;
145182918Smarius            case CompletionStatus._COMPLETED_NO:
146182918Smarius                this.completionStatus = CompletionStatus.COMPLETED_NO;
147182918Smarius                break;
148182918Smarius            case CompletionStatus._COMPLETED_MAYBE:
149182918Smarius                this.completionStatus = CompletionStatus.COMPLETED_MAYBE;
150182918Smarius                break;
151182918Smarius            default:
152182918Smarius                throw wrapper.badCompletionStatusInReply(
153182918Smarius                    CompletionStatus.COMPLETED_MAYBE, new Integer(status) );
154182918Smarius            }
155182918Smarius
156182918Smarius        } else if (this.reply_status == USER_EXCEPTION) {
157197164Smarius            // do nothing. The client stub will read the exception from body.
158182918Smarius        } else if (this.reply_status == LOCATION_FORWARD) {
159182918Smarius            CDRInputStream cdr = (CDRInputStream) istream;
160182918Smarius            this.ior = IORFactories.makeIOR( cdr ) ;
161182918Smarius        }
162182918Smarius    }
163182918Smarius
164182918Smarius    // Note, this writes only the header information. SystemException or
165182918Smarius    // IOR may be written afterwards into the reply mesg body.
166182918Smarius    public void write(org.omg.CORBA.portable.OutputStream ostream) {
167182918Smarius        super.write(ostream);
168182918Smarius        if (this.service_contexts != null) {
169182918Smarius                service_contexts.write(
170182918Smarius                (org.omg.CORBA_2_3.portable.OutputStream) ostream,
171182918Smarius                GIOPVersion.V1_0);
172182918Smarius            } else {
173182918Smarius                ServiceContexts.writeNullServiceContext(
174182918Smarius                (org.omg.CORBA_2_3.portable.OutputStream) ostream);
175182918Smarius        }
176182918Smarius        ostream.write_ulong(this.request_id);
177182918Smarius        ostream.write_long(this.reply_status);
178182918Smarius    }
179182918Smarius
180182918Smarius    // Static methods
181182918Smarius
182182918Smarius    public static void isValidReplyStatus(int replyStatus) {
183182918Smarius        switch (replyStatus) {
184182918Smarius        case NO_EXCEPTION :
185182918Smarius        case USER_EXCEPTION :
186182918Smarius        case SYSTEM_EXCEPTION :
187182918Smarius        case LOCATION_FORWARD :
188182918Smarius            break;
189182918Smarius        default :
190182918Smarius            ORBUtilSystemException localWrapper = ORBUtilSystemException.get(
191182918Smarius                CORBALogDomains.RPC_PROTOCOL ) ;
192182918Smarius            throw localWrapper.illegalReplyStatus( CompletionStatus.COMPLETED_MAYBE);
193182918Smarius        }
194182918Smarius    }
195182918Smarius
196182918Smarius    public void callback(MessageHandler handler)
197182918Smarius        throws java.io.IOException
198182918Smarius    {
199182918Smarius        handler.handleInput(this);
200182918Smarius    }
201182918Smarius} //
202182918Smarius