/* 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.util.Iterator; /** * Our hacky version of transactional semantics. The goal is to prevent * the following situation: * * * AAA is not modified locally. * * A modified AAA is downloaded during the storing phase. Its local * timestamp is advanced. * * The direction of syncing changes, and AAA is now uploaded to the server. * * The following situation should still be supported: * * * AAA is not modified locally. * * A modified AAA is downloaded and merged with the local AAA. * * The merged AAA is uploaded to the server. * * As should: * * * AAA is modified locally. * * A modified AAA is downloaded, and discarded or merged. * * The current version of AAA is uploaded to the server. * * We achieve this by tracking GUIDs during the storing phase. If we * apply a record such that the local copy is substantially the same * as the record we just downloaded, we add it to a list of records * to avoid uploading. The definition of "substantially the same" * depends on the particular repository. The only consideration is "do we * want to upload this record in this sync?". * * Note that items are removed from this list when a fetch that * considers them for upload completes successfully. The entire list * is discarded when the session is completed. * * This interface exposes methods to: * * * During a store, recording that a record has been stored, and should * thus not be returned in subsequent fetches; * * During a fetch, checking whether a record should be returned. * * In the future this might also grow self-persistence. * * See also RepositorySession.trackRecord. * * @author rnewman * */ public interface StoreTracker { /** * @param guid * The GUID of the item to track. * @return * Whether the GUID was a newly tracked value. */ public boolean trackRecordForExclusion(String guid); /** * @param guid * The GUID of the item to check. * @return * true if the item is already tracked. */ public boolean isTrackedForExclusion(String guid); /** * * @param guid * @return true if the specified GUID was removed from the tracked set. */ public boolean untrackStoredForExclusion(String guid); public RecordFilter getFilter(); public Iterator<String> recordsTrackedForExclusion(); }