Program: 7502
Project: 7502
Buggy source:
/** 
 * Installs a plug-in from the specified file. If an existing plug-in with the same id already exists, it will be replaced without warning. Note that the new plug-in will NOT be loaded.
 * @param file           the plug-in ZIP file
 * @return the unique plug-in id
 * @throws PluginException if the plug-in couldn't be installedcorrectly
 */
public String install(File file) throws PluginException {
  ZipFile zip=null;
  ZipEntry entry;
  InputStream is;
  Properties props;
  String pluginId;
  File dir;
  String msg;
  try {
    zip=new ZipFile(file);
    entry=zip.getEntry("String_Node_Str");
    if (entry == null) {
      msg="String_Node_Str" + file.getName();
      LOG.warning(msg);
      throw new PluginException(msg);
    }
    is=zip.getInputStream(entry);
    props=new Properties();
    try {
      props.load(is);
    }
  finally {
      try {
        is.close();
      }
 catch (      Exception ignore) {
      }
    }
    pluginId=props.getProperty(Plugin.KEY_ID);
    if (pluginId == null || pluginId.trim().length() < 0) {
      msg="String_Node_Str";
      throw new PluginException(msg);
    }
    dir=new File(pluginDir,pluginId);
    if (dir.exists()) {
      unload(pluginId);
      destroyStorage(pluginId);
      FileUtil.delete(dir);
    }
    FileUtil.unpackZip(zip,dir);
  }
 catch (  IOException e) {
    msg="String_Node_Str" + file.getName() + "String_Node_Str"+ e.getMessage();
    LOG.warning(msg);
    throw new PluginException(msg);
  }
 finally {
    if (zip != null) {
      try {
        zip.close();
      }
 catch (      IOException ignore) {
      }
    }
  }
  createStorage(pluginDir,pluginId);
  return pluginId;
}

Fixed version (ground truth):
/** 
 * Installs a plug-in from the specified file. If an existing plug-in with the same id already exists, it will be replaced without warning. Note that the new plug-in will NOT be loaded.
 * @param file           the plug-in ZIP file
 * @return the unique plug-in id
 * @throws PluginException if the plug-in couldn't be installedcorrectly
 */
public String install(File file) throws PluginException {
  ZipFile zip=null;
  ZipEntry entry;
  InputStream is;
  Properties props;
  String pluginId;
  File dir;
  String msg;
  try {
    zip=new ZipFile(file);
    entry=zip.getEntry("String_Node_Str");
    if (entry == null) {
      msg="String_Node_Str" + file.getName();
      LOG.warning(msg);
      throw new PluginException(msg);
    }
    is=zip.getInputStream(entry);
    props=new Properties();
    try {
      props.load(is);
    }
  finally {
      try {
        is.close();
      }
 catch (      Exception ignore) {
      }
    }
    pluginId=props.getProperty(Plugin.KEY_ID);
    if (pluginId == null || pluginId.trim().length() < 0) {
      msg="String_Node_Str";
      throw new PluginException(msg);
    }
    if (isAvailable(pluginId)) {
      unload(pluginId);
      destroyStorage(pluginId);
    }
    dir=new File(pluginDir,pluginId);
    if (dir.exists()) {
      FileUtil.delete(dir);
    }
    FileUtil.unpackZip(zip,dir);
  }
 catch (  IOException e) {
    msg="String_Node_Str" + file.getName() + "String_Node_Str"+ e.getMessage();
    LOG.warning(msg);
    throw new PluginException(msg);
  }
 finally {
    if (zip != null) {
      try {
        zip.close();
      }
 catch (      IOException ignore) {
      }
    }
  }
  createStorage(pluginDir,pluginId);
  return pluginId;
}