connection.java

来自「java jdk 1.4的源码」· Java 代码 · 共 221 行

JAVA
221
字号
/* * @(#)Connection.java	1.85 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//* * Licensed Materials - Property of IBM * RMI-IIOP v1.0 * Copyright IBM Corp. 1998 1999  All Rights Reserved * * US Government Users Restricted Rights - Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */package com.sun.corba.se.internal.iiop;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.net.InetAddress;import org.omg.CORBA.SystemException;import org.omg.CORBA.CompletionStatus;import org.omg.CORBA.OBJECT_NOT_EXIST;import org.omg.CORBA.MARSHAL;import org.omg.CORBA.INTERNAL;import org.omg.CORBA.DATA_CONVERSION;import org.omg.CORBA.portable.*;import com.sun.org.omg.SendingContext.CodeBase;import com.sun.corba.se.internal.core.ServerGIOP;import com.sun.corba.se.internal.core.EndPoint;import com.sun.corba.se.internal.core.IOR;import com.sun.corba.se.internal.core.MarshalOutputStream;import com.sun.corba.se.internal.orbutil.MinorCodes; //d11638import com.sun.corba.se.internal.orbutil.ORBUtility; //d11638import com.sun.corba.se.internal.core.GIOPVersion;import com.sun.corba.se.internal.iiop.messages.MessageBase;import com.sun.corba.se.internal.iiop.messages.LocateRequestMessage;import com.sun.corba.se.internal.iiop.messages.LocateReplyMessage;import com.sun.corba.se.internal.core.CodeSetComponentInfo;import com.sun.corba.se.internal.core.OSFCodeSetRegistry;/** * Common connection base class. */abstract public class Connection    implements        com.sun.corba.se.connection.Connection{    // Connection close states    // REVISIT - rather than define these "intermediate" constants,    // just use the one from MinorCodes directly where these are    // referenced.    public static final int CONN_ABORT = MinorCodes.CONN_ABORT;    public static final int CONN_REBIND = MinorCodes.CONN_REBIND;    protected ORB orb;    protected Socket socket;    // The socket used for this connection.    protected long timeStamp = 0;    protected boolean isServer = false;    protected ConnectionTable connectionTable = null;    // Negotiated code sets for char and wchar data    protected CodeSetComponentInfo.CodeSetContext codeSetContext = null;    void dprint(String msg) {	ORBUtility.dprint(this, msg);    }    public ORB getORB() {        return orb;    }    public Socket getSocket() {	return socket;    }    abstract public IIOPInputStream invoke(IIOPOutputStream s)	throws SystemException;    abstract public void delete();    abstract public java.io.InputStream getInputStream();    abstract public ServerGIOP getServerGIOP();    abstract public IIOPInputStream send(IIOPOutputStream s, boolean oneWay);    abstract public void sendReply(IIOPOutputStream s) throws Exception;    // All of Following abstract required for Connection cleanup    abstract public void cleanUp() throws java.lang.Exception;    abstract public boolean isBusy();    abstract public void requestBegins();    abstract public void requestEnds(IIOPInputStream request);    abstract public void print();    abstract public void setConnection(Socket _socket, ConnectionTable ctab)	throws java.lang.Exception;    abstract public void abortConnection();    // Indicates whether or not ServiceContexts have even been exchange yet    abstract public boolean isPostInitialContexts();    // Sets to true the state that ServiceContexts have indeed been exchanged    // once already    abstract public void setPostInitialContexts();    public IOR locate(int id, byte [] key, IOR ior)    {        LocateRequestMessage msg;        IIOPOutputStream os;        IIOPInputStream is;        GIOPVersion requestVersion =            GIOPVersion.chooseRequestVersion(orb, ior);        msg = MessageBase.createLocateRequest(orb, requestVersion, id, key);        // This chooses the right buffering strategy for the locate msg.        // locate msgs 1.0 & 1.1 :=> grow, 1.2 :=> stream        //os = orb.newOutputStream(this);        os = com.sun.corba.se.internal.iiop.IIOPOutputStream.                createIIOPOutputStreamForLocateMsg(                        requestVersion, orb, this);        os.setMessage(msg);        msg.write(os);        is = send(os, false);        LocateReplyMessage reply;        reply = (LocateReplyMessage) is.getMessage();        switch (reply.getReplyStatus()) {	    case LocateReplyMessage.UNKNOWN_OBJECT:            throw new OBJECT_NOT_EXIST( MinorCodes.LOCATE_UNKNOWN_OBJECT,					CompletionStatus.COMPLETED_NO );	    case LocateReplyMessage.OBJECT_HERE:            return null;        case LocateReplyMessage.OBJECT_FORWARD:	    case LocateReplyMessage.OBJECT_FORWARD_PERM: {            /*            IOR ior;            ior = new IOR(orb);            ior.read(is);            return ior;            */            return reply.getIOR();	    }        }        throw new INTERNAL( MinorCodes.BAD_LOCATE_REQUEST_STATUS,            		    CompletionStatus.COMPLETED_NO );    }    void shutdown() {        try {            socket.close();        } catch (IOException ioex) {}    }    public void stampTime() {	connectionTable.stampTime(this);    }    // Sets this connection's code base IOR.  This is done after    // getting the IOR out of the SendingContext service context.    // Our ORBs always send this, but it's optional in CORBA.    public abstract void setCodeBaseIOR(IOR codeBase);    abstract IOR getCodeBaseIOR();    abstract CodeBase getCodeBase();    public synchronized CodeSetComponentInfo.CodeSetContext getCodeSetContext() {        // Needs to be synchronized for the following case when the client        // doesn't send the code set context twice, and we have two threads        // in ServerDelegate processCodeSetContext.        //        // Thread A checks to see if there is a context, there is none, so        //     it calls setCodeSetContext, getting the synch lock.        // Thread B checks to see if there is a context.  If we didn't synch,        //     it might decide to outlaw wchar/wstring.        return codeSetContext;    }    public synchronized void setCodeSetContext(CodeSetComponentInfo.CodeSetContext csc) {        // Check whether or not we should set this.  Technically,        // someone should only send a duplicate code set service context,        // but this makes sure we always use the first one we got.        if (codeSetContext == null) {                        if (OSFCodeSetRegistry.lookupEntry(csc.getCharCodeSet()) == null ||                OSFCodeSetRegistry.lookupEntry(csc.getWCharCodeSet()) == null) {                // If the client says it's negotiated a code set that                // isn't a fallback and we never said we support, then                // it has a bug.                throw new DATA_CONVERSION(MinorCodes.BAD_CODESETS_FROM_CLIENT,                                          CompletionStatus.COMPLETED_NO);            }            codeSetContext = csc;        }    }    final boolean isServer()    {        return isServer;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?