1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mobile/android/base/sync/middleware/MiddlewareRepositorySession.java Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,184 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +package org.mozilla.gecko.sync.middleware; 1.9 + 1.10 +import java.util.concurrent.ExecutorService; 1.11 + 1.12 +import org.mozilla.gecko.background.common.log.Logger; 1.13 +import org.mozilla.gecko.sync.repositories.InactiveSessionException; 1.14 +import org.mozilla.gecko.sync.repositories.InvalidSessionTransitionException; 1.15 +import org.mozilla.gecko.sync.repositories.RepositorySession; 1.16 +import org.mozilla.gecko.sync.repositories.RepositorySessionBundle; 1.17 +import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionBeginDelegate; 1.18 +import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFinishDelegate; 1.19 +import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionGuidsSinceDelegate; 1.20 +import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionWipeDelegate; 1.21 + 1.22 +public abstract class MiddlewareRepositorySession extends RepositorySession { 1.23 + private static final String LOG_TAG = "MiddlewareSession"; 1.24 + protected final RepositorySession inner; 1.25 + 1.26 + public MiddlewareRepositorySession(RepositorySession innerSession, MiddlewareRepository repository) { 1.27 + super(repository); 1.28 + this.inner = innerSession; 1.29 + } 1.30 + 1.31 + @Override 1.32 + public void wipe(RepositorySessionWipeDelegate delegate) { 1.33 + inner.wipe(delegate); 1.34 + } 1.35 + 1.36 + public class MiddlewareRepositorySessionBeginDelegate implements RepositorySessionBeginDelegate { 1.37 + 1.38 + private MiddlewareRepositorySession outerSession; 1.39 + private RepositorySessionBeginDelegate next; 1.40 + 1.41 + public MiddlewareRepositorySessionBeginDelegate(MiddlewareRepositorySession outerSession, RepositorySessionBeginDelegate next) { 1.42 + this.outerSession = outerSession; 1.43 + this.next = next; 1.44 + } 1.45 + 1.46 + @Override 1.47 + public void onBeginFailed(Exception ex) { 1.48 + next.onBeginFailed(ex); 1.49 + } 1.50 + 1.51 + @Override 1.52 + public void onBeginSucceeded(RepositorySession session) { 1.53 + next.onBeginSucceeded(outerSession); 1.54 + } 1.55 + 1.56 + @Override 1.57 + public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) { 1.58 + final RepositorySessionBeginDelegate deferred = next.deferredBeginDelegate(executor); 1.59 + return new RepositorySessionBeginDelegate() { 1.60 + @Override 1.61 + public void onBeginSucceeded(RepositorySession session) { 1.62 + if (inner != session) { 1.63 + Logger.warn(LOG_TAG, "Got onBeginSucceeded for session " + session + ", not our inner session!"); 1.64 + } 1.65 + deferred.onBeginSucceeded(outerSession); 1.66 + } 1.67 + 1.68 + @Override 1.69 + public void onBeginFailed(Exception ex) { 1.70 + deferred.onBeginFailed(ex); 1.71 + } 1.72 + 1.73 + @Override 1.74 + public RepositorySessionBeginDelegate deferredBeginDelegate(ExecutorService executor) { 1.75 + return this; 1.76 + } 1.77 + }; 1.78 + } 1.79 + } 1.80 + 1.81 + public void begin(RepositorySessionBeginDelegate delegate) throws InvalidSessionTransitionException { 1.82 + inner.begin(new MiddlewareRepositorySessionBeginDelegate(this, delegate)); 1.83 + } 1.84 + 1.85 + public class MiddlewareRepositorySessionFinishDelegate implements RepositorySessionFinishDelegate { 1.86 + private final MiddlewareRepositorySession outerSession; 1.87 + private final RepositorySessionFinishDelegate next; 1.88 + 1.89 + public MiddlewareRepositorySessionFinishDelegate(MiddlewareRepositorySession outerSession, RepositorySessionFinishDelegate next) { 1.90 + this.outerSession = outerSession; 1.91 + this.next = next; 1.92 + } 1.93 + 1.94 + @Override 1.95 + public void onFinishFailed(Exception ex) { 1.96 + next.onFinishFailed(ex); 1.97 + } 1.98 + 1.99 + @Override 1.100 + public void onFinishSucceeded(RepositorySession session, RepositorySessionBundle bundle) { 1.101 + next.onFinishSucceeded(outerSession, bundle); 1.102 + } 1.103 + 1.104 + @Override 1.105 + public RepositorySessionFinishDelegate deferredFinishDelegate(ExecutorService executor) { 1.106 + return this; 1.107 + } 1.108 + } 1.109 + 1.110 + @Override 1.111 + public void finish(RepositorySessionFinishDelegate delegate) throws InactiveSessionException { 1.112 + inner.finish(new MiddlewareRepositorySessionFinishDelegate(this, delegate)); 1.113 + } 1.114 + 1.115 + 1.116 + @Override 1.117 + public synchronized void ensureActive() throws InactiveSessionException { 1.118 + inner.ensureActive(); 1.119 + } 1.120 + 1.121 + @Override 1.122 + public synchronized boolean isActive() { 1.123 + return inner.isActive(); 1.124 + } 1.125 + 1.126 + @Override 1.127 + public synchronized SessionStatus getStatus() { 1.128 + return inner.getStatus(); 1.129 + } 1.130 + 1.131 + @Override 1.132 + public synchronized void setStatus(SessionStatus status) { 1.133 + inner.setStatus(status); 1.134 + } 1.135 + 1.136 + @Override 1.137 + public synchronized void transitionFrom(SessionStatus from, SessionStatus to) 1.138 + throws InvalidSessionTransitionException { 1.139 + inner.transitionFrom(from, to); 1.140 + } 1.141 + 1.142 + @Override 1.143 + public void abort() { 1.144 + inner.abort(); 1.145 + } 1.146 + 1.147 + @Override 1.148 + public void abort(RepositorySessionFinishDelegate delegate) { 1.149 + inner.abort(new MiddlewareRepositorySessionFinishDelegate(this, delegate)); 1.150 + } 1.151 + 1.152 + @Override 1.153 + public void guidsSince(long timestamp, RepositorySessionGuidsSinceDelegate delegate) { 1.154 + // TODO: need to do anything here? 1.155 + inner.guidsSince(timestamp, delegate); 1.156 + } 1.157 + 1.158 + @Override 1.159 + public void storeDone() { 1.160 + inner.storeDone(); 1.161 + } 1.162 + 1.163 + @Override 1.164 + public void storeDone(long storeEnd) { 1.165 + inner.storeDone(storeEnd); 1.166 + } 1.167 + 1.168 + @Override 1.169 + public boolean shouldSkip() { 1.170 + return inner.shouldSkip(); 1.171 + } 1.172 + 1.173 + @Override 1.174 + public boolean dataAvailable() { 1.175 + return inner.dataAvailable(); 1.176 + } 1.177 + 1.178 + @Override 1.179 + public void unbundle(RepositorySessionBundle bundle) { 1.180 + inner.unbundle(bundle); 1.181 + } 1.182 + 1.183 + @Override 1.184 + public long getLastSyncTimestamp() { 1.185 + return inner.getLastSyncTimestamp(); 1.186 + } 1.187 +}