1. /*
  2. * @(#)IIOPProfileTemplateImpl.java 1.20 03/12/19
  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.ior.iiop;
  8. import java.util.Iterator ;
  9. import org.omg.IOP.TAG_INTERNET_IOP ;
  10. import org.omg.CORBA_2_3.portable.InputStream ;
  11. import org.omg.CORBA_2_3.portable.OutputStream ;
  12. import com.sun.corba.se.spi.ior.TaggedComponent ;
  13. import com.sun.corba.se.spi.ior.TaggedProfile ;
  14. import com.sun.corba.se.spi.ior.TaggedProfileTemplate ;
  15. import com.sun.corba.se.spi.ior.TaggedProfileTemplateBase ;
  16. import com.sun.corba.se.spi.ior.ObjectKeyTemplate ;
  17. import com.sun.corba.se.spi.ior.ObjectId ;
  18. import com.sun.corba.se.spi.ior.IdentifiableContainerBase ;
  19. import com.sun.corba.se.spi.ior.IdentifiableBase ;
  20. import com.sun.corba.se.impl.ior.EncapsulationUtility ;
  21. import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate ;
  22. import com.sun.corba.se.spi.ior.iiop.IIOPAddress ;
  23. import com.sun.corba.se.spi.ior.iiop.IIOPFactories ;
  24. import com.sun.corba.se.impl.encoding.EncapsOutputStream ;
  25. import com.sun.corba.se.impl.encoding.CDROutputStream ;
  26. import com.sun.corba.se.spi.ior.iiop.GIOPVersion ;
  27. import com.sun.corba.se.spi.orb.ORB ;
  28. /**
  29. * @author
  30. * If getMinorVersion==0, this does not contain any tagged components
  31. */
  32. public class IIOPProfileTemplateImpl extends TaggedProfileTemplateBase
  33. implements IIOPProfileTemplate
  34. {
  35. private ORB orb ;
  36. private GIOPVersion giopVersion ;
  37. private IIOPAddress primary ;
  38. public boolean equals( Object obj )
  39. {
  40. if (!(obj instanceof IIOPProfileTemplateImpl))
  41. return false ;
  42. IIOPProfileTemplateImpl other = (IIOPProfileTemplateImpl)obj ;
  43. return super.equals( obj ) && giopVersion.equals( other.giopVersion ) &&
  44. primary.equals( other.primary ) ;
  45. }
  46. public int hashCode()
  47. {
  48. return super.hashCode() ^ giopVersion.hashCode() ^ primary.hashCode() ;
  49. }
  50. public TaggedProfile create( ObjectKeyTemplate oktemp, ObjectId id )
  51. {
  52. return IIOPFactories.makeIIOPProfile( orb, oktemp, id, this ) ;
  53. }
  54. public GIOPVersion getGIOPVersion()
  55. {
  56. return giopVersion ;
  57. }
  58. public IIOPAddress getPrimaryAddress()
  59. {
  60. return primary ;
  61. }
  62. public IIOPProfileTemplateImpl( ORB orb, GIOPVersion version, IIOPAddress primary )
  63. {
  64. this.orb = orb ;
  65. this.giopVersion = version ;
  66. this.primary = primary ;
  67. if (giopVersion.getMinor() == 0)
  68. // Adding tagged components is not allowed for IIOP 1.0,
  69. // so this template is complete and should be made immutable.
  70. makeImmutable() ;
  71. }
  72. public IIOPProfileTemplateImpl( InputStream istr )
  73. {
  74. byte major = istr.read_octet() ;
  75. byte minor = istr.read_octet() ;
  76. giopVersion = GIOPVersion.getInstance( major, minor ) ;
  77. primary = new IIOPAddressImpl( istr ) ;
  78. orb = (ORB)(istr.orb()) ;
  79. // Handle any tagged components (if applicable)
  80. if (minor > 0)
  81. EncapsulationUtility.readIdentifiableSequence(
  82. this, orb.getTaggedComponentFactoryFinder(), istr ) ;
  83. makeImmutable() ;
  84. }
  85. public void write( ObjectKeyTemplate okeyTemplate, ObjectId id, OutputStream os)
  86. {
  87. giopVersion.write( os ) ;
  88. primary.write( os ) ;
  89. // Note that this is NOT an encapsulation: do not marshal
  90. // the endianness flag. However, the length is required.
  91. // Note that this cannot be accomplished with a codec!
  92. // Use the byte order of the given stream
  93. OutputStream encapsulatedOS = new EncapsOutputStream( (ORB)os.orb(),
  94. ((CDROutputStream)os).isLittleEndian() ) ;
  95. okeyTemplate.write( id, encapsulatedOS ) ;
  96. EncapsulationUtility.writeOutputStream( encapsulatedOS, os ) ;
  97. if (giopVersion.getMinor() > 0)
  98. EncapsulationUtility.writeIdentifiableSequence( this, os ) ;
  99. }
  100. /** Write out this IIOPProfileTemplateImpl only.
  101. */
  102. public void writeContents( OutputStream os)
  103. {
  104. giopVersion.write( os ) ;
  105. primary.write( os ) ;
  106. if (giopVersion.getMinor() > 0)
  107. EncapsulationUtility.writeIdentifiableSequence( this, os ) ;
  108. }
  109. public int getId()
  110. {
  111. return TAG_INTERNET_IOP.value ;
  112. }
  113. public boolean isEquivalent( TaggedProfileTemplate temp )
  114. {
  115. if (!(temp instanceof IIOPProfileTemplateImpl))
  116. return false ;
  117. IIOPProfileTemplateImpl tempimp = (IIOPProfileTemplateImpl)temp ;
  118. return primary.equals( tempimp.primary ) ;
  119. }
  120. }