improve/improveJul2 #116
|
@ -24,10 +24,10 @@ import retrofit2.Response;
|
||||||
|
|
||||||
public class KSActionsImpl implements KSActions {
|
public class KSActionsImpl implements KSActions {
|
||||||
|
|
||||||
private UserSettings userSettings;
|
private final UserSettings userSettings;
|
||||||
private KidShiftApiService kidShiftApiService;
|
private final KidShiftApiService kidShiftApiService;
|
||||||
private KSLogger logger;
|
private final KSLogger logger;
|
||||||
private CacheWrapper cacheWrapper;
|
private final CacheWrapper cacheWrapper;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public KSActionsImpl(UserSettings userSettings, KidShiftApiService kidShiftApiService, KSLogger logger, CacheWrapper cacheWrapper) {
|
public KSActionsImpl(UserSettings userSettings, KidShiftApiService kidShiftApiService, KSLogger logger, CacheWrapper cacheWrapper) {
|
||||||
|
|
|
@ -14,17 +14,14 @@ import one.nem.kidshift.utils.KSLogger;
|
||||||
|
|
||||||
public class ParentDataImpl implements ParentData {
|
public class ParentDataImpl implements ParentData {
|
||||||
|
|
||||||
private KidShiftApiService kidshiftApiService;
|
private final UserSettings userSettings;
|
||||||
|
|
||||||
private UserSettings userSettings;
|
private final KSLogger logger;
|
||||||
|
|
||||||
private KSLogger logger;
|
private final KSActions ksActions;
|
||||||
|
|
||||||
private KSActions ksActions;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings, KSLogger logger, KSActions ksActions) {
|
public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings, KSLogger logger, KSActions ksActions) {
|
||||||
this.kidshiftApiService = kidshiftApiService;
|
|
||||||
this.userSettings = userSettings;
|
this.userSettings = userSettings;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.ksActions = ksActions;
|
this.ksActions = ksActions;
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
package one.nem.kidshift.data.impl;
|
package one.nem.kidshift.data.impl;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.stream.Collectors;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.security.auth.callback.Callback;
|
|
||||||
|
|
||||||
import one.nem.kidshift.data.KSActions;
|
import one.nem.kidshift.data.KSActions;
|
||||||
import one.nem.kidshift.data.TaskData;
|
import one.nem.kidshift.data.TaskData;
|
||||||
import one.nem.kidshift.data.retrofit.model.converter.TaskModelConverter;
|
|
||||||
import one.nem.kidshift.data.retrofit.model.task.TaskListResponse;
|
|
||||||
import one.nem.kidshift.data.room.utils.CacheWrapper;
|
import one.nem.kidshift.data.room.utils.CacheWrapper;
|
||||||
import one.nem.kidshift.model.callback.TaskItemModelCallback;
|
import one.nem.kidshift.model.callback.TaskItemModelCallback;
|
||||||
import one.nem.kidshift.model.tasks.TaskItemModel;
|
import one.nem.kidshift.model.tasks.TaskItemModel;
|
||||||
|
@ -18,9 +16,9 @@ import one.nem.kidshift.utils.KSLogger;
|
||||||
|
|
||||||
public class TaskDataImpl implements TaskData {
|
public class TaskDataImpl implements TaskData {
|
||||||
|
|
||||||
private KSActions ksActions;
|
private final KSActions ksActions;
|
||||||
private CacheWrapper cacheWrapper;
|
private final CacheWrapper cacheWrapper;
|
||||||
private KSLogger logger;
|
private final KSLogger logger;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public TaskDataImpl(KSActions ksActions, CacheWrapper cacheWrapper, KSLogger logger) {
|
public TaskDataImpl(KSActions ksActions, CacheWrapper cacheWrapper, KSLogger logger) {
|
||||||
|
@ -31,30 +29,74 @@ public class TaskDataImpl implements TaskData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TaskItemModel>> getTasks(TaskItemModelCallback callback) {
|
public CompletableFuture<List<TaskItemModel>> getTasks(TaskItemModelCallback callback) {
|
||||||
return CompletableFuture.supplyAsync(() -> {
|
|
||||||
logger.debug("タスク取得開始");
|
logger.debug("タスク取得開始");
|
||||||
Thread thread = new Thread(() -> {
|
|
||||||
// TODO-rca: ちゃんと比較して呼ぶ
|
CompletableFuture<List<TaskItemModel>> cachedTasksFuture = cacheWrapper.getTaskList();
|
||||||
ksActions.syncTasks().thenAccept(callback::onUpdated);
|
|
||||||
});
|
return cachedTasksFuture.thenCompose(cachedTasks -> {
|
||||||
thread.start();
|
if (cachedTasks == null || cachedTasks.isEmpty()) {
|
||||||
return cacheWrapper.getTaskList().thenApply(taskList -> {
|
logger.debug("キャッシュ無: サーバーからタスクを取得");
|
||||||
if (taskList == null || taskList.isEmpty()) {
|
return fetchTasksFromServer(callback);
|
||||||
try {
|
|
||||||
logger.debug("キャッシュ無: タスク取得スレッド待機");
|
|
||||||
thread.join();
|
|
||||||
return cacheWrapper.getTaskList().join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
logger.debug("キャッシュ有 (タスク数: " + taskList.size() + ")");
|
logger.debug("キャッシュ有 (タスク数: " + cachedTasks.size() + ")");
|
||||||
return taskList;
|
return checkForUpdates(cachedTasks, callback);
|
||||||
}
|
}
|
||||||
}).join();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<List<TaskItemModel>> fetchTasksFromServer(TaskItemModelCallback callback) {
|
||||||
|
return ksActions.syncTasks().thenApply(serverTasks -> {
|
||||||
|
if (serverTasks == null || serverTasks.isEmpty()) {
|
||||||
|
callback.onUnchanged();
|
||||||
|
} else {
|
||||||
|
callback.onUpdated(serverTasks);
|
||||||
|
}
|
||||||
|
return serverTasks;
|
||||||
|
}).exceptionally(e -> {
|
||||||
|
logger.error("タスク取得失敗: " + e.getMessage());
|
||||||
|
callback.onFailed(e.getMessage());
|
||||||
|
return Collections.emptyList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<List<TaskItemModel>> checkForUpdates(List<TaskItemModel> cachedTasks, TaskItemModelCallback callback) {
|
||||||
|
return ksActions.syncTasks().thenApply(serverTasks -> {
|
||||||
|
if (serverTasks == null || serverTasks.isEmpty()) {
|
||||||
|
callback.onUnchanged();
|
||||||
|
return cachedTasks;
|
||||||
|
} else {
|
||||||
|
boolean isChanged = isTaskListChanged(cachedTasks, serverTasks);
|
||||||
|
if (isChanged) {
|
||||||
|
logger.debug("タスク取得完了: キャッシュと比較して変更あり");
|
||||||
|
callback.onUpdated(serverTasks);
|
||||||
|
return serverTasks;
|
||||||
|
} else {
|
||||||
|
logger.debug("タスク取得完了: キャッシュと比較して変更なし");
|
||||||
|
callback.onUnchanged();
|
||||||
|
return cachedTasks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).exceptionally(e -> {
|
||||||
|
logger.error("タスク取得失敗: " + e.getMessage());
|
||||||
|
callback.onFailed(e.getMessage());
|
||||||
|
return cachedTasks;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isTaskListChanged(List<TaskItemModel> cachedTasks, List<TaskItemModel> serverTasks) {
|
||||||
|
if (cachedTasks.size() != serverTasks.size()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (TaskItemModel serverTask : serverTasks) {
|
||||||
|
boolean exists = cachedTasks.stream().anyMatch(cachedTask -> serverTask.getId().equals(cachedTask.getId()));
|
||||||
|
if (!exists) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TaskItemModel>> getTasks(String childId, TaskItemModelCallback callback) {
|
public CompletableFuture<List<TaskItemModel>> getTasks(String childId, TaskItemModelCallback callback) {
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user