diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index a2ae460..135ec23 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -32,12 +32,25 @@ public CachingDataStorageImpl(DataStorage db, int timeout, TimeUnit t @Override public OutdatableResult getOutdatable(String key) { - // TODO implement - // TODO use ScheduledExecutorService to remove outdated result from cache - see SlowCompletableFutureDb implementation - // TODO complete OutdatableResult::outdated after removing outdated result from cache - // TODO don't use obtrudeException on result - just don't - // TODO use remove(Object key, Object value) to remove target value - // TODO Start timeout after receiving result in CompletableFuture, not after receiving CompletableFuture itself - throw new UnsupportedOperationException(); + + CompletableFuture sched = new CompletableFuture<>(); + CompletableFuture resultFuture = new CompletableFuture<>(); + OutdatableResult outdatableResult = new OutdatableResult<>(resultFuture, sched); + OutdatableResult cashedResult = cache.putIfAbsent(key, outdatableResult); + if (cashedResult == null) { + db.get(key).whenComplete((result, throwable) -> { + if (throwable == null){ + resultFuture.complete(result); + } + else { + resultFuture.completeExceptionally(throwable); + } + scheduledExecutorService.schedule(() -> { + cache.remove(key, outdatableResult); + sched.complete(null); + }, timeout, timeoutUnits); + }); + return outdatableResult; + } else return cashedResult; } }