package org.jboss.seam.example.remoting.chatroom; import static org.jboss.seam.ScopeType.CONVERSATION; import java.util.Set; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import org.jboss.seam.annotations.Begin; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.End; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; @Stateful @Name("chatroomAction") @Scope(CONVERSATION) public class ChatRoomAction implements ChatRoomActionWebRemote { @In(create=true) private transient TopicPublisher topicPublisher; @In(create=true) private transient TopicSession topicSession; @In(create=true) Set<String> chatroomUsers; private String username; @Begin public boolean connect(String username) { this.username = username; boolean added = chatroomUsers.add(username); if (added) { publish( new ChatroomEvent("connect", username) ); } return added; } public void sendMessage(String message) { publish( new ChatroomEvent("message", username, message) ); } @End public void disconnect() { chatroomUsers.remove(username); publish( new ChatroomEvent("disconnect", username) ); } public Set<String> listUsers() { return chatroomUsers; } private void publish(ChatroomEvent message) { try { topicPublisher.publish( topicSession.createObjectMessage(message) ); } catch (Exception ex) { throw new RuntimeException(ex); } } @Destroy @Remove public void destroy() {} }