/** Get the Transport Metric for a specific Transport Type */
  public TransportMetric getTransportMetric(String protocol, EndpointAddress endpointAddress) {
    for (Iterator i = transportMetrics.iterator(); i.hasNext(); ) {
      TransportMetric transportMetric = (TransportMetric) i.next();
      if (protocol.equals(transportMetric.getProtocol())
          && endpointAddress.equals(transportMetric.getEndpointAddress())) return transportMetric;
    }

    return null;
  }
  /** {@inheritDoc} */
  public void serializeTo(Element element) throws DocumentSerializationException {
    for (Iterator i = transportMetrics.iterator(); i.hasNext(); ) {
      TransportMetric transportMetric = (TransportMetric) i.next();

      DocumentSerializableUtilities.addDocumentSerializable(
          element, "transportMetric", transportMetric);
    }
    if (moduleClassID != null) {
      DocumentSerializableUtilities.addString(element, "moduleClassID", moduleClassID.toString());
    }
  }
  /** {@inheritDoc} */
  public void serializeTo(Element element) throws DocumentSerializationException {
    DocumentSerializableUtilities.addString(element, "description", description);

    for (Iterator i = serviceMonitorFilters.values().iterator(); i.hasNext(); ) {
      ServiceMonitorFilter serviceMonitorFilter = (ServiceMonitorFilter) i.next();

      Element serviceElement = DocumentSerializableUtilities.createChildElement(element, "service");

      DocumentSerializableUtilities.addString(
          serviceElement, "moduleClassID", serviceMonitorFilter.getModuleClassID().toString());
      DocumentSerializableUtilities.addDocumentSerializable(
          serviceElement, "serviceFilter", serviceMonitorFilter);
    }
  }
  /**
   * Make a shallow copy of this metric only including the portions designated in the Filter
   *
   * <p>Note: since this is a shallow copy it is dangerous to modify the submetrics
   *
   * @param transportServiceMonitorFilter Filter designates constituant parts to be included
   * @return a copy of this metric with references to the designated parts
   */
  public TransportServiceMetric shallowCopy(
      TransportServiceMonitorFilter transportServiceMonitorFilter) {
    TransportServiceMetric serviceMetric = new TransportServiceMetric();
    serviceMetric.moduleClassID = moduleClassID;

    for (Iterator i = getTransportMetrics(); i.hasNext(); ) {
      TransportMetric transportMetric = (TransportMetric) i.next();
      String protocol = transportMetric.getProtocol();

      if (transportServiceMonitorFilter.hasTransport(protocol))
        serviceMetric.addTransportMetric(transportMetric);
    }

    return serviceMetric;
  }
  public void mergeMetrics(
      ServiceMetric serviceMetric, TransportServiceMonitorFilter transportServiceMonitorFilter) {
    TransportServiceMetric otherTransportServiceMetric = (TransportServiceMetric) serviceMetric;

    for (Iterator i = otherTransportServiceMetric.getTransportMetrics(); i.hasNext(); ) {
      TransportMetric otherTransportMetric = (TransportMetric) i.next();
      String protocol = otherTransportMetric.getProtocol();

      if ((transportServiceMonitorFilter == null)
          || transportServiceMonitorFilter.hasTransport(protocol)) {
        TransportMetric transportMetric =
            getTransportMetric(
                otherTransportMetric.getProtocol(), otherTransportMetric.getEndpointAddress());

        if (transportMetric == null) {
          transportMetric = new TransportMetric(otherTransportMetric);
          addTransportMetric(transportMetric);
        }

        transportMetric.mergeMetrics(otherTransportMetric);
      }
    }
  }