1. /*
  2. * @(#)SocketFactoryContactInfoListIteratorImpl.java 1.11 04/06/21
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.corba.se.impl.legacy.connection;
  8. import org.omg.CORBA.CompletionStatus;
  9. import org.omg.CORBA.SystemException;
  10. import com.sun.corba.se.pept.transport.ContactInfo;
  11. import com.sun.corba.se.spi.legacy.connection.GetEndPointInfoAgainException;
  12. import com.sun.corba.se.spi.orb.ORB;
  13. import com.sun.corba.se.spi.transport.CorbaContactInfo;
  14. import com.sun.corba.se.spi.transport.CorbaContactInfoList;
  15. import com.sun.corba.se.spi.transport.SocketInfo;
  16. import com.sun.corba.se.impl.transport.CorbaContactInfoListIteratorImpl;
  17. import com.sun.corba.se.impl.transport.SharedCDRContactInfoImpl;
  18. public class SocketFactoryContactInfoListIteratorImpl
  19. extends CorbaContactInfoListIteratorImpl
  20. {
  21. private SocketInfo socketInfoCookie;
  22. public SocketFactoryContactInfoListIteratorImpl(
  23. ORB orb,
  24. CorbaContactInfoList corbaContactInfoList)
  25. {
  26. super(orb, corbaContactInfoList, null, null);
  27. }
  28. ////////////////////////////////////////////////////
  29. //
  30. // java.util.Iterator
  31. //
  32. public boolean hasNext()
  33. {
  34. return true;
  35. }
  36. public Object next()
  37. {
  38. if (contactInfoList.getEffectiveTargetIOR().getProfile().isLocal()){
  39. return new SharedCDRContactInfoImpl(
  40. orb, contactInfoList,
  41. contactInfoList.getEffectiveTargetIOR(),
  42. orb.getORBData().getGIOPAddressDisposition());
  43. } else {
  44. // REVISIT:
  45. // on comm_failure maybe need to give IOR instead of located.
  46. return new SocketFactoryContactInfoImpl(
  47. orb, contactInfoList,
  48. contactInfoList.getEffectiveTargetIOR(),
  49. orb.getORBData().getGIOPAddressDisposition(),
  50. socketInfoCookie);
  51. }
  52. }
  53. ////////////////////////////////////////////////////
  54. //
  55. // pept.ContactInfoListIterator
  56. //
  57. public boolean reportException(ContactInfo contactInfo,
  58. RuntimeException ex)
  59. {
  60. this.failureContactInfo = (CorbaContactInfo)contactInfo;
  61. this.failureException = ex;
  62. if (ex instanceof org.omg.CORBA.COMM_FAILURE) {
  63. if (ex.getCause() instanceof GetEndPointInfoAgainException) {
  64. socketInfoCookie =
  65. ((GetEndPointInfoAgainException) ex.getCause())
  66. .getEndPointInfo();
  67. return true;
  68. }
  69. SystemException se = (SystemException) ex;
  70. if (se.completed == CompletionStatus.COMPLETED_NO) {
  71. if (contactInfoList.getEffectiveTargetIOR() !=
  72. contactInfoList.getTargetIOR())
  73. {
  74. // retry from root ior
  75. contactInfoList.setEffectiveTargetIOR(
  76. contactInfoList.getTargetIOR());
  77. return true;
  78. }
  79. }
  80. }
  81. return false;
  82. }
  83. }
  84. // End of file.