/* 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.stage;
import org.mozilla.gecko.sync.GlobalSession;
import org.mozilla.gecko.sync.InfoCollections;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.MetaGlobal;
import org.mozilla.gecko.sync.PersistedMetaGlobal;
import org.mozilla.gecko.sync.delegates.MetaGlobalDelegate;
import org.mozilla.gecko.sync.net.SyncStorageResponse;
public class FetchMetaGlobalStage extends AbstractNonRepositorySyncStage {
public FetchMetaGlobalStage(GlobalSession session) {
super(session);
}
private static final String LOG_TAG = "FetchMetaGlobalStage";
private static final String META_COLLECTION = "meta";
public class StageMetaGlobalDelegate implements MetaGlobalDelegate {
private GlobalSession session;
public StageMetaGlobalDelegate(GlobalSession session) {
this.session = session;
}
@Override
public void handleSuccess(MetaGlobal global, SyncStorageResponse response) {
Logger.trace(LOG_TAG, "Persisting fetched meta/global and last modified.");
PersistedMetaGlobal pmg = session.config.persistedMetaGlobal();
pmg.persistMetaGlobal(global);
// Take the timestamp from the response since it is later than the timestamp from info/collections.
pmg.persistLastModified(response.normalizedWeaveTimestamp());
session.processMetaGlobal(global);
}
@Override
public void handleFailure(SyncStorageResponse response) {
session.handleHTTPError(response, "Failure fetching meta/global.");
}
@Override
public void handleError(Exception e) {
session.abort(e, "Failure fetching meta/global.");
}
@Override
public void handleMissing(MetaGlobal global, SyncStorageResponse response) {
session.processMissingMetaGlobal(global);
}
}
@Override
public void execute() throws NoSuchStageException {
InfoCollections infoCollections = session.config.infoCollections;
if (infoCollections == null) {
session.abort(null, "No info/collections set in FetchMetaGlobalStage.");
return;
}
long lastModified = session.config.persistedMetaGlobal().lastModified();
if (!infoCollections.updateNeeded(META_COLLECTION, lastModified)) {
// Try to use our local collection keys for this session.
Logger.info(LOG_TAG, "Trying to use persisted meta/global for this session.");
MetaGlobal global = session.config.persistedMetaGlobal().metaGlobal(session.config.metaURL(), session.credentials());
if (global != null) {
Logger.info(LOG_TAG, "Using persisted meta/global for this session.");
session.processMetaGlobal(global); // Calls session.advance().
return;
}
Logger.info(LOG_TAG, "Failed to use persisted meta/global for this session.");
}
// We need an update: fetch or upload meta/global as necessary.
Logger.info(LOG_TAG, "Fetching fresh meta/global for this session.");
MetaGlobal global = new MetaGlobal(session.config.metaURL(), session.credentials());
global.fetch(new StageMetaGlobalDelegate(session));
}
}