package knorxx.framework.generator.springsampleapp.server.service;
import java.io.IOException;
import java.util.Date;
import knorxx.framework.generator.springadapter.KnorxxDispatcherServletInitializer;
import knorxx.framework.generator.springadapter.atmosphere.WebApplicationContextRetriever;
import knorxx.framework.generator.springsampleapp.server.model.Data;
import knorxx.framework.generator.web.client.MessageQueue;
import knorxx.framework.generator.web.server.json.JsonHelper;
import org.atmosphere.config.managed.Decoder;
import org.atmosphere.config.managed.Encoder;
import org.atmosphere.config.service.Disconnect;
import org.atmosphere.config.service.Get;
import org.atmosphere.config.service.ManagedService;
import org.atmosphere.config.service.Message;
import org.atmosphere.config.service.Post;
import org.atmosphere.config.service.Put;
import org.atmosphere.config.service.Ready;
import org.atmosphere.cpr.AtmosphereResource;
import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Source: http://async-io.org/tutorial.html
* @author sj
*/
@ManagedService(path = KnorxxDispatcherServletInitializer.ATMOSPHERE_URL + "/chat") // RedisBroadcaster.class for a distributed environment
public class ChatQueue extends MessageQueue<Data> {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
JsonHelper jsonHelperInAtmosphereInjectionTest;
@Ready
public void onReady(final AtmosphereResource resource) {
logger.info("Browser {} connected.", resource.uuid());
}
@Disconnect
public void onDisconnect(AtmosphereResourceEvent event) {
if (event.isCancelled()) {
logger.info("Browser {} unexpectedly disconnected", event.getResource().uuid());
} else if (event.isClosedByClient()) {
logger.info("Browser {} closed the connection", event.getResource().uuid());
}
}
@Post
public void onPost(AtmosphereResource resource) {
logger.info("Post");
}
@Put
public void onPut(AtmosphereResource resource) {
logger.info("Put");
}
@Get
public void onGet(AtmosphereResource resource) {
logger.info("Get");
}
@Message(encoders = {GsonEncoder.class}, decoders = {GsonDecoder.class})
public Data onMessage(Data data) throws IOException {
data.setTime(new Date().getTime());
logger.info("{} just send {}", data.getAuthor(), data.getMessage());
return data;
}
public static class GsonEncoder extends WebApplicationContextRetriever implements Encoder<Data, String> {
@Override
public String encode(Data data) {
return getWebApplicationContext().getBean(JsonHelper.class).toJson(data);
}
}
public static class GsonDecoder extends WebApplicationContextRetriever implements Decoder<String, Data> {
@Override
public Data decode(String message) {
return getWebApplicationContext().getBean(JsonHelper.class).fromJson(message, Data.class);
}
}
}