From a57cbdd2feb73d2d33acca69a92f86eaa66382bd Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Fri, 3 Feb 2012 13:09:29 -0800 Subject: [PATCH] Bug 723235, Bug 720304, Bug 723240 - Request bookmarks and history items sorted by sortindex/frecency, with limits. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Bug 720304 - Limit number of processed history records, with a hard limit of 500 history items per request. • Bug 723235 - Request history items sorted by sortindex/frecency. • Bug 723240 - Request bookmark items sorted by sortindex/frecency. And imposes a sanity limit of 5,000 bookmarks per fetch. (Note that batching is outside the scope of these bugs.) --- .../ConstrainedServer11Repository.java | 38 ++++++++++++ .../sync/repositories/Server11Repository.java | 61 ++++++++++++------- .../Server11RepositorySession.java | 21 +++++-- ...ndroidBrowserBookmarksServerSyncStage.java | 19 ++++++ .../AndroidBrowserHistoryServerSyncStage.java | 19 ++++++ .../base/sync/stage/ServerSyncStage.java | 14 +++-- mobile/android/sync/java-sources.mn | 2 +- 7 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 mobile/android/base/sync/repositories/ConstrainedServer11Repository.java diff --git a/mobile/android/base/sync/repositories/ConstrainedServer11Repository.java b/mobile/android/base/sync/repositories/ConstrainedServer11Repository.java new file mode 100644 index 00000000000..69c3b3cd51b --- /dev/null +++ b/mobile/android/base/sync/repositories/ConstrainedServer11Repository.java @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.sync.repositories; + +import java.net.URISyntaxException; + +import org.mozilla.gecko.sync.CredentialsSource; + +/** + * A kind of Server11Repository that supports explicit setting of limit and sort on operations. + * + * @author rnewman + * + */ +public class ConstrainedServer11Repository extends Server11Repository { + + private String sort = null; + private long limit = -1; + + public ConstrainedServer11Repository(String serverURI, String username, String collection, CredentialsSource credentialsSource, long limit, String sort) throws URISyntaxException { + super(serverURI, username, collection, credentialsSource); + + this.limit = limit; + this.sort = sort; + } + + @Override + protected String getDefaultSort() { + return sort; + } + + @Override + protected long getDefaultFetchLimit() { + return limit; + } +} diff --git a/mobile/android/base/sync/repositories/Server11Repository.java b/mobile/android/base/sync/repositories/Server11Repository.java index fe723b7c582..141d71ac6a8 100644 --- a/mobile/android/base/sync/repositories/Server11Repository.java +++ b/mobile/android/base/sync/repositories/Server11Repository.java @@ -39,6 +39,7 @@ package org.mozilla.gecko.sync.repositories; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import org.mozilla.gecko.sync.CredentialsSource; import org.mozilla.gecko.sync.Utils; @@ -92,32 +93,50 @@ public class Server11Repository extends Repository { return this.collectionPathURI; } - public URI collectionURI(boolean full, long newer, String ids) throws URISyntaxException { - // Do it this way to make it easier to add more params later. - // It's pretty ugly, I'll grant. - // I can't believe Java doesn't have a good way to do this. - boolean anyParams = full; - String uriParams = ""; - if (anyParams) { - StringBuilder params = new StringBuilder("?"); - if (full) { - params.append("full=1"); - } - if (newer >= 0) { - // Translate local millisecond timestamps into server decimal seconds. - String newerString = Utils.millisecondsToDecimalSecondsString(newer); - params.append((full ? "&newer=" : "newer=") + newerString); - } - if (ids != null) { - params.append(((full || newer >= 0) ? "&ids=" : "ids=") + ids); - } - uriParams = params.toString(); + public URI collectionURI(boolean full, long newer, long limit, String sort, String ids) throws URISyntaxException { + ArrayList params = new ArrayList(); + if (full) { + params.add("full=1"); } - String uri = this.collectionPath + uriParams; + if (newer >= 0) { + // Translate local millisecond timestamps into server decimal seconds. + String newerString = Utils.millisecondsToDecimalSecondsString(newer); + params.add("newer=" + newerString); + } + if (limit > 0) { + params.add("limit=" + limit); + } + if (sort != null) { + params.add("sort=" + sort); // We trust these values. + } + if (ids != null) { + params.add("ids=" + ids); // We trust these values. + } + + if (params.size() == 0) { + return this.collectionPathURI; + } + + StringBuilder out = new StringBuilder(); + char indicator = '?'; + for (String param : params) { + out.append(indicator); + indicator = '&'; + out.append(param); + } + String uri = this.collectionPath + out.toString(); return new URI(uri); } public URI wboURI(String id) throws URISyntaxException { return new URI(this.collectionPath + "/" + id); } + + // Override these. + protected long getDefaultFetchLimit() { + return -1; + } + protected String getDefaultSort() { + return null; + } } diff --git a/mobile/android/base/sync/repositories/Server11RepositorySession.java b/mobile/android/base/sync/repositories/Server11RepositorySession.java index ddc4bea62e8..e92a354bb47 100644 --- a/mobile/android/base/sync/repositories/Server11RepositorySession.java +++ b/mobile/android/base/sync/repositories/Server11RepositorySession.java @@ -214,21 +214,34 @@ public class Server11RepositorySession extends RepositorySession { } protected void fetchWithParameters(long newer, + long limit, boolean full, + String sort, String ids, - SyncStorageRequestDelegate delegate) throws URISyntaxException { + SyncStorageRequestDelegate delegate) + throws URISyntaxException { - URI collectionURI = serverRepository.collectionURI(full, newer, ids); + URI collectionURI = serverRepository.collectionURI(full, newer, limit, sort, ids); SyncStorageCollectionRequest request = new SyncStorageCollectionRequest(collectionURI); request.delegate = delegate; request.get(); } + public void fetchSince(long timestamp, long limit, String sort, RepositorySessionFetchRecordsDelegate delegate) { + try { + this.fetchWithParameters(timestamp, limit, true, sort, null, new RequestFetchDelegateAdapter(delegate)); + } catch (URISyntaxException e) { + delegate.onFetchFailed(e, null); + } + } + @Override public void fetchSince(long timestamp, RepositorySessionFetchRecordsDelegate delegate) { try { - this.fetchWithParameters(timestamp, true, null, new RequestFetchDelegateAdapter(delegate)); + long limit = serverRepository.getDefaultFetchLimit(); + String sort = serverRepository.getDefaultSort(); + this.fetchWithParameters(timestamp, limit, true, sort, null, new RequestFetchDelegateAdapter(delegate)); } catch (URISyntaxException e) { delegate.onFetchFailed(e, null); } @@ -245,7 +258,7 @@ public class Server11RepositorySession extends RepositorySession { // TODO: watch out for URL length limits! try { String ids = flattenIDs(guids); - this.fetchWithParameters(-1, true, ids, new RequestFetchDelegateAdapter(delegate)); + this.fetchWithParameters(-1, -1, true, "index", ids, new RequestFetchDelegateAdapter(delegate)); } catch (URISyntaxException e) { delegate.onFetchFailed(e, null); } diff --git a/mobile/android/base/sync/stage/AndroidBrowserBookmarksServerSyncStage.java b/mobile/android/base/sync/stage/AndroidBrowserBookmarksServerSyncStage.java index d5be4ddf192..4ab79d634c7 100644 --- a/mobile/android/base/sync/stage/AndroidBrowserBookmarksServerSyncStage.java +++ b/mobile/android/base/sync/stage/AndroidBrowserBookmarksServerSyncStage.java @@ -37,12 +37,21 @@ package org.mozilla.gecko.sync.stage; +import java.net.URISyntaxException; + +import org.mozilla.gecko.sync.repositories.ConstrainedServer11Repository; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; import org.mozilla.gecko.sync.repositories.android.AndroidBrowserBookmarksRepository; import org.mozilla.gecko.sync.repositories.domain.BookmarkRecordFactory; public class AndroidBrowserBookmarksServerSyncStage extends ServerSyncStage { + + // Eventually this kind of sync stage will be data-driven, + // and all this hard-coding can go away. + private static final String BOOKMARKS_SORT = "index"; + private static final long BOOKMARKS_REQUEST_LIMIT = 5000; // Sanity limit. + @Override public void execute(org.mozilla.gecko.sync.GlobalSession session) throws NoSuchStageException { super.execute(session); @@ -57,6 +66,16 @@ public class AndroidBrowserBookmarksServerSyncStage extends ServerSyncStage { return "bookmarks"; } + @Override + protected Repository getRemoteRepository() throws URISyntaxException { + return new ConstrainedServer11Repository(session.config.getClusterURLString(), + session.config.username, + getCollection(), + session, + BOOKMARKS_REQUEST_LIMIT, + BOOKMARKS_SORT); + } + @Override protected Repository getLocalRepository() { return new AndroidBrowserBookmarksRepository(); diff --git a/mobile/android/base/sync/stage/AndroidBrowserHistoryServerSyncStage.java b/mobile/android/base/sync/stage/AndroidBrowserHistoryServerSyncStage.java index 0da9fdcb328..d745591df1b 100644 --- a/mobile/android/base/sync/stage/AndroidBrowserHistoryServerSyncStage.java +++ b/mobile/android/base/sync/stage/AndroidBrowserHistoryServerSyncStage.java @@ -37,12 +37,21 @@ package org.mozilla.gecko.sync.stage; +import java.net.URISyntaxException; + +import org.mozilla.gecko.sync.repositories.ConstrainedServer11Repository; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; import org.mozilla.gecko.sync.repositories.android.AndroidBrowserHistoryRepository; import org.mozilla.gecko.sync.repositories.domain.HistoryRecordFactory; public class AndroidBrowserHistoryServerSyncStage extends ServerSyncStage { + + // Eventually this kind of sync stage will be data-driven, + // and all this hard-coding can go away. + private static final String HISTORY_SORT = "index"; + private static final long HISTORY_REQUEST_LIMIT = 500; + @Override public void execute(org.mozilla.gecko.sync.GlobalSession session) throws NoSuchStageException { super.execute(session); @@ -62,6 +71,16 @@ public class AndroidBrowserHistoryServerSyncStage extends ServerSyncStage { return new AndroidBrowserHistoryRepository(); } + @Override + protected Repository getRemoteRepository() throws URISyntaxException { + return new ConstrainedServer11Repository(session.config.getClusterURLString(), + session.config.username, + getCollection(), + session, + HISTORY_REQUEST_LIMIT, + HISTORY_SORT); + } + @Override protected RecordFactory getRecordFactory() { return new HistoryRecordFactory(); diff --git a/mobile/android/base/sync/stage/ServerSyncStage.java b/mobile/android/base/sync/stage/ServerSyncStage.java index 0d93887aa8a..c591b00e2d6 100644 --- a/mobile/android/base/sync/stage/ServerSyncStage.java +++ b/mobile/android/base/sync/stage/ServerSyncStage.java @@ -84,6 +84,14 @@ public abstract class ServerSyncStage implements protected abstract Repository getLocalRepository(); protected abstract RecordFactory getRecordFactory(); + // Override this in subclasses. + protected Repository getRemoteRepository() throws URISyntaxException { + return new Server11Repository(session.config.getClusterURLString(), + session.config.username, + getCollection(), + session); + } + /** * Return a Crypto5Middleware-wrapped Server11Repository. * @@ -97,11 +105,7 @@ public abstract class ServerSyncStage implements protected Repository wrappedServerRepo() throws NoCollectionKeysSetException, URISyntaxException { String collection = this.getCollection(); KeyBundle collectionKey = session.keyForCollection(collection); - Server11Repository serverRepo = new Server11Repository(session.config.getClusterURLString(), - session.config.username, - collection, - session); - Crypto5MiddlewareRepository cryptoRepo = new Crypto5MiddlewareRepository(serverRepo, collectionKey); + Crypto5MiddlewareRepository cryptoRepo = new Crypto5MiddlewareRepository(getRemoteRepository(), collectionKey); cryptoRepo.recordFactory = getRecordFactory(); return cryptoRepo; } diff --git a/mobile/android/sync/java-sources.mn b/mobile/android/sync/java-sources.mn index 929c08f3060..0511919e52a 100644 --- a/mobile/android/sync/java-sources.mn +++ b/mobile/android/sync/java-sources.mn @@ -1 +1 @@ -sync/AlreadySyncingException.java sync/CollectionKeys.java sync/CredentialsSource.java sync/crypto/CryptoException.java sync/crypto/Cryptographer.java sync/crypto/CryptoInfo.java sync/crypto/HKDF.java sync/crypto/HMACVerificationException.java sync/crypto/KeyBundle.java sync/crypto/MissingCryptoInputException.java sync/crypto/NoKeyBundleException.java sync/cryptographer/CryptoStatusBundle.java sync/cryptographer/SyncCryptographer.java sync/CryptoRecord.java sync/DelayedWorkTracker.java sync/delegates/FreshStartDelegate.java sync/delegates/GlobalSessionCallback.java sync/delegates/InfoCollectionsDelegate.java sync/delegates/KeyUploadDelegate.java sync/delegates/MetaGlobalDelegate.java sync/delegates/WipeServerDelegate.java sync/ExtendedJSONObject.java sync/GlobalSession.java sync/HTTPFailureException.java sync/InfoCollections.java sync/jpake/BigIntegerHelper.java sync/jpake/Gx4IsOneException.java sync/jpake/IncorrectZkpException.java sync/jpake/JPakeClient.java sync/jpake/JPakeCrypto.java sync/jpake/JPakeNoActivePairingException.java sync/jpake/JPakeNumGenerator.java sync/jpake/JPakeNumGeneratorRandom.java sync/jpake/JPakeParty.java sync/jpake/JPakeRequest.java sync/jpake/JPakeRequestDelegate.java sync/jpake/JPakeResponse.java sync/jpake/JPakeUtils.java sync/jpake/Zkp.java sync/MetaGlobal.java sync/MetaGlobalException.java sync/MetaGlobalMissingEnginesException.java sync/MetaGlobalNotSetException.java sync/middleware/Crypto5MiddlewareRepository.java sync/middleware/Crypto5MiddlewareRepositorySession.java sync/middleware/MiddlewareRepository.java sync/net/BaseResource.java sync/net/CompletedEntity.java sync/net/HandleProgressException.java sync/net/Resource.java sync/net/ResourceDelegate.java sync/net/SyncResourceDelegate.java sync/net/SyncResponse.java sync/net/SyncStorageCollectionRequest.java sync/net/SyncStorageCollectionRequestDelegate.java sync/net/SyncStorageRecordRequest.java sync/net/SyncStorageRequest.java sync/net/SyncStorageRequestDelegate.java sync/net/SyncStorageRequestIncrementalDelegate.java sync/net/SyncStorageResponse.java sync/net/TLSSocketFactory.java sync/net/WBOCollectionRequestDelegate.java sync/NoCollectionKeysSetException.java sync/NonArrayJSONException.java sync/NonObjectJSONException.java sync/PrefsSource.java sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java sync/repositories/android/AndroidBrowserBookmarksRepository.java sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java sync/repositories/android/AndroidBrowserHistoryDataAccessor.java sync/repositories/android/AndroidBrowserHistoryDataExtender.java sync/repositories/android/AndroidBrowserHistoryRepository.java sync/repositories/android/AndroidBrowserHistoryRepositorySession.java sync/repositories/android/AndroidBrowserPasswordsDataAccessor.java sync/repositories/android/AndroidBrowserPasswordsRepository.java sync/repositories/android/AndroidBrowserPasswordsRepositorySession.java sync/repositories/android/AndroidBrowserRepository.java sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java sync/repositories/android/AndroidBrowserRepositorySession.java sync/repositories/android/BrowserContract.java sync/repositories/android/PasswordColumns.java sync/repositories/android/RepoUtils.java sync/repositories/BookmarkNeedsReparentingException.java sync/repositories/BookmarksRepository.java sync/repositories/delegates/DeferrableRepositorySessionCreationDelegate.java sync/repositories/delegates/DeferredRepositorySessionBeginDelegate.java sync/repositories/delegates/DeferredRepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/DeferredRepositorySessionFinishDelegate.java sync/repositories/delegates/DeferredRepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionBeginDelegate.java sync/repositories/delegates/RepositorySessionCleanDelegate.java sync/repositories/delegates/RepositorySessionCreationDelegate.java sync/repositories/delegates/RepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/RepositorySessionFinishDelegate.java sync/repositories/delegates/RepositorySessionGuidsSinceDelegate.java sync/repositories/delegates/RepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionWipeDelegate.java sync/repositories/domain/BookmarkRecord.java sync/repositories/domain/BookmarkRecordFactory.java sync/repositories/domain/HistoryRecord.java sync/repositories/domain/HistoryRecordFactory.java sync/repositories/domain/PasswordRecord.java sync/repositories/domain/Record.java sync/repositories/HashSetStoreTracker.java sync/repositories/HistoryRepository.java sync/repositories/IdentityRecordFactory.java sync/repositories/InactiveSessionException.java sync/repositories/InvalidBookmarkTypeException.java sync/repositories/InvalidRequestException.java sync/repositories/InvalidSessionTransitionException.java sync/repositories/MultipleRecordsForGuidException.java sync/repositories/NoGuidForIdException.java sync/repositories/NoStoreDelegateException.java sync/repositories/NullCursorException.java sync/repositories/ParentNotFoundException.java sync/repositories/ProfileDatabaseException.java sync/repositories/RecordFactory.java sync/repositories/RecordFilter.java sync/repositories/Repository.java sync/repositories/RepositorySession.java sync/repositories/RepositorySessionBundle.java sync/repositories/Server11Repository.java sync/repositories/Server11RepositorySession.java sync/repositories/StoreTracker.java sync/repositories/StoreTrackingRepositorySession.java sync/setup/activities/AccountActivity.java sync/setup/activities/SetupFailureActivity.java sync/setup/activities/SetupSuccessActivity.java sync/setup/activities/SetupSyncActivity.java sync/setup/Constants.java sync/setup/SyncAuthenticatorService.java sync/stage/AndroidBrowserBookmarksServerSyncStage.java sync/stage/AndroidBrowserHistoryServerSyncStage.java sync/stage/CheckPreconditionsStage.java sync/stage/CompletedStage.java sync/stage/EnsureClusterURLStage.java sync/stage/EnsureKeysStage.java sync/stage/FetchInfoCollectionsStage.java sync/stage/FetchMetaGlobalStage.java sync/stage/GlobalSyncStage.java sync/stage/NoSuchStageException.java sync/stage/NoSyncIDException.java sync/stage/ServerSyncStage.java sync/StubActivity.java sync/syncadapter/SyncAdapter.java sync/syncadapter/SyncService.java sync/SyncConfiguration.java sync/SyncConfigurationException.java sync/SyncException.java sync/synchronizer/ConcurrentRecordConsumer.java sync/synchronizer/RecordConsumer.java sync/synchronizer/RecordsChannel.java sync/synchronizer/RecordsChannelDelegate.java sync/synchronizer/RecordsConsumerDelegate.java sync/synchronizer/SerialRecordConsumer.java sync/synchronizer/SessionNotBegunException.java sync/synchronizer/Synchronizer.java sync/synchronizer/SynchronizerDelegate.java sync/synchronizer/SynchronizerSession.java sync/synchronizer/SynchronizerSessionDelegate.java sync/synchronizer/UnbundleError.java sync/synchronizer/UnexpectedSessionException.java sync/SynchronizerConfiguration.java sync/SynchronizerConfigurations.java sync/ThreadPool.java sync/UnexpectedJSONException.java sync/UnknownSynchronizerConfigurationVersionException.java sync/Utils.java +sync/AlreadySyncingException.java sync/CollectionKeys.java sync/CredentialsSource.java sync/crypto/CryptoException.java sync/crypto/Cryptographer.java sync/crypto/CryptoInfo.java sync/crypto/HKDF.java sync/crypto/HMACVerificationException.java sync/crypto/KeyBundle.java sync/crypto/MissingCryptoInputException.java sync/crypto/NoKeyBundleException.java sync/cryptographer/CryptoStatusBundle.java sync/cryptographer/SyncCryptographer.java sync/CryptoRecord.java sync/DelayedWorkTracker.java sync/delegates/FreshStartDelegate.java sync/delegates/GlobalSessionCallback.java sync/delegates/InfoCollectionsDelegate.java sync/delegates/KeyUploadDelegate.java sync/delegates/MetaGlobalDelegate.java sync/delegates/WipeServerDelegate.java sync/ExtendedJSONObject.java sync/GlobalSession.java sync/HTTPFailureException.java sync/InfoCollections.java sync/jpake/BigIntegerHelper.java sync/jpake/Gx4IsOneException.java sync/jpake/IncorrectZkpException.java sync/jpake/JPakeClient.java sync/jpake/JPakeCrypto.java sync/jpake/JPakeNoActivePairingException.java sync/jpake/JPakeNumGenerator.java sync/jpake/JPakeNumGeneratorRandom.java sync/jpake/JPakeParty.java sync/jpake/JPakeRequest.java sync/jpake/JPakeRequestDelegate.java sync/jpake/JPakeResponse.java sync/jpake/JPakeUtils.java sync/jpake/Zkp.java sync/MetaGlobal.java sync/MetaGlobalException.java sync/MetaGlobalMissingEnginesException.java sync/MetaGlobalNotSetException.java sync/middleware/Crypto5MiddlewareRepository.java sync/middleware/Crypto5MiddlewareRepositorySession.java sync/middleware/MiddlewareRepository.java sync/net/BaseResource.java sync/net/CompletedEntity.java sync/net/HandleProgressException.java sync/net/Resource.java sync/net/ResourceDelegate.java sync/net/SyncResourceDelegate.java sync/net/SyncResponse.java sync/net/SyncStorageCollectionRequest.java sync/net/SyncStorageCollectionRequestDelegate.java sync/net/SyncStorageRecordRequest.java sync/net/SyncStorageRequest.java sync/net/SyncStorageRequestDelegate.java sync/net/SyncStorageRequestIncrementalDelegate.java sync/net/SyncStorageResponse.java sync/net/TLSSocketFactory.java sync/net/WBOCollectionRequestDelegate.java sync/NoCollectionKeysSetException.java sync/NonArrayJSONException.java sync/NonObjectJSONException.java sync/PrefsSource.java sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java sync/repositories/android/AndroidBrowserBookmarksRepository.java sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java sync/repositories/android/AndroidBrowserHistoryDataAccessor.java sync/repositories/android/AndroidBrowserHistoryDataExtender.java sync/repositories/android/AndroidBrowserHistoryRepository.java sync/repositories/android/AndroidBrowserHistoryRepositorySession.java sync/repositories/android/AndroidBrowserPasswordsDataAccessor.java sync/repositories/android/AndroidBrowserPasswordsRepository.java sync/repositories/android/AndroidBrowserPasswordsRepositorySession.java sync/repositories/android/AndroidBrowserRepository.java sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java sync/repositories/android/AndroidBrowserRepositorySession.java sync/repositories/android/BrowserContract.java sync/repositories/android/PasswordColumns.java sync/repositories/android/RepoUtils.java sync/repositories/BookmarkNeedsReparentingException.java sync/repositories/BookmarksRepository.java sync/repositories/ConstrainedServer11Repository.java sync/repositories/delegates/DeferrableRepositorySessionCreationDelegate.java sync/repositories/delegates/DeferredRepositorySessionBeginDelegate.java sync/repositories/delegates/DeferredRepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/DeferredRepositorySessionFinishDelegate.java sync/repositories/delegates/DeferredRepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionBeginDelegate.java sync/repositories/delegates/RepositorySessionCleanDelegate.java sync/repositories/delegates/RepositorySessionCreationDelegate.java sync/repositories/delegates/RepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/RepositorySessionFinishDelegate.java sync/repositories/delegates/RepositorySessionGuidsSinceDelegate.java sync/repositories/delegates/RepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionWipeDelegate.java sync/repositories/domain/BookmarkRecord.java sync/repositories/domain/BookmarkRecordFactory.java sync/repositories/domain/HistoryRecord.java sync/repositories/domain/HistoryRecordFactory.java sync/repositories/domain/PasswordRecord.java sync/repositories/domain/Record.java sync/repositories/HashSetStoreTracker.java sync/repositories/HistoryRepository.java sync/repositories/IdentityRecordFactory.java sync/repositories/InactiveSessionException.java sync/repositories/InvalidBookmarkTypeException.java sync/repositories/InvalidRequestException.java sync/repositories/InvalidSessionTransitionException.java sync/repositories/MultipleRecordsForGuidException.java sync/repositories/NoGuidForIdException.java sync/repositories/NoStoreDelegateException.java sync/repositories/NullCursorException.java sync/repositories/ParentNotFoundException.java sync/repositories/ProfileDatabaseException.java sync/repositories/RecordFactory.java sync/repositories/RecordFilter.java sync/repositories/Repository.java sync/repositories/RepositorySession.java sync/repositories/RepositorySessionBundle.java sync/repositories/Server11Repository.java sync/repositories/Server11RepositorySession.java sync/repositories/StoreTracker.java sync/repositories/StoreTrackingRepositorySession.java sync/setup/activities/AccountActivity.java sync/setup/activities/SetupFailureActivity.java sync/setup/activities/SetupSuccessActivity.java sync/setup/activities/SetupSyncActivity.java sync/setup/Constants.java sync/setup/SyncAuthenticatorService.java sync/stage/AndroidBrowserBookmarksServerSyncStage.java sync/stage/AndroidBrowserHistoryServerSyncStage.java sync/stage/CheckPreconditionsStage.java sync/stage/CompletedStage.java sync/stage/EnsureClusterURLStage.java sync/stage/EnsureKeysStage.java sync/stage/FetchInfoCollectionsStage.java sync/stage/FetchMetaGlobalStage.java sync/stage/GlobalSyncStage.java sync/stage/NoSuchStageException.java sync/stage/NoSyncIDException.java sync/stage/ServerSyncStage.java sync/StubActivity.java sync/syncadapter/SyncAdapter.java sync/syncadapter/SyncService.java sync/SyncConfiguration.java sync/SyncConfigurationException.java sync/SyncException.java sync/synchronizer/ConcurrentRecordConsumer.java sync/synchronizer/RecordConsumer.java sync/synchronizer/RecordsChannel.java sync/synchronizer/RecordsChannelDelegate.java sync/synchronizer/RecordsConsumerDelegate.java sync/synchronizer/SerialRecordConsumer.java sync/synchronizer/SessionNotBegunException.java sync/synchronizer/Synchronizer.java sync/synchronizer/SynchronizerDelegate.java sync/synchronizer/SynchronizerSession.java sync/synchronizer/SynchronizerSessionDelegate.java sync/synchronizer/UnbundleError.java sync/synchronizer/UnexpectedSessionException.java sync/SynchronizerConfiguration.java sync/SynchronizerConfigurations.java sync/ThreadPool.java sync/UnexpectedJSONException.java sync/UnknownSynchronizerConfigurationVersionException.java sync/Utils.java