⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 corbacontactinfolistiteratorimpl.java

📁 java1.6众多例子参考
💻 JAVA
字号:
/* * @(#)CorbaContactInfoListIteratorImpl.java	1.30 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.transport;import java.util.Iterator;import java.util.List;import org.omg.CORBA.COMM_FAILURE;import org.omg.CORBA.CompletionStatus;import org.omg.CORBA.INTERNAL;import org.omg.CORBA.SystemException;import com.sun.corba.se.pept.transport.ContactInfo ;import com.sun.corba.se.pept.transport.ContactInfoList ;import com.sun.corba.se.spi.ior.IOR ;import com.sun.corba.se.spi.logging.CORBALogDomains;import com.sun.corba.se.spi.orb.ORB ;import com.sun.corba.se.spi.transport.CorbaContactInfo;import com.sun.corba.se.spi.transport.CorbaContactInfoList;import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator;import com.sun.corba.se.spi.transport.IIOPPrimaryToContactInfo;import com.sun.corba.se.impl.logging.ORBUtilSystemException;import com.sun.corba.se.impl.protocol.CorbaInvocationInfo;// REVISIT: create a unit test for this class.public class CorbaContactInfoListIteratorImpl    implements	CorbaContactInfoListIterator{    protected ORB orb;    protected CorbaContactInfoList contactInfoList;    protected CorbaContactInfo successContactInfo;    protected CorbaContactInfo failureContactInfo;    protected RuntimeException failureException;    // ITERATOR state    protected Iterator effectiveTargetIORIterator;    protected CorbaContactInfo previousContactInfo;    protected boolean isAddrDispositionRetry;    protected IIOPPrimaryToContactInfo primaryToContactInfo;    protected ContactInfo primaryContactInfo;    protected List listOfContactInfos;    // End ITERATOR state    public CorbaContactInfoListIteratorImpl(        ORB orb,	CorbaContactInfoList corbaContactInfoList,	ContactInfo primaryContactInfo,	List listOfContactInfos)    {	this.orb = orb;	this.contactInfoList = corbaContactInfoList;	this.primaryContactInfo = primaryContactInfo;	if (listOfContactInfos != null) {	    // listOfContactInfos is null when used by the legacy	    // socket factory.  In that case this iterator is NOT used.	    this.effectiveTargetIORIterator = listOfContactInfos.iterator();	}	// List is immutable so no need to synchronize access.	this.listOfContactInfos = listOfContactInfos;	this.previousContactInfo = null;	this.isAddrDispositionRetry = false;	this.successContactInfo = null;	this.failureContactInfo = null;	this.failureException = null;	primaryToContactInfo = orb.getORBData().getIIOPPrimaryToContactInfo();    }    ////////////////////////////////////////////////////    //    // java.util.Iterator    //    public boolean hasNext()    {	// REVISIT: Implement as internal closure iterator which would	// wraps sticky or default.  Then hasNext and next just call	// the closure.	if (isAddrDispositionRetry) {	    return true;	}	boolean result;	if (primaryToContactInfo != null) {	    result = primaryToContactInfo.hasNext(primaryContactInfo,						  previousContactInfo,						  listOfContactInfos);	} else {	    result = effectiveTargetIORIterator.hasNext();	}	return result;    }    public Object next()    {	if (isAddrDispositionRetry) {	    isAddrDispositionRetry = false;	    return previousContactInfo;	}	// We hold onto the last in case we get an addressing	// disposition retry.  Then we use it again.	// We also hold onto it for the sticky manager.	if (primaryToContactInfo != null) {	    previousContactInfo = (CorbaContactInfo)		primaryToContactInfo.next(primaryContactInfo,					  previousContactInfo,					  listOfContactInfos);	} else {	    previousContactInfo = (CorbaContactInfo)		effectiveTargetIORIterator.next();	}	return previousContactInfo;    }    public void remove()    {	throw new UnsupportedOperationException();    }    ////////////////////////////////////////////////////    //    // com.sun.corba.se.pept.transport.ContactInfoListIterator    //    public ContactInfoList getContactInfoList()    {	return contactInfoList;    }    public void reportSuccess(ContactInfo contactInfo)    {	this.successContactInfo = (CorbaContactInfo)contactInfo;    }    public boolean reportException(ContactInfo contactInfo, 				   RuntimeException ex)    {	this.failureContactInfo = (CorbaContactInfo)contactInfo;	this.failureException = ex;	if (ex instanceof COMM_FAILURE) {	    SystemException se = (SystemException) ex;	    if (se.completed == CompletionStatus.COMPLETED_NO) {		if (hasNext()) {		    return true;		}		if (contactInfoList.getEffectiveTargetIOR() !=		    contactInfoList.getTargetIOR())                 {		    // retry from root ior		    updateEffectiveTargetIOR(contactInfoList.getTargetIOR());		    return true;		}	    }	}	return false;    }    public RuntimeException getFailureException()    {	if (failureException == null) {	    return		ORBUtilSystemException.get( orb,					    CORBALogDomains.RPC_TRANSPORT )		    .invalidContactInfoListIteratorFailureException();	} else {	    return failureException;	}    }    ////////////////////////////////////////////////////    //    // spi.CorbaContactInfoListIterator    //    public void reportAddrDispositionRetry(CorbaContactInfo contactInfo, 					   short disposition)    {	previousContactInfo.setAddressingDisposition(disposition);	isAddrDispositionRetry = true;    }    public void reportRedirect(CorbaContactInfo contactInfo,			       IOR forwardedIOR)    {	updateEffectiveTargetIOR(forwardedIOR);    }    ////////////////////////////////////////////////////    //    // Implementation.    //    //     // REVISIT:    //     // The normal operation for a standard iterator is to throw    // ConcurrentModificationException whenever the underlying collection    // changes.  This is implemented by keeping a modification counter (the    // timestamp may fail because the granularity is too coarse).    // Essentially what you need to do is whenever the iterator fails this    // way, go back to ContactInfoList and get a new iterator.    //    // Need to update CorbaClientRequestDispatchImpl to catch and use     // that exception.    //    public void updateEffectiveTargetIOR(IOR newIOR)    {	contactInfoList.setEffectiveTargetIOR(newIOR);	// If we report the exception in _request (i.e., beginRequest	// we cannot throw RemarshalException to the stub because _request	// does not declare that exception.	// To keep the two-level dispatching (first level chooses ContactInfo,	// second level is specific to that ContactInfo/EPT) we need to	// ensure that the request dispatchers get their iterator from the 	// InvocationStack (i.e., ThreadLocal). That way if the list iterator	// needs a complete update it happens right here.	((CorbaInvocationInfo)orb.getInvocationInfo())	    .setContactInfoListIterator(contactInfoList.iterator());    }}// End of file.

⌨️ 快捷键说明

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