Program: 21482
Project: 21482
Buggy source:
/** 
 * Ermittelt über die Plugins alle Passenden Linksund gibt diese in einem Vector zurück
 * @return link-Vector
 */
public Vector<DownloadLink> findLinks(){
  Vector<DownloadLink> links=new Vector<DownloadLink>();
  Vector<String> cryptedLinks=new Vector<String>();
  Vector<String> decryptedLinks=new Vector<String>();
  PluginForDecrypt pDecrypt;
  PluginForHost pHost;
  PluginForSearch pSearch;
  for (int i=0; i < pluginsForSearch.size(); i++) {
    pSearch=pluginsForSearch.get(i);
    if (pSearch.canHandle(data)) {
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_SEARCH_ACTIVE,pSearch));
      decryptedLinks.addAll(pSearch.findLinks(data));
      data=pSearch.cutMatches(data);
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_SEARCH_INACTIVE,pSearch));
    }
  }
  data=Plugin.getHttpLinkList(data);
  logger.info("String_Node_Str" + data);
  for (int i=0; i < pluginsForDecrypt.size(); i++) {
    pDecrypt=pluginsForDecrypt.get(i);
    if (pDecrypt.isClipboardEnabled() && pDecrypt.canHandle(data)) {
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_ACTIVE,pDecrypt));
      cryptedLinks.addAll(pDecrypt.getDycryptableLinks(data));
      data=pDecrypt.cutMatches(data);
      decryptedLinks.addAll(pDecrypt.decryptLinks(cryptedLinks));
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_INACTIVE,pDecrypt));
    }
  }
  boolean moreToDo;
  do {
    moreToDo=false;
    for (int i=0; i < pluginsForDecrypt.size(); i++) {
      pDecrypt=pluginsForDecrypt.get(i);
      Iterator<String> iterator=decryptedLinks.iterator();
      while (iterator.hasNext()) {
        String data=iterator.next();
        if (pDecrypt.isClipboardEnabled() && pDecrypt.canHandle(data)) {
          moreToDo=true;
          fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_ACTIVE,pDecrypt));
          iterator.remove();
          decryptedLinks.addAll(pDecrypt.decryptLink(data));
          iterator=decryptedLinks.iterator();
          fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_INACTIVE,pDecrypt));
        }
      }
    }
  }
 while (moreToDo);
  for (int i=0; i < pluginsForHost.size(); i++) {
    pHost=pluginsForHost.get(i);
    if (pHost.isClipboardEnabled() && pHost.canHandle(data)) {
      links.addAll(pHost.getDownloadLinks(data));
      data=pHost.cutMatches(data);
    }
  }
  Iterator<String> iterator=decryptedLinks.iterator();
  while (iterator.hasNext()) {
    String decrypted=iterator.next();
    logger.info("String_Node_Str" + decrypted);
    for (int i=0; i < pluginsForHost.size(); i++) {
      pHost=pluginsForHost.get(i);
      if (pHost.isClipboardEnabled() && pHost.canHandle(decrypted)) {
        links.addAll(pHost.getDownloadLinks(decrypted));
        iterator.remove();
      }
    }
  }
  logger.info("String_Node_Str" + links);
  return links;
}

Fixed version (ground truth):
/** 
 * Ermittelt über die Plugins alle Passenden Linksund gibt diese in einem Vector zurück
 * @return link-Vector
 */
public Vector<DownloadLink> findLinks(){
  Vector<DownloadLink> links=new Vector<DownloadLink>();
  Vector<String> cryptedLinks=new Vector<String>();
  Vector<String> decryptedLinks=new Vector<String>();
  PluginForDecrypt pDecrypt;
  PluginForHost pHost;
  PluginForSearch pSearch;
  for (int i=0; i < pluginsForSearch.size(); i++) {
    pSearch=pluginsForSearch.get(i);
    if (pSearch.canHandle(data)) {
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_SEARCH_ACTIVE,pSearch));
      decryptedLinks.addAll(pSearch.findLinks(data));
      data=pSearch.cutMatches(data);
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_SEARCH_INACTIVE,pSearch));
    }
  }
  data=Plugin.getHttpLinkList(data);
  for (int i=0; i < pluginsForDecrypt.size(); i++) {
    pDecrypt=pluginsForDecrypt.get(i);
    if (pDecrypt.isClipboardEnabled() && pDecrypt.canHandle(data)) {
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_ACTIVE,pDecrypt));
      cryptedLinks.addAll(pDecrypt.getDycryptableLinks(data));
      data=pDecrypt.cutMatches(data);
      decryptedLinks.addAll(pDecrypt.decryptLinks(cryptedLinks));
      fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_INACTIVE,pDecrypt));
    }
  }
  boolean moreToDo;
  do {
    moreToDo=false;
    for (int i=0; i < pluginsForDecrypt.size(); i++) {
      pDecrypt=pluginsForDecrypt.get(i);
      Iterator<String> iterator=decryptedLinks.iterator();
      while (iterator.hasNext()) {
        String data=iterator.next();
        if (pDecrypt.isClipboardEnabled() && pDecrypt.canHandle(data)) {
          moreToDo=true;
          fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_ACTIVE,pDecrypt));
          iterator.remove();
          decryptedLinks.addAll(pDecrypt.decryptLink(data));
          iterator=decryptedLinks.iterator();
          fireControlEvent(new ControlEvent(this,ControlEvent.CONTROL_PLUGIN_DECRYPT_INACTIVE,pDecrypt));
        }
      }
    }
  }
 while (moreToDo);
  for (int i=0; i < pluginsForHost.size(); i++) {
    pHost=pluginsForHost.get(i);
    if (pHost.isClipboardEnabled() && pHost.canHandle(data)) {
      links.addAll(pHost.getDownloadLinks(data));
      data=pHost.cutMatches(data);
    }
  }
  Iterator<String> iterator=decryptedLinks.iterator();
  while (iterator.hasNext()) {
    String decrypted=iterator.next();
    for (int i=0; i < pluginsForHost.size(); i++) {
      pHost=pluginsForHost.get(i);
      if (pHost.isClipboardEnabled() && pHost.canHandle(decrypted)) {
        links.addAll(pHost.getDownloadLinks(decrypted));
        iterator.remove();
      }
    }
  }
  return links;
}