package org.springsource.flexchat.event;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.flex.messaging.AsyncMessageCreator;
import org.springframework.flex.messaging.MessageTemplate;
import org.springframework.flex.messaging.SubscribeEvent;
import org.springframework.flex.messaging.UnsubscribeEvent;
import org.springframework.flex.messaging.integration.FlexHeaders;
import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;
public class SubscriptionListener implements ApplicationListener<ApplicationEvent> {
private final MessageTemplate flexTemplate = new MessageTemplate();
@Autowired
public SubscriptionListener(MessageBroker broker) {
flexTemplate.setMessageBroker(broker);
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof SubscribeEvent) {
SubscribeEvent subscribe = (SubscribeEvent) event;
String messageClientId = subscribe.getClientId();
Map<String, String> body = new HashMap<String, String>();
body.put("userId", subscribe.getSource().toString());
body.put("chatMessage", "I am connected.");
flexTemplate.send(new EventMessageCreator(event.getSource().toString(), messageClientId, "si-chat-receiver", body));
} else if (event instanceof UnsubscribeEvent) {
UnsubscribeEvent unsubscribe = (UnsubscribeEvent) event;
String messageClientId = unsubscribe.getClientId();
Map<String, String> body = new HashMap<String, String>();
body.put("userId", unsubscribe.getSource().toString());
body.put("chatMessage", "I am disconnected.");
flexTemplate.send(new EventMessageCreator(event.getSource().toString(), messageClientId, "si-chat-receiver", body));
}
}
private static final class EventMessageCreator implements AsyncMessageCreator {
private final String flexClientId;
private final String messageClientId;
private final String destinationId;
private final Object body;
public EventMessageCreator(String flexClientId, String messageClientId, String destinationId, Object body) {
this.flexClientId = flexClientId;
this.messageClientId = messageClientId;
this.destinationId = destinationId;
this.body = body;
}
@Override
public AsyncMessage createMessage() {
AsyncMessage message = new AsyncMessage();
message.setHeader(FlexHeaders.FLEX_CLIENT_ID, flexClientId);
message.setClientId(this.messageClientId);
message.setDestination(this.destinationId);
message.setMessageId(UUIDUtils.createUUID());
message.setTimestamp(System.currentTimeMillis());
message.setBody(body);
return message;
}
}
}