michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: package org.mozilla.gecko.sync.middleware; michael@0: michael@0: import java.util.concurrent.ExecutorService; michael@0: michael@0: import org.mozilla.gecko.background.common.log.Logger; michael@0: import org.mozilla.gecko.sync.repositories.InactiveSessionException; michael@0: import org.mozilla.gecko.sync.repositories.InvalidSessionTransitionException; michael@0: import org.mozilla.gecko.sync.repositories.RepositorySession; michael@0: import org.mozilla.gecko.sync.repositories.RepositorySessionBundle; michael@0: import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionBeginDelegate; michael@0: import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFinishDelegate; michael@0: import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionGuidsSinceDelegate; michael@0: import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionWipeDelegate; michael@0: michael@0: public abstract class MiddlewareRepositorySession extends RepositorySession { michael@0: private static final String LOG_TAG = "MiddlewareSession"; michael@0: protected final RepositorySession inner; michael@0: michael@0: public MiddlewareRepositorySession(RepositorySession innerSession, MiddlewareRepository repository) { michael@0: super(repository); michael@0: this.inner = innerSession; michael@0: } michael@0: michael@0: @Override michael@0: public void wipe(RepositorySessionWipeDelegate delegate) { michael@0: inner.wipe(delegate); michael@0: } michael@0: michael@0: public class MiddlewareRepositorySessionBeginDelegate implements RepositorySessionBeginDelegate { michael@0: michael@0: private MiddlewareRepositorySession outerSession; michael@0: private RepositorySessionBeginDelegate next; michael@0: michael@0: public MiddlewareRepositorySessionBeginDelegate(MiddlewareRepositorySession outerSession, RepositorySessionBeginDelegate next) { michael@0: this.outerSession = outerSession; michael@0: this.next = next; michael@0: } michael@0: michael@0: @Override michael@0: public void onBeginFailed(Exception ex) { michael@0: next.onBeginFailed(ex); michael@0: } michael@0: michael@0: @Override michael@0: public void onBeginSucceeded(RepositorySession session) { michael@0: next.onBeginSucceeded(outerSession); michael@0: } michael@0: michael@0: @Override michael@0: public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) { michael@0: final RepositorySessionBeginDelegate deferred = next.deferredBeginDelegate(executor); michael@0: return new RepositorySessionBeginDelegate() { michael@0: @Override michael@0: public void onBeginSucceeded(RepositorySession session) { michael@0: if (inner != session) { michael@0: Logger.warn(LOG_TAG, "Got onBeginSucceeded for session " + session + ", not our inner session!"); michael@0: } michael@0: deferred.onBeginSucceeded(outerSession); michael@0: } michael@0: michael@0: @Override michael@0: public void onBeginFailed(Exception ex) { michael@0: deferred.onBeginFailed(ex); michael@0: } michael@0: michael@0: @Override michael@0: public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) { michael@0: return this; michael@0: } michael@0: }; michael@0: } michael@0: } michael@0: michael@0: public void begin(RepositorySessionBeginDelegate delegate) throws InvalidSessionTransitionException { michael@0: inner.begin(new MiddlewareRepositorySessionBeginDelegate(this, delegate)); michael@0: } michael@0: michael@0: public class MiddlewareRepositorySessionFinishDelegate implements RepositorySessionFinishDelegate { michael@0: private final MiddlewareRepositorySession outerSession; michael@0: private final RepositorySessionFinishDelegate next; michael@0: michael@0: public MiddlewareRepositorySessionFinishDelegate(MiddlewareRepositorySession outerSession, RepositorySessionFinishDelegate next) { michael@0: this.outerSession = outerSession; michael@0: this.next = next; michael@0: } michael@0: michael@0: @Override michael@0: public void onFinishFailed(Exception ex) { michael@0: next.onFinishFailed(ex); michael@0: } michael@0: michael@0: @Override michael@0: public void onFinishSucceeded(RepositorySession session, RepositorySessionBundle bundle) { michael@0: next.onFinishSucceeded(outerSession, bundle); michael@0: } michael@0: michael@0: @Override michael@0: public RepositorySessionFinishDelegate deferredFinishDelegate(ExecutorService executor) { michael@0: return this; michael@0: } michael@0: } michael@0: michael@0: @Override michael@0: public void finish(RepositorySessionFinishDelegate delegate) throws InactiveSessionException { michael@0: inner.finish(new MiddlewareRepositorySessionFinishDelegate(this, delegate)); michael@0: } michael@0: michael@0: michael@0: @Override michael@0: public synchronized void ensureActive() throws InactiveSessionException { michael@0: inner.ensureActive(); michael@0: } michael@0: michael@0: @Override michael@0: public synchronized boolean isActive() { michael@0: return inner.isActive(); michael@0: } michael@0: michael@0: @Override michael@0: public synchronized SessionStatus getStatus() { michael@0: return inner.getStatus(); michael@0: } michael@0: michael@0: @Override michael@0: public synchronized void setStatus(SessionStatus status) { michael@0: inner.setStatus(status); michael@0: } michael@0: michael@0: @Override michael@0: public synchronized void transitionFrom(SessionStatus from, SessionStatus to) michael@0: throws InvalidSessionTransitionException { michael@0: inner.transitionFrom(from, to); michael@0: } michael@0: michael@0: @Override michael@0: public void abort() { michael@0: inner.abort(); michael@0: } michael@0: michael@0: @Override michael@0: public void abort(RepositorySessionFinishDelegate delegate) { michael@0: inner.abort(new MiddlewareRepositorySessionFinishDelegate(this, delegate)); michael@0: } michael@0: michael@0: @Override michael@0: public void guidsSince(long timestamp, RepositorySessionGuidsSinceDelegate delegate) { michael@0: // TODO: need to do anything here? michael@0: inner.guidsSince(timestamp, delegate); michael@0: } michael@0: michael@0: @Override michael@0: public void storeDone() { michael@0: inner.storeDone(); michael@0: } michael@0: michael@0: @Override michael@0: public void storeDone(long storeEnd) { michael@0: inner.storeDone(storeEnd); michael@0: } michael@0: michael@0: @Override michael@0: public boolean shouldSkip() { michael@0: return inner.shouldSkip(); michael@0: } michael@0: michael@0: @Override michael@0: public boolean dataAvailable() { michael@0: return inner.dataAvailable(); michael@0: } michael@0: michael@0: @Override michael@0: public void unbundle(RepositorySessionBundle bundle) { michael@0: inner.unbundle(bundle); michael@0: } michael@0: michael@0: @Override michael@0: public long getLastSyncTimestamp() { michael@0: return inner.getLastSyncTimestamp(); michael@0: } michael@0: }