class KPM::BaseArtifact

def pull_and_put_in_place(logger, coordinate_map, plugin_name, destination_path=nil, skip_top_dir=true, sha1_file=nil, force_download=false, verify_sha1=true, overrides={}, ssl_verify=true)

def pull_and_put_in_place(logger, coordinate_map, plugin_name, destination_path=nil, skip_top_dir=true, sha1_file=nil, force_download=false, verify_sha1=true, overrides={}, ssl_verify=true)
  # Build artifact info
  artifact_info = artifact_info(logger, coordinate_map, overrides, ssl_verify)
  artifact_info[:plugin_name] = plugin_name
  populate_fs_info(artifact_info, destination_path)
  # Update with resolved version in case 'LATEST' was passed
  coordinate_map[:version] = artifact_info[:version]
  coordinates = KPM::Coordinates.build_coordinates(coordinate_map)
  # Return early if there's nothing to do
  if !force_download && skip_if_exists(artifact_info, coordinates, sha1_file)
    logger.info "  Skipping installation of #{coordinates} to #{artifact_info[:file_path]}, file already exists"
    # We need to do a bit of magic to make sure that artifact_info[:bundle_dir] is correctly populated when we bail early
    if artifact_info[:is_tgz] && coordinate_map[:artifact_id] != 'killbill-platform-osgi-bundles-defaultbundles'
      plugin_dir = File.split(artifact_info[:dir_name])[0]
      plugin_name = artifact_info[:plugin_name]
      unless plugin_name
        plugins_manager = PluginsManager.new(plugin_dir, logger)
        artifact_id = coordinates.split(':')[1]
        plugin_name = plugins_manager.guess_plugin_name(artifact_id)
      end
      if plugin_name.nil?
        logger.warn("Failed to guess plugin_name for #{coordinates}: artifact_info[:bundle_dir] will not be populated correctly")
      else
        version = artifact_info[:version]
        artifact_info[:bundle_dir] = Pathname.new(artifact_info[:dir_name]).join(plugin_name).join(version).to_s
      end
    else
      artifact_info[:bundle_dir] = artifact_info[:dir_name]
    end
    artifact_info[:skipped] = true
    return artifact_info
  end
  # Create the destination directory
  FileUtils.mkdir_p(artifact_info[:dir_name])
  # Download the artifact in a temporary directory in case of failures
  Dir.mktmpdir do |tmp_destination_dir|
    logger.info "      Starting download of #{coordinates} to #{tmp_destination_dir}"
    downloaded_artifact_info = pull_and_verify(logger, artifact_info[:sha1], coordinates, tmp_destination_dir, sha1_file, verify_sha1, overrides, ssl_verify)
    if artifact_info[:is_tgz]
      artifact_info[:bundle_dir] = Utils.unpack_tgz(downloaded_artifact_info[:file_path], artifact_info[:dir_name], skip_top_dir)
      FileUtils.rm downloaded_artifact_info[:file_path]
    else
      FileUtils.mv downloaded_artifact_info[:file_path], artifact_info[:file_path]
      artifact_info[:bundle_dir] = artifact_info[:dir_name]
      artifact_info[:size] = downloaded_artifact_info[:size]
    end
    logger.info "Successful installation of #{coordinates} to #{artifact_info[:bundle_dir]}"
  end
  artifact_info
end