/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package fr.hhdev.ocelot.web;

import fr.hhdev.ocelot.messaging.MessageEvent;
import fr.hhdev.ocelot.messaging.MessageToClient;
import java.io.IOException;
import java.util.Collection;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.websocket.EncodeException;
import javax.websocket.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Singleton that send push messages
 * @author hhfrancois
 */
@Singleton
public class TopicsMessagesBroadcaster {

	private final static Logger logger = LoggerFactory.getLogger(TopicsMessagesBroadcaster.class);

	@Inject
	private SessionManager sessionManager;

	/**
	 * Send message to topic
	 *
	 * @param msg
	 */
	public void sendMessageToTopic(@Observes @MessageEvent MessageToClient msg) {
		logger.debug("Sending message/response to topic {}", msg.toJson());
		try {
			if (sessionManager.existsSessionForTopic(msg.getId())) {
				Collection<Session> sessions = sessionManager.getSessionsForTopic(msg.getId());
				if (sessions != null && !sessions.isEmpty()) {
					logger.debug("Send message to '{}' topic {} client(s) : {}", new Object[]{msg.getId(), sessions.size(), msg.toJson()});
					for (Session session : sessions) {
						if (session.isOpen()) {
							session.getBasicRemote().sendObject(msg);
						}
					}
				} else {
					logger.debug("No client for topic '{}'", msg.getId());
				}
			} else {
				logger.debug("No topic '{}'", msg.getId());
			}
		} catch (IOException | EncodeException ex) {
			logger.error("Fail to send message to topic: "+msg.getId(), ex);
		}
	}
}

@@ -355,32 +355,61 @@
 o.IOException;%0D%0A
+import java.util.ArrayList;%0D%0A
 import java.util
@@ -1113,17 +1113,8 @@
 sage
-/response
  to 
@@ -1121,16 +1121,19 @@
 topic %7B%7D
+...
 %22, msg.t
@@ -1306,32 +1306,65 @@
 %09%09%09%09
-if (sessions != null && 
+Collection%3CSession%3E closed = new ArrayList%3C%3E();%0D%0A%09%09%09%09if (
 !ses
@@ -1642,16 +1642,163 @@
 %09%09%09%7D
-%0D%0A%09%09%09%09%09%7D
+ else %7B%0D%0A%09%09%09%09%09%09%09closed.add(session);%0D%0A%09%09%09%09%09%09%7D%0D%0A%09%09%09%09%09%7D%0D%0A%09%09%09%09%09logger.debug(%22Session closed to remove '%7B%7D'%22, closed.size());%0D%0A%09%09%09%09%09sessions.removeAll(closed);
 %0D%0A%09%09

remove closed sessions after test during send message to topic