diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index a2ae460..8a93abf 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -38,6 +38,30 @@ public OutdatableResult getOutdatable(String key) { // 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 result = new CompletableFuture<>(); + CompletableFuture outdated = new CompletableFuture<>(); + + OutdatableResult newResult = new OutdatableResult<>(result, outdated); + OutdatableResult cacheResult = cache.putIfAbsent(key, newResult); + + if (cacheResult != null) { + return cacheResult; + } + + db.get(key).whenComplete((e, t) -> { + if (t != null) { + result.completeExceptionally(t); + } else { + result.complete(e); + } + scheduledExecutorService.schedule(() -> { + cache.remove(key, newResult); + outdated.complete(null); + }, + timeout, + timeoutUnits); + }); + return newResult; } }