});
}
@Override
public Observable<Service> addService(final AddServiceRequest request) {
Service addedService = serviceRegistry.serviceBy(request.type(), request.bucket());
if (addedService != null) {
return Observable.just(addedService);
}
final Service service = ServiceFactory.create(
request.hostname().getHostName(),
request.bucket(),
request.password(),
request.port(),
environment,
request.type(),
responseBuffer
);
serviceStates.put(service, service.state());
service.states().subscribe(new Action1<LifecycleState>() {
@Override
public void call(LifecycleState state) {
serviceStates.put(service, state);
LifecycleState oldState = state();
LifecycleState newState = recalculateState();
if (oldState == newState) {
return;
}
if (newState == LifecycleState.CONNECTED) {
if (!connected) {
LOGGER.info("Connected to Node " + hostname.getHostName());
}
connected = true;
LOGGER.debug("Connected (" + state() + ") to Node " + hostname);
} else if (newState == LifecycleState.DISCONNECTED) {
if (connected) {
LOGGER.info("Disconnected from Node " + hostname.getHostName());
}
connected = false;
LOGGER.debug("Disconnected (" + state() + ") from Node " + hostname);
}
transitionState(newState);
}
});
serviceRegistry.addService(service, request.bucket());
return service.connect().map(new Func1<LifecycleState, Service>() {
@Override
public Service call(LifecycleState state) {
return service;
}
});