package io.muoncore.spring.mapping;
import io.muoncore.Muon;
import io.muoncore.spring.methodinvocation.MuonStreamMethodInvocation;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.rx.broadcast.Broadcaster;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
public class StreamConnector {
private Muon muon;
private MuonStreamMethodInvocation muonStreamMethodInvocation;
private String muonUrl;
private ConnectionState connectionState = ConnectionState.DISCONNECTED;
public StreamConnector(Muon muon, String muonUrl, MuonStreamMethodInvocation muonStreamMethodInvocation) {
this.muon = muon;
this.muonUrl = muonUrl;
this.muonStreamMethodInvocation = muonStreamMethodInvocation;
}
public synchronized void safeConnectToStream() throws URISyntaxException, UnsupportedEncodingException {
if (connectionState == ConnectionState.DISCONNECTED) {
connectToStream();
}
}
private void connectToStream() throws URISyntaxException, UnsupportedEncodingException {
connectionState = ConnectionState.CONNECTING;
Broadcaster<Object> localstream = Broadcaster.create();
localstream.subscribe(new Subscriber<Object>() {
@Override
public void onSubscribe(Subscription s) {
}
@Override
public void onNext(Object o) {
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
connectionState = ConnectionState.DISCONNECTED;
}
@Override
public void onComplete() {
}
});
localstream.consume(muonStreamMethodInvocation::invoke);
muon.subscribe(new URI(muonUrl), muonStreamMethodInvocation.getDecodedParameterType(), localstream);
if (connectionState == ConnectionState.CONNECTING) {
connectionState = ConnectionState.CONNECTED;
}
}
public boolean isConnected() {
return connectionState == ConnectionState.CONNECTED;
}
public String getMuonUrl() {
return muonUrl;
}
private enum ConnectionState {
DISCONNECTED, CONNECTING, CONNECTED
}
}