package fr.ippon.tatami.web.atmosphere; import com.fasterxml.jackson.databind.ObjectMapper; import org.atmosphere.config.service.ManagedService; import org.atmosphere.cpr.AtmosphereResource; import org.atmosphere.cpr.AtmosphereResponse; import org.atmosphere.cpr.Broadcaster; import org.atmosphere.cpr.BroadcasterFactory; import org.atmosphere.handler.OnMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; @ManagedService( path = "/realtime/statuses/home_timeline") public class RealtimeService extends OnMessage<TatamiNotification> { private static final Logger log = LoggerFactory.getLogger(RealtimeService.class); private static final ObjectMapper jsonObjectMapper = new ObjectMapper(); @Override public void onOpen(AtmosphereResource resource) throws IOException { log.debug("Opening Atmosphere connection"); String broadcasterName = "/realtime/statuses/home_timeline/" + resource.getRequest().getRemoteUser(); log.debug("Subscribing this resource to broadcaster: {}", broadcasterName); Broadcaster b = BroadcasterFactory.getDefault().lookup(broadcasterName, true); b.addAtmosphereResource(resource); } @Override public void onResume(AtmosphereResponse response) throws IOException { log.debug("Resuming Atmosphere connection"); } @Override public void onTimeout(AtmosphereResponse response) throws IOException { log.debug("Atmosphere connection timeout"); } @Override public void onDisconnect(AtmosphereResponse response) throws IOException { log.debug("Closing Atmosphere connection"); } @Override public void onMessage(AtmosphereResponse response, TatamiNotification notification) throws IOException { log.debug("Received Atmosphere message: {}", notification); String json = jsonObjectMapper.writeValueAsString(notification); response.getWriter().write(json); } }