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