/**
   * set the value, update apform and the platform, notify managers and propagates to the members,
   * recursively
   *
   * @param com the component on which ot set the attribute
   * @param attr attribute name
   * @param value attribute value
   */
  private void propagate(String attr, Object value) {
    if (value == null) {
      return;
    }
    Object oldValue = get(attr);
    if (oldValue != null && oldValue.equals(value.toString())) {
      return;
    }

    // Change value
    put(attr, value);

    // Notify the execution platform
    if (get(attr) == value) {
      getApformComponent().setProperty(attr, value.toString());
    }

    /*
     * notify property managers
     */
    if (oldValue == null) {
      ApamManagers.notifyAttributeAdded(this, attr, value.toString());
    } else {
      ApamManagers.notifyAttributeChanged(this, attr, value.toString(), oldValue.toString());
    }

    // Propagate to members recursively
    for (Component member : getMembers()) {
      ((ComponentImpl) member).propagate(attr, value);
    }
  }