Merge pull request 'improve/improveJul2' (#116) from improve/improveJul2 into main

Reviewed-on: #116
This commit is contained in:
Fujimatsu 2024-07-02 06:31:18 +00:00
commit b3d95b9ba3
3 changed files with 77 additions and 38 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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;