/* 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.middleware;
import java.util.concurrent.ExecutorService;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.repositories.InactiveSessionException;
import org.mozilla.gecko.sync.repositories.InvalidSessionTransitionException;
import org.mozilla.gecko.sync.repositories.RepositorySession;
import org.mozilla.gecko.sync.repositories.RepositorySessionBundle;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionBeginDelegate;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFinishDelegate;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionGuidsSinceDelegate;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionWipeDelegate;
public abstract class MiddlewareRepositorySession extends RepositorySession {
private static final String LOG_TAG = "MiddlewareSession";
protected final RepositorySession inner;
public MiddlewareRepositorySession(RepositorySession innerSession, MiddlewareRepository repository) {
super(repository);
this.inner = innerSession;
}
@Override
public void wipe(RepositorySessionWipeDelegate delegate) {
inner.wipe(delegate);
}
public class MiddlewareRepositorySessionBeginDelegate implements RepositorySessionBeginDelegate {
private MiddlewareRepositorySession outerSession;
private RepositorySessionBeginDelegate next;
public MiddlewareRepositorySessionBeginDelegate(MiddlewareRepositorySession outerSession, RepositorySessionBeginDelegate next) {
this.outerSession = outerSession;
this.next = next;
}
@Override
public void onBeginFailed(Exception ex) {
next.onBeginFailed(ex);
}
@Override
public void onBeginSucceeded(RepositorySession session) {
next.onBeginSucceeded(outerSession);
}
@Override
public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) {
final RepositorySessionBeginDelegate deferred = next.deferredBeginDelegate(executor);
return new RepositorySessionBeginDelegate() {
@Override
public void onBeginSucceeded(RepositorySession session) {
if (inner != session) {
Logger.warn(LOG_TAG, "Got onBeginSucceeded for session " + session + ", not our inner session!");
}
deferred.onBeginSucceeded(outerSession);
}
@Override
public void onBeginFailed(Exception ex) {
deferred.onBeginFailed(ex);
}
@Override
public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) {
return this;
}
};
}
}
public void begin(RepositorySessionBeginDelegate delegate) throws InvalidSessionTransitionException {
inner.begin(new MiddlewareRepositorySessionBeginDelegate(this, delegate));
}
public class MiddlewareRepositorySessionFinishDelegate implements RepositorySessionFinishDelegate {
private final MiddlewareRepositorySession outerSession;
private final RepositorySessionFinishDelegate next;
public MiddlewareRepositorySessionFinishDelegate(MiddlewareRepositorySession outerSession, RepositorySessionFinishDelegate next) {
this.outerSession = outerSession;
this.next = next;
}
@Override
public void onFinishFailed(Exception ex) {
next.onFinishFailed(ex);
}
@Override
public void onFinishSucceeded(RepositorySession session, RepositorySessionBundle bundle) {
next.onFinishSucceeded(outerSession, bundle);
}
@Override
public RepositorySessionFinishDelegate deferredFinishDelegate(ExecutorService executor) {
return this;
}
}
@Override
public void finish(RepositorySessionFinishDelegate delegate) throws InactiveSessionException {
inner.finish(new MiddlewareRepositorySessionFinishDelegate(this, delegate));
}
@Override
public synchronized void ensureActive() throws InactiveSessionException {
inner.ensureActive();
}
@Override
public synchronized boolean isActive() {
return inner.isActive();
}
@Override
public synchronized SessionStatus getStatus() {
return inner.getStatus();
}
@Override
public synchronized void setStatus(SessionStatus status) {
inner.setStatus(status);
}
@Override
public synchronized void transitionFrom(SessionStatus from, SessionStatus to)
throws InvalidSessionTransitionException {
inner.transitionFrom(from, to);
}
@Override
public void abort() {
inner.abort();
}
@Override
public void abort(RepositorySessionFinishDelegate delegate) {
inner.abort(new MiddlewareRepositorySessionFinishDelegate(this, delegate));
}
@Override
public void guidsSince(long timestamp, RepositorySessionGuidsSinceDelegate delegate) {
// TODO: need to do anything here?
inner.guidsSince(timestamp, delegate);
}
@Override
public void storeDone() {
inner.storeDone();
}
@Override
public void storeDone(long storeEnd) {
inner.storeDone(storeEnd);
}
}