1 7 8 package com.sun.corba.se.impl.transport; 9 10 import java.util.Iterator ; 11 import java.util.List ; 12 13 import org.omg.CORBA.COMM_FAILURE ; 14 import org.omg.CORBA.CompletionStatus ; 15 import org.omg.CORBA.INTERNAL ; 16 import org.omg.CORBA.SystemException ; 17 18 import com.sun.corba.se.pept.transport.ContactInfo ; 19 import com.sun.corba.se.pept.transport.ContactInfoList ; 20 21 import com.sun.corba.se.spi.ior.IOR ; 22 import com.sun.corba.se.spi.logging.CORBALogDomains; 23 import com.sun.corba.se.spi.orb.ORB ; 24 import com.sun.corba.se.spi.transport.CorbaContactInfo; 25 import com.sun.corba.se.spi.transport.CorbaContactInfoList; 26 import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator; 27 import com.sun.corba.se.spi.transport.IIOPPrimaryToContactInfo; 28 29 import com.sun.corba.se.impl.logging.ORBUtilSystemException; 30 import com.sun.corba.se.impl.protocol.CorbaInvocationInfo; 31 32 34 public class CorbaContactInfoListIteratorImpl 35 implements 36 CorbaContactInfoListIterator 37 { 38 protected ORB orb; 39 protected CorbaContactInfoList contactInfoList; 40 protected CorbaContactInfo successContactInfo; 41 protected CorbaContactInfo failureContactInfo; 42 protected RuntimeException failureException; 43 44 protected Iterator effectiveTargetIORIterator; 46 protected CorbaContactInfo previousContactInfo; 47 protected boolean isAddrDispositionRetry; 48 protected IIOPPrimaryToContactInfo primaryToContactInfo; 49 protected ContactInfo primaryContactInfo; 50 protected List listOfContactInfos; 51 53 public CorbaContactInfoListIteratorImpl( 54 ORB orb, 55 CorbaContactInfoList corbaContactInfoList, 56 ContactInfo primaryContactInfo, 57 List listOfContactInfos) 58 { 59 this.orb = orb; 60 this.contactInfoList = corbaContactInfoList; 61 this.primaryContactInfo = primaryContactInfo; 62 if (listOfContactInfos != null) { 63 this.effectiveTargetIORIterator = listOfContactInfos.iterator(); 66 } 67 this.listOfContactInfos = listOfContactInfos; 69 70 this.previousContactInfo = null; 71 this.isAddrDispositionRetry = false; 72 73 this.successContactInfo = null; 74 this.failureContactInfo = null; 75 this.failureException = null; 76 77 primaryToContactInfo = orb.getORBData().getIIOPPrimaryToContactInfo(); 78 } 79 80 85 public boolean hasNext() 86 { 87 91 if (isAddrDispositionRetry) { 92 return true; 93 } 94 95 boolean result; 96 97 if (primaryToContactInfo != null) { 98 result = primaryToContactInfo.hasNext(primaryContactInfo, 99 previousContactInfo, 100 listOfContactInfos); 101 } else { 102 result = effectiveTargetIORIterator.hasNext(); 103 } 104 105 return result; 106 } 107 108 public Object next() 109 { 110 if (isAddrDispositionRetry) { 111 isAddrDispositionRetry = false; 112 return previousContactInfo; 113 } 114 115 118 120 if (primaryToContactInfo != null) { 121 previousContactInfo = (CorbaContactInfo) 122 primaryToContactInfo.next(primaryContactInfo, 123 previousContactInfo, 124 listOfContactInfos); 125 } else { 126 previousContactInfo = (CorbaContactInfo) 127 effectiveTargetIORIterator.next(); 128 } 129 130 return previousContactInfo; 131 } 132 133 public void remove() 134 { 135 throw new UnsupportedOperationException (); 136 } 137 138 143 public ContactInfoList getContactInfoList() 144 { 145 return contactInfoList; 146 } 147 148 public void reportSuccess(ContactInfo contactInfo) 149 { 150 this.successContactInfo = (CorbaContactInfo)contactInfo; 151 } 152 153 public boolean reportException(ContactInfo contactInfo, 154 RuntimeException ex) 155 { 156 this.failureContactInfo = (CorbaContactInfo)contactInfo; 157 this.failureException = ex; 158 if (ex instanceof COMM_FAILURE ) { 159 SystemException se = (SystemException ) ex; 160 if (se.completed == CompletionStatus.COMPLETED_NO) { 161 if (hasNext()) { 162 return true; 163 } 164 if (contactInfoList.getEffectiveTargetIOR() != 165 contactInfoList.getTargetIOR()) 166 { 167 updateEffectiveTargetIOR(contactInfoList.getTargetIOR()); 169 return true; 170 } 171 } 172 } 173 return false; 174 } 175 176 public RuntimeException getFailureException() 177 { 178 if (failureException == null) { 179 return 180 ORBUtilSystemException.get( orb, 181 CORBALogDomains.RPC_TRANSPORT ) 182 .invalidContactInfoListIteratorFailureException(); 183 } else { 184 return failureException; 185 } 186 } 187 188 193 public void reportAddrDispositionRetry(CorbaContactInfo contactInfo, 194 short disposition) 195 { 196 previousContactInfo.setAddressingDisposition(disposition); 197 isAddrDispositionRetry = true; 198 } 199 200 public void reportRedirect(CorbaContactInfo contactInfo, 201 IOR forwardedIOR) 202 { 203 updateEffectiveTargetIOR(forwardedIOR); 204 } 205 206 211 225 public void updateEffectiveTargetIOR(IOR newIOR) 226 { 227 contactInfoList.setEffectiveTargetIOR(newIOR); 228 ((CorbaInvocationInfo)orb.getInvocationInfo()) 237 .setContactInfoListIterator(contactInfoList.iterator()); 238 } 239 } 240 241 | Popular Tags |