Program: 21506
Project: 21506
Buggy source:
/** 
 * Speichert einen InputStream binär auf der Festplatte ab
 * @param downloadLink der DownloadLink
 * @param urlConnection Wenn bereits vom Plugin eine vorkonfigurierte URLConnectionvorhanden ist, wird diese hier übergeben und benutzt. Ansonsten erfolgt ein normaler GET Download von der URL, die im DownloadLink hinterlegt ist
 * @return wahr, wenn alle Daten ausgelesen und gespeichert wurden
 */
public boolean download(DownloadLink downloadLink,URLConnection urlConnection){
  File fileOutput=downloadLink.getFileOutput();
  int downloadedBytes=0;
  long start, end, time;
  try {
    ByteBuffer buffer=ByteBuffer.allocateDirect(READ_BUFFER);
    if (urlConnection == null)     urlConnection=downloadLink.getUrlDownload().openConnection();
    FileOutputStream fos=new FileOutputStream(fileOutput);
    ReadableByteChannel source=Channels.newChannel(urlConnection.getInputStream());
    WritableByteChannel dest=fos.getChannel();
    int contentLen=urlConnection.getContentLength();
    downloadLink.setInProgress(true);
    logger.info("String_Node_Str");
    start=System.currentTimeMillis();
    buffer.clear();
    int bytesLastSpeedCheck=0;
    long t1=System.currentTimeMillis();
    for (int i=0; !aborted; i++) {
      Thread.sleep(100);
      int bytes=source.read(buffer);
      if (bytes == -1)       break;
      buffer.flip();
      dest.write(buffer);
      buffer.compact();
      downloadedBytes+=bytes;
      bytesLastSpeedCheck+=bytes;
      if (i % 10 == 0) {
        long t2=System.currentTimeMillis();
        int speed=(int)(bytesLastSpeedCheck * 1000 / (t2 - t1));
        downloadLink.setDownloadSpeed(speed);
        bytesLastSpeedCheck=0;
        t1=t2;
      }
      downloadLink.setDownloadCurrent(downloadedBytes);
      firePluginEvent(new PluginEvent(this,PluginEvent.PLUGIN_DATA_CHANGED,downloadLink));
    }
    if (contentLen != -1 && downloadedBytes != contentLen) {
      logger.info("String_Node_Str");
      return false;
    }
    end=System.currentTimeMillis();
    time=end - start;
    source.close();
    dest.close();
    fos.close();
    firePluginEvent(new PluginEvent(this,PluginEvent.PLUGIN_PROGRESS_FINISH,downloadLink));
    logger.info("String_Node_Str" + fileOutput.getAbsolutePath());
    logger.info(downloadedBytes + "String_Node_Str" + time+ "String_Node_Str");
    return true;
  }
 catch (  FileNotFoundException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  SecurityException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  IOException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  InterruptedException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
  return false;
}

Fixed version (ground truth):
/** 
 * Speichert einen InputStream binär auf der Festplatte ab
 * @param downloadLink der DownloadLink
 * @param urlConnection Wenn bereits vom Plugin eine vorkonfigurierte URLConnectionvorhanden ist, wird diese hier übergeben und benutzt. Ansonsten erfolgt ein normaler GET Download von der URL, die im DownloadLink hinterlegt ist
 * @return wahr, wenn alle Daten ausgelesen und gespeichert wurden
 */
public boolean download(DownloadLink downloadLink,URLConnection urlConnection){
  File fileOutput=downloadLink.getFileOutput();
  int downloadedBytes=0;
  long start, end, time;
  try {
    ByteBuffer buffer=ByteBuffer.allocateDirect(READ_BUFFER);
    if (urlConnection == null)     urlConnection=downloadLink.getUrlDownload().openConnection();
    FileOutputStream fos=new FileOutputStream(fileOutput);
    ReadableByteChannel source=Channels.newChannel(urlConnection.getInputStream());
    WritableByteChannel dest=fos.getChannel();
    int contentLen=urlConnection.getContentLength();
    downloadLink.setInProgress(true);
    logger.info("String_Node_Str");
    start=System.currentTimeMillis();
    buffer.clear();
    int bytesLastSpeedCheck=0;
    long t1=System.currentTimeMillis();
    for (int i=0; !aborted; i++) {
      Thread.sleep(50);
      int bytes=source.read(buffer);
      if (bytes == -1)       break;
      buffer.flip();
      dest.write(buffer);
      buffer.compact();
      downloadedBytes+=bytes;
      bytesLastSpeedCheck+=bytes;
      if (i % 20 == 0) {
        long t2=System.currentTimeMillis();
        int speed=(int)(bytesLastSpeedCheck * 1000 / (t2 - t1));
        downloadLink.setDownloadSpeed(speed);
        logger.fine(Integer.toString(speed));
        bytesLastSpeedCheck=0;
        t1=t2;
      }
      downloadLink.setDownloadCurrent(downloadedBytes);
      firePluginEvent(new PluginEvent(this,PluginEvent.PLUGIN_DATA_CHANGED,downloadLink));
    }
    if (contentLen != -1 && downloadedBytes != contentLen) {
      logger.info("String_Node_Str");
      return false;
    }
    end=System.currentTimeMillis();
    time=end - start;
    source.close();
    dest.close();
    fos.close();
    firePluginEvent(new PluginEvent(this,PluginEvent.PLUGIN_PROGRESS_FINISH,downloadLink));
    logger.info("String_Node_Str" + fileOutput.getAbsolutePath());
    logger.info(downloadedBytes + "String_Node_Str" + time+ "String_Node_Str");
    return true;
  }
 catch (  FileNotFoundException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  SecurityException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  IOException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
catch (  InterruptedException e) {
    logger.severe("String_Node_Str" + e.getLocalizedMessage());
  }
  return false;
}