![JAR search and dependency download from the Maven repository](/logo.png)
co.easimart.OfflineObjectStore Maven / Gradle / Ivy
package co.easimart;
import java.util.Arrays;
import java.util.List;
import bolts.Continuation;
import bolts.Task;
/** package */ class OfflineObjectStore implements EasimartObjectStore {
private static Task migrate(
final EasimartObjectStore from, final EasimartObjectStore to) {
return from.getAsync().onSuccessTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
final T object = task.getResult();
if (object == null) {
return task;
}
return Task.whenAll(Arrays.asList(
from.deleteAsync(),
to.setAsync(object)
)).continueWith(new Continuation() {
@Override
public T then(Task task) throws Exception {
return object;
}
});
}
});
}
private final String className;
private final String pinName;
private final EasimartObjectStore legacy;
public OfflineObjectStore(Class clazz, String pinName, EasimartObjectStore legacy) {
this(EasimartObject.getClassName(clazz), pinName, legacy);
}
public OfflineObjectStore(String className, String pinName, EasimartObjectStore legacy) {
this.className = className;
this.pinName = pinName;
this.legacy = legacy;
}
@Override
public Task setAsync(final T object) {
return EasimartObject.unpinAllInBackground(pinName).continueWithTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
return object.pinInBackground(pinName, false);
}
});
}
@Override
public Task getAsync() {
// We need to set `ignoreACLs` since we can't use ACLs without the current user.
EasimartQuery query = EasimartQuery.getQuery(className)
.fromPin(pinName)
.ignoreACLs();
return query.findInBackground().onSuccessTask(new Continuation, Task>() {
@Override
public Task then(Task> task) throws Exception {
List results = task.getResult();
if (results != null) {
if (results.size() == 1) {
return Task.forResult(results.get(0));
} else {
return EasimartObject.unpinAllInBackground(pinName).cast();
}
}
return Task.forResult(null);
}
}).onSuccessTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
T ldsObject = task.getResult();
if (ldsObject != null) {
return task;
}
return migrate(legacy, OfflineObjectStore.this).cast();
}
});
}
@Override
public Task existsAsync() {
// We need to set `ignoreACLs` since we can't use ACLs without the current user.
EasimartQuery query = EasimartQuery.getQuery(className)
.fromPin(pinName)
.ignoreACLs();
return query.countInBackground().onSuccessTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
boolean exists = task.getResult() == 1;
if (exists) {
return Task.forResult(true);
}
return legacy.existsAsync();
}
});
}
@Override
public Task deleteAsync() {
final Task ldsTask = EasimartObject.unpinAllInBackground(pinName);
return Task.whenAll(Arrays.asList(
legacy.deleteAsync(),
ldsTask
)).continueWithTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
// We only really care about the result of unpinning.
return ldsTask;
}
});
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy