corbamessagemediatorimpl.java
来自「JAVA 所有包」· Java 代码 · 共 2,135 行 · 第 1/5 页
JAVA
2,135 行
/* * @(#)CorbaMessageMediatorImpl.java 1.99 05/11/17 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.impl.protocol;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.util.EmptyStackException;import java.util.Iterator;import org.omg.CORBA.Any;import org.omg.CORBA.CompletionStatus;import org.omg.CORBA.ExceptionList;import org.omg.CORBA.INTERNAL;import org.omg.CORBA.Principal;import org.omg.CORBA.SystemException;import org.omg.CORBA.TypeCode;import org.omg.CORBA.UnknownUserException;import org.omg.CORBA.UNKNOWN;import org.omg.CORBA.portable.ResponseHandler;import org.omg.CORBA.portable.UnknownException;import org.omg.CORBA_2_3.portable.InputStream;import org.omg.CORBA_2_3.portable.OutputStream;import org.omg.IOP.ExceptionDetailMessage;import org.omg.IOP.TAG_RMI_CUSTOM_MAX_STREAM_FORMAT;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.MessageMediator;import com.sun.corba.se.pept.protocol.ProtocolHandler;import com.sun.corba.se.pept.transport.ByteBufferPool;import com.sun.corba.se.pept.transport.Connection;import com.sun.corba.se.pept.transport.ContactInfo;import com.sun.corba.se.pept.transport.EventHandler;import com.sun.corba.se.spi.ior.IOR;import com.sun.corba.se.spi.ior.ObjectKey;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.IIOPProfileTemplate;import com.sun.corba.se.spi.ior.iiop.IIOPProfile;import com.sun.corba.se.spi.ior.iiop.MaxStreamFormatVersionComponent;import com.sun.corba.se.spi.oa.OAInvocationInfo;import com.sun.corba.se.spi.oa.ObjectAdapter;import com.sun.corba.se.spi.orb.ORB;import com.sun.corba.se.spi.orb.ORBVersionFactory;import com.sun.corba.se.spi.protocol.CorbaMessageMediator;import com.sun.corba.se.spi.protocol.CorbaProtocolHandler;import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher;import com.sun.corba.se.spi.protocol.ForwardException;import com.sun.corba.se.spi.transport.CorbaConnection;import com.sun.corba.se.spi.transport.CorbaContactInfo;import com.sun.corba.se.spi.transport.CorbaResponseWaitingRoom;import com.sun.corba.se.spi.logging.CORBALogDomains;import com.sun.corba.se.spi.servicecontext.ORBVersionServiceContext;import com.sun.corba.se.spi.servicecontext.ServiceContexts;import com.sun.corba.se.spi.servicecontext.UEInfoServiceContext;import com.sun.corba.se.spi.servicecontext.MaxStreamFormatVersionServiceContext;import com.sun.corba.se.spi.servicecontext.SendingContextServiceContext;import com.sun.corba.se.spi.servicecontext.UnknownServiceContext;import com.sun.corba.se.impl.corba.RequestImpl;import com.sun.corba.se.impl.encoding.BufferManagerFactory;import com.sun.corba.se.impl.encoding.BufferManagerReadStream;import com.sun.corba.se.impl.encoding.CDRInputObject;import com.sun.corba.se.impl.encoding.CDROutputObject;import com.sun.corba.se.impl.encoding.EncapsOutputStream;import com.sun.corba.se.impl.logging.ORBUtilSystemException;import com.sun.corba.se.impl.logging.InterceptorsSystemException;import com.sun.corba.se.impl.orbutil.ORBConstants;import com.sun.corba.se.impl.orbutil.ORBUtility;import com.sun.corba.se.impl.ior.iiop.JavaSerializationComponent;import com.sun.corba.se.impl.protocol.AddressingDispositionException;import com.sun.corba.se.impl.protocol.RequestCanceledException;import com.sun.corba.se.impl.protocol.giopmsgheaders.AddressingDispositionHelper;import com.sun.corba.se.impl.protocol.giopmsgheaders.CancelRequestMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.FragmentMessage_1_1;import com.sun.corba.se.impl.protocol.giopmsgheaders.FragmentMessage_1_2;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateRequestMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateRequestMessage_1_0;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateRequestMessage_1_1;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateRequestMessage_1_2;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateReplyOrReplyMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateReplyMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateReplyMessage_1_0;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateReplyMessage_1_1;import com.sun.corba.se.impl.protocol.giopmsgheaders.LocateReplyMessage_1_2;import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageHandler;import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_0;import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_1;import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_2;import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage;import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage_1_0 ;import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage_1_1 ;import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage_1_2 ;// REVISIT: make sure no memory leaks in client/server request/reply maps.// REVISIT: normalize requestHeader, replyHeader, messageHeader./** * @author Harold Carr */public class CorbaMessageMediatorImpl implements CorbaMessageMediator, CorbaProtocolHandler, MessageHandler{ protected ORB orb; protected ORBUtilSystemException wrapper ; protected InterceptorsSystemException interceptorWrapper ; protected CorbaContactInfo contactInfo; protected CorbaConnection connection; protected short addrDisposition; protected CDROutputObject outputObject; protected CDRInputObject inputObject; protected Message messageHeader; protected RequestMessage requestHeader; protected LocateReplyOrReplyMessage replyHeader; protected String replyExceptionDetailMessage; protected IOR replyIOR; protected Integer requestIdInteger; protected Message dispatchHeader; protected ByteBuffer dispatchByteBuffer; protected byte streamFormatVersion; protected boolean streamFormatVersionSet = false; protected org.omg.CORBA.Request diiRequest; protected boolean cancelRequestAlreadySent = false; protected ProtocolHandler protocolHandler; protected boolean _executeReturnServantInResponseConstructor = false; protected boolean _executeRemoveThreadInfoInResponseConstructor = false; protected boolean _executePIInResponseConstructor = false; // // Client-side constructor. // public CorbaMessageMediatorImpl(ORB orb, ContactInfo contactInfo, Connection connection, GIOPVersion giopVersion, IOR ior, int requestId, short addrDisposition, String operationName, boolean isOneWay) { this( orb, connection ) ; this.contactInfo = (CorbaContactInfo) contactInfo; this.addrDisposition = addrDisposition; streamFormatVersion = getStreamFormatVersionForThisRequest( ((CorbaContactInfo)this.contactInfo).getEffectiveTargetIOR(), giopVersion); streamFormatVersionSet = true; requestHeader = (RequestMessage) MessageBase.createRequest( this.orb, giopVersion, ORBUtility.getEncodingVersion(orb, ior), requestId, !isOneWay, ((CorbaContactInfo)this.contactInfo).getEffectiveTargetIOR(), this.addrDisposition, operationName, new ServiceContexts(orb), null); } // // Acceptor constructor. // public CorbaMessageMediatorImpl(ORB orb, Connection connection) { this.orb = orb; this.connection = (CorbaConnection)connection; this.wrapper = ORBUtilSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; this.interceptorWrapper = InterceptorsSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; } // // Dispatcher constructor. // // Note: in some cases (e.g., a reply message) this message // mediator will only be used for dispatch. Then the original // request side mediator will take over. public CorbaMessageMediatorImpl(ORB orb, CorbaConnection connection, Message dispatchHeader, ByteBuffer byteBuffer) { this( orb, connection ) ; this.dispatchHeader = dispatchHeader; this.dispatchByteBuffer = byteBuffer; } //////////////////////////////////////////////////// // // MessageMediator // public Broker getBroker() { return orb; } public ContactInfo getContactInfo() { return contactInfo; } public Connection getConnection() { return connection; } public void initializeMessage() { getRequestHeader().write(outputObject); } public void finishSendingRequest() { // REVISIT: probably move logic in outputObject to here. outputObject.finishSendingMessage(); } public InputObject waitForResponse() { if (getRequestHeader().isResponseExpected()) { return connection.waitForResponse(this); } return null; } public void setOutputObject(OutputObject outputObject) { this.outputObject = (CDROutputObject) outputObject; } public OutputObject getOutputObject() { return outputObject; } public void setInputObject(InputObject inputObject) { this.inputObject = (CDRInputObject) inputObject; } public InputObject getInputObject() { return inputObject; } //////////////////////////////////////////////////// // // CorbaMessageMediator // public void setReplyHeader(LocateReplyOrReplyMessage header) { this.replyHeader = header; this.replyIOR = header.getIOR(); // REVISIT - need separate field? } public LocateReplyMessage getLocateReplyHeader() { return (LocateReplyMessage) replyHeader; } public ReplyMessage getReplyHeader() { return (ReplyMessage) replyHeader; } public void setReplyExceptionDetailMessage(String message) { replyExceptionDetailMessage = message; } public RequestMessage getRequestHeader() { return requestHeader; } public GIOPVersion getGIOPVersion() { if (messageHeader != null) { return messageHeader.getGIOPVersion(); } return getRequestHeader().getGIOPVersion(); } public byte getEncodingVersion() { if (messageHeader != null) { return messageHeader.getEncodingVersion(); } return getRequestHeader().getEncodingVersion(); } public int getRequestId() { return getRequestHeader().getRequestId(); } public Integer getRequestIdInteger() { if (requestIdInteger == null) { requestIdInteger = new Integer(getRequestHeader().getRequestId()); } return requestIdInteger; } public boolean isOneWay() { return ! getRequestHeader().isResponseExpected(); } public short getAddrDisposition() { return addrDisposition; } public String getOperationName() { return getRequestHeader().getOperation(); } public ServiceContexts getRequestServiceContexts() { return getRequestHeader().getServiceContexts(); } public ServiceContexts getReplyServiceContexts() { return getReplyHeader().getServiceContexts(); } public void sendCancelRequestIfFinalFragmentNotSent() { if ((!sentFullMessage()) && sentFragment() && (!cancelRequestAlreadySent)) { try { if (orb.subcontractDebugFlag) { dprint(".sendCancelRequestIfFinalFragmentNotSent->: " + opAndId(this)); } connection.sendCancelRequestWithLock(getGIOPVersion(), getRequestId()); // Case: first a location forward, then a marshaling // exception (e.g., non-serializable object). Only // send cancel once. cancelRequestAlreadySent = true; } catch (IOException e) { if (orb.subcontractDebugFlag) { dprint(".sendCancelRequestIfFinalFragmentNotSent: !ERROR : " + opAndId(this), e); } // REVISIT: we could attempt to send a final incomplete // fragment in this case. throw interceptorWrapper.ioexceptionDuringCancelRequest( CompletionStatus.COMPLETED_MAYBE, e ); } finally { if (orb.subcontractDebugFlag) { dprint(".sendCancelRequestIfFinalFragmentNotSent<-: " + opAndId(this)); } } } } public boolean sentFullMessage() { return outputObject.getBufferManager().sentFullMessage(); } public boolean sentFragment() { return outputObject.getBufferManager().sentFragment(); } public void setDIIInfo(org.omg.CORBA.Request diiRequest) { this.diiRequest = diiRequest; } public boolean isDIIRequest() { return diiRequest != null; } public Exception unmarshalDIIUserException(String repoId, InputStream is) { if (! isDIIRequest()) { return null; } ExceptionList _exceptions = diiRequest.exceptions(); try { // Find the typecode for the exception for (int i=0; i<_exceptions.count() ; i++) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?