@Test void watchFile() { final Revision latestRevision = new Revision(3); final Entry<String> latestEntry = Entry.ofText(latestRevision, "/a.txt", "a"); when(delegate.normalizeRevision(any(), any(), any())) .thenReturn(completedFuture(Revision.INIT)); when(delegate.watchFile(any(), any(), any(), (Query<String>) any(), anyLong())) .thenReturn(completedFuture(latestEntry)); assertThat(dogma.watchFile("foo", "bar", Revision.INIT, Query.ofText("/a.txt"), 10000L).join()) .isEqualTo(latestEntry); assertThat(dogma.latestKnownRevision("foo", "bar")).isEqualTo(latestRevision); verify(delegate, times(1)).normalizeRevision("foo", "bar", Revision.INIT); verify(delegate, times(1)).watchFile("foo", "bar", Revision.INIT, Query.ofText("/a.txt"), 10000L); verifyNoMoreInteractions(delegate); }
@Override public <T> CompletableFuture<Entry<T>> watchFile( String projectName, String repositoryName, Revision lastKnownRevision, Query<T> query, long timeoutMillis) { return normalizeRevisionAndExecuteWithRetries( projectName, repositoryName, lastKnownRevision, new Function<Revision, CompletableFuture<Entry<T>>>() { @Override public CompletableFuture<Entry<T>> apply(Revision normLastKnownRevision) { return delegate.watchFile(projectName, repositoryName, normLastKnownRevision, query, timeoutMillis) .thenApply(entry -> { if (entry != null) { updateLatestKnownRevision(projectName, repositoryName, entry.revision()); } return entry; }); } @Override public String toString() { return "watchFile(" + projectName + ", " + repositoryName + ", " + lastKnownRevision + ", " + query + ", " + timeoutMillis + ')'; } }); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public <T> CompletableFuture<Entry<T>> watchFile( String projectName, String repositoryName, Revision lastKnownRevision, Query<T> query, long timeoutMillis) { return normalizeRevisionAndExecuteWithRetries( projectName, repositoryName, lastKnownRevision, new Function<Revision, CompletableFuture<Entry<T>>>() { @Override public CompletableFuture<Entry<T>> apply(Revision normLastKnownRevision) { return delegate.watchFile(projectName, repositoryName, normLastKnownRevision, query, timeoutMillis) .thenApply(entry -> { if (entry != null) { updateLatestKnownRevision(projectName, repositoryName, entry.revision()); } return entry; }); } @Override public String toString() { return "watchFile(" + projectName + ", " + repositoryName + ", " + lastKnownRevision + ", " + query + ", " + timeoutMillis + ')'; } }); } }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public <T> CompletableFuture<Entry<T>> watchFile( String projectName, String repositoryName, Revision lastKnownRevision, Query<T> query, long timeoutMillis) { return normalizeRevisionAndExecuteWithRetries( projectName, repositoryName, lastKnownRevision, new Function<Revision, CompletableFuture<Entry<T>>>() { @Override public CompletableFuture<Entry<T>> apply(Revision normLastKnownRevision) { return delegate.watchFile(projectName, repositoryName, normLastKnownRevision, query, timeoutMillis) .thenApply(entry -> { if (entry != null) { updateLatestKnownRevision(projectName, repositoryName, entry.revision()); } return entry; }); } @Override public String toString() { return "watchFile(" + projectName + ", " + repositoryName + ", " + lastKnownRevision + ", " + query + ", " + timeoutMillis + ')'; } }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public <T> CompletableFuture<Entry<T>> watchFile( String projectName, String repositoryName, Revision lastKnownRevision, Query<T> query, long timeoutMillis) { return normalizeRevisionAndExecuteWithRetries( projectName, repositoryName, lastKnownRevision, new Function<Revision, CompletableFuture<Entry<T>>>() { @Override public CompletableFuture<Entry<T>> apply(Revision normLastKnownRevision) { return delegate.watchFile(projectName, repositoryName, normLastKnownRevision, query, timeoutMillis) .thenApply(entry -> { if (entry != null) { updateLatestKnownRevision(projectName, repositoryName, entry.revision()); } return entry; }); } @Override public String toString() { return "watchFile(" + projectName + ", " + repositoryName + ", " + lastKnownRevision + ", " + query + ", " + timeoutMillis + ')'; } }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); @Override CompletableFuture<Void> createProject(String projectName); @Override CompletableFuture<Void> removeProject(String projectName); @Override CompletableFuture<Void> purgeProject(String projectName); @Override CompletableFuture<Void> unremoveProject(String projectName); @Override CompletableFuture<Set<String>> listProjects(); @Override CompletableFuture<Set<String>> listRemovedProjects(); @Override CompletableFuture<Void> createRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> removeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> purgeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> unremoveRepository(String projectName, String repositoryName); @Override CompletableFuture<Map<String, RepositoryInfo>> listRepositories(String projectName); @Override CompletableFuture<Set<String>> listRemovedRepositories(String projectName); @Override CompletableFuture<Revision> normalizeRevision(
            String projectName, String repositoryName, Revision revision); @Override CompletableFuture<Map<String, EntryType>> listFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<Entry<T>> getFile(
            String projectName, String repositoryName, Revision revision, Query<T> query); @Override CompletableFuture<Map<String, Entry<?>>> getFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<MergedEntry<T>> mergeFiles(
            String projectName, String repositoryName, Revision revision,
            MergeQuery<T> mergeQuery); @Override CompletableFuture<List<Commit>> getHistory(
            String projectName, String repositoryName, Revision from,
            Revision to, String pathPattern); @Override CompletableFuture<Change<T>> getDiff(
            String projectName, String repositoryName, Revision from, Revision to, Query<T> query); @Override CompletableFuture<List<Change<?>>> getDiffs(
            String projectName, String repositoryName, Revision from, Revision to, String pathPattern); @Override CompletableFuture<List<Change<?>>> getPreviewDiffs(
            String projectName, String repositoryName, Revision baseRevision,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            String summary, String detail, Markup markup, Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            Author author, String summary, String detail, Markup markup,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<Revision> watchRepository(
            String projectName, String repositoryName, Revision lastKnownRevision,
            String pathPattern, long timeoutMillis); @Override CompletableFuture<Entry<T>> watchFile(
            String projectName, String repositoryName, Revision lastKnownRevision,
            Query<T> query, long timeoutMillis); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public <T> CompletableFuture<Entry<T>> watchFile( String projectName, String repositoryName, Revision lastKnownRevision, Query<T> query, long timeoutMillis) { return normalizeRevisionAndExecuteWithRetries( projectName, repositoryName, lastKnownRevision, new Function<Revision, CompletableFuture<Entry<T>>>() { @Override public CompletableFuture<Entry<T>> apply(Revision normLastKnownRevision) { return delegate.watchFile(projectName, repositoryName, normLastKnownRevision, query, timeoutMillis) .thenApply(entry -> { if (entry != null) { updateLatestKnownRevision(projectName, repositoryName, entry.revision()); } return entry; }); } @Override public String toString() { return "watchFile(" + projectName + ", " + repositoryName + ", " + lastKnownRevision + ", " + query + ", " + timeoutMillis + ')'; } }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); @Override CompletableFuture<Void> createProject(String projectName); @Override CompletableFuture<Void> removeProject(String projectName); @Override CompletableFuture<Void> purgeProject(String projectName); @Override CompletableFuture<Void> unremoveProject(String projectName); @Override CompletableFuture<Set<String>> listProjects(); @Override CompletableFuture<Set<String>> listRemovedProjects(); @Override CompletableFuture<Void> createRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> removeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> purgeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> unremoveRepository(String projectName, String repositoryName); @Override CompletableFuture<Map<String, RepositoryInfo>> listRepositories(String projectName); @Override CompletableFuture<Set<String>> listRemovedRepositories(String projectName); @Override CompletableFuture<Revision> normalizeRevision(
            String projectName, String repositoryName, Revision revision); @Override CompletableFuture<Map<String, EntryType>> listFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<Entry<T>> getFile(
            String projectName, String repositoryName, Revision revision, Query<T> query); @Override CompletableFuture<Map<String, Entry<?>>> getFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<MergedEntry<T>> mergeFiles(
            String projectName, String repositoryName, Revision revision,
            MergeQuery<T> mergeQuery); @Override CompletableFuture<List<Commit>> getHistory(
            String projectName, String repositoryName, Revision from,
            Revision to, String pathPattern); @Override CompletableFuture<Change<T>> getDiff(
            String projectName, String repositoryName, Revision from, Revision to, Query<T> query); @Override CompletableFuture<List<Change<?>>> getDiffs(
            String projectName, String repositoryName, Revision from, Revision to, String pathPattern); @Override CompletableFuture<List<Change<?>>> getPreviewDiffs(
            String projectName, String repositoryName, Revision baseRevision,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            String summary, String detail, Markup markup, Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            Author author, String summary, String detail, Markup markup,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<Revision> watchRepository(
            String projectName, String repositoryName, Revision lastKnownRevision,
            String pathPattern, long timeoutMillis); @Override CompletableFuture<Entry<T>> watchFile(
            String projectName, String repositoryName, Revision lastKnownRevision,
            Query<T> query, long timeoutMillis);  }