diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index a2ae460..f8af9d5 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -1,5 +1,6 @@ package part2.cache; +import com.sun.javafx.geom.AreaOp; import db.DataStorage; import db.SlowCompletableFutureDb; @@ -38,6 +39,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(); + + OutdatableResult res = new OutdatableResult<>(new CompletableFuture<>(), new CompletableFuture<>()); + OutdatableResult tOutdatableResult = cache.putIfAbsent(key, res); + + if (tOutdatableResult == null) { + db.get(key).whenComplete( + (t, e) -> { + if (e != null) { + res.getResult().completeExceptionally(e); + } else { + res.getResult().complete(t); + } + scheduledExecutorService.schedule(() -> { + cache.remove(key, cache.get(key)); + res.getOutdated().complete(null); + }, + timeout, + timeoutUnits + ); + } + ); + return res; + } else { + return tOutdatableResult; + } } }