package io.muoncore.discovery;
import io.muoncore.Discovery;
import io.muoncore.InstanceDescriptor;
import io.muoncore.ServiceDescriptor;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class MultiDiscovery implements Discovery {
private List<Discovery> discoveries;
private CountDownLatch onReadyLatch;
public MultiDiscovery(List<Discovery> discoveries) {
this.discoveries = discoveries;
onReadyLatch = new CountDownLatch(discoveries.size());
}
@Override
public List<ServiceDescriptor> getKnownServices() {
List<ServiceDescriptor> desc = discoveries.stream().flatMap( it -> it.getKnownServices().stream()).distinct().collect(Collectors.toList());
return desc;
}
@Override
public void advertiseLocalService(InstanceDescriptor descriptor) {
discoveries.forEach( discovery -> discovery.advertiseLocalService(descriptor));
}
@Override
public void onReady(DiscoveryOnReady onReady) {
discoveries.forEach( discovery -> discovery.onReady(onReadyLatch::countDown));
new Thread(() ->{
try {
onReadyLatch.await(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
onReady.call();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
@Override
public void shutdown() {
discoveries.stream().forEach(Discovery::shutdown);
}
}