@SuppressWarnings("unchecked")
public <T> Task<StreamSubscriptionHandle<T>> subscribe(String provider, Class<T> dataClass, String streamId, AsyncObserver<T> observer)
{
StreamKey streamKey = new StreamKey(provider, dataClass, streamId);
ConcurrentMap<Handle, AsyncObserver> observers = observerMap.get(streamKey);
if (observers == null)
{
observers = InternalUtils.putIfAbsentAndGet(observerMap, streamKey, new ConcurrentHashMap<>());
ServerSideStreamProxy serverSideStreamProxy = runtime.getRemoteObserverReference(null, ServerSideStreamProxy.class, "0");
int dataClassId = DefaultClassDictionary.get().getClassId(dataClass);
Task<StreamSubscriptionHandle<Object>> subscriptionHandleTask = serverSideStreamProxy.subscribe(provider, dataClassId, streamId, localReference);
await(subscriptionHandleTask);
}
observers = (observers != null) ? observers : InternalUtils.putIfAbsentAndGet(observerMap, streamKey, new ConcurrentHashMap<>());
Handle handle = new Handle(streamKey, nextId.incrementAndGet());
observers.put(handle, observer);
return Task.fromValue(handle);
}