/** @return the Java serialization encoding version. */
  public static byte getEncodingVersion(ORB orb, IOR ior) {

    // Is Java serialization enabled?
    // Check the JavaSerializationComponent (tagged component)
    // in the IIOPProfile. If present, the peer ORB's GIOP is capable
    // of using Java serialization instead of CDR serialization.
    // In such a case, use Java serialization, iff the java serialization
    // versions match.

    if (orb.getORBData().isJavaSerializationEnabled()) {
      IIOPProfile prof = ior.getProfile();
      IIOPProfileTemplate profTemp = (IIOPProfileTemplate) prof.getTaggedProfileTemplate();
      java.util.Iterator iter = profTemp.iteratorById(ORBConstants.TAG_JAVA_SERIALIZATION_ID);
      if (iter.hasNext()) {
        JavaSerializationComponent jc = (JavaSerializationComponent) iter.next();
        byte jcVersion = jc.javaSerializationVersion();
        if (jcVersion >= Message.JAVA_ENC_VERSION) {
          return Message.JAVA_ENC_VERSION;
        } else if (jcVersion > Message.CDR_ENC_VERSION) {
          return jc.javaSerializationVersion();
        } else {
          // throw error?
          // Since encodingVersion is <= 0 (CDR_ENC_VERSION).
        }
      }
    }
    return Message.CDR_ENC_VERSION; // default
  }
  public List getSocketInfo(IOR ior) {
    SocketInfo socketInfo;
    List result = new ArrayList();

    IIOPProfileTemplate iiopProfileTemplate =
        (IIOPProfileTemplate) ior.getProfile().getTaggedProfileTemplate();
    IIOPAddress primary = iiopProfileTemplate.getPrimaryAddress();
    String hostname = primary.getHost().toLowerCase();
    int port = primary.getPort();
    // NOTE: we could check for 0 (i.e., CSIv2) but, for a
    // non-CSIv2-configured client ORB talking to a CSIv2 configured
    // server ORB you might end up with an empty contact info list
    // which would then report a failure which would not be as
    // instructive as leaving a ContactInfo with a 0 port in the list.
    socketInfo = createSocketInfo(hostname, port);
    result.add(socketInfo);

    Iterator iterator = iiopProfileTemplate.iteratorById(TAG_ALTERNATE_IIOP_ADDRESS.value);

    while (iterator.hasNext()) {
      AlternateIIOPAddressComponent alternate = (AlternateIIOPAddressComponent) iterator.next();
      hostname = alternate.getAddress().getHost().toLowerCase();
      port = alternate.getAddress().getPort();
      socketInfo = createSocketInfo(hostname, port);
      result.add(socketInfo);
    }
    return result;
  }
  /**
   * Returns all the tagged components with the given ID from the profile selected for this request.
   */
  public TaggedComponent[] get_effective_components(int id) {
    checkAccess(MID_GET_EFFECTIVE_COMPONENTS);
    Integer integerId = new Integer(id);
    TaggedComponent[] result = null;
    boolean justCreatedCache = false;

    if (cachedEffectiveComponents == null) {
      cachedEffectiveComponents = new HashMap();
      justCreatedCache = true;
    } else {
      // Look in cache:
      result = (TaggedComponent[]) cachedEffectiveComponents.get(integerId);
    }

    // null could mean we cached null or not in cache.
    if ((result == null)
        && (justCreatedCache || !cachedEffectiveComponents.containsKey(integerId))) {
      // Not in cache.  Get it from the profile:
      CorbaContactInfo corbaContactInfo = (CorbaContactInfo) messageMediator.getContactInfo();
      IIOPProfileTemplate ptemp =
          (IIOPProfileTemplate) corbaContactInfo.getEffectiveProfile().getTaggedProfileTemplate();
      result = ptemp.getIOPComponents(myORB, id);
      cachedEffectiveComponents.put(integerId, result);
    }

    // As per ptc/00-08-06, section 21.3.13.6., If not found, raise
    // BAD_PARAM with minor code INVALID_COMPONENT_ID.
    if ((result == null) || (result.length == 0)) {
      throw stdWrapper.invalidComponentId(integerId);
    }

    // Good citizen: In the interest of efficiency, we will assume
    // interceptors will not modify the returned TaggedCompoent[], or
    // the TaggedComponents inside of it.  Otherwise, we would need to
    // clone the array and make a deep copy of its contents.

    return result;
  }