Program: 75169
Project: 75169
Buggy source:
/** 
 * Override the base class to open the model specified if the attribute is modelFileOrURL, or for other parameters, to cache their values.
 * @param attribute The attribute that changed.
 * @exception IllegalActionException If the change is not acceptableto this container (not thrown in this base class).
 */
public void attributeChanged(Attribute attribute) throws IllegalActionException {
  if (attribute == modelFileOrURL) {
    if (_debugging) {
      _debug("String_Node_Str" + modelFileOrURL.getExpression());
    }
    URL url=modelFileOrURL.asURL();
    if (url != null) {
      File asFile=modelFileOrURL.asFile();
      if (!asFile.isFile()) {
        throw new IllegalActionException(this,"String_Node_Str" + url);
      }
      MoMLParser parser=new MoMLParser();
      try {
        _model=parser.parse(null,url);
      }
 catch (      Exception ex) {
        throw new IllegalActionException(this,ex,"String_Node_Str" + url);
      }
      if (_model instanceof CompositeActor) {
        _manager=new Manager(_model.workspace(),"String_Node_Str");
        ((CompositeActor)_model).setManager(_manager);
        if (_debugging) {
          _debug("String_Node_Str");
        }
      }
    }
 else {
      _model=null;
      _manager=null;
      _throwable=null;
    }
  }
 else   if (attribute == executionOnFiring) {
    String executionOnFiringValue=executionOnFiring.stringValue();
    if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_RUN_IN_CALLING_THREAD;
    }
 else     if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_RUN_IN_A_NEW_THREAD;
    }
 else     if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_DO_NOTHING;
    }
 else {
      throw new IllegalActionException(this,"String_Node_Str" + executionOnFiringValue);
    }
  }
 else   if (attribute == postfireAction) {
    String postfireActionValue=postfireAction.stringValue();
    if (postfireActionValue.equals("String_Node_Str")) {
      _postfireActionValue=_DO_NOTHING;
    }
 else     if (postfireActionValue.equals("String_Node_Str")) {
      _postfireActionValue=_STOP_EXECUTING;
    }
 else {
      throw new IllegalActionException(this,"String_Node_Str" + postfireActionValue);
    }
  }
 else {
    super.attributeChanged(attribute);
  }
}

Fixed version (ground truth):
/** 
 * Override the base class to open the model specified if the attribute is modelFileOrURL, or for other parameters, to cache their values.
 * @param attribute The attribute that changed.
 * @exception IllegalActionException If the change is not acceptableto this container (not thrown in this base class).
 */
public void attributeChanged(Attribute attribute) throws IllegalActionException {
  if (attribute == modelFileOrURL) {
    if (_debugging) {
      _debug("String_Node_Str" + modelFileOrURL.getExpression());
    }
    URL url=modelFileOrURL.asURL();
    if (url != null) {
      if (url.getProtocol().equals("String_Node_Str")) {
        File asFile=modelFileOrURL.asFile();
        if (!asFile.isFile()) {
          throw new IllegalActionException(this,"String_Node_Str" + url);
        }
      }
      MoMLParser parser=new MoMLParser();
      try {
        _model=parser.parse(null,url);
      }
 catch (      Exception ex) {
        throw new IllegalActionException(this,ex,"String_Node_Str" + url);
      }
      if (_model instanceof CompositeActor) {
        _manager=new Manager(_model.workspace(),"String_Node_Str");
        ((CompositeActor)_model).setManager(_manager);
        if (_debugging) {
          _debug("String_Node_Str");
        }
      }
    }
 else {
      _model=null;
      _manager=null;
      _throwable=null;
    }
  }
 else   if (attribute == executionOnFiring) {
    String executionOnFiringValue=executionOnFiring.stringValue();
    if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_RUN_IN_CALLING_THREAD;
    }
 else     if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_RUN_IN_A_NEW_THREAD;
    }
 else     if (executionOnFiringValue.equals("String_Node_Str")) {
      _executionOnFiringValue=_DO_NOTHING;
    }
 else {
      throw new IllegalActionException(this,"String_Node_Str" + executionOnFiringValue);
    }
  }
 else   if (attribute == postfireAction) {
    String postfireActionValue=postfireAction.stringValue();
    if (postfireActionValue.equals("String_Node_Str")) {
      _postfireActionValue=_DO_NOTHING;
    }
 else     if (postfireActionValue.equals("String_Node_Str")) {
      _postfireActionValue=_STOP_EXECUTING;
    }
 else {
      throw new IllegalActionException(this,"String_Node_Str" + postfireActionValue);
    }
  }
 else {
    super.attributeChanged(attribute);
  }
}