Program: 75170
Project: 75170
Buggy source:
/** 
 * Read the URL and produce output.
 * @param sourceURL The source URL.
 */
private void _readURL(URL sourceURL) throws IOException, IllegalActionException {
  if (_debugging) {
    _debug("String_Node_Str" + sourceURL);
  }
  URLConnection urlConnection=sourceURL.openConnection();
  String contentType=urlConnection.getContentType();
  if (!contentType.startsWith("String_Node_Str") && !contentType.startsWith("String_Node_Str")) {
    throw new IllegalActionException(this,"String_Node_Str" + directoryOrURL + "String_Node_Str"+ "String_Node_Str"+ urlConnection.getContentType());
  }
  BufferedReader in=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
  if (!contentType.startsWith("String_Node_Str") && !urlConnection.getURL().toString().endsWith("String_Node_Str")) {
    throw new IllegalActionException(this,"String_Node_Str" + directoryOrURL + "String_Node_Str");
  }
  List resultsList=new LinkedList();
  String line;
  String target=null;
  boolean sawBody=false, sawHREF=false;
  while ((line=in.readLine()) != null) {
    line=line.trim();
    if (_debugging) {
      _debug(line);
    }
    if (line.startsWith("String_Node_Str") || line.startsWith("String_Node_Str")) {
      sawBody=true;
    }
 else {
      if (sawBody) {
        StringTokenizer tokenizer=new StringTokenizer(line,"String_Node_Str");
        while (tokenizer.hasMoreTokens()) {
          String token=tokenizer.nextToken();
          if (token.compareToIgnoreCase("String_Node_Str") == 0) {
            sawHREF=true;
            target=null;
          }
 else {
            if (sawHREF) {
              if (target == null) {
                target=token;
              }
 else {
                String reference=target;
                if (reference.length() > 20) {
                  reference=target.substring(0,20);
                }
                if (!token.startsWith(reference)) {
                  sawHREF=false;
                }
 else {
                  if (accept(null,target)) {
                    String base=directoryOrURL.getExpression();
                    if (!base.endsWith("String_Node_Str")) {
                      base=base + "String_Node_Str";
                    }
                    resultsList.add(new StringToken(base + target));
                  }
                  sawHREF=false;
                }
              }
            }
          }
        }
      }
    }
  }
  in.close();
  if (_debugging) {
    _debug("String_Node_Str");
    _debug("String_Node_Str");
    Iterator results=resultsList.iterator();
    while (results.hasNext()) {
      _debug(((StringToken)results.next()).stringValue());
    }
  }
  StringToken[] results=new StringToken[resultsList.size()];
  output.broadcast(new ArrayToken((StringToken[])(resultsList.toArray(results))));
}

Fixed version (ground truth):
/** 
 * Read the URL and produce output.
 * @param sourceURL The source URL.
 */
private void _readURL(URL sourceURL) throws IOException, IllegalActionException {
  if (_debugging) {
    _debug("String_Node_Str" + sourceURL);
  }
  URLConnection urlConnection=sourceURL.openConnection();
  String contentType=urlConnection.getContentType();
  if (!contentType.startsWith("String_Node_Str") && !contentType.startsWith("String_Node_Str")) {
    throw new IllegalActionException(this,"String_Node_Str" + directoryOrURL + "String_Node_Str"+ "String_Node_Str"+ urlConnection.getContentType());
  }
  BufferedReader in=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
  if (!contentType.startsWith("String_Node_Str") && !urlConnection.getURL().toString().endsWith("String_Node_Str")) {
    throw new IllegalActionException(this,"String_Node_Str" + directoryOrURL + "String_Node_Str");
  }
  List resultsList=new LinkedList();
  String line;
  String target=null;
  boolean sawBody=false, sawHREF=false;
  while ((line=in.readLine()) != null) {
    line=line.trim();
    if (_debugging) {
      _debug(line);
    }
    if (line.startsWith("String_Node_Str") || line.startsWith("String_Node_Str")) {
      sawBody=true;
    }
 else {
      if (sawBody) {
        StringTokenizer tokenizer=new StringTokenizer(line,"String_Node_Str");
        while (tokenizer.hasMoreTokens()) {
          String token=tokenizer.nextToken();
          if (token.compareToIgnoreCase("String_Node_Str") == 0) {
            sawHREF=true;
            target=null;
          }
 else {
            if (sawHREF) {
              if (target == null) {
                target=token;
              }
 else {
                String reference=target;
                if (reference.length() > 20) {
                  reference=target.substring(0,20);
                }
                if (!token.startsWith(reference)) {
                  sawHREF=false;
                }
 else {
                  if (accept(null,target)) {
                    String base=directoryOrURL.stringValue();
                    if (!base.endsWith("String_Node_Str")) {
                      base=base + "String_Node_Str";
                    }
                    resultsList.add(new StringToken(base + target));
                  }
                  sawHREF=false;
                }
              }
            }
          }
        }
      }
    }
  }
  in.close();
  if (_debugging) {
    _debug("String_Node_Str");
    _debug("String_Node_Str");
    Iterator results=resultsList.iterator();
    while (results.hasNext()) {
      _debug(((StringToken)results.next()).stringValue());
    }
  }
  StringToken[] results=new StringToken[resultsList.size()];
  output.broadcast(new ArrayToken((StringToken[])(resultsList.toArray(results))));
}