Program: 70358
Project: 70358
Buggy source:
@Override public void obtainData(LogicalData ld,DataLocation source,DataLocation target,LogicalData tgtData,Transferable reason,EventListener listener){
  logger.info("String_Node_Str" + ld.getName());
  for (  DataLocation loc : ld.getLocations()) {
    if (loc.getProtocol().equals(Protocol.PERSISTENT_URI)) {
      logger.debug("String_Node_Str" + loc.getPath());
      reason.setDataTarget(loc.getPath());
      listener.notifyEnd(null);
      return;
    }
  }
  if (ld.isInMemory()) {
    try {
      Serializer.serialize(ld.getValue(),target.getPath());
    }
 catch (    IOException ex) {
      ErrorManager.warn("String_Node_Str" + target.getPath(),ex);
    }
    if (tgtData != null) {
      tgtData.addLocation(target);
    }
    logger.debug("String_Node_Str" + target.getPath());
    reason.setDataTarget(target.getPath());
    listener.notifyEnd(null);
    return;
  }
  if (debug) {
    logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
  }
  ld.lockHostRemoval();
  Collection<Copy> copiesInProgress=ld.getCopiesInProgress();
  if (copiesInProgress != null && !copiesInProgress.isEmpty()) {
    for (    Copy copy : copiesInProgress) {
      if (copy != null) {
        if (copy.getTargetLoc() != null && copy.getTargetLoc().getHosts().contains(Comm.getAppHost())) {
          if (debug) {
            logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
          }
          waitForCopyTofinish(copy);
          String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
          try {
            if (debug) {
              logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ copy.getFinalTarget()+ "String_Node_Str"+ targetPath);
            }
            Files.copy((new File(copy.getFinalTarget())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
            if (tgtData != null) {
              tgtData.addLocation(target);
            }
            logger.debug("String_Node_Str" + targetPath);
            reason.setDataTarget(targetPath);
            listener.notifyEnd(null);
            ld.releaseHostRemoval();
            return;
          }
 catch (          IOException ex) {
            ErrorManager.warn("String_Node_Str" + copy.getFinalTarget() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
          }
        }
 else         if (copy.getTargetData() != null && copy.getTargetData().getAllHosts().contains(Comm.getAppHost())) {
          waitForCopyTofinish(copy);
          String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
          try {
            if (debug) {
              logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ copy.getFinalTarget()+ "String_Node_Str"+ targetPath);
            }
            Files.copy((new File(copy.getFinalTarget())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
            if (tgtData != null) {
              tgtData.addLocation(target);
            }
            logger.debug("String_Node_Str" + targetPath);
            reason.setDataTarget(targetPath);
            listener.notifyEnd(null);
            ld.releaseHostRemoval();
            return;
          }
 catch (          IOException ex) {
            ErrorManager.warn("String_Node_Str" + copy.getFinalTarget() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
          }
        }
 else {
          if (debug) {
            logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
          }
        }
      }
    }
  }
  if (debug) {
    logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ Comm.getAppHost().getName()+ "String_Node_Str");
  }
  for (  MultiURI u : ld.getURIs()) {
    if (debug) {
      String hostname=(u.getHost() != null) ? u.getHost().getName() : "String_Node_Str";
      logger.debug(ld.getName() + "String_Node_Str" + u.toString()+ "String_Node_Str"+ hostname+ "String_Node_Str");
    }
    if (u.getHost() == Comm.getAppHost()) {
      String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
      try {
        if (debug) {
          logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ u.getHost().getName()+ "String_Node_Str"+ target.getPath());
        }
        Files.copy((new File(u.getPath())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
        if (tgtData != null) {
          tgtData.addLocation(target);
        }
        logger.debug("String_Node_Str" + targetPath);
        reason.setDataTarget(targetPath);
        listener.notifyEnd(null);
        ld.releaseHostRemoval();
        return;
      }
 catch (      IOException ex) {
        ErrorManager.warn("String_Node_Str" + u.getPath() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
      }
    }
 else {
      if (debug) {
        String hostname=(u.getHost() != null) ? u.getHost().getName() : "String_Node_Str";
        logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ hostname+ "String_Node_Str");
      }
    }
  }
  if (source != null) {
    for (    Resource sourceRes : source.getHosts()) {
      COMPSsNode node=sourceRes.getNode();
      if (node != this) {
        try {
          if (debug) {
            logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ source.getPath()+ "String_Node_Str"+ target.getPath());
          }
          node.sendData(ld,source,target,tgtData,reason,listener);
        }
 catch (        Exception e) {
          ErrorManager.warn("String_Node_Str" + target.getPath(),e);
          continue;
        }
        logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
        ld.releaseHostRemoval();
        return;
      }
 else {
        String sourcePath=source.getURIInHost(Comm.getAppHost()).getPath();
        String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
        try {
          if (debug) {
            logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourcePath+ "String_Node_Str"+ targetPath);
          }
          Files.copy(new File(sourcePath).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
          logger.debug("String_Node_Str" + target.getPath());
          reason.setDataTarget(targetPath);
          listener.notifyEnd(null);
          ld.releaseHostRemoval();
          return;
        }
 catch (        IOException ex) {
          ErrorManager.warn("String_Node_Str" + sourcePath + "String_Node_Str"+ targetPath,ex);
        }
      }
    }
  }
 else {
    logger.debug("String_Node_Str");
  }
  for (  Resource sourceRes : ld.getAllHosts()) {
    COMPSsNode node=sourceRes.getNode();
    if (node != this) {
      try {
        logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourceRes.getName()+ "String_Node_Str"+ target.getPath());
        node.sendData(ld,source,target,tgtData,reason,listener);
      }
 catch (      Exception e) {
        logger.error("String_Node_Str",e);
        continue;
      }
      logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
      ld.releaseHostRemoval();
      return;
    }
 else {
      if (debug) {
        logger.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourceRes.getName()+ "String_Node_Str");
      }
    }
  }
  ErrorManager.warn("String_Node_Str" + ld.getName() + "String_Node_Str"+ target.getPath());
  ld.releaseHostRemoval();
}

Fixed version (ground truth):
@Override public void obtainData(LogicalData ld,DataLocation source,DataLocation target,LogicalData tgtData,Transferable reason,EventListener listener){
  LOGGER.info("String_Node_Str" + ld.getName());
  for (  DataLocation loc : ld.getLocations()) {
    if (loc.getProtocol().equals(Protocol.PERSISTENT_URI)) {
      LOGGER.debug("String_Node_Str" + loc.getPath());
      reason.setDataTarget(loc.getPath());
      listener.notifyEnd(null);
      return;
    }
  }
  if (ld.isInMemory()) {
    try {
      Serializer.serialize(ld.getValue(),target.getPath());
    }
 catch (    IOException ex) {
      ErrorManager.warn("String_Node_Str" + target.getPath(),ex);
    }
    if (tgtData != null) {
      tgtData.addLocation(target);
    }
    LOGGER.debug("String_Node_Str" + target.getPath());
    reason.setDataTarget(target.getPath());
    listener.notifyEnd(null);
    return;
  }
  if (DEBUG) {
    LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
  }
  ld.lockHostRemoval();
  Collection<Copy> copiesInProgress=ld.getCopiesInProgress();
  if (copiesInProgress != null && !copiesInProgress.isEmpty()) {
    for (    Copy copy : copiesInProgress) {
      if (copy != null) {
        if (copy.getTargetLoc() != null && copy.getTargetLoc().getHosts().contains(Comm.getAppHost())) {
          if (DEBUG) {
            LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
          }
          waitForCopyTofinish(copy);
          String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
          try {
            if (DEBUG) {
              LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ copy.getFinalTarget()+ "String_Node_Str"+ targetPath);
            }
            Files.copy((new File(copy.getFinalTarget())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
            if (tgtData != null) {
              tgtData.addLocation(target);
            }
            LOGGER.debug("String_Node_Str" + targetPath);
            reason.setDataTarget(targetPath);
            listener.notifyEnd(null);
            ld.releaseHostRemoval();
            return;
          }
 catch (          IOException ex) {
            ErrorManager.warn("String_Node_Str" + copy.getFinalTarget() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
          }
        }
 else         if (copy.getTargetData() != null && copy.getTargetData().getAllHosts().contains(Comm.getAppHost())) {
          waitForCopyTofinish(copy);
          String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
          try {
            if (DEBUG) {
              LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ copy.getFinalTarget()+ "String_Node_Str"+ targetPath);
            }
            Files.copy((new File(copy.getFinalTarget())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
            if (tgtData != null) {
              tgtData.addLocation(target);
            }
            LOGGER.debug("String_Node_Str" + targetPath);
            reason.setDataTarget(targetPath);
            listener.notifyEnd(null);
            ld.releaseHostRemoval();
            return;
          }
 catch (          IOException ex) {
            ErrorManager.warn("String_Node_Str" + copy.getFinalTarget() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
          }
        }
 else {
          if (DEBUG) {
            LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
          }
        }
      }
    }
  }
  if (DEBUG) {
    LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ Comm.getAppHost().getName()+ "String_Node_Str");
  }
  for (  MultiURI u : ld.getURIs()) {
    if (DEBUG) {
      String hostname=(u.getHost() != null) ? u.getHost().getName() : "String_Node_Str";
      LOGGER.debug(ld.getName() + "String_Node_Str" + u.toString()+ "String_Node_Str"+ hostname+ "String_Node_Str");
    }
    if (u.getHost() == Comm.getAppHost()) {
      String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
      try {
        if (DEBUG) {
          LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ u.getHost().getName()+ "String_Node_Str"+ target.getPath());
        }
        Files.copy((new File(u.getPath())).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
        if (tgtData != null) {
          tgtData.addLocation(target);
        }
        LOGGER.debug("String_Node_Str" + targetPath);
        reason.setDataTarget(targetPath);
        listener.notifyEnd(null);
        ld.releaseHostRemoval();
        return;
      }
 catch (      IOException ex) {
        ErrorManager.warn("String_Node_Str" + u.getPath() + "String_Node_Str"+ targetPath+ "String_Node_Str",ex);
      }
    }
 else {
      if (DEBUG) {
        String hostname=(u.getHost() != null) ? u.getHost().getName() : "String_Node_Str";
        LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ hostname+ "String_Node_Str");
      }
    }
  }
  if (source != null) {
    for (    Resource sourceRes : source.getHosts()) {
      COMPSsNode node=sourceRes.getNode();
      if (node != this) {
        try {
          if (DEBUG) {
            LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ source.getPath()+ "String_Node_Str"+ target.getPath());
          }
          node.sendData(ld,source,target,tgtData,reason,listener);
        }
 catch (        Exception e) {
          ErrorManager.warn("String_Node_Str" + target.getPath(),e);
          continue;
        }
        LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
        ld.releaseHostRemoval();
        return;
      }
 else {
        String sourcePath=source.getURIInHost(Comm.getAppHost()).getPath();
        String targetPath=target.getURIInHost(Comm.getAppHost()).getPath();
        try {
          if (DEBUG) {
            LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourcePath+ "String_Node_Str"+ targetPath);
          }
          Files.copy(new File(sourcePath).toPath(),new File(targetPath).toPath(),StandardCopyOption.REPLACE_EXISTING);
          LOGGER.debug("String_Node_Str" + target.getPath());
          reason.setDataTarget(targetPath);
          listener.notifyEnd(null);
          ld.releaseHostRemoval();
          return;
        }
 catch (        IOException ex) {
          ErrorManager.warn("String_Node_Str" + sourcePath + "String_Node_Str"+ targetPath,ex);
        }
      }
    }
  }
 else {
    LOGGER.debug("String_Node_Str");
  }
  for (  Resource sourceRes : ld.getAllHosts()) {
    COMPSsNode node=sourceRes.getNode();
    if (node != this) {
      try {
        LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourceRes.getName()+ "String_Node_Str"+ target.getPath());
        node.sendData(ld,source,target,tgtData,reason,listener);
      }
 catch (      Exception e) {
        LOGGER.error("String_Node_Str",e);
        continue;
      }
      LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str");
      ld.releaseHostRemoval();
      return;
    }
 else {
      if (DEBUG) {
        LOGGER.debug("String_Node_Str" + ld.getName() + "String_Node_Str"+ sourceRes.getName()+ "String_Node_Str");
      }
    }
  }
  ErrorManager.warn("String_Node_Str" + ld.getName() + "String_Node_Str"+ target.getPath());
  ld.releaseHostRemoval();
}