package org.solmix.sgt.client.event;
import java.util.List;
import java.util.logging.Logger;
import org.solmix.atmosphere.client.Atmosphere;
import org.solmix.atmosphere.client.AtmosphereCloseHandler;
import org.solmix.atmosphere.client.AtmosphereMessageHandler;
import org.solmix.atmosphere.client.AtmosphereOpenHandler;
import org.solmix.atmosphere.client.AtmosphereRequest;
import org.solmix.atmosphere.client.AtmosphereRequestConfig;
import org.solmix.atmosphere.client.AtmosphereResponse;
import org.solmix.sgt.client.annotation.DefaultEventTopic;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
public class EventServiceProxy implements EventService
{
static final Logger logger = Logger.getLogger(EventServiceProxy.class.getName());
private final String url;
private Atmosphere proxy;
private AtmosphereRequest request;
private final EventBus eventBus;
@Inject
public EventServiceProxy(@DefaultEventTopic String url, EventBus eventBus)
{
this.url = url;
this.eventBus = eventBus;
}
@Override
public void start() {
if (proxy == null) {
proxy = Atmosphere.create();
request= proxy.subscribe(getAtmosphereRequestConfig());
}
}
protected AtmosphereRequestConfig getAtmosphereRequestConfig(){
EventSerializer serializer= new EventSerializer();
AtmosphereRequestConfig atmConfig = AtmosphereRequestConfig.create(serializer);
atmConfig.setUrl(GWT.getHostPageBaseURL()+url);
atmConfig.setContentType("application/json; charset=UTF-8");
atmConfig.setTransport(AtmosphereRequestConfig.Transport.STREAMING);
atmConfig.setFallbackTransport(AtmosphereRequestConfig.Transport.LONG_POLLING);
atmConfig.setOpenHandler(new AtmosphereOpenHandler() {
@Override
public void onOpen(AtmosphereResponse response) {
// SC.say("JSON Connection opened");
}
});
atmConfig.setCloseHandler(new AtmosphereCloseHandler() {
@Override
public void onClose(AtmosphereResponse response) {
// SC.say("JSON Connection closed");
}
});
atmConfig.setTransportFailureHandler(new org.solmix.atmosphere.client.AtmosphereTransportFailureHandler(){
@Override
public void onTransportFailure(String errorMsg, AtmosphereRequest request) {
// SC.say("onTransportFailure"+errorMsg);
}
});
atmConfig.setErrorHandler(new org.solmix.atmosphere.client.AtmosphereErrorHandler(){
@Override
public void onError(AtmosphereResponse response) {
// SC.say("onError");
}
});
atmConfig.setReconnectHandler(new org.solmix.atmosphere.client.AtmosphereReconnectHandler(){
@Override
public void onReconnect(AtmosphereRequestConfig request, AtmosphereResponse response) {
// SC.say("onReconnect");
}
});
atmConfig.setMessageHandler(new AtmosphereMessageHandler() {
@Override
public void onMessage(AtmosphereResponse response) {
List<ServerEvent> events = response.getMessages();
for (ServerEvent event : events) {
GWTServerEvent e = new GWTServerEvent(event);
eventBus.fireEventFromSource(e, this);
logger.info("received message through JSON: " + event.getTopic());
}
}
});
return atmConfig;
}
@Override
public void stop() {
}
@Override
public void push(Object event) throws SerializationException{
if(request==null)
start();
request.push(event);
}
}