Commit b99139b1 authored by kinaba@chromium.org's avatar kinaba@chromium.org

Use DriveService for proper resource id resolution in ChangeListLoader.

The fixture of ID is needed not only for WAPI -> DriveAPI
but also for WAPI -> FakeDriveService.

BUG=285614

Review URL: https://chromiumcodereview.appspot.com/23670006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221685 0039d316-1c4b-4281-b951-d872f2087c98
parent 0ead7858
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/browser/chromeos/drive/logging.h" #include "chrome/browser/chromeos/drive/logging.h"
#include "chrome/browser/chromeos/drive/resource_metadata.h" #include "chrome/browser/chromeos/drive/resource_metadata.h"
#include "chrome/browser/drive/drive_api_util.h" #include "chrome/browser/drive/drive_api_util.h"
#include "chrome/browser/drive/drive_service_interface.h"
#include "chrome/browser/google_apis/drive_api_parser.h" #include "chrome/browser/google_apis/drive_api_parser.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -178,9 +179,11 @@ class DeltaFeedFetcher : public ChangeListLoader::FeedFetcher { ...@@ -178,9 +179,11 @@ class DeltaFeedFetcher : public ChangeListLoader::FeedFetcher {
class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher {
public: public:
FastFetchFeedFetcher(JobScheduler* scheduler, FastFetchFeedFetcher(JobScheduler* scheduler,
DriveServiceInterface* drive_service,
const std::string& directory_resource_id, const std::string& directory_resource_id,
const std::string& root_folder_id) const std::string& root_folder_id)
: scheduler_(scheduler), : scheduler_(scheduler),
drive_service_(drive_service),
directory_resource_id_(directory_resource_id), directory_resource_id_(directory_resource_id),
root_folder_id_(root_folder_id), root_folder_id_(root_folder_id),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
...@@ -279,32 +282,31 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { ...@@ -279,32 +282,31 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher {
callback.Run(FILE_ERROR_OK, change_lists_.Pass()); callback.Run(FILE_ERROR_OK, change_lists_.Pass());
} }
// Fixes resource IDs in |change_list| into the format that |drive_service_|
// can understand. Note that |change_list| contains IDs in GData WAPI format
// since currently we always use WAPI for fast fetch, regardless of the flag.
void FixResourceIdInChangeList(ChangeList* change_list) { void FixResourceIdInChangeList(ChangeList* change_list) {
std::vector<ResourceEntry>* entries = change_list->mutable_entries(); std::vector<ResourceEntry>* entries = change_list->mutable_entries();
for (size_t i = 0; i < entries->size(); ++i) { for (size_t i = 0; i < entries->size(); ++i) {
ResourceEntry* entry = &(*entries)[i]; ResourceEntry* entry = &(*entries)[i];
if (entry->has_resource_id()) { if (entry->has_resource_id())
entry->set_resource_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( entry->set_resource_id(FixResourceId(entry->resource_id()));
entry->resource_id()));
}
// Currently parent local id is the parent's resource id. // Currently parent local id is the parent's resource id.
// It will be replaced by actual local id. (crbug.com/260514). // It will be replaced by actual local id. (crbug.com/260514).
if (entry->has_parent_local_id()) { if (entry->has_parent_local_id())
entry->set_parent_local_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( entry->set_parent_local_id(FixResourceId(entry->parent_local_id()));
entry->parent_local_id()));
}
} }
} }
std::string UpgradeResourceIdFromGDataWapiToDriveApiV2( std::string FixResourceId(const std::string& resource_id) {
const std::string& resource_id) {
if (resource_id == util::kWapiRootDirectoryResourceId) if (resource_id == util::kWapiRootDirectoryResourceId)
return root_folder_id_; return root_folder_id_;
return drive::util::CanonicalizeResourceId(resource_id); return drive_service_->CanonicalizeResourceId(resource_id);
} }
JobScheduler* scheduler_; JobScheduler* scheduler_;
DriveServiceInterface* drive_service_;
std::string directory_resource_id_; std::string directory_resource_id_;
std::string root_folder_id_; std::string root_folder_id_;
ScopedVector<ChangeList> change_lists_; ScopedVector<ChangeList> change_lists_;
...@@ -317,10 +319,12 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { ...@@ -317,10 +319,12 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher {
ChangeListLoader::ChangeListLoader( ChangeListLoader::ChangeListLoader(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler) JobScheduler* scheduler,
DriveServiceInterface* drive_service)
: blocking_task_runner_(blocking_task_runner), : blocking_task_runner_(blocking_task_runner),
resource_metadata_(resource_metadata), resource_metadata_(resource_metadata),
scheduler_(scheduler), scheduler_(scheduler),
drive_service_(drive_service),
last_known_remote_changestamp_(0), last_known_remote_changestamp_(0),
loaded_(false), loaded_(false),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
...@@ -769,6 +773,7 @@ void ChangeListLoader::DoLoadDirectoryFromServer( ...@@ -769,6 +773,7 @@ void ChangeListLoader::DoLoadDirectoryFromServer(
FastFetchFeedFetcher* fetcher = new FastFetchFeedFetcher( FastFetchFeedFetcher* fetcher = new FastFetchFeedFetcher(
scheduler_, scheduler_,
drive_service_,
directory_fetch_info.resource_id(), directory_fetch_info.resource_id(),
root_folder_id_); root_folder_id_);
fast_fetch_feed_fetcher_set_.insert(fetcher); fast_fetch_feed_fetcher_set_.insert(fetcher);
......
...@@ -32,6 +32,7 @@ class ResourceList; ...@@ -32,6 +32,7 @@ class ResourceList;
namespace drive { namespace drive {
class DriveServiceInterface;
class JobScheduler; class JobScheduler;
class ResourceEntry; class ResourceEntry;
...@@ -64,7 +65,8 @@ class ChangeListLoader { ...@@ -64,7 +65,8 @@ class ChangeListLoader {
ChangeListLoader(base::SequencedTaskRunner* blocking_task_runner, ChangeListLoader(base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler); JobScheduler* scheduler,
DriveServiceInterface* drive_service);
~ChangeListLoader(); ~ChangeListLoader();
// Indicates whether there is a request for full resource list or change // Indicates whether there is a request for full resource list or change
...@@ -265,6 +267,7 @@ class ChangeListLoader { ...@@ -265,6 +267,7 @@ class ChangeListLoader {
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
ResourceMetadata* resource_metadata_; // Not owned. ResourceMetadata* resource_metadata_; // Not owned.
JobScheduler* scheduler_; // Not owned. JobScheduler* scheduler_; // Not owned.
DriveServiceInterface* drive_service_; // Not owned.
ObserverList<ChangeListLoaderObserver> observers_; ObserverList<ChangeListLoaderObserver> observers_;
typedef std::map<std::string, std::vector<FileOperationCallback> > typedef std::map<std::string, std::vector<FileOperationCallback> >
LoadCallbackMap; LoadCallbackMap;
......
...@@ -131,7 +131,8 @@ class ChangeListLoaderTest : public testing::Test { ...@@ -131,7 +131,8 @@ class ChangeListLoaderTest : public testing::Test {
change_list_loader_.reset( change_list_loader_.reset(
new ChangeListLoader(base::MessageLoopProxy::current().get(), new ChangeListLoader(base::MessageLoopProxy::current().get(),
metadata_.get(), metadata_.get(),
scheduler_.get())); scheduler_.get(),
drive_service_.get()));
} }
// Adds a new file to the root directory of the service. // Adds a new file to the root directory of the service.
...@@ -219,7 +220,8 @@ TEST_F(ChangeListLoaderTest, LoadIfNeeded_LocalMetadataAvailable) { ...@@ -219,7 +220,8 @@ TEST_F(ChangeListLoaderTest, LoadIfNeeded_LocalMetadataAvailable) {
change_list_loader_.reset( change_list_loader_.reset(
new ChangeListLoader(base::MessageLoopProxy::current().get(), new ChangeListLoader(base::MessageLoopProxy::current().get(),
metadata_.get(), metadata_.get(),
scheduler_.get())); scheduler_.get(),
drive_service_.get()));
// Add a file to the service. // Add a file to the service.
scoped_ptr<google_apis::ResourceEntry> gdata_entry = AddNewFile("New File"); scoped_ptr<google_apis::ResourceEntry> gdata_entry = AddNewFile("New File");
......
...@@ -372,7 +372,10 @@ void FileSystem::ReloadAfterReset(FileError error) { ...@@ -372,7 +372,10 @@ void FileSystem::ReloadAfterReset(FileError error) {
void FileSystem::SetupChangeListLoader() { void FileSystem::SetupChangeListLoader() {
change_list_loader_.reset(new internal::ChangeListLoader( change_list_loader_.reset(new internal::ChangeListLoader(
blocking_task_runner_.get(), resource_metadata_, scheduler_)); blocking_task_runner_.get(),
resource_metadata_,
scheduler_,
drive_service_));
change_list_loader_->AddObserver(this); change_list_loader_->AddObserver(this);
} }
......
...@@ -110,7 +110,10 @@ void OperationTestBase::SetUp() { ...@@ -110,7 +110,10 @@ void OperationTestBase::SetUp() {
// Makes sure the FakeDriveService's content is loaded to the metadata_. // Makes sure the FakeDriveService's content is loaded to the metadata_.
change_list_loader_.reset(new internal::ChangeListLoader( change_list_loader_.reset(new internal::ChangeListLoader(
blocking_task_runner_.get(), metadata_.get(), scheduler_.get())); blocking_task_runner_.get(),
metadata_.get(),
scheduler_.get(),
fake_drive_service_.get()));
change_list_loader_->LoadIfNeeded( change_list_loader_->LoadIfNeeded(
internal::DirectoryFetchInfo(), internal::DirectoryFetchInfo(),
google_apis::test_util::CreateCopyResultCallback(&error)); google_apis::test_util::CreateCopyResultCallback(&error));
......
...@@ -186,7 +186,8 @@ class SyncClientTest : public testing::Test { ...@@ -186,7 +186,8 @@ class SyncClientTest : public testing::Test {
internal::ChangeListLoader change_list_loader( internal::ChangeListLoader change_list_loader(
base::MessageLoopProxy::current().get(), base::MessageLoopProxy::current().get(),
metadata_.get(), metadata_.get(),
scheduler_.get()); scheduler_.get(),
drive_service_.get());
change_list_loader.LoadIfNeeded( change_list_loader.LoadIfNeeded(
DirectoryFetchInfo(), DirectoryFetchInfo(),
google_apis::test_util::CreateCopyResultCallback(&error)); google_apis::test_util::CreateCopyResultCallback(&error));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment