Merge pull request 'improve/improveJul2' (#116) from improve/improveJul2 into main
Reviewed-on: #116
This commit is contained in:
commit
b3d95b9ba3
|
@ -24,10 +24,10 @@ import retrofit2.Response;
|
|||
|
||||
public class KSActionsImpl implements KSActions {
|
||||
|
||||
private UserSettings userSettings;
|
||||
private KidShiftApiService kidShiftApiService;
|
||||
private KSLogger logger;
|
||||
private CacheWrapper cacheWrapper;
|
||||
private final UserSettings userSettings;
|
||||
private final KidShiftApiService kidShiftApiService;
|
||||
private final KSLogger logger;
|
||||
private final CacheWrapper cacheWrapper;
|
||||
|
||||
@Inject
|
||||
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 {
|
||||
|
||||
private KidShiftApiService kidshiftApiService;
|
||||
private final UserSettings userSettings;
|
||||
|
||||
private UserSettings userSettings;
|
||||
private final KSLogger logger;
|
||||
|
||||
private KSLogger logger;
|
||||
|
||||
private KSActions ksActions;
|
||||
private final KSActions ksActions;
|
||||
|
||||
@Inject
|
||||
public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings, KSLogger logger, KSActions ksActions) {
|
||||
this.kidshiftApiService = kidshiftApiService;
|
||||
this.userSettings = userSettings;
|
||||
this.logger = logger;
|
||||
this.ksActions = ksActions;
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
package one.nem.kidshift.data.impl;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.security.auth.callback.Callback;
|
||||
|
||||
import one.nem.kidshift.data.KSActions;
|
||||
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.model.callback.TaskItemModelCallback;
|
||||
import one.nem.kidshift.model.tasks.TaskItemModel;
|
||||
|
@ -18,9 +16,9 @@ import one.nem.kidshift.utils.KSLogger;
|
|||
|
||||
public class TaskDataImpl implements TaskData {
|
||||
|
||||
private KSActions ksActions;
|
||||
private CacheWrapper cacheWrapper;
|
||||
private KSLogger logger;
|
||||
private final KSActions ksActions;
|
||||
private final CacheWrapper cacheWrapper;
|
||||
private final KSLogger logger;
|
||||
|
||||
@Inject
|
||||
public TaskDataImpl(KSActions ksActions, CacheWrapper cacheWrapper, KSLogger logger) {
|
||||
|
@ -31,30 +29,74 @@ public class TaskDataImpl implements TaskData {
|
|||
|
||||
@Override
|
||||
public CompletableFuture<List<TaskItemModel>> getTasks(TaskItemModelCallback callback) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
logger.debug("タスク取得開始");
|
||||
Thread thread = new Thread(() -> {
|
||||
// TODO-rca: ちゃんと比較して呼ぶ
|
||||
ksActions.syncTasks().thenAccept(callback::onUpdated);
|
||||
});
|
||||
thread.start();
|
||||
return cacheWrapper.getTaskList().thenApply(taskList -> {
|
||||
if (taskList == null || taskList.isEmpty()) {
|
||||
try {
|
||||
logger.debug("キャッシュ無: タスク取得スレッド待機");
|
||||
thread.join();
|
||||
return cacheWrapper.getTaskList().join();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
CompletableFuture<List<TaskItemModel>> cachedTasksFuture = cacheWrapper.getTaskList();
|
||||
|
||||
return cachedTasksFuture.thenCompose(cachedTasks -> {
|
||||
if (cachedTasks == null || cachedTasks.isEmpty()) {
|
||||
logger.debug("キャッシュ無: サーバーからタスクを取得");
|
||||
return fetchTasksFromServer(callback);
|
||||
} else {
|
||||
logger.debug("キャッシュ有 (タスク数: " + taskList.size() + ")");
|
||||
return taskList;
|
||||
logger.debug("キャッシュ有 (タスク数: " + cachedTasks.size() + ")");
|
||||
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
|
||||
public CompletableFuture<List<TaskItemModel>> getTasks(String childId, TaskItemModelCallback callback) {
|
||||
return null;
|
||||
|
|
Loading…
Reference in New Issue
Block a user