/**
   * Set the value of a specific attribute of this MBean.
   *
   * @param attribute The identification of the attribute to be set and the new value
   * @exception AttributeNotFoundException if this attribute is not supported by this MBean
   * @exception MBeanException if the initializer of an object throws an exception
   * @exception ReflectionException if a Java reflection exception occurs when invoking the getter
   */
  @Override
  public void setAttribute(Attribute attribute)
      throws AttributeNotFoundException, MBeanException, ReflectionException, RemoteException,
          RemoteException {

    // Validate the input parameters
    if (attribute == null)
      throw new RuntimeOperationsException(
          new IllegalArgumentException("Attribute is null"), "Attribute is null");

    String name = attribute.getName();
    Object value = attribute.getValue();
    if (name == null)
      throw new RuntimeOperationsException(
          new IllegalArgumentException("Attribute name is null"), "Attribute name is null");

    ContextResourceLinkRemoteInterface crl = null;
    try {
      crl = (ContextResourceLinkRemoteInterface) getManagedResource();
    } catch (InstanceNotFoundException e) {
      throw new MBeanException(e);
    } catch (InvalidTargetObjectTypeException e) {
      throw new MBeanException(e);
    }

    if ("global".equals(name)) {
      crl.setGlobal((String) value);
    } else if ("description".equals(name)) {
      crl.setDescription((String) value);
    } else if ("name".equals(name)) {
      crl.setName((String) value);
    } else if ("type".equals(name)) {
      crl.setType((String) value);
    } else {
      crl.setProperty(name, "" + value);
    }

    // cannot use side-effects.  It's removed and added back each time
    // there is a modification in a resource.
    NamingResourcesRemoteInterface nr = crl.getNamingResources();
    nr.removeResourceLink(crl.getName());
    nr.addResourceLink(crl);
  }